1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "sync/test/local_sync_test_server.h"
6
7 #include "base/command_line.h"
8 #include "base/path_service.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/values.h"
11 #include "net/test/python_utils.h"
12 #include "net/test/spawned_test_server/spawned_test_server.h"
13
14 namespace syncer {
15
LocalSyncTestServer()16 LocalSyncTestServer::LocalSyncTestServer()
17 : LocalTestServer(
18 net::SpawnedTestServer::TYPE_HTTP, // Sync uses the HTTP scheme.
19 net::SpawnedTestServer::kLocalhost,
20 base::FilePath()),
21 xmpp_port_(0) {}
22
LocalSyncTestServer(uint16 port,uint16 xmpp_port)23 LocalSyncTestServer::LocalSyncTestServer(uint16 port, uint16 xmpp_port)
24 : LocalTestServer(
25 net::SpawnedTestServer::TYPE_HTTP, // Sync uses the HTTP scheme.
26 net::SpawnedTestServer::kLocalhost,
27 base::FilePath()),
28 xmpp_port_(xmpp_port) {
29 SetPort(port);
30 }
31
~LocalSyncTestServer()32 LocalSyncTestServer::~LocalSyncTestServer() {}
33
AddCommandLineArguments(base::CommandLine * command_line) const34 bool LocalSyncTestServer::AddCommandLineArguments(
35 base::CommandLine* command_line) const {
36 if (!LocalTestServer::AddCommandLineArguments(command_line))
37 return false;
38 if (xmpp_port_ != 0) {
39 std::string xmpp_port_str = base::IntToString(xmpp_port_);
40 command_line->AppendArg("--xmpp-port=" + xmpp_port_str);
41 }
42 return true;
43 }
44
GetTestServerPath(base::FilePath * testserver_path) const45 bool LocalSyncTestServer::GetTestServerPath(
46 base::FilePath* testserver_path) const {
47 base::FilePath testserver_dir;
48 if (!PathService::Get(base::DIR_SOURCE_ROOT, &testserver_dir)) {
49 LOG(ERROR) << "Failed to get DIR_SOURCE_ROOT";
50 return false;
51 }
52 testserver_dir = testserver_dir.Append(FILE_PATH_LITERAL("sync"))
53 .Append(FILE_PATH_LITERAL("tools"))
54 .Append(FILE_PATH_LITERAL("testserver"));
55
56 *testserver_path =
57 testserver_dir.Append(FILE_PATH_LITERAL("sync_testserver.py"));
58 return true;
59 }
60
GetTestScriptPath(const base::FilePath::StringType & test_script_name,base::FilePath * test_script_path) const61 bool LocalSyncTestServer::GetTestScriptPath(
62 const base::FilePath::StringType& test_script_name,
63 base::FilePath* test_script_path) const {
64 base::FilePath testserver_path;
65 if (!GetTestServerPath(&testserver_path))
66 return false;
67 *test_script_path = testserver_path.DirName().Append(test_script_name);
68 return true;
69 }
70
SetPythonPath() const71 bool LocalSyncTestServer::SetPythonPath() const {
72 if (!LocalTestServer::SetPythonPath())
73 return false;
74
75 // Add the net/tools/testserver directory to the path, so that testserver_base
76 // can be imported.
77 base::FilePath net_testserver_path;
78 if (!LocalTestServer::GetTestServerPath(&net_testserver_path)) {
79 LOG(ERROR) << "Failed to get net testserver path.";
80 return false;
81 }
82 AppendToPythonPath(net_testserver_path.DirName());
83
84 // Locate the Python code generated by the sync protocol buffers compiler.
85 base::FilePath pyproto_dir;
86 if (!GetPyProtoPath(&pyproto_dir)) {
87 LOG(WARNING) << "Cannot find pyproto dir for generated code. "
88 << "Testserver features that rely on it will not work";
89 return true;
90 }
91 AppendToPythonPath(pyproto_dir.AppendASCII("sync").AppendASCII("protocol"));
92 return true;
93 }
94
95 } // namespace syncer
96