blob: 3bfabcf05d1322139ec0f750f8e9299ab976bb34 [file] [log] [blame]
rsimha@chromium.org99a6f172013-01-20 01:10:24 +00001// Copyright 2013 The Chromium Authors. All rights reserved.
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <stdio.h>
6
Peter Boström3b00eb12021-04-05 20:48:20 +00007#include <memory>
8
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +00009#include "base/at_exit.h"
10#include "base/command_line.h"
brettw@chromium.org9d094992013-02-24 05:40:52 +000011#include "base/files/file_path.h"
Scott Grahamc7b94d92018-10-25 18:50:53 +000012#include "base/files/file_util.h"
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +000013#include "base/logging.h"
Chris Sharp81f46b92019-08-02 15:45:32 +000014#include "base/message_loop/message_pump_type.h"
fdorayfdd01b72016-08-25 08:36:37 -070015#include "base/run_loop.h"
avi@chromium.org60a948a2013-06-07 18:41:05 +000016#include "base/strings/utf_string_conversions.h"
Alex Clarke868a3392019-06-06 15:41:53 +000017#include "base/task/single_thread_task_executor.h"
tim@chromium.orgc9ff5422011-06-18 11:53:42 +000018#include "base/test/test_timeouts.h"
Matt Menke9ef58632020-11-02 18:31:15 +000019#include "net/test/embedded_test_server/embedded_test_server.h"
phajdan.jr@chromium.orgafa35e12013-05-07 20:04:21 +000020#include "net/test/spawned_test_server/spawned_test_server.h"
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +000021
22static void PrintUsage() {
Matt Menke3a293bd2021-08-13 20:34:43 +000023 printf(
24 "run_testserver --doc-root=relpath\n"
25 " [--http|--https|--ws|--wss]\n"
26 " [--ssl-cert=ok|mismatched-name|expired]\n");
rsimha@chromium.org6a5525c2012-05-24 20:40:21 +000027 printf("(NOTE: relpath should be relative to the 'src' directory.\n");
rsimha@chromium.org6a5525c2012-05-24 20:40:21 +000028}
29
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +000030int main(int argc, const char* argv[]) {
31 base::AtExitManager at_exit_manager;
Chris Sharp81f46b92019-08-02 15:45:32 +000032 base::SingleThreadTaskExecutor io_task_executor(base::MessagePumpType::IO);
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +000033
34 // Process command line
thestig@chromium.org94a4efc2014-06-03 00:01:07 +000035 base::CommandLine::Init(argc, argv);
36 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +000037
akalin@chromium.org520e2022013-06-21 21:15:33 +000038 logging::LoggingSettings settings;
39 settings.logging_dest = logging::LOG_TO_ALL;
Robbie McElrath776b6952019-08-20 22:22:53 +000040 settings.log_file_path = FILE_PATH_LITERAL("testserver.log");
akalin@chromium.org520e2022013-06-21 21:15:33 +000041 if (!logging::InitLogging(settings)) {
akalin@chromium.org3dfcd452010-11-18 22:29:38 +000042 printf("Error: could not initialize logging. Exiting.\n");
43 return -1;
44 }
45
tim@chromium.org8d38ca12011-06-23 23:56:38 +000046 TestTimeouts::Initialize();
47
rsimha@chromium.org6a5525c2012-05-24 20:40:21 +000048 if (command_line->GetSwitches().empty() ||
rsimha@chromium.org99a6f172013-01-20 01:10:24 +000049 command_line->HasSwitch("help")) {
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +000050 PrintUsage();
51 return -1;
52 }
53
Matt Menke9ef58632020-11-02 18:31:15 +000054 // If populated, EmbeddedTestServer is used instead of the SpawnedTestServer.
David Benjamin85999442021-11-22 21:01:55 +000055 absl::optional<net::EmbeddedTestServer::Type> embedded_test_server_type;
Matt Menke9ef58632020-11-02 18:31:15 +000056
phajdan.jr@chromium.orga866ea42013-05-03 18:57:22 +000057 net::SpawnedTestServer::Type server_type;
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +000058 if (command_line->HasSwitch("http")) {
David Benjamin85999442021-11-22 21:01:55 +000059 embedded_test_server_type = net::EmbeddedTestServer::TYPE_HTTP;
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +000060 } else if (command_line->HasSwitch("https")) {
David Benjamin85999442021-11-22 21:01:55 +000061 embedded_test_server_type = net::EmbeddedTestServer::TYPE_HTTPS;
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +000062 } else if (command_line->HasSwitch("ws")) {
phajdan.jr@chromium.orga866ea42013-05-03 18:57:22 +000063 server_type = net::SpawnedTestServer::TYPE_WS;
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +000064 } else if (command_line->HasSwitch("wss")) {
phajdan.jr@chromium.orga866ea42013-05-03 18:57:22 +000065 server_type = net::SpawnedTestServer::TYPE_WSS;
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +000066 } else {
67 // If no scheme switch is specified, select http or https scheme.
68 // TODO(toyoshim): Remove this estimation.
Matt Menke9ef58632020-11-02 18:31:15 +000069 if (command_line->HasSwitch("ssl-cert")) {
David Benjamin85999442021-11-22 21:01:55 +000070 embedded_test_server_type = net::EmbeddedTestServer::TYPE_HTTPS;
Matt Menke9ef58632020-11-02 18:31:15 +000071 } else {
David Benjamin85999442021-11-22 21:01:55 +000072 embedded_test_server_type = net::EmbeddedTestServer::TYPE_HTTP;
Matt Menke9ef58632020-11-02 18:31:15 +000073 }
akalin@chromium.org154bb132010-11-12 02:20:27 +000074 }
75
phajdan.jr@chromium.orga866ea42013-05-03 18:57:22 +000076 net::SpawnedTestServer::SSLOptions ssl_options;
David Benjamin85999442021-11-22 21:01:55 +000077 net::EmbeddedTestServer::ServerCertificate server_certificate;
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +000078 if (command_line->HasSwitch("ssl-cert")) {
David Benjamin85999442021-11-22 21:01:55 +000079 if ((embedded_test_server_type.has_value() &&
80 *embedded_test_server_type != net::EmbeddedTestServer::TYPE_HTTPS) ||
81 (!embedded_test_server_type.has_value() &&
82 !net::SpawnedTestServer::UsingSSL(server_type))) {
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +000083 printf("Error: --ssl-cert is specified on non-secure scheme\n");
84 PrintUsage();
85 return -1;
86 }
87 std::string cert_option = command_line->GetSwitchValueASCII("ssl-cert");
cbentzel@chromium.orgca6e57e2011-09-03 03:06:40 +000088 if (cert_option == "ok") {
phajdan.jr@chromium.orga866ea42013-05-03 18:57:22 +000089 ssl_options.server_certificate =
90 net::SpawnedTestServer::SSLOptions::CERT_OK;
David Benjamin85999442021-11-22 21:01:55 +000091 server_certificate = net::EmbeddedTestServer::CERT_OK;
cbentzel@chromium.orgca6e57e2011-09-03 03:06:40 +000092 } else if (cert_option == "mismatched-name") {
toyoshim@chromium.orgb1546ce2012-08-23 01:05:12 +000093 ssl_options.server_certificate =
phajdan.jr@chromium.orga866ea42013-05-03 18:57:22 +000094 net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME;
David Benjamin85999442021-11-22 21:01:55 +000095 server_certificate = net::EmbeddedTestServer::CERT_MISMATCHED_NAME;
cbentzel@chromium.orgca6e57e2011-09-03 03:06:40 +000096 } else if (cert_option == "expired") {
toyoshim@chromium.orgb1546ce2012-08-23 01:05:12 +000097 ssl_options.server_certificate =
phajdan.jr@chromium.orga866ea42013-05-03 18:57:22 +000098 net::SpawnedTestServer::SSLOptions::CERT_EXPIRED;
David Benjamin85999442021-11-22 21:01:55 +000099 server_certificate = net::EmbeddedTestServer::CERT_EXPIRED;
cbentzel@chromium.orgca6e57e2011-09-03 03:06:40 +0000100 } else {
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +0000101 printf("Error: --ssl-cert has invalid value %s\n", cert_option.c_str());
cbentzel@chromium.orgca6e57e2011-09-03 03:06:40 +0000102 PrintUsage();
103 return -1;
104 }
105 }
106
brettw@chromium.orgb1ccf592013-02-08 20:40:15 +0000107 base::FilePath doc_root = command_line->GetSwitchValuePath("doc-root");
rsimha@chromium.org99a6f172013-01-20 01:10:24 +0000108 if (doc_root.empty()) {
akalin@chromium.org154bb132010-11-12 02:20:27 +0000109 printf("Error: --doc-root must be specified\n");
110 PrintUsage();
111 return -1;
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +0000112 }
113
Matt Menke9ef58632020-11-02 18:31:15 +0000114 base::FilePath full_path =
115 net::test_server::EmbeddedTestServer::GetFullPathFromSourceDirectory(
116 doc_root);
117 if (!base::DirectoryExists(full_path)) {
118 printf("Error: invalid doc root: \"%s\" does not exist!\n",
119 base::UTF16ToUTF8(full_path.LossyDisplayName()).c_str());
120 return -1;
121 }
122
123 // Use EmbeddedTestServer, if it supports the provided configuration.
124 if (embedded_test_server_type.has_value()) {
David Benjamin85999442021-11-22 21:01:55 +0000125 net::EmbeddedTestServer embedded_test_server(*embedded_test_server_type);
126 if (*embedded_test_server_type == net::EmbeddedTestServer::TYPE_HTTPS) {
127 embedded_test_server.SetSSLConfig(server_certificate);
128 }
129
Matt Menke9ef58632020-11-02 18:31:15 +0000130 embedded_test_server.AddDefaultHandlers(doc_root);
131 if (!embedded_test_server.Start()) {
132 printf("Error: failed to start embedded test server. Exiting.\n");
133 return -1;
134 }
135
136 printf("Embedded test server running at %s (type ctrl+c to exit)\n",
137 embedded_test_server.host_port_pair().ToString().c_str());
138
139 base::RunLoop().Run();
140 return 0;
141 }
142
143 // Otherwise, use the SpawnedTestServer.
danakj33b49432016-04-18 15:28:08 -0700144 std::unique_ptr<net::SpawnedTestServer> test_server;
phajdan.jr@chromium.orga866ea42013-05-03 18:57:22 +0000145 if (net::SpawnedTestServer::UsingSSL(server_type)) {
Peter Boström3b00eb12021-04-05 20:48:20 +0000146 test_server = std::make_unique<net::SpawnedTestServer>(
147 server_type, ssl_options, doc_root);
toyoshim@chromium.orgaa1b6e72012-10-09 03:43:19 +0000148 } else {
Peter Boström3b00eb12021-04-05 20:48:20 +0000149 test_server =
150 std::make_unique<net::SpawnedTestServer>(server_type, doc_root);
rsimha@chromium.org6a5525c2012-05-24 20:40:21 +0000151 }
cbentzel@chromium.orgca6e57e2011-09-03 03:06:40 +0000152
153 if (!test_server->Start()) {
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +0000154 printf("Error: failed to start test server. Exiting.\n");
155 return -1;
156 }
157
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +0000158 printf("testserver running at %s (type ctrl+c to exit)\n",
cbentzel@chromium.orgca6e57e2011-09-03 03:06:40 +0000159 test_server->host_port_pair().ToString().c_str());
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +0000160
fdorayfdd01b72016-08-25 08:36:37 -0700161 base::RunLoop().Run();
phajdan.jr@chromium.orgefd74402010-09-03 23:54:36 +0000162}