Index: runtime/vm/profiler_test.cc |
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc |
index a35da3071634f32f9877c99b8b2a98fbda10b39b..35338515d72ce136f2b84980f8cf35e66228e8cc 100644 |
--- a/runtime/vm/profiler_test.cc |
+++ b/runtime/vm/profiler_test.cc |
@@ -149,8 +149,13 @@ static RawClass* GetClass(const Library& lib, const char* name) { |
class AllocationFilter : public SampleFilter { |
public: |
- explicit AllocationFilter(Isolate* isolate, intptr_t cid) |
- : SampleFilter(isolate), |
+ AllocationFilter(Isolate* isolate, |
+ intptr_t cid, |
+ int64_t time_origin_micros = -1, |
+ int64_t time_extent_micros = -1) |
+ : SampleFilter(isolate, |
+ time_origin_micros, |
+ time_extent_micros), |
cid_(cid), |
enable_vm_ticks_(false) { |
} |
@@ -196,6 +201,7 @@ TEST_CASE(Profiler_TrivialRecordAllocation) { |
Library& root_library = Library::Handle(); |
root_library ^= Api::UnwrapHandle(lib); |
+ const int64_t before_allocations_micros = Dart_TimelineGetMicros(); |
const Class& class_a = Class::Handle(GetClass(root_library, "A")); |
EXPECT(!class_a.IsNull()); |
class_a.SetTraceAllocation(true); |
@@ -203,14 +209,20 @@ TEST_CASE(Profiler_TrivialRecordAllocation) { |
Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
EXPECT_VALID(result); |
- |
+ const int64_t after_allocations_micros = Dart_TimelineGetMicros(); |
+ const int64_t allocation_extent_micros = |
+ after_allocations_micros - before_allocations_micros; |
{ |
Thread* thread = Thread::Current(); |
Isolate* isolate = thread->isolate(); |
StackZone zone(thread); |
HANDLESCOPE(thread); |
Profile profile(isolate); |
- AllocationFilter filter(isolate, class_a.id()); |
+ // Filter for the class in the time range. |
+ AllocationFilter filter(isolate, |
+ class_a.id(), |
+ before_allocations_micros, |
+ allocation_extent_micros); |
profile.Build(thread, &filter, Profile::kNoTags); |
// We should have 1 allocation sample. |
EXPECT_EQ(1, profile.sample_count()); |
@@ -252,6 +264,23 @@ TEST_CASE(Profiler_TrivialRecordAllocation) { |
EXPECT_STREQ("B.boo", walker.CurrentName()); |
EXPECT(!walker.Down()); |
} |
+ |
+ // Query with a time filter where no allocations occurred. |
+ { |
+ Thread* thread = Thread::Current(); |
+ Isolate* isolate = thread->isolate(); |
+ StackZone zone(thread); |
+ HANDLESCOPE(thread); |
+ Profile profile(isolate); |
+ AllocationFilter filter(isolate, |
+ class_a.id(), |
+ Dart_TimelineGetMicros(), |
+ 16000); |
+ profile.Build(thread, &filter, Profile::kNoTags); |
+ // We should have no allocation samples because none occured within |
+ // the specified time range. |
+ EXPECT_EQ(0, profile.sample_count()); |
+ } |
} |