1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115

content / public / test / embedded_worker_instance_test_harness.cc [blame]

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

#include "content/public/test/embedded_worker_instance_test_harness.h"

#include <stdint.h>

#include "base/run_loop.h"
#include "base/test/test_future.h"
#include "content/browser/service_worker/embedded_worker_instance.h"
#include "content/browser/service_worker/embedded_worker_test_helper.h"
#include "content/browser/service_worker/service_worker_hid_delegate_observer.h"
#include "content/browser/service_worker/service_worker_test_utils.h"
#include "content/browser/service_worker/service_worker_usb_delegate_observer.h"
#include "content/public/test/test_browser_context.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace content {

EmbeddedWorkerInstanceTestHarness::~EmbeddedWorkerInstanceTestHarness() =
    default;

void EmbeddedWorkerInstanceTestHarness::SetUp() {
  helper_ = std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath(),
                                                       CreateBrowserContext());
}

void EmbeddedWorkerInstanceTestHarness::TearDown() {
  helper_.reset();
}

std::unique_ptr<BrowserContext>
EmbeddedWorkerInstanceTestHarness::CreateBrowserContext() {
  return std::make_unique<TestBrowserContext>();
}

void EmbeddedWorkerInstanceTestHarness::CreateAndStartWorker(
    const GURL& origin,
    const GURL& worker_url) {
  EXPECT_EQ(worker_version_, nullptr);
  EmbeddedWorkerTestHelper::RegistrationAndVersionPair pair =
      helper_->PrepareRegistrationAndVersion(origin, worker_url);

  worker_version_ = pair.second;
  std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> records;
  records.push_back(WriteToDiskCacheWithIdSync(
      helper_->context()->GetStorageControl(), worker_version_->script_url(),
      10, {} /* headers */, "I'm a body", "I'm a meta data"));
  worker_version_->script_cache_map()->SetResources(records);
  worker_version_->SetMainScriptResponse(
      EmbeddedWorkerTestHelper::CreateMainScriptResponse());
  worker_version_->set_fetch_handler_type(
      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);

  content::HidDelegate* hid_delegate =
      content::GetContentClientForTesting()->browser()->GetHidDelegate();
  worker_version_->set_has_hid_event_handlers(
      hid_delegate && hid_delegate->IsServiceWorkerAllowedForOrigin(
                          url::Origin::Create(origin)));

  content::UsbDelegate* usb_delegate =
      content::GetContentClientForTesting()->browser()->GetUsbDelegate();
  worker_version_->set_has_usb_event_handlers(
      usb_delegate && usb_delegate->IsServiceWorkerAllowedForOrigin(
                          url::Origin::Create(origin)));

  worker_version_->SetStatus(ServiceWorkerVersion::Status::ACTIVATED);
  pair.first->SetActiveVersion(worker_version_);

  // Make the registration findable via storage functions.
  base::test::TestFuture<blink::ServiceWorkerStatusCode> status;
  helper_->context()->registry()->StoreRegistration(
      pair.first.get(), pair.second.get(), status.GetCallback());
  ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, status.Get());

  StartServiceWorker(worker_version_.get());
  ASSERT_EQ(worker_version_->embedded_worker()->status(),
            blink::EmbeddedWorkerStatus::kRunning);
}

void EmbeddedWorkerInstanceTestHarness::StopAndResetWorker() {
  EXPECT_NE(worker_version_, nullptr);
  StopServiceWorker(worker_version_.get());
  ASSERT_EQ(worker_version_->embedded_worker()->status(),
            blink::EmbeddedWorkerStatus::kStopped);
  worker_version_.reset();
}

#if !BUILDFLAG(IS_ANDROID)
void EmbeddedWorkerInstanceTestHarness::BindHidServiceToWorker(
    const GURL& origin,
    mojo::PendingReceiver<blink::mojom::HidService> receiver) {
  EmbeddedWorkerInstance* worker = worker_version_->embedded_worker();
  EXPECT_NE(worker, nullptr);
  worker->BindHidService(url::Origin::Create(origin), std::move(receiver));
}
#endif  // !BUILDFLAG(IS_ANDROID)

void EmbeddedWorkerInstanceTestHarness::BindUsbServiceToWorker(
    const GURL& origin,
    mojo::PendingReceiver<blink::mojom::WebUsbService> receiver) {
  EmbeddedWorkerInstance* worker = worker_version_->embedded_worker();
  EXPECT_NE(worker, nullptr);
  worker->BindUsbService(url::Origin::Create(origin), std::move(receiver));
}

EmbeddedWorkerInstanceTestHarness::EmbeddedWorkerInstanceTestHarness(
    std::unique_ptr<BrowserTaskEnvironment> task_environment)
    : task_environment_(std::move(task_environment)) {}

}  // namespace content