// Copyright (c) 2012 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 "chrome/browser/safe_browsing/local_safebrowsing_test_server.h"

#include "base/command_line.h"
#include "base/path_service.h"
#include "base/strings/string_number_conversions.h"
#include "base/values.h"
#include "net/test/python_utils.h"
#include "net/test/spawned_test_server/spawned_test_server.h"

LocalSafeBrowsingTestServer::LocalSafeBrowsingTestServer(
    const base::FilePath& data_file)
    : net::LocalTestServer(net::SpawnedTestServer::TYPE_HTTP,
                           net::SpawnedTestServer::kLocalhost,
                           base::FilePath()),
      data_file_(data_file) {
}

LocalSafeBrowsingTestServer::~LocalSafeBrowsingTestServer() {}

bool LocalSafeBrowsingTestServer::GetTestServerPath(
    base::FilePath* testserver_path) const {
  base::FilePath testserver_dir;
  if (!PathService::Get(base::DIR_SOURCE_ROOT, &testserver_dir)) {
    LOG(ERROR) << "Failed to get DIR_SOURCE_ROOT";
    return false;
  }

  testserver_dir = testserver_dir
      .Append(FILE_PATH_LITERAL("chrome"))
      .Append(FILE_PATH_LITERAL("browser"))
      .Append(FILE_PATH_LITERAL("safe_browsing"));

  *testserver_path = testserver_dir.Append(FILE_PATH_LITERAL(
      "safe_browsing_testserver.py"));
  return true;
}

bool LocalSafeBrowsingTestServer::SetPythonPath() const {
  if (!net::LocalTestServer::SetPythonPath())
    return false;

  // Locate the Python code generated by the protocol buffers compiler.
  base::FilePath pyproto_dir;
  if (!GetPyProtoPath(&pyproto_dir)) {
    LOG(ERROR) << "Cannot find pyproto dir for generated code.";
    return false;
  }

  AppendToPythonPath(pyproto_dir.AppendASCII("google"));
  return true;
}

bool LocalSafeBrowsingTestServer::GenerateAdditionalArguments(
    base::DictionaryValue* arguments) const {
  arguments->SetString("data-file", data_file_.value());
  return true;
}
