// Copyright 2013 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. #include <stdio.h> #include "base/at_exit.h" #include "base/command_line.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" #include "base/process/launch.h" #include "base/strings/string_number_conversions.h" #include "base/test/test_timeouts.h" #include "net/test/python_utils.h" #include "sync/test/local_sync_test_server.h" static void PrintUsage() { printf("run_sync_testserver [--port=<port>] [--xmpp-port=<xmpp_port>]\n"); } // Launches the chromiumsync_test.py or xmppserver_test.py scripts, which test // the sync HTTP and XMPP sever functionality respectively. static bool RunSyncTest( const base::FilePath::StringType& sync_test_script_name) { scoped_ptr<syncer::LocalSyncTestServer> test_server( new syncer::LocalSyncTestServer()); if (!test_server->SetPythonPath()) { LOG(ERROR) << "Error trying to set python path. Exiting."; return false; } base::FilePath sync_test_script_path; if (!test_server->GetTestScriptPath(sync_test_script_name, &sync_test_script_path)) { LOG(ERROR) << "Error trying to get path for test script " << sync_test_script_name; return false; } CommandLine python_command(CommandLine::NO_PROGRAM); if (!GetPythonCommand(&python_command)) { LOG(ERROR) << "Could not get python runtime command."; return false; } python_command.AppendArgPath(sync_test_script_path); if (!base::LaunchProcess(python_command, base::LaunchOptions(), NULL)) { LOG(ERROR) << "Failed to launch test script " << sync_test_script_name; return false; } return true; } // Gets a port value from the switch with name |switch_name| and writes it to // |port|. Returns true if a port was provided and false otherwise. static bool GetPortFromSwitch(const std::string& switch_name, uint16* port) { DCHECK(port != NULL) << "|port| is NULL"; CommandLine* command_line = CommandLine::ForCurrentProcess(); int port_int = 0; if (command_line->HasSwitch(switch_name)) { std::string port_str = command_line->GetSwitchValueASCII(switch_name); if (!base::StringToInt(port_str, &port_int)) { return false; } } *port = static_cast<uint16>(port_int); return true; } int main(int argc, const char* argv[]) { base::AtExitManager at_exit_manager; base::MessageLoopForIO message_loop; // Process command line CommandLine::Init(argc, argv); CommandLine* command_line = CommandLine::ForCurrentProcess(); logging::LoggingSettings settings; settings.logging_dest = logging::LOG_TO_ALL; settings.log_file = FILE_PATH_LITERAL("sync_testserver.log"); if (!logging::InitLogging(settings)) { printf("Error: could not initialize logging. Exiting.\n"); return -1; } TestTimeouts::Initialize(); if (command_line->HasSwitch("help")) { PrintUsage(); return 0; } if (command_line->HasSwitch("sync-test")) { return RunSyncTest(FILE_PATH_LITERAL("chromiumsync_test.py")) ? 0 : -1; } if (command_line->HasSwitch("xmpp-test")) { return RunSyncTest(FILE_PATH_LITERAL("xmppserver_test.py")) ? 0 : -1; } uint16 port = 0; GetPortFromSwitch("port", &port); uint16 xmpp_port = 0; GetPortFromSwitch("xmpp-port", &xmpp_port); scoped_ptr<syncer::LocalSyncTestServer> test_server( new syncer::LocalSyncTestServer(port, xmpp_port)); if (!test_server->Start()) { printf("Error: failed to start python sync test server. Exiting.\n"); return -1; } printf("Python sync test server running at %s (type ctrl+c to exit)\n", test_server->host_port_pair().ToString().c_str()); message_loop.Run(); return 0; }