// Copyright 2017 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 "chromecast/browser/renderer_prelauncher.h"

#include <memory>

#include "base/command_line.h"
#include "base/run_loop.h"
#include "chromecast/base/chromecast_switches.h"
#include "chromecast/base/metrics/cast_metrics_helper.h"
#include "chromecast/browser/cast_browser_context.h"
#include "chromecast/browser/cast_browser_process.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/site_instance.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_base.h"

namespace chromecast {

class RendererPrelauncherTest : public content::BrowserTestBase {
 public:
  RendererPrelauncherTest() {}

  RendererPrelauncherTest(const RendererPrelauncherTest&) = delete;
  RendererPrelauncherTest& operator=(const RendererPrelauncherTest&) = delete;

  ~RendererPrelauncherTest() override {}

 protected:
  // content::BrowserTestBase implementation:
  void SetUp() override;
  void PreRunTestOnMainThread() override;
  void PostRunTestOnMainThread() override {}
};

void RendererPrelauncherTest::SetUp() {
  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
  command_line->AppendSwitchASCII(switches::kTestType, "browser");

  BrowserTestBase::SetUp();
}

void RendererPrelauncherTest::PreRunTestOnMainThread() {
  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  base::RunLoop().RunUntilIdle();

  metrics::CastMetricsHelper::GetInstance()->SetDummySessionIdForTesting();
}

IN_PROC_BROWSER_TEST_F(RendererPrelauncherTest, ReusedRenderer) {
  GURL gurl("https://www.google.com/");
  content::BrowserContext* browser_context =
      shell::CastBrowserProcess::GetInstance()->browser_context();
  EXPECT_TRUE(browser_context);

  // Prelaunch a renderer process for the url.
  auto prelauncher =
      std::make_unique<RendererPrelauncher>(browser_context, gurl);
  prelauncher->Prelaunch();
  scoped_refptr<content::SiteInstance> site_instance =
      prelauncher->site_instance();
  EXPECT_TRUE(site_instance->HasProcess());

  // Launch a web contents for the site instance.
  content::WebContents::CreateParams create_params(browser_context, nullptr);
  create_params.site_instance = site_instance;
  std::unique_ptr<content::WebContents> web_contents(
      content::WebContents::Create(create_params));
  EXPECT_EQ(site_instance->GetProcess(),
            web_contents->GetSiteInstance()->GetProcess());

  // Nativgate to the url.
  content::NavigationController::LoadURLParams params(gurl);
  web_contents->GetController().LoadURLWithParams(params);
  EXPECT_EQ(site_instance->GetProcess(),
            web_contents->GetSiteInstance()->GetProcess());

  // Ensure that the renderer process terminates.
  prelauncher.reset();
  web_contents.reset();
  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
          switches::kSingleProcess)) {
    EXPECT_FALSE(site_instance->HasProcess());
  }
}

}  // namespace chromecast
