blob: d9f2f162d1b1287852e90f1c234d3068bd3451de [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this sink code is governed by a BSD-style license that can be found
// in the LICENSE file.
#include "third_party/blink/renderer/platform/loader/fetch/cached_metadata_handler.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/mojom/loader/code_cache.mojom-blink.h"
#include "third_party/blink/public/platform/web_url.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_request.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_response.h"
#include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
namespace {
class MockPlatform final : public TestingPlatformSupportWithMockScheduler {
public:
MockPlatform() = default;
~MockPlatform() override = default;
// From blink::Platform:
void CacheMetadata(mojom::blink::CodeCacheType cache_type,
const WebURL& url,
base::Time,
const uint8_t*,
size_t) override {
cached_urls_.push_back(url);
}
void CacheMetadataInCacheStorage(const WebURL& url,
base::Time,
const uint8_t*,
size_t,
const WebSecurityOrigin&,
const WebString&) override {
cache_storage_cached_urls_.push_back(url);
}
const Vector<WebURL>& CachedURLs() const { return cached_urls_; }
const Vector<WebURL>& CacheStorageCachedURLs() const {
return cache_storage_cached_urls_;
}
private:
Vector<WebURL> cached_urls_;
Vector<WebURL> cache_storage_cached_urls_;
};
ResourceResponse CreateTestResourceResponse() {
ResourceResponse response(KURL("https://example.com/"));
response.SetHttpStatusCode(200);
return response;
}
void SendDataFor(const ResourceResponse& response) {
constexpr uint8_t kTestData[] = {1, 2, 3, 4, 5};
std::unique_ptr<CachedMetadataSender> sender = CachedMetadataSender::Create(
response, mojom::blink::CodeCacheType::kJavascript,
SecurityOrigin::Create(response.CurrentRequestUrl()));
sender->Send(kTestData, sizeof(kTestData));
}
TEST(CachedMetadataHandlerTest, SendsMetadataToPlatform) {
ScopedTestingPlatformSupport<MockPlatform> mock;
ResourceResponse response(CreateTestResourceResponse());
SendDataFor(response);
EXPECT_EQ(1u, mock->CachedURLs().size());
EXPECT_EQ(0u, mock->CacheStorageCachedURLs().size());
}
TEST(
CachedMetadataHandlerTest,
DoesNotSendMetadataToPlatformWhenFetchedViaServiceWorkerWithSyntheticResponse) {
ScopedTestingPlatformSupport<MockPlatform> mock;
// Equivalent to service worker calling respondWith(new Response(...))
ResourceResponse response(CreateTestResourceResponse());
response.SetWasFetchedViaServiceWorker(true);
SendDataFor(response);
EXPECT_EQ(0u, mock->CachedURLs().size());
EXPECT_EQ(0u, mock->CacheStorageCachedURLs().size());
}
TEST(
CachedMetadataHandlerTest,
SendsMetadataToPlatformWhenFetchedViaServiceWorkerWithPassThroughResponse) {
ScopedTestingPlatformSupport<MockPlatform> mock;
// Equivalent to service worker calling respondWith(fetch(evt.request.url));
ResourceResponse response(CreateTestResourceResponse());
response.SetWasFetchedViaServiceWorker(true);
response.SetUrlListViaServiceWorker({response.CurrentRequestUrl()});
SendDataFor(response);
EXPECT_EQ(1u, mock->CachedURLs().size());
EXPECT_EQ(0u, mock->CacheStorageCachedURLs().size());
}
TEST(
CachedMetadataHandlerTest,
DoesNotSendMetadataToPlatformWhenFetchedViaServiceWorkerWithDifferentURLResponse) {
ScopedTestingPlatformSupport<MockPlatform> mock;
// Equivalent to service worker calling respondWith(fetch(some_different_url))
ResourceResponse response(CreateTestResourceResponse());
response.SetWasFetchedViaServiceWorker(true);
response.SetUrlListViaServiceWorker(
{KURL("https://example.com/different/url")});
SendDataFor(response);
EXPECT_EQ(0u, mock->CachedURLs().size());
EXPECT_EQ(0u, mock->CacheStorageCachedURLs().size());
}
TEST(CachedMetadataHandlerTest,
SendsMetadataToPlatformWhenFetchedViaServiceWorkerWithCacheResponse) {
ScopedTestingPlatformSupport<MockPlatform> mock;
// Equivalent to service worker calling respondWith(cache.match(some_url));
ResourceResponse response(CreateTestResourceResponse());
response.SetWasFetchedViaServiceWorker(true);
response.SetCacheStorageCacheName("dummy");
SendDataFor(response);
EXPECT_EQ(0u, mock->CachedURLs().size());
EXPECT_EQ(1u, mock->CacheStorageCachedURLs().size());
}
} // namespace
} // namespace blink