| Index: services/url_response_disk_cache/url_response_disk_cache_apptest.cc
|
| diff --git a/services/url_response_disk_cache/url_response_disk_cache_apptest.cc b/services/url_response_disk_cache/url_response_disk_cache_apptest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6b543de5a6ed8683210b4efe1b0e275b36d3211b
|
| --- /dev/null
|
| +++ b/services/url_response_disk_cache/url_response_disk_cache_apptest.cc
|
| @@ -0,0 +1,267 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/files/file_util.h"
|
| +#include "base/rand_util.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/strings/stringprintf.h"
|
| +#include "mojo/public/cpp/application/application_impl.h"
|
| +#include "mojo/public/cpp/application/application_test_base.h"
|
| +#include "mojo/public/cpp/system/data_pipe.h"
|
| +#include "mojo/services/network/public/interfaces/url_loader.mojom.h"
|
| +#include "mojo/services/url_response_disk_cache/public/interfaces/url_response_disk_cache.mojom.h"
|
| +#include "services/url_response_disk_cache/kTestData.h"
|
| +
|
| +namespace mojo {
|
| +
|
| +namespace {
|
| +
|
| +class URLResponseDiskCacheAppTest : public mojo::test::ApplicationTestBase {
|
| + public:
|
| + URLResponseDiskCacheAppTest() : ApplicationTestBase() {}
|
| + ~URLResponseDiskCacheAppTest() override {}
|
| +
|
| + void SetUp() override {
|
| + mojo::test::ApplicationTestBase::SetUp();
|
| + application_impl()->ConnectToService("mojo:url_response_disk_cache",
|
| + &url_response_disk_cache_);
|
| + }
|
| +
|
| + protected:
|
| + URLResponseDiskCachePtr url_response_disk_cache_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(URLResponseDiskCacheAppTest);
|
| +};
|
| +
|
| +base::FilePath toPath(Array<uint8_t> path) {
|
| + if (path.is_null()) {
|
| + return base::FilePath();
|
| + }
|
| + return base::FilePath(
|
| + std::string(reinterpret_cast<char*>(&path.front()), path.size()));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(URLResponseDiskCacheAppTest, GetFile) {
|
| + URLResponsePtr url_response = mojo::URLResponse::New();
|
| + url_response->url = "http://www.example.com/1";
|
| + url_response->headers = Array<String>(1);
|
| + url_response->headers[0] = base::StringPrintf("ETag: %f", base::RandDouble());
|
| + DataPipe pipe;
|
| + std::string content = base::RandBytesAsString(32);
|
| + uint32_t num_bytes = content.size();
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + WriteDataRaw(pipe.producer_handle.get(), content.c_str(),
|
| + &num_bytes, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + ASSERT_EQ(content.size(), num_bytes);
|
| + pipe.producer_handle.reset();
|
| + url_response->body = pipe.consumer_handle.Pass();
|
| + base::FilePath file;
|
| + base::FilePath cache_dir;
|
| + url_response_disk_cache_->GetFile(
|
| + url_response.Pass(),
|
| + [&file, &cache_dir](Array<uint8_t> received_file_path,
|
| + Array<uint8_t> received_cache_dir_path) {
|
| + file = toPath(received_file_path.Pass());
|
| + cache_dir = toPath(received_cache_dir_path.Pass());
|
| + });
|
| + url_response_disk_cache_.WaitForIncomingMethodCall();
|
| + ASSERT_FALSE(file.empty());
|
| + std::string received_content;
|
| + ASSERT_TRUE(base::ReadFileToString(file, &received_content));
|
| + EXPECT_EQ(content, received_content);
|
| +}
|
| +
|
| +TEST_F(URLResponseDiskCacheAppTest, GetExtractedContent) {
|
| + URLResponsePtr url_response = mojo::URLResponse::New();
|
| + url_response->url = "http://www.example.com/2";
|
| + url_response->headers = Array<String>(1);
|
| + url_response->headers[0] = base::StringPrintf("ETag: %f", base::RandDouble());
|
| + DataPipe pipe;
|
| + std::string content = base::RandBytesAsString(32);
|
| + uint32_t num_bytes = kTestData.size;
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + WriteDataRaw(pipe.producer_handle.get(), kTestData.data, &num_bytes,
|
| + MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + ASSERT_EQ(kTestData.size, num_bytes);
|
| + pipe.producer_handle.reset();
|
| + url_response->body = pipe.consumer_handle.Pass();
|
| + base::FilePath extracted_dir;
|
| + base::FilePath cache_dir;
|
| + url_response_disk_cache_->GetExtractedContent(
|
| + url_response.Pass(),
|
| + [&extracted_dir, &cache_dir](Array<uint8_t> received_extracted_dir,
|
| + Array<uint8_t> received_cache_dir_path) {
|
| + extracted_dir = toPath(received_extracted_dir.Pass());
|
| + cache_dir = toPath(received_cache_dir_path.Pass());
|
| + });
|
| + url_response_disk_cache_.WaitForIncomingMethodCall();
|
| + ASSERT_FALSE(extracted_dir.empty());
|
| + base::FilePath file1 = extracted_dir.Append("file1");
|
| + std::string file_content;
|
| + ASSERT_TRUE(base::ReadFileToString(file1, &file_content));
|
| + EXPECT_EQ("hello\n", file_content);
|
| + base::FilePath file2 = extracted_dir.Append("file2");
|
| + ASSERT_TRUE(base::ReadFileToString(file2, &file_content));
|
| + EXPECT_EQ("world\n", file_content);
|
| +}
|
| +
|
| +TEST_F(URLResponseDiskCacheAppTest, CacheTest) {
|
| + URLResponsePtr url_response = mojo::URLResponse::New();
|
| + url_response->url = "http://www.example.com/3";
|
| + url_response->headers = Array<String>(1);
|
| + std::string etag = base::StringPrintf("ETag: %f", base::RandDouble());
|
| + url_response->headers[0] = etag;
|
| + DataPipe pipe1;
|
| + std::string content = base::RandBytesAsString(32);
|
| + uint32_t num_bytes = content.size();
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + WriteDataRaw(pipe1.producer_handle.get(), content.c_str(),
|
| + &num_bytes, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + ASSERT_EQ(content.size(), num_bytes);
|
| + pipe1.producer_handle.reset();
|
| + url_response->body = pipe1.consumer_handle.Pass();
|
| + base::FilePath file;
|
| + base::FilePath cache_dir;
|
| + url_response_disk_cache_->GetFile(
|
| + url_response.Pass(),
|
| + [&file, &cache_dir](Array<uint8_t> received_file_path,
|
| + Array<uint8_t> received_cache_dir_path) {
|
| + file = toPath(received_file_path.Pass());
|
| + cache_dir = toPath(received_cache_dir_path.Pass());
|
| + });
|
| + url_response_disk_cache_.WaitForIncomingMethodCall();
|
| + ASSERT_FALSE(file.empty());
|
| + std::string received_content;
|
| + ASSERT_TRUE(base::ReadFileToString(file, &received_content));
|
| + EXPECT_EQ(content, received_content);
|
| + base::FilePath saved_file = cache_dir.Append("file");
|
| + EXPECT_FALSE(base::PathExists(saved_file));
|
| + std::string cached_content = base::RandBytesAsString(32);
|
| + ASSERT_TRUE(base::WriteFile(saved_file, cached_content.data(),
|
| + cached_content.size()));
|
| +
|
| + // Request using a response for the same URL, with the same etag, but a
|
| + // different content. The cached value should be returned.
|
| + url_response = mojo::URLResponse::New();
|
| + url_response->url = "http://www.example.com/3";
|
| + url_response->headers = Array<String>(1);
|
| + url_response->headers[0] = etag;
|
| + DataPipe pipe2;
|
| + std::string new_content = base::RandBytesAsString(32);
|
| + num_bytes = new_content.size();
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + WriteDataRaw(pipe2.producer_handle.get(), new_content.c_str(),
|
| + &num_bytes, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + ASSERT_EQ(new_content.size(), num_bytes);
|
| + pipe2.producer_handle.reset();
|
| + url_response->body = pipe2.consumer_handle.Pass();
|
| + url_response_disk_cache_->GetFile(
|
| + url_response.Pass(),
|
| + [&file, &cache_dir](Array<uint8_t> received_file_path,
|
| + Array<uint8_t> received_cache_dir_path) {
|
| + file = toPath(received_file_path.Pass());
|
| + cache_dir = toPath(received_cache_dir_path.Pass());
|
| + });
|
| + url_response_disk_cache_.WaitForIncomingMethodCall();
|
| + ASSERT_FALSE(file.empty());
|
| + ASSERT_TRUE(base::ReadFileToString(file, &received_content));
|
| + EXPECT_EQ(content, received_content);
|
| + saved_file = cache_dir.Append("file");
|
| + EXPECT_TRUE(base::PathExists(saved_file));
|
| + std::string received_cached_content;
|
| + ASSERT_TRUE(base::ReadFileToString(saved_file, &received_cached_content));
|
| + EXPECT_EQ(cached_content, received_cached_content);
|
| +
|
| + // Request using a response for the same URL, with the a different etag. Check
|
| + // that the new content is returned, and the cached files is deleted.
|
| + url_response = mojo::URLResponse::New();
|
| + url_response->url = "http://www.example.com/3";
|
| + url_response->headers = Array<String>(1);
|
| + url_response->headers[0] = base::StringPrintf("ETag: %f", base::RandDouble());
|
| + DataPipe pipe3;
|
| + new_content = base::RandBytesAsString(32);
|
| + num_bytes = new_content.size();
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + WriteDataRaw(pipe3.producer_handle.get(), new_content.c_str(),
|
| + &num_bytes, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + ASSERT_EQ(new_content.size(), num_bytes);
|
| + pipe3.producer_handle.reset();
|
| + url_response->body = pipe3.consumer_handle.Pass();
|
| + url_response_disk_cache_->GetFile(
|
| + url_response.Pass(),
|
| + [&file, &cache_dir](Array<uint8_t> received_file_path,
|
| + Array<uint8_t> received_cache_dir_path) {
|
| + file = toPath(received_file_path.Pass());
|
| + cache_dir = toPath(received_cache_dir_path.Pass());
|
| + });
|
| + url_response_disk_cache_.WaitForIncomingMethodCall();
|
| + ASSERT_FALSE(file.empty());
|
| + ASSERT_TRUE(base::ReadFileToString(file, &received_content));
|
| + EXPECT_EQ(new_content, received_content);
|
| + saved_file = cache_dir.Append("file");
|
| + EXPECT_FALSE(base::PathExists(saved_file));
|
| + ASSERT_TRUE(base::WriteFile(saved_file, cached_content.data(),
|
| + cached_content.size()));
|
| +
|
| + // Request using a response without an etag header. Check that the new
|
| + // content is returned, and the cached files is deleted.
|
| + url_response = mojo::URLResponse::New();
|
| + url_response->url = "http://www.example.com/3";
|
| + DataPipe pipe4;
|
| + new_content = base::RandBytesAsString(32);
|
| + num_bytes = new_content.size();
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + WriteDataRaw(pipe4.producer_handle.get(), new_content.c_str(),
|
| + &num_bytes, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + ASSERT_EQ(new_content.size(), num_bytes);
|
| + pipe4.producer_handle.reset();
|
| + url_response->body = pipe4.consumer_handle.Pass();
|
| + url_response_disk_cache_->GetFile(
|
| + url_response.Pass(),
|
| + [&file, &cache_dir](Array<uint8_t> received_file_path,
|
| + Array<uint8_t> received_cache_dir_path) {
|
| + file = toPath(received_file_path.Pass());
|
| + cache_dir = toPath(received_cache_dir_path.Pass());
|
| + });
|
| + url_response_disk_cache_.WaitForIncomingMethodCall();
|
| + ASSERT_FALSE(file.empty());
|
| + ASSERT_TRUE(base::ReadFileToString(file, &received_content));
|
| + EXPECT_EQ(new_content, received_content);
|
| + saved_file = cache_dir.Append("file");
|
| + EXPECT_FALSE(base::PathExists(saved_file));
|
| + ASSERT_TRUE(base::WriteFile(saved_file, cached_content.data(),
|
| + cached_content.size()));
|
| +
|
| + // Request using a response with an etag header while the cache version
|
| + // doesn't have one. Check that the new content is returned, and the cached
|
| + // files is deleted.
|
| + url_response = mojo::URLResponse::New();
|
| + url_response->url = "http://www.example.com/3";
|
| + DataPipe pipe5;
|
| + new_content = base::RandBytesAsString(32);
|
| + num_bytes = new_content.size();
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + WriteDataRaw(pipe5.producer_handle.get(), new_content.c_str(),
|
| + &num_bytes, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| + ASSERT_EQ(new_content.size(), num_bytes);
|
| + pipe5.producer_handle.reset();
|
| + url_response->body = pipe5.consumer_handle.Pass();
|
| + url_response_disk_cache_->GetFile(
|
| + url_response.Pass(),
|
| + [&file, &cache_dir](Array<uint8_t> received_file_path,
|
| + Array<uint8_t> received_cache_dir_path) {
|
| + file = toPath(received_file_path.Pass());
|
| + cache_dir = toPath(received_cache_dir_path.Pass());
|
| + });
|
| + url_response_disk_cache_.WaitForIncomingMethodCall();
|
| + ASSERT_FALSE(file.empty());
|
| + ASSERT_TRUE(base::ReadFileToString(file, &received_content));
|
| + EXPECT_EQ(new_content, received_content);
|
| + saved_file = cache_dir.Append("file");
|
| + EXPECT_FALSE(base::PathExists(saved_file));
|
| +}
|
| +
|
| +} // namespace mojo
|
|
|