| // 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 <thread> | |
| #include "flutter/fml/message_loop_impl.h" | |
| #include "flutter/fml/thread.h" | |
| #include "flutter/shell/profiling/sampling_profiler.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<MockTaskRunner> Create() { | |
| return AdoptRef(new MockTaskRunner()); | |
| } | |
| MOCK_METHOD(void, PostTask, (const fml::closure& task), (override)); | |
| MOCK_METHOD(void, | |
| PostTaskForTime, | |
| (const fml::closure& task, fml::TimePoint target_time), | |
| (override)); | |
| MOCK_METHOD(void, | |
| PostDelayedTask, | |
| (const fml::closure& task, fml::TimeDelta delay), | |
| (override)); | |
| MOCK_METHOD(bool, RunsTasksOnCurrentThread, (), (override)); | |
| MOCK_METHOD(TaskQueueId, GetTaskQueueId, (), (override)); | |
| private: | |
| MockTaskRunner() : TaskRunner(fml::RefPtr<MessageLoopImpl>()) {} | |
| }; | |
| } // namespace | |
| } // namespace fml | |
| namespace flutter { | |
| TEST(SamplingProfilerTest, DeleteAfterStart) { | |
| auto thread = | |
| std::make_unique<fml::Thread>(flutter::testing::GetCurrentTestName()); | |
| auto task_runner = fml::MockTaskRunner::Create(); | |
| std::atomic<int> 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 |