// Copyright 2014 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 "mojo/shell/shell_test_base.h"

#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "build/build_config.h"
#include "mojo/shell/filename_util.h"
#include "url/gurl.h"

namespace mojo {
namespace shell {
namespace test {

ShellTestBase::ShellTestBase() {
}

ShellTestBase::~ShellTestBase() {
}

void ShellTestBase::SetUp() {
  shell_context_.Init();
  base::FilePath service_dir;
  CHECK(PathService::Get(base::DIR_MODULE, &service_dir));
}

ScopedMessagePipeHandle ShellTestBase::ConnectToService(
    const GURL& application_url,
    const std::string& service_name) {
  // Set the MojoURLResolver origin to be the same as the base file path for
  // local files. This is primarily for test convenience, so that references
  // to unknown mojo: urls that do not have specific local file or custom
  // mappings registered on the URL resolver are treated as shared libraries.
  base::FilePath service_dir;
  CHECK(PathService::Get(base::DIR_MODULE, &service_dir));
  shell_context_.mojo_url_resolver()->SetBaseURL(
      FilePathToFileURL(service_dir));

  return shell_context_.ConnectToServiceByName(
      application_url, service_name).Pass();
}

ScopedMessagePipeHandle ShellTestBase::ConnectToServiceViaNetwork(
    const GURL& application_url,
    const std::string& service_name) {
  return shell_context_.ConnectToServiceByName(
      application_url, service_name).Pass();
}

}  // namespace test
}  // namespace shell
}  // namespace mojo
