// 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.

#ifndef SYNC_TEST_LOCAL_SYNC_TEST_SERVER_H_
#define SYNC_TEST_LOCAL_SYNC_TEST_SERVER_H_

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "net/test/spawned_test_server/local_test_server.h"

namespace syncer {

// Runs a Python-based sync test server on the same machine on which the
// LocalSyncTestServer runs.
class LocalSyncTestServer : public net::LocalTestServer {
 public:
  // Initialize a sync server that listens on localhost using ephemeral ports
  // for sync and p2p notifications.
  LocalSyncTestServer();

  // Initialize a sync server that listens on |port| for sync updates and
  // |xmpp_port| for p2p notifications.
  LocalSyncTestServer(uint16 port, uint16 xmpp_port);

  ~LocalSyncTestServer() override;

  // Overriden from net::LocalTestServer.
  bool AddCommandLineArguments(base::CommandLine* command_line) const override;
  bool SetPythonPath() const override;
  bool GetTestServerPath(base::FilePath* testserver_path) const override;

  // Returns true if the path to |test_script_name| is successfully stored  in
  // |*test_script_path|. Used by the run_sync_testserver executable.
  bool GetTestScriptPath(const base::FilePath::StringType& test_script_name,
                         base::FilePath* test_script_path) const;

 private:
  // Port on which the Sync XMPP server listens.
  uint16 xmpp_port_;

  DISALLOW_COPY_AND_ASSIGN(LocalSyncTestServer);
};

}  // namespace syncer

#endif  // SYNC_TEST_LOCAL_SYNC_TEST_SERVER_H_
