Commit f55562d6 authored by Kenichi Ishibashi's avatar Kenichi Ishibashi Committed by Commit Bot

service worker: Remove direct use of old resource reader

This removes direct use of ServiceWorkerResponseReader from tests.
Tests use the mojo version instead.

Bug: 1055677
Change-Id: Id1d955a88d76b515c5e2be9ed0b8bd12dbade814
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2302978
Commit-Queue: Kenichi Ishibashi <bashi@chromium.org>
Reviewed-by: default avatarMakoto Shimazu <shimazu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789846}
parent 87fe6786
...@@ -367,7 +367,7 @@ TEST_F(ServiceWorkerInstalledScriptsSenderTest, FailedToSendMetaData) { ...@@ -367,7 +367,7 @@ TEST_F(ServiceWorkerInstalledScriptsSenderTest, FailedToSendMetaData) {
TEST_F(ServiceWorkerInstalledScriptsSenderTest, Histograms) { TEST_F(ServiceWorkerInstalledScriptsSenderTest, Histograms) {
const GURL kMainScriptURL = version()->script_url(); const GURL kMainScriptURL = version()->script_url();
// Use script bodies small enough to be read by one // Use script bodies small enough to be read by one
// ServiceWorkerResponseReader::ReadData(). The number of // ServiceWorkerResourceReader::ReadData(). The number of
// ServiceWorker.DiskCache.ReadResponseResult will be two per script (one is // ServiceWorker.DiskCache.ReadResponseResult will be two per script (one is
// reading the body and the other is saying EOD). // reading the body and the other is saying EOD).
std::map<GURL, ExpectedScriptInfo> kExpectedScriptInfoMap = { std::map<GURL, ExpectedScriptInfo> kExpectedScriptInfoMap = {
......
...@@ -239,7 +239,7 @@ class ServiceWorkerNewScriptLoaderTest : public testing::Test { ...@@ -239,7 +239,7 @@ class ServiceWorkerNewScriptLoaderTest : public testing::Test {
// Returns false if the entry for |url| doesn't exist in the storage. // Returns false if the entry for |url| doesn't exist in the storage.
bool VerifyStoredResponse(const GURL& url) { bool VerifyStoredResponse(const GURL& url) {
return ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse( return ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse(
LookupResourceId(url), context()->storage(), LookupResourceId(url), context()->GetStorageControl(),
mock_server_.Get(url).body); mock_server_.Get(url).body);
} }
......
...@@ -142,7 +142,7 @@ class ServiceWorkerScriptLoaderFactoryCopyResumeTest ...@@ -142,7 +142,7 @@ class ServiceWorkerScriptLoaderFactoryCopyResumeTest
// The response should also be stored in the storage. // The response should also be stored in the storage.
EXPECT_TRUE(ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse( EXPECT_TRUE(ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse(
version_->script_cache_map()->LookupResourceId(script_url_), version_->script_cache_map()->LookupResourceId(script_url_),
helper_->context()->storage(), expected_body)); helper_->context()->GetStorageControl(), expected_body));
EXPECT_TRUE(client_.has_received_response()); EXPECT_TRUE(client_.has_received_response());
EXPECT_TRUE(client_.response_body().is_valid()); EXPECT_TRUE(client_.response_body().is_valid());
......
...@@ -100,37 +100,6 @@ ReadResponseHeadResult ReadResponseHead( ...@@ -100,37 +100,6 @@ ReadResponseHeadResult ReadResponseHead(
return result; return result;
} }
class MockServiceWorkerDataPipeStateNotifier
: public storage::mojom::ServiceWorkerDataPipeStateNotifier {
public:
MockServiceWorkerDataPipeStateNotifier() = default;
mojo::PendingRemote<storage::mojom::ServiceWorkerDataPipeStateNotifier>
BindNewPipeAndPassRemote() {
return receiver_.BindNewPipeAndPassRemote();
}
int32_t WaitUntilComplete() {
if (!complete_status_.has_value()) {
loop_.Run();
DCHECK(complete_status_.has_value());
}
return *complete_status_;
}
private:
void OnComplete(int32_t status) override {
complete_status_ = status;
if (loop_.running())
loop_.Quit();
}
base::Optional<int32_t> complete_status_;
base::RunLoop loop_;
mojo::Receiver<storage::mojom::ServiceWorkerDataPipeStateNotifier> receiver_{
this};
};
ReadDataResult ReadResponseData( ReadDataResult ReadResponseData(
storage::mojom::ServiceWorkerResourceReader* reader, storage::mojom::ServiceWorkerResourceReader* reader,
int data_size) { int data_size) {
......
...@@ -61,7 +61,7 @@ namespace service_worker_storage_unittest { ...@@ -61,7 +61,7 @@ namespace service_worker_storage_unittest {
struct ReadResponseHeadResult { struct ReadResponseHeadResult {
int result; int result;
network::mojom::URLResponseHeadPtr response_head; network::mojom::URLResponseHeadPtr response_head;
scoped_refptr<net::IOBufferWithSize> metadata; base::Optional<mojo_base::BigBuffer> metadata;
}; };
using RegistrationData = storage::mojom::ServiceWorkerRegistrationData; using RegistrationData = storage::mojom::ServiceWorkerRegistrationData;
...@@ -185,15 +185,17 @@ int WriteBasicResponse( ...@@ -185,15 +185,17 @@ int WriteBasicResponse(
return WriteStringResponse(storage, id, headers, std::string(kHttpBody)); return WriteStringResponse(storage, id, headers, std::string(kHttpBody));
} }
ReadResponseHeadResult ReadResponseHead(ServiceWorkerStorage* storage, ReadResponseHeadResult ReadResponseHead(
mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
int64_t id) { int64_t id) {
mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
storage->CreateResourceReader(id, reader.BindNewPipeAndPassReceiver());
ReadResponseHeadResult out; ReadResponseHeadResult out;
base::RunLoop loop; base::RunLoop loop;
std::unique_ptr<ServiceWorkerResponseReader> reader =
storage->CreateResponseReader(id);
reader->ReadResponseHead(base::BindLambdaForTesting( reader->ReadResponseHead(base::BindLambdaForTesting(
[&](int result, network::mojom::URLResponseHeadPtr response_head, [&](int result, network::mojom::URLResponseHeadPtr response_head,
scoped_refptr<net::IOBufferWithSize> metadata) { base::Optional<mojo_base::BigBuffer> metadata) {
out.result = result; out.result = result;
out.response_head = std::move(response_head); out.response_head = std::move(response_head);
out.metadata = std::move(metadata); out.metadata = std::move(metadata);
...@@ -203,36 +205,45 @@ ReadResponseHeadResult ReadResponseHead(ServiceWorkerStorage* storage, ...@@ -203,36 +205,45 @@ ReadResponseHeadResult ReadResponseHead(ServiceWorkerStorage* storage,
return out; return out;
} }
bool VerifyBasicResponse(ServiceWorkerStorage* storage, bool VerifyBasicResponse(
mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
int64_t id, int64_t id,
bool expected_positive_result) { bool expected_positive_result) {
const std::string kExpectedHttpBody("Hello"); const std::string kExpectedHttpBody("Hello");
std::unique_ptr<ServiceWorkerResponseReader> reader =
storage->CreateResponseReader(id);
ReadResponseHeadResult out = ReadResponseHead(storage, id); ReadResponseHeadResult out = ReadResponseHead(storage, id);
if (expected_positive_result) if (expected_positive_result)
EXPECT_LT(0, out.result); EXPECT_LT(0, out.result);
if (out.result <= 0) if (out.result <= 0)
return false; return false;
std::string received_body; mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
storage->CreateResourceReader(id, reader.BindNewPipeAndPassReceiver());
const int kBigEnough = 512; const int kBigEnough = 512;
scoped_refptr<net::IOBuffer> buffer = MockServiceWorkerDataPipeStateNotifier notifier;
base::MakeRefCounted<IOBuffer>(kBigEnough); mojo::ScopedDataPipeConsumerHandle data_consumer;
TestCompletionCallback cb; base::RunLoop loop;
reader->ReadData(buffer.get(), kBigEnough, cb.callback()); reader->ReadData(
int rv = cb.WaitForResult(); kBigEnough, notifier.BindNewPipeAndPassRemote(),
base::BindLambdaForTesting([&](mojo::ScopedDataPipeConsumerHandle pipe) {
data_consumer = std::move(pipe);
loop.Quit();
}));
loop.Run();
std::string body = ReadDataPipe(std::move(data_consumer));
int rv = notifier.WaitUntilComplete();
EXPECT_EQ(static_cast<int>(kExpectedHttpBody.size()), rv); EXPECT_EQ(static_cast<int>(kExpectedHttpBody.size()), rv);
if (rv <= 0) if (rv <= 0)
return false; return false;
received_body.assign(buffer->data(), rv);
bool status_match = bool status_match =
std::string("HONKYDORY") == out.response_head->headers->GetStatusText(); std::string("HONKYDORY") == out.response_head->headers->GetStatusText();
bool data_match = kExpectedHttpBody == received_body; bool data_match = kExpectedHttpBody == body;
EXPECT_EQ(out.response_head->headers->GetStatusText(), "HONKYDORY"); EXPECT_EQ(out.response_head->headers->GetStatusText(), "HONKYDORY");
EXPECT_EQ(received_body, kExpectedHttpBody); EXPECT_EQ(body, kExpectedHttpBody);
return status_match && data_match; return status_match && data_match;
} }
...@@ -266,13 +277,14 @@ int ClearMetadata(ServiceWorkerVersion* version, const GURL& url) { ...@@ -266,13 +277,14 @@ int ClearMetadata(ServiceWorkerVersion* version, const GURL& url) {
return cb.WaitForResult(); return cb.WaitForResult();
} }
bool VerifyResponseMetadata(ServiceWorkerStorage* storage, bool VerifyResponseMetadata(
mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
int64_t id, int64_t id,
const std::string& expected_metadata) { const std::string& expected_metadata) {
std::unique_ptr<ServiceWorkerResponseReader> reader = mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
storage->CreateResponseReader(id); storage->CreateResourceReader(id, reader.BindNewPipeAndPassReceiver());
ReadResponseHeadResult out = ReadResponseHead(storage, id); ReadResponseHeadResult out = ReadResponseHead(storage, id);
if (!out.metadata.get()) if (!out.metadata.has_value())
return false; return false;
EXPECT_EQ(0, memcmp(expected_metadata.data(), out.metadata->data(), EXPECT_EQ(0, memcmp(expected_metadata.data(), out.metadata->data(),
expected_metadata.length())); expected_metadata.length()));
...@@ -702,7 +714,7 @@ TEST_F(ServiceWorkerStorageTest, DisabledStorage) { ...@@ -702,7 +714,7 @@ TEST_F(ServiceWorkerStorageTest, DisabledStorage) {
// Response reader and writer created by the disabled storage should fail to // Response reader and writer created by the disabled storage should fail to
// access the disk cache. // access the disk cache.
ReadResponseHeadResult out = ReadResponseHead(storage(), kResourceId); ReadResponseHeadResult out = ReadResponseHead(storage_control(), kResourceId);
EXPECT_EQ(net::ERR_CACHE_MISS, out.result); EXPECT_EQ(net::ERR_CACHE_MISS, out.result);
EXPECT_EQ(net::ERR_FAILED, EXPECT_EQ(net::ERR_FAILED,
WriteBasicResponse(storage_control(), kResourceId)); WriteBasicResponse(storage_control(), kResourceId));
...@@ -1320,8 +1332,8 @@ class ServiceWorkerResourceStorageTest : public ServiceWorkerStorageTest { ...@@ -1320,8 +1332,8 @@ class ServiceWorkerResourceStorageTest : public ServiceWorkerStorageTest {
// And dump something in the disk cache for them. // And dump something in the disk cache for them.
WriteBasicResponse(storage_control(), resource_id1_); WriteBasicResponse(storage_control(), resource_id1_);
WriteBasicResponse(storage_control(), resource_id2_); WriteBasicResponse(storage_control(), resource_id2_);
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id2_, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
// Storing the registration/version should take the resources ids out // Storing the registration/version should take the resources ids out
// of the uncommitted list. // of the uncommitted list.
...@@ -1366,19 +1378,21 @@ TEST_F(ServiceWorkerResourceStorageTest, ...@@ -1366,19 +1378,21 @@ TEST_F(ServiceWorkerResourceStorageTest,
// Check metadata is written. // Check metadata is written.
EXPECT_EQ(static_cast<int>(strlen(kMetadata1)), EXPECT_EQ(static_cast<int>(strlen(kMetadata1)),
WriteResponseMetadata(storage(), resource_id1_, kMetadata1)); WriteResponseMetadata(storage(), resource_id1_, kMetadata1));
EXPECT_TRUE(VerifyResponseMetadata(storage(), resource_id1_, kMetadata1)); EXPECT_TRUE(
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata1));
EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
// Check metadata is written and truncated. // Check metadata is written and truncated.
EXPECT_EQ(static_cast<int>(strlen(kMetadata2)), EXPECT_EQ(static_cast<int>(strlen(kMetadata2)),
WriteResponseMetadata(storage(), resource_id1_, kMetadata2)); WriteResponseMetadata(storage(), resource_id1_, kMetadata2));
EXPECT_TRUE(VerifyResponseMetadata(storage(), resource_id1_, kMetadata2)); EXPECT_TRUE(
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata2));
EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
// Check metadata is deleted. // Check metadata is deleted.
EXPECT_EQ(0, WriteResponseMetadata(storage(), resource_id1_, "")); EXPECT_EQ(0, WriteResponseMetadata(storage(), resource_id1_, ""));
EXPECT_FALSE(VerifyResponseMetadata(storage(), resource_id1_, "")); EXPECT_FALSE(VerifyResponseMetadata(storage_control(), resource_id1_, ""));
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
} }
TEST_F(ServiceWorkerResourceStorageTest, TEST_F(ServiceWorkerResourceStorageTest,
...@@ -1399,19 +1413,21 @@ TEST_F(ServiceWorkerResourceStorageTest, ...@@ -1399,19 +1413,21 @@ TEST_F(ServiceWorkerResourceStorageTest,
// Check metadata is written. // Check metadata is written.
EXPECT_EQ(static_cast<int>(strlen(kMetadata1)), EXPECT_EQ(static_cast<int>(strlen(kMetadata1)),
WriteMetadata(version, script_, kMetadata1)); WriteMetadata(version, script_, kMetadata1));
EXPECT_TRUE(VerifyResponseMetadata(storage(), resource_id1_, kMetadata1)); EXPECT_TRUE(
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata1));
EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
// Check metadata is written and truncated. // Check metadata is written and truncated.
EXPECT_EQ(static_cast<int>(strlen(kMetadata2)), EXPECT_EQ(static_cast<int>(strlen(kMetadata2)),
WriteMetadata(version, script_, kMetadata2)); WriteMetadata(version, script_, kMetadata2));
EXPECT_TRUE(VerifyResponseMetadata(storage(), resource_id1_, kMetadata2)); EXPECT_TRUE(
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); VerifyResponseMetadata(storage_control(), resource_id1_, kMetadata2));
EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
// Check metadata is deleted. // Check metadata is deleted.
EXPECT_EQ(0, ClearMetadata(version, script_)); EXPECT_EQ(0, ClearMetadata(version, script_));
EXPECT_FALSE(VerifyResponseMetadata(storage(), resource_id1_, "")); EXPECT_FALSE(VerifyResponseMetadata(storage_control(), resource_id1_, ""));
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
} }
TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_NoLiveVersion) { TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_NoLiveVersion) {
...@@ -1428,8 +1444,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_NoLiveVersion) { ...@@ -1428,8 +1444,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_NoLiveVersion) {
loop.Run(); loop.Run();
EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty()); EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id1_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id2_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
} }
TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_WaitingVersion) { TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_WaitingVersion) {
...@@ -1440,8 +1456,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_WaitingVersion) { ...@@ -1440,8 +1456,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_WaitingVersion) {
DeleteRegistration(registration_, scope_.GetOrigin())); DeleteRegistration(registration_, scope_.GetOrigin()));
EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size()); EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size());
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, false)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, false));
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id2_, false)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, false));
// Doom the version. The resources should be purged. // Doom the version. The resources should be purged.
base::RunLoop loop; base::RunLoop loop;
...@@ -1450,8 +1466,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_WaitingVersion) { ...@@ -1450,8 +1466,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_WaitingVersion) {
loop.Run(); loop.Run();
EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty()); EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id1_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id2_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
} }
TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_ActiveVersion) { TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_ActiveVersion) {
...@@ -1474,8 +1490,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_ActiveVersion) { ...@@ -1474,8 +1490,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_ActiveVersion) {
DeleteRegistration(registration_, scope_.GetOrigin())); DeleteRegistration(registration_, scope_.GetOrigin()));
EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size()); EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size());
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id2_, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
// Dooming the version should cause the resources to be deleted. // Dooming the version should cause the resources to be deleted.
base::RunLoop loop; base::RunLoop loop;
...@@ -1486,8 +1502,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_ActiveVersion) { ...@@ -1486,8 +1502,8 @@ TEST_F(ServiceWorkerResourceStorageTest, DeleteRegistration_ActiveVersion) {
loop.Run(); loop.Run();
EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty()); EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id1_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id2_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
} }
TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) { TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) {
...@@ -1512,8 +1528,8 @@ TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) { ...@@ -1512,8 +1528,8 @@ TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) {
std::vector<int64_t> verify_ids = GetPurgeableResourceIdsFromDB(); std::vector<int64_t> verify_ids = GetPurgeableResourceIdsFromDB();
EXPECT_EQ(2u, verify_ids.size()); EXPECT_EQ(2u, verify_ids.size());
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, true));
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id2_, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, true));
// Also add an uncommitted resource. // Also add an uncommitted resource.
int64_t kStaleUncommittedResourceId = GetNewResourceIdSync(storage()); int64_t kStaleUncommittedResourceId = GetNewResourceIdSync(storage());
...@@ -1522,8 +1538,8 @@ TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) { ...@@ -1522,8 +1538,8 @@ TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) {
verify_ids = GetUncommittedResourceIdsFromDB(); verify_ids = GetUncommittedResourceIdsFromDB();
EXPECT_EQ(1u, verify_ids.size()); EXPECT_EQ(1u, verify_ids.size());
WriteBasicResponse(storage_control(), kStaleUncommittedResourceId); WriteBasicResponse(storage_control(), kStaleUncommittedResourceId);
EXPECT_TRUE( EXPECT_TRUE(VerifyBasicResponse(storage_control(),
VerifyBasicResponse(storage(), kStaleUncommittedResourceId, true)); kStaleUncommittedResourceId, true));
// Simulate browser shutdown. The purgeable and uncommitted resources are now // Simulate browser shutdown. The purgeable and uncommitted resources are now
// stale. // stale.
...@@ -1546,11 +1562,11 @@ TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) { ...@@ -1546,11 +1562,11 @@ TEST_F(ServiceWorkerResourceStorageDiskTest, CleanupOnRestart) {
verify_ids = GetPurgeableResourceIdsFromDB(); verify_ids = GetPurgeableResourceIdsFromDB();
EXPECT_TRUE(verify_ids.empty()); EXPECT_TRUE(verify_ids.empty());
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id1_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id2_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
EXPECT_FALSE( EXPECT_FALSE(VerifyBasicResponse(storage_control(),
VerifyBasicResponse(storage(), kStaleUncommittedResourceId, false)); kStaleUncommittedResourceId, false));
EXPECT_TRUE(VerifyBasicResponse(storage(), kNewResourceId, true)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), kNewResourceId, true));
} }
TEST_F(ServiceWorkerResourceStorageDiskTest, DeleteAndStartOver) { TEST_F(ServiceWorkerResourceStorageDiskTest, DeleteAndStartOver) {
...@@ -1663,8 +1679,8 @@ TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration) { ...@@ -1663,8 +1679,8 @@ TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration) {
EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size()); EXPECT_EQ(2u, GetPurgeableResourceIdsFromDB().size());
EXPECT_TRUE(GetPurgingResources().empty()); EXPECT_TRUE(GetPurgingResources().empty());
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id1_, false)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id1_, false));
EXPECT_TRUE(VerifyBasicResponse(storage(), resource_id2_, false)); EXPECT_TRUE(VerifyBasicResponse(storage_control(), resource_id2_, false));
// Remove the controllee to allow the new version to become active, making the // Remove the controllee to allow the new version to become active, making the
// old version redundant. // old version redundant.
...@@ -1679,8 +1695,8 @@ TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration) { ...@@ -1679,8 +1695,8 @@ TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration) {
// Its resources should be purged. // Its resources should be purged.
loop.Run(); loop.Run();
EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty()); EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id1_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id2_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
} }
TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration_NoLiveVersion) { TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration_NoLiveVersion) {
...@@ -1717,8 +1733,8 @@ TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration_NoLiveVersion) { ...@@ -1717,8 +1733,8 @@ TEST_F(ServiceWorkerResourceStorageTest, UpdateRegistration_NoLiveVersion) {
// The resources should be purged. // The resources should be purged.
loop.Run(); loop.Run();
EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty()); EXPECT_TRUE(GetPurgeableResourceIdsFromDB().empty());
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id1_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id1_, false));
EXPECT_FALSE(VerifyBasicResponse(storage(), resource_id2_, false)); EXPECT_FALSE(VerifyBasicResponse(storage_control(), resource_id2_, false));
} }
// Test fixture that uses disk storage, rather than memory. Useful for tests // Test fixture that uses disk storage, rather than memory. Useful for tests
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include <vector> #include <vector>
#include "base/barrier_closure.h" #include "base/barrier_closure.h"
#include "base/run_loop.h"
#include "base/test/bind_test_util.h" #include "base/test/bind_test_util.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/frame_tree_node.h"
...@@ -707,6 +706,33 @@ void MockServiceWorkerResourceWriter::CompletePendingWrite() { ...@@ -707,6 +706,33 @@ void MockServiceWorkerResourceWriter::CompletePendingWrite() {
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
} }
MockServiceWorkerDataPipeStateNotifier::
MockServiceWorkerDataPipeStateNotifier() = default;
MockServiceWorkerDataPipeStateNotifier::
~MockServiceWorkerDataPipeStateNotifier() = default;
mojo::PendingRemote<storage::mojom::ServiceWorkerDataPipeStateNotifier>
MockServiceWorkerDataPipeStateNotifier::BindNewPipeAndPassRemote() {
return receiver_.BindNewPipeAndPassRemote();
}
int32_t MockServiceWorkerDataPipeStateNotifier::WaitUntilComplete() {
if (!complete_status_.has_value()) {
base::RunLoop loop;
on_complete_callback_ = loop.QuitClosure();
loop.Run();
DCHECK(complete_status_.has_value());
}
return *complete_status_;
}
void MockServiceWorkerDataPipeStateNotifier::OnComplete(int32_t status) {
complete_status_ = status;
if (on_complete_callback_)
std::move(on_complete_callback_).Run();
}
ServiceWorkerUpdateCheckTestUtils::ServiceWorkerUpdateCheckTestUtils() = ServiceWorkerUpdateCheckTestUtils::ServiceWorkerUpdateCheckTestUtils() =
default; default;
ServiceWorkerUpdateCheckTestUtils::~ServiceWorkerUpdateCheckTestUtils() = ServiceWorkerUpdateCheckTestUtils::~ServiceWorkerUpdateCheckTestUtils() =
...@@ -848,43 +874,57 @@ void ServiceWorkerUpdateCheckTestUtils:: ...@@ -848,43 +874,57 @@ void ServiceWorkerUpdateCheckTestUtils::
bool ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse( bool ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse(
int64_t resource_id, int64_t resource_id,
ServiceWorkerStorage* storage, mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
const std::string& expected_body) { const std::string& expected_body) {
DCHECK(storage); DCHECK(storage);
if (resource_id == blink::mojom::kInvalidServiceWorkerResourceId) if (resource_id == blink::mojom::kInvalidServiceWorkerResourceId)
return false; return false;
mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader;
storage->CreateResourceReader(resource_id,
reader.BindNewPipeAndPassReceiver());
// Verify the response status. // Verify the response status.
size_t response_data_size = 0; size_t response_data_size = 0;
{ {
std::unique_ptr<ServiceWorkerResponseReader> reader = int rv;
storage->CreateResponseReader(resource_id); std::string status_text;
auto info_buffer = base::MakeRefCounted<HttpResponseInfoIOBuffer>(); base::RunLoop loop;
net::TestCompletionCallback cb; reader->ReadResponseHead(base::BindLambdaForTesting(
reader->ReadInfo(info_buffer.get(), cb.callback()); [&](int status, network::mojom::URLResponseHeadPtr response_head,
int rv = cb.WaitForResult(); base::Optional<mojo_base::BigBuffer> metadata) {
rv = status;
status_text = response_head->headers->GetStatusText();
response_data_size = response_head->content_length;
loop.Quit();
}));
loop.Run();
if (rv < 0) if (rv < 0)
return false; return false;
EXPECT_LT(0, rv); EXPECT_LT(0, rv);
EXPECT_EQ("OK", info_buffer->http_info->headers->GetStatusText()); EXPECT_EQ("OK", status_text);
response_data_size = info_buffer->response_data_size;
} }
// Verify the response body. // Verify the response body.
{ {
std::unique_ptr<ServiceWorkerResponseReader> reader = MockServiceWorkerDataPipeStateNotifier notifier;
storage->CreateResponseReader(resource_id); mojo::ScopedDataPipeConsumerHandle data_consumer;
auto buffer = base::RunLoop loop;
base::MakeRefCounted<net::IOBufferWithSize>(response_data_size); reader->ReadData(response_data_size, notifier.BindNewPipeAndPassRemote(),
net::TestCompletionCallback cb; base::BindLambdaForTesting(
reader->ReadData(buffer.get(), buffer->size(), cb.callback()); [&](mojo::ScopedDataPipeConsumerHandle pipe) {
int rv = cb.WaitForResult(); data_consumer = std::move(pipe);
loop.Quit();
}));
loop.Run();
std::string body = ReadDataPipe(std::move(data_consumer));
int rv = notifier.WaitUntilComplete();
if (rv < 0) if (rv < 0)
return false; return false;
EXPECT_EQ(static_cast<int>(expected_body.size()), rv); EXPECT_EQ(static_cast<int>(expected_body.size()), rv);
EXPECT_EQ(expected_body, body);
std::string received_body(buffer->data(), rv);
EXPECT_EQ(expected_body, received_body);
} }
return true; return true;
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/run_loop.h"
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "components/services/storage/public/mojom/service_worker_storage_control.mojom.h" #include "components/services/storage/public/mojom/service_worker_storage_control.mojom.h"
#include "content/browser/service_worker/service_worker_cache_writer.h" #include "content/browser/service_worker/service_worker_cache_writer.h"
...@@ -372,6 +373,28 @@ class MockServiceWorkerResourceWriter ...@@ -372,6 +373,28 @@ class MockServiceWorkerResourceWriter
DISALLOW_COPY_AND_ASSIGN(MockServiceWorkerResourceWriter); DISALLOW_COPY_AND_ASSIGN(MockServiceWorkerResourceWriter);
}; };
// A test implementation of ServiceWorkerDataPipeStateNotifier.
class MockServiceWorkerDataPipeStateNotifier
: public storage::mojom::ServiceWorkerDataPipeStateNotifier {
public:
MockServiceWorkerDataPipeStateNotifier();
~MockServiceWorkerDataPipeStateNotifier() override;
mojo::PendingRemote<storage::mojom::ServiceWorkerDataPipeStateNotifier>
BindNewPipeAndPassRemote();
int32_t WaitUntilComplete();
private:
// storage::mojom::ServiceWorkerDataPipeStateNotifier implementations:
void OnComplete(int32_t status) override;
base::Optional<int32_t> complete_status_;
base::OnceClosure on_complete_callback_;
mojo::Receiver<storage::mojom::ServiceWorkerDataPipeStateNotifier> receiver_{
this};
};
class ServiceWorkerUpdateCheckTestUtils { class ServiceWorkerUpdateCheckTestUtils {
public: public:
ServiceWorkerUpdateCheckTestUtils(); ServiceWorkerUpdateCheckTestUtils();
...@@ -428,8 +451,9 @@ class ServiceWorkerUpdateCheckTestUtils { ...@@ -428,8 +451,9 @@ class ServiceWorkerUpdateCheckTestUtils {
// Returns false if the entry for |resource_id| doesn't exist in the storage. // Returns false if the entry for |resource_id| doesn't exist in the storage.
// Returns true when response status is "OK" and response body is same as // Returns true when response status is "OK" and response body is same as
// expected if body exists. // expected if body exists.
static bool VerifyStoredResponse(int64_t resource_id, static bool VerifyStoredResponse(
ServiceWorkerStorage* storage, int64_t resource_id,
mojo::Remote<storage::mojom::ServiceWorkerStorageControl>& storage,
const std::string& expected_body); const std::string& expected_body);
}; };
......
...@@ -167,7 +167,8 @@ class ServiceWorkerUpdatedScriptLoaderTest : public testing::Test { ...@@ -167,7 +167,8 @@ class ServiceWorkerUpdatedScriptLoaderTest : public testing::Test {
// The response should also be stored in the storage. // The response should also be stored in the storage.
EXPECT_TRUE(ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse( EXPECT_TRUE(ServiceWorkerUpdateCheckTestUtils::VerifyStoredResponse(
LookupResourceId(kScriptURL), context()->storage(), expected_body)); LookupResourceId(kScriptURL), context()->GetStorageControl(),
expected_body));
std::string response; std::string response;
EXPECT_TRUE(mojo::BlockingCopyToString(client_->response_body_release(), EXPECT_TRUE(mojo::BlockingCopyToString(client_->response_body_release(),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment