chromium/fuchsia_web/webengine/test/web_engine_browser_test.cc

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "fuchsia_web/webengine/test/web_engine_browser_test.h"

#include <fuchsia/web/cpp/fidl.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/service_directory.h>
#include <lib/vfs/cpp/pseudo_dir.h>

#include <vector>

#include "base/command_line.h"
#include "base/fuchsia/fuchsia_logging.h"
#include "base/fuchsia/process_context.h"
#include "base/fuchsia/test_component_context_for_process.h"
#include "base/run_loop.h"
#include "fuchsia_web/webengine/browser/web_engine_browser_context.h"
#include "fuchsia_web/webengine/browser/web_engine_browser_main_parts.h"
#include "fuchsia_web/webengine/browser/web_engine_content_browser_client.h"
#include "fuchsia_web/webengine/switches.h"
#include "fuchsia_web/webengine/web_engine_main_delegate.h"
#include "net/test/embedded_test_server/default_handlers.h"
#include "ui/gfx/switches.h"
#include "ui/ozone/public/ozone_switches.h"

WebEngineBrowserTest::WebEngineBrowserTest() = default;

WebEngineBrowserTest::~WebEngineBrowserTest() = default;

void WebEngineBrowserTest::SetUp() {
  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
  SetUpCommandLine(command_line);
  BrowserTestBase::SetUp();
}

void WebEngineBrowserTest::PreRunTestOnMainThread() {
  zx_status_t status = published_services().Connect(context_.NewRequest());
  ZX_CHECK(status == ZX_OK, status) << "Connect fuchsia.web.Context";

  net::test_server::RegisterDefaultHandlers(embedded_test_server());
  if (!test_server_root_.empty()) {
    embedded_test_server()->ServeFilesFromSourceDirectory(test_server_root_);
  }
}

void WebEngineBrowserTest::PostRunTestOnMainThread() {
  // Unbind the Context while the message loops are still alive.
  context_.Unbind();

  // Shutting down the context needs to run connection error handlers
  // etc which normally are what causes the main loop to exit. Since in
  // tests we are not running a main loop indefinitely, we want to let those
  // things run, just as they would in production, before shutting down. This
  // makes the main loop run until breaking the connection completes.
  base::RunLoop().RunUntilIdle();
}

sys::ServiceDirectory& WebEngineBrowserTest::published_services() {
  if (!published_services_) {
    fidl::InterfaceRequest<fuchsia::io::Directory> svc_request;
    published_services_ =
        sys::ServiceDirectory::CreateWithRequest(&svc_request);
    base::ComponentContextForProcess()
        ->outgoing()
        ->GetOrCreateDirectory("svc")
        ->Serve(fuchsia::io::OpenFlags::RIGHT_READABLE |
                    fuchsia::io::OpenFlags::RIGHT_WRITABLE,
                svc_request.TakeChannel());
  }
  return *published_services_;
}

void WebEngineBrowserTest::SetHeadlessInCommandLine(
    base::CommandLine* command_line) {
  command_line->AppendSwitchNative(switches::kOzonePlatform,
                                   switches::kHeadless);
  command_line->AppendSwitch(switches::kHeadless);
}

ContextImpl* WebEngineBrowserTest::context_impl() const {
  // The ContentMainDelegate and ContentBrowserClient must already exist,
  // since those are created early on, before test setup or execution.
  auto* browser_client =
      WebEngineMainDelegate::GetInstanceForTest()->browser_client();
  CHECK(browser_client);

  auto* main_parts = browser_client->main_parts_for_test();
  CHECK(main_parts) << "context_impl() called too early in browser startup.";

  auto* context = main_parts->context_for_test();
  CHECK(context) << "context_impl() called before Context connected.";

  return context;
}

std::vector<FrameHostImpl*> WebEngineBrowserTest::frame_host_impls() const {
  // The ContentMainDelegate and ContentBrowserClient must already exist,
  // since those are created early on, before test setup or execution.
  auto* browser_client =
      WebEngineMainDelegate::GetInstanceForTest()->browser_client();
  CHECK(browser_client);

  auto* main_parts = browser_client->main_parts_for_test();
  CHECK(main_parts) << "frame_host_impl() called too early in browser startup.";

  return main_parts->frame_hosts_for_test();
}