[vm] Prevent empty range in coverage output

Closes https://github.com/dart-lang/sdk/pull/49251

GitOrigin-RevId: 4c399e9b8150bbce495b4f88e0546bdd40fff7ed
Change-Id: Ic16843edeeca9678a7caedbe8f675f7d0d20548d
TEST=Added a case to source_report_test.cc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/248349
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Liam Appelbe <liama@google.com>
Reviewed-by: Liam Appelbe <liama@google.com>
This commit is contained in:
kanghuay
2022-06-15 20:13:28 +00:00
committed by Commit Bot
parent 98d5b29ac2
commit 5daf8f21ed
2 changed files with 68 additions and 2 deletions
+2 -2
View File
@@ -606,12 +606,12 @@ void SourceReport::VisitLibrary(JSONArray* jsarr, const Library& lib) {
Error& err = Error::Handle(cls.EnsureIsFinalized(thread()));
if (!err.IsNull()) {
// Emit an uncompiled range for this class with error information.
JSONObject range(jsarr);
script = cls.script();
const intptr_t script_index = GetScriptIndex(script);
if (script_index < 0) {
continue;
}
JSONObject range(jsarr);
range.AddProperty("scriptIndex", script_index);
range.AddProperty("startPos", cls.token_pos());
range.AddProperty("endPos", cls.end_token_pos());
@@ -623,12 +623,12 @@ void SourceReport::VisitLibrary(JSONArray* jsarr, const Library& lib) {
} else {
cls.EnsureDeclarationLoaded();
// Emit one range for the whole uncompiled class.
JSONObject range(jsarr);
script = cls.script();
const intptr_t script_index = GetScriptIndex(script);
if (script_index < 0) {
continue;
}
JSONObject range(jsarr);
range.AddProperty("scriptIndex", script_index);
range.AddProperty("startPos", cls.token_pos());
range.AddProperty("endPos", cls.end_token_pos());
+66
View File
@@ -58,6 +58,72 @@ ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_NoCalls) {
buffer);
}
ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_Filters_single) {
// WARNING: This MUST be big enough for the serialized JSON string.
const int kBufferSize = 1024;
char buffer[kBufferSize];
const char* kScript =
"main() {\n"
"}";
Library& lib = Library::Handle();
lib ^= ExecuteScript(kScript);
ASSERT(!lib.IsNull());
GrowableObjectArray& filters =
GrowableObjectArray::Handle(GrowableObjectArray::New());
filters.Add(String::Handle(String::New(RESOLVED_USER_TEST_URI)));
SourceReport report(SourceReport::kCoverage, filters);
JSONStream js;
report.PrintJSON(&js, Script::Handle(Script::null()));
const char* json_str = js.ToCString();
ASSERT(strlen(json_str) < kBufferSize);
ElideJSONSubstring("libraries", json_str, buffer);
EXPECT_STREQ(
"{\"type\":\"SourceReport\",\"ranges\":"
// One compiled range, one hit at function declaration.
"[{\"scriptIndex\":0,\"startPos\":0,\"endPos\":9,\"compiled\":true,"
"\"coverage\":{\"hits\":[0],\"misses\":[]}}],"
// One script in the script table.
"\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
"\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
buffer);
}
ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_Filters_empty) {
// WARNING: This MUST be big enough for the serialized JSON string.
const int kBufferSize = 1024;
char buffer[kBufferSize];
const char* kScript =
"main() {\n"
"}";
Library& lib = Library::Handle();
lib ^= ExecuteScript(kScript);
ASSERT(!lib.IsNull());
GrowableObjectArray& filters =
GrowableObjectArray::Handle(GrowableObjectArray::New());
filters.Add(String::Handle(String::New("foo:bar/")));
SourceReport report(SourceReport::kCoverage, filters);
JSONStream js;
report.PrintJSON(&js, Script::Handle(Script::null()));
const char* json_str = js.ToCString();
ASSERT(strlen(json_str) < kBufferSize);
ElideJSONSubstring("libraries", json_str, buffer);
EXPECT_STREQ(
"{\"type\":\"SourceReport\",\"ranges\":"
// No compiled range.
"[],"
// No script.
"\"scripts\":[]}",
buffer);
}
ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_SimpleCall) {
// WARNING: This MUST be big enough for the serialized JSON string.
const int kBufferSize = 1024;