| // Copyright (c) 2012 The Chromium 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 NET_TEST_SPAWNED_TEST_SERVER_REMOTE_TEST_SERVER_H_ | |
| #define NET_TEST_SPAWNED_TEST_SERVER_REMOTE_TEST_SERVER_H_ | |
| #include <string> | |
| #include "base/macros.h" | |
| #include "base/threading/thread.h" | |
| #include "net/test/spawned_test_server/base_test_server.h" | |
| #include "net/test/spawned_test_server/remote_test_server_config.h" | |
| namespace net { | |
| class RemoteTestServerSpawnerRequest; | |
| class TcpSocketProxy; | |
| // The RemoteTestServer runs an external Python-based test server in another | |
| // machine that is different from the machine that executes the tests. It is | |
| // necessary because it's not always possible to run the test server on the same | |
| // machine (it doesn't run on Android and Fuchsia because it's written in | |
| // Python). | |
| // | |
| // The actual test server is executed on the host machine, while the unit tests | |
| // themselves continue running on the device. To control the test server on the | |
| // host machine, a second HTTP server is started, the spawner server, which | |
| // controls the life cycle of remote test servers. Calls to start/kill the | |
| // SpawnedTestServer are then redirected to the spawner server via | |
| // this spawner communicator. The spawner is implemented in | |
| // build/util/lib/common/chrome_test_server_spawner.py . | |
| // | |
| // Currently the following two commands are supported by spawner. | |
| // | |
| // (1) Start Python test server, format is: | |
| // Path: "/start". | |
| // Method: "POST". | |
| // Data to server: all arguments needed to launch the Python test server, in | |
| // JSON format. | |
| // Data from server: a JSON dict includes the following two field if success, | |
| // "port": the port the Python test server actually listen on that. | |
| // "message": must be "started". | |
| // | |
| // (2) Kill Python test server, format is: | |
| // Path: "/kill". | |
| // Method: "GET". | |
| // Data to server: port=<server_port>. | |
| // Data from server: String "killed" returned if success. | |
| // | |
| // The internal I/O thread is required by net stack to perform net I/O. | |
| // The Start/StopServer methods block the caller thread until result is | |
| // fetched from spawner server or timed-out. | |
| class RemoteTestServer : public BaseTestServer { | |
| public: | |
| // Initialize a TestServer. |document_root| must be a relative path under the | |
| // root tree. | |
| RemoteTestServer(Type type, const base::FilePath& document_root); | |
| // Initialize a TestServer with a specific set of SSLOptions. | |
| // |document_root| must be a relative path under the root tree. | |
| RemoteTestServer(Type type, | |
| const SSLOptions& ssl_options, | |
| const base::FilePath& document_root); | |
| ~RemoteTestServer() override; | |
| // BaseTestServer overrides. | |
| bool StartInBackground() override WARN_UNUSED_RESULT; | |
| bool BlockUntilStarted() override WARN_UNUSED_RESULT; | |
| // Stops the Python test server that is running on the host machine. | |
| bool Stop(); | |
| // Returns the actual path of document root for the test cases. This function | |
| // should be called by test cases to retrieve the actual document root path | |
| // on the Android device, otherwise document_root() function is used to get | |
| // the document root. | |
| base::FilePath GetDocumentRoot() const; | |
| private: | |
| bool Init(const base::FilePath& document_root); | |
| RemoteTestServerConfig config_; | |
| // Thread used to run all IO activity in RemoteTestServerSpawnerRequest and | |
| // |test_server_proxy_|. | |
| base::Thread io_thread_; | |
| std::unique_ptr<RemoteTestServerSpawnerRequest> start_request_; | |
| // Server port. Non-zero when the server is running. | |
| int remote_port_ = 0; | |
| std::unique_ptr<TcpSocketProxy> test_server_proxy_; | |
| std::unique_ptr<TcpSocketProxy> ocsp_proxy_; | |
| DISALLOW_COPY_AND_ASSIGN(RemoteTestServer); | |
| }; | |
| } // namespace net | |
| #endif // NET_TEST_SPAWNED_TEST_SERVER_REMOTE_TEST_SERVER_H_ |