diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/loader/fetch/url_loader/cached_metadata_handler_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/loader/fetch/url_loader/cached_metadata_handler_test.cc | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/loader/fetch/url_loader/cached_metadata_handler_test.cc b/chromium/third_party/blink/renderer/platform/loader/fetch/url_loader/cached_metadata_handler_test.cc new file mode 100644 index 00000000000..330a1a62ad0 --- /dev/null +++ b/chromium/third_party/blink/renderer/platform/loader/fetch/url_loader/cached_metadata_handler_test.cc @@ -0,0 +1,162 @@ +// 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/url_loader/cached_metadata_handler.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/mojom/loader/code_cache.mojom.h" +#include "third_party/blink/public/platform/url_conversion.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 MockGeneratedCodeCache { + public: + const Vector<GURL>& CachedURLs() const { return cached_urls_; } + const Vector<GURL>& CacheStorageCachedURLs() const { + return cache_storage_cached_urls_; + } + + void CacheMetadata(mojom::CodeCacheType cache_type, + const GURL& gurl, + base::Time, + const uint8_t*, + size_t) { + cached_urls_.push_back(gurl); + } + + void CacheMetadataInCacheStorage(const GURL& gurl) { + cache_storage_cached_urls_.push_back(gurl); + } + + private: + Vector<GURL> cached_urls_; + Vector<GURL> cache_storage_cached_urls_; +}; + +class CodeCacheHostMockImpl : public blink::mojom::CodeCacheHost { + public: + explicit CodeCacheHostMockImpl(MockGeneratedCodeCache* sim) : sim_(sim) {} + + private: + // blink::mojom::CodeCacheHost implementation. + void DidGenerateCacheableMetadata(blink::mojom::CodeCacheType cache_type, + const GURL& url, + base::Time expected_response_time, + mojo_base::BigBuffer data) override { + sim_->CacheMetadata(cache_type, url, expected_response_time, data.data(), + data.size()); + } + + void FetchCachedCode(blink::mojom::CodeCacheType cache_type, + const GURL& url, + FetchCachedCodeCallback) override {} + void ClearCodeCacheEntry(blink::mojom::CodeCacheType cache_type, + const GURL& url) override {} + void DidGenerateCacheableMetadataInCacheStorage( + const GURL& url, + base::Time expected_response_time, + mojo_base::BigBuffer data, + const url::Origin& cache_storage_origin, + const std::string& cache_storage_cache_name) override { + sim_->CacheMetadataInCacheStorage(url); + } + + MockGeneratedCodeCache* sim_; +}; + +ResourceResponse CreateTestResourceResponse() { + ResourceResponse response(KURL("https://example.com/")); + response.SetHttpStatusCode(200); + return response; +} + +void SendDataFor(const ResourceResponse& response, + MockGeneratedCodeCache* disk) { + constexpr uint8_t kTestData[] = {1, 2, 3, 4, 5}; + std::unique_ptr<CachedMetadataSender> sender = CachedMetadataSender::Create( + response, mojom::CodeCacheType::kJavascript, + SecurityOrigin::Create(response.CurrentRequestUrl())); + + std::unique_ptr<blink::mojom::CodeCacheHost> code_cache_host = + std::make_unique<CodeCacheHostMockImpl>(CodeCacheHostMockImpl(disk)); + sender->Send(code_cache_host.get(), kTestData, sizeof(kTestData)); +} + +TEST(CachedMetadataHandlerTest, SendsMetadataToPlatform) { + MockGeneratedCodeCache mock_disk_cache; + ResourceResponse response(CreateTestResourceResponse()); + + SendDataFor(response, &mock_disk_cache); + EXPECT_EQ(1u, mock_disk_cache.CachedURLs().size()); + EXPECT_EQ(0u, mock_disk_cache.CacheStorageCachedURLs().size()); +} + +TEST( + CachedMetadataHandlerTest, + DoesNotSendMetadataToPlatformWhenFetchedViaServiceWorkerWithSyntheticResponse) { + MockGeneratedCodeCache mock_disk_cache; + + // Equivalent to service worker calling respondWith(new Response(...)) + ResourceResponse response(CreateTestResourceResponse()); + response.SetWasFetchedViaServiceWorker(true); + + SendDataFor(response, &mock_disk_cache); + EXPECT_EQ(0u, mock_disk_cache.CachedURLs().size()); + EXPECT_EQ(0u, mock_disk_cache.CacheStorageCachedURLs().size()); +} + +TEST( + CachedMetadataHandlerTest, + SendsMetadataToPlatformWhenFetchedViaServiceWorkerWithPassThroughResponse) { + MockGeneratedCodeCache mock_disk_cache; + + // Equivalent to service worker calling respondWith(fetch(evt.request.url)); + ResourceResponse response(CreateTestResourceResponse()); + response.SetWasFetchedViaServiceWorker(true); + response.SetUrlListViaServiceWorker({response.CurrentRequestUrl()}); + + SendDataFor(response, &mock_disk_cache); + EXPECT_EQ(1u, mock_disk_cache.CachedURLs().size()); + EXPECT_EQ(0u, mock_disk_cache.CacheStorageCachedURLs().size()); +} + +TEST( + CachedMetadataHandlerTest, + DoesNotSendMetadataToPlatformWhenFetchedViaServiceWorkerWithDifferentURLResponse) { + MockGeneratedCodeCache mock_disk_cache; + + // 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, &mock_disk_cache); + EXPECT_EQ(0u, mock_disk_cache.CachedURLs().size()); + EXPECT_EQ(0u, mock_disk_cache.CacheStorageCachedURLs().size()); +} + +TEST(CachedMetadataHandlerTest, + SendsMetadataToPlatformWhenFetchedViaServiceWorkerWithCacheResponse) { + MockGeneratedCodeCache mock_disk_cache; + + // Equivalent to service worker calling respondWith(cache.match(some_url)); + ResourceResponse response(CreateTestResourceResponse()); + response.SetWasFetchedViaServiceWorker(true); + response.SetCacheStorageCacheName("dummy"); + + SendDataFor(response, &mock_disk_cache); + EXPECT_EQ(0u, mock_disk_cache.CachedURLs().size()); + EXPECT_EQ(1u, mock_disk_cache.CacheStorageCachedURLs().size()); +} + +} // namespace +} // namespace blink |