// Copyright 2015 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/test/media_router/media_router_base_browsertest.h"

#include "base/bind.h"
#include "base/command_line.h"
#include "base/location.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/timer/elapsed_timer.h"
#include "chrome/browser/extensions/unpacked_installer.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/process_manager.h"
#include "extensions/common/switches.h"

namespace {
// Command line argument to specify unpacked extension location.
const char kExtensionUnpacked[] = "extension-unpacked";
}  // namespace


namespace media_router {

MediaRouterBaseBrowserTest::MediaRouterBaseBrowserTest()
    : extension_load_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
                            base::WaitableEvent::InitialState::NOT_SIGNALED),
      extension_host_created_(false) {
}

MediaRouterBaseBrowserTest::~MediaRouterBaseBrowserTest() {
}

void MediaRouterBaseBrowserTest::SetUp() {
  ParseCommandLine();
  // The integration and E2E tests depend on the WebUI Cast dialog, so the Views
  // dialog must be disabled.
  feature_list_.InitAndEnableFeature(features::kViewsCastDialog);
  ExtensionBrowserTest::SetUp();
}

void MediaRouterBaseBrowserTest::TearDown() {
  ExtensionBrowserTest::TearDown();
}

void MediaRouterBaseBrowserTest::SetUpOnMainThread() {
  ExtensionBrowserTest::SetUpOnMainThread();
  extensions::ProcessManager* process_manager = extensions::ProcessManager::Get(
      browser()->profile()->GetOriginalProfile());
  DCHECK(process_manager);
  process_manager->AddObserver(this);
  InstallAndEnableMRExtension();
  extension_load_event_.Wait();
}

void MediaRouterBaseBrowserTest::TearDownOnMainThread() {
  UninstallMRExtension();
  extensions::ProcessManager* process_manager =
      extensions::ProcessManager::Get(browser()->profile());
  DCHECK(process_manager);
  process_manager->RemoveObserver(this);
  ExtensionBrowserTest::TearDownOnMainThread();
}

void MediaRouterBaseBrowserTest::InstallAndEnableMRExtension() {
  const extensions::Extension* extension = LoadExtension(extension_unpacked_);
  extension_id_ = extension->id();
}

void MediaRouterBaseBrowserTest::UninstallMRExtension() {
  if (!extension_id_.empty()) {
    UninstallExtension(extension_id_);
  }
}

bool MediaRouterBaseBrowserTest::ConditionalWait(
    base::TimeDelta timeout,
    base::TimeDelta interval,
    const base::Callback<bool(void)>& callback) {
  base::ElapsedTimer timer;
  do {
    if (callback.Run())
      return true;

    base::RunLoop run_loop;
    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
        FROM_HERE, run_loop.QuitClosure(), interval);
    run_loop.Run();
  } while (timer.Elapsed() < timeout);

  return false;
}

void MediaRouterBaseBrowserTest::Wait(base::TimeDelta timeout) {
  base::RunLoop run_loop;
  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
      FROM_HERE, run_loop.QuitClosure(), timeout);
  run_loop.Run();
}

void MediaRouterBaseBrowserTest::OnBackgroundHostCreated(
    extensions::ExtensionHost* host) {
  extension_host_created_ = true;
  DVLOG(0) << "Host created";
  extension_load_event_.Signal();
}

void MediaRouterBaseBrowserTest::ParseCommandLine() {
  DVLOG(0) << "ParseCommandLine";
  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
  extension_unpacked_ = command_line->GetSwitchValuePath(kExtensionUnpacked);

  // No extension provided. Use the default component extension in Chromium.
  if (extension_unpacked_.empty()) {
    base::FilePath base_dir;
    ASSERT_TRUE(base::PathService::Get(base::DIR_MODULE, &base_dir));
    base::FilePath extension_path = base_dir.Append(FILE_PATH_LITERAL(
        "gen/chrome/browser/resources/media_router/extension"));
    if (PathExists(extension_path)) {
      extension_unpacked_ = extension_path;
    }
  }

  // An unpacked component extension must be provided.
  ASSERT_FALSE(extension_unpacked_.empty());
}

Browser* MediaRouterBaseBrowserTest::browser() {
  return ExtensionBrowserTest::browser();
}

}  // namespace media_router
