|  | // 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. | 
|  |  | 
|  | #ifndef FLUTTER_TESTING_THREAD_TEST_H_ | 
|  | #define FLUTTER_TESTING_THREAD_TEST_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "flutter/fml/macros.h" | 
|  | #include "flutter/fml/message_loop.h" | 
|  | #include "flutter/fml/task_runner.h" | 
|  | #include "flutter/fml/thread.h" | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | namespace flutter { | 
|  | namespace testing { | 
|  |  | 
|  | //------------------------------------------------------------------------------ | 
|  | /// @brief      A fixture that creates threads with running message loops that | 
|  | ///             are terminated when the test is done (the threads are joined | 
|  | ///             then as well). While this fixture may be used on it's own, it is | 
|  | ///             often sub-classed by other fixtures whose functioning requires | 
|  | ///             threads to be created as necessary. | 
|  | /// | 
|  | class ThreadTest : public ::testing::Test { | 
|  | public: | 
|  | ThreadTest(); | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | /// @brief      Get the task runner for the thread that the current unit-test | 
|  | ///             is running on. This creates a message loop as necessary. | 
|  | /// | 
|  | /// @attention  Unlike all other threads and task runners, this task runner is | 
|  | ///             shared by all tests running in the process. Tests must ensure | 
|  | ///             that all tasks posted to this task runner are executed before | 
|  | ///             the test ends to prevent the task from one test being executed | 
|  | ///             while another test is running. When in doubt, just create a | 
|  | ///             bespoke thread and task running. These cannot be seen by other | 
|  | ///             tests in the process. | 
|  | /// | 
|  | /// @see        `GetThreadTaskRunner`, `CreateNewThread`. | 
|  | /// | 
|  | /// @return     The task runner for the thread the test is running on. | 
|  | /// | 
|  | fml::RefPtr<fml::TaskRunner> GetCurrentTaskRunner(); | 
|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | /// @brief      Creates a new thread, initializes a message loop on it, and, | 
|  | ///             returns its task runner to the unit-test. The message loop is | 
|  | ///             terminated (and its thread joined) when the test ends. This | 
|  | ///             allows tests to create multiple named threads as necessary. | 
|  | /// | 
|  | /// @param[in]  name  The name of the OS thread created. | 
|  | /// | 
|  | /// @return     The task runner for the newly created thread. | 
|  | /// | 
|  | fml::RefPtr<fml::TaskRunner> CreateNewThread(std::string name = ""); | 
|  |  | 
|  | private: | 
|  | fml::RefPtr<fml::TaskRunner> current_task_runner_; | 
|  | std::vector<std::unique_ptr<fml::Thread>> extra_threads_; | 
|  |  | 
|  | FML_DISALLOW_COPY_AND_ASSIGN(ThreadTest); | 
|  | }; | 
|  |  | 
|  | }  // namespace testing | 
|  | }  // namespace flutter | 
|  |  | 
|  | #endif  // FLUTTER_TESTING_THREAD_TEST_H_ |