local_test_server.h revision a3f7b4e666c476898878fa745f637129375cd889
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifndef NET_TEST_SPAWNED_TEST_SERVER_LOCAL_TEST_SERVER_H_ 6b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define NET_TEST_SPAWNED_TEST_SERVER_LOCAL_TEST_SERVER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/process_handle.h" 12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/base_test_server.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandLine; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LocalTestServer runs an external Python-based test server in the 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// same machine in which the LocalTestServer runs. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocalTestServer : public BaseTestServer { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize a TestServer listening on a specific host (IP or hostname). 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |document_root| must be a relative path under the root tree. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalTestServer(Type type, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& document_root); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize a TestServer with a specific set of SSLOptions. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |document_root| must be a relative path under the root tree. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalTestServer(Type type, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLOptions& ssl_options, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& document_root); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LocalTestServer(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start the test server and block until it's ready. Returns true on success. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Start() WARN_UNUSED_RESULT; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Start the test server without blocking. Use this if you need multiple test 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // servers (such as WebSockets and HTTP, or HTTP and HTTPS). You must call 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BlockUntilStarted on all servers your test requires before executing the 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // test. For example: 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // // Start the servers in parallel. 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ASSERT_TRUE(http_server.StartInBackground()); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ASSERT_TRUE(websocket_server.StartInBackground()); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // // Wait for both servers to be ready. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ASSERT_TRUE(http_server.BlockUntilStarted()); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ASSERT_TRUE(websocket_server.BlockUntilStarted()); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RunMyTest(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true on success. 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool StartInBackground() WARN_UNUSED_RESULT; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Block until ths test server is ready. Returns true on success. See 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // StartInBackground() documentation for more information. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool BlockUntilStarted() WARN_UNUSED_RESULT; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the server started by Start(). 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Stop(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modify PYTHONPATH to contain libraries we need. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool SetPythonPath() const WARN_UNUSED_RESULT; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the base::FilePath for the testserver python script is 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // successfully stored in |*testserver_path|. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool GetTestServerPath(base::FilePath* testserver_path) const 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WARN_UNUSED_RESULT; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the command line arguments for the Python test server to 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |command_line|. Returns true on success. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool AddCommandLineArguments(CommandLine* command_line) const 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WARN_UNUSED_RESULT; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the actual path of document root for test cases. This function 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should be called by test cases to retrieve the actual document root path. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetDocumentRoot() const { return document_root(); }; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Init(const base::FilePath& document_root); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Launches the Python test server. Returns true on success. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool LaunchPython(const base::FilePath& testserver_path) WARN_UNUSED_RESULT; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for the server to start. Returns true on success. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WaitToStart() WARN_UNUSED_RESULT; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle of the Python process running the test server. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ProcessHandle process_handle_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // JobObject used to clean up orphaned child processes. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle job_handle_; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pipe file handle we read from. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle child_read_fd_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pipe file handle the child and we write to. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle child_write_fd_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The file descriptor the child writes to when it starts. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int child_fd_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::ScopedFD child_fd_closer_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LocalTestServer); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif // NET_TEST_SPAWNED_TEST_SERVER_LOCAL_TEST_SERVER_H_ 118