// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "flutter/shell/profiling/sampling_profiler.h" #include "flutter/fml/message_loop_impl.h" #include "flutter/fml/thread.h" #include "flutter/testing/testing.h" #include "gmock/gmock.h" using testing::_; using testing::Invoke; namespace fml { namespace { class MockTaskRunner : public fml::TaskRunner { public: inline static RefPtr Create() { return AdoptRef(new MockTaskRunner()); } MOCK_METHOD1(PostTask, void(const fml::closure& task)); MOCK_METHOD2(PostTaskForTime, void(const fml::closure& task, fml::TimePoint target_time)); MOCK_METHOD2(PostDelayedTask, void(const fml::closure& task, fml::TimeDelta delay)); MOCK_METHOD0(RunsTasksOnCurrentThread, bool()); MOCK_METHOD0(GetTaskQueueId, TaskQueueId()); private: MockTaskRunner() : TaskRunner(fml::RefPtr()) {} }; } // namespace } // namespace fml namespace flutter { TEST(SamplingProfilerTest, DeleteAfterStart) { auto thread = std::make_unique(flutter::testing::GetCurrentTestName()); auto task_runner = fml::MockTaskRunner::Create(); std::atomic invoke_count = 0; // Ignore calls to PostTask since that would require mocking out calls to // Dart. EXPECT_CALL(*task_runner, PostDelayedTask(_, _)) .WillRepeatedly( Invoke([&](const fml::closure& task, fml::TimeDelta delay) { invoke_count.fetch_add(1); thread->GetTaskRunner()->PostTask(task); })); { auto profiler = SamplingProfiler( "profiler", /*profiler_task_runner=*/task_runner, [] { return ProfileSample(); }, /*num_samples_per_sec=*/1000); profiler.Start(); } int invoke_count_at_delete = invoke_count.load(); std::this_thread::sleep_for(std::chrono::milliseconds(2)); // nyquist ASSERT_EQ(invoke_count_at_delete, invoke_count.load()); } } // namespace flutter