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