| Index: net/http/http_cache_unittest.cc
|
| ===================================================================
|
| --- net/http/http_cache_unittest.cc (revision 110389)
|
| +++ net/http/http_cache_unittest.cc (working copy)
|
| @@ -5,7 +5,6 @@
|
| #include "net/http/http_cache.h"
|
|
|
| #include "base/bind.h"
|
| -#include "base/hash_tables.h"
|
| #include "base/memory/scoped_vector.h"
|
| #include "base/message_loop.h"
|
| #include "base/string_util.h"
|
| @@ -17,9 +16,7 @@
|
| #include "net/base/net_errors.h"
|
| #include "net/base/net_log_unittest.h"
|
| #include "net/base/ssl_cert_request_info.h"
|
| -#include "net/base/ssl_config_service.h"
|
| #include "net/disk_cache/disk_cache.h"
|
| -#include "net/http/disk_cache_based_ssl_host_info.h"
|
| #include "net/http/http_byte_range.h"
|
| #include "net/http/http_request_headers.h"
|
| #include "net/http/http_request_info.h"
|
| @@ -28,671 +25,13 @@
|
| #include "net/http/http_transaction.h"
|
| #include "net/http/http_transaction_unittest.h"
|
| #include "net/http/http_util.h"
|
| +#include "net/http/mock_http_cache.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| using base::Time;
|
|
|
| namespace {
|
|
|
| -int GetTestModeForEntry(const std::string& key) {
|
| - // 'key' is prefixed with an identifier if it corresponds to a cached POST.
|
| - // Skip past that to locate the actual URL.
|
| - //
|
| - // TODO(darin): It breaks the abstraction a bit that we assume 'key' is an
|
| - // URL corresponding to a registered MockTransaction. It would be good to
|
| - // have another way to access the test_mode.
|
| - GURL url;
|
| - if (isdigit(key[0])) {
|
| - size_t slash = key.find('/');
|
| - DCHECK(slash != std::string::npos);
|
| - url = GURL(key.substr(slash + 1));
|
| - } else {
|
| - url = GURL(key);
|
| - }
|
| - const MockTransaction* t = FindMockTransaction(url);
|
| - DCHECK(t);
|
| - return t->test_mode;
|
| -}
|
| -
|
| -// We can override the test mode for a given operation by setting this global
|
| -// variable. Just remember to reset it after the test!.
|
| -int g_test_mode = 0;
|
| -
|
| -// Returns the test mode after considering the global override.
|
| -int GetEffectiveTestMode(int test_mode) {
|
| - if (!g_test_mode)
|
| - return test_mode;
|
| -
|
| - return g_test_mode;
|
| -}
|
| -
|
| -//-----------------------------------------------------------------------------
|
| -// mock disk cache (a very basic memory cache implementation)
|
| -
|
| -static const int kNumCacheEntryDataIndices = 3;
|
| -
|
| -class MockDiskEntry : public disk_cache::Entry,
|
| - public base::RefCounted<MockDiskEntry> {
|
| - public:
|
| - MockDiskEntry()
|
| - : test_mode_(0), doomed_(false), sparse_(false),
|
| - fail_requests_(false), busy_(false), delayed_(false) {
|
| - }
|
| -
|
| - explicit MockDiskEntry(const std::string& key)
|
| - : key_(key), doomed_(false), sparse_(false),
|
| - fail_requests_(false), busy_(false), delayed_(false) {
|
| - test_mode_ = GetTestModeForEntry(key);
|
| - }
|
| -
|
| - bool is_doomed() const { return doomed_; }
|
| -
|
| - virtual void Doom() {
|
| - doomed_ = true;
|
| - }
|
| -
|
| - virtual void Close() {
|
| - Release();
|
| - }
|
| -
|
| - virtual std::string GetKey() const {
|
| - if (fail_requests_)
|
| - return std::string();
|
| - return key_;
|
| - }
|
| -
|
| - virtual Time GetLastUsed() const {
|
| - return Time::FromInternalValue(0);
|
| - }
|
| -
|
| - virtual Time GetLastModified() const {
|
| - return Time::FromInternalValue(0);
|
| - }
|
| -
|
| - virtual int32 GetDataSize(int index) const {
|
| - DCHECK(index >= 0 && index < kNumCacheEntryDataIndices);
|
| - return static_cast<int32>(data_[index].size());
|
| - }
|
| -
|
| - virtual int ReadData(int index, int offset, net::IOBuffer* buf, int buf_len,
|
| - net::OldCompletionCallback* callback) {
|
| - DCHECK(index >= 0 && index < kNumCacheEntryDataIndices);
|
| - DCHECK(callback);
|
| -
|
| - if (fail_requests_)
|
| - return net::ERR_CACHE_READ_FAILURE;
|
| -
|
| - if (offset < 0 || offset > static_cast<int>(data_[index].size()))
|
| - return net::ERR_FAILED;
|
| - if (static_cast<size_t>(offset) == data_[index].size())
|
| - return 0;
|
| -
|
| - int num = std::min(buf_len, static_cast<int>(data_[index].size()) - offset);
|
| - memcpy(buf->data(), &data_[index][offset], num);
|
| -
|
| - if (GetEffectiveTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ)
|
| - return num;
|
| -
|
| - CallbackLater(callback, num);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - virtual int WriteData(int index, int offset, net::IOBuffer* buf, int buf_len,
|
| - net::OldCompletionCallback* callback, bool truncate) {
|
| - DCHECK(index >= 0 && index < kNumCacheEntryDataIndices);
|
| - DCHECK(callback);
|
| - DCHECK(truncate);
|
| -
|
| - if (fail_requests_) {
|
| - CallbackLater(callback, net::ERR_CACHE_READ_FAILURE);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - if (offset < 0 || offset > static_cast<int>(data_[index].size()))
|
| - return net::ERR_FAILED;
|
| -
|
| - data_[index].resize(offset + buf_len);
|
| - if (buf_len)
|
| - memcpy(&data_[index][offset], buf->data(), buf_len);
|
| -
|
| - if (GetEffectiveTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE)
|
| - return buf_len;
|
| -
|
| - CallbackLater(callback, buf_len);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - virtual int ReadSparseData(int64 offset, net::IOBuffer* buf, int buf_len,
|
| - net::OldCompletionCallback* callback) {
|
| - DCHECK(callback);
|
| - if (!sparse_ || busy_)
|
| - return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
|
| - if (offset < 0)
|
| - return net::ERR_FAILED;
|
| -
|
| - if (fail_requests_)
|
| - return net::ERR_CACHE_READ_FAILURE;
|
| -
|
| - DCHECK(offset < kint32max);
|
| - int real_offset = static_cast<int>(offset);
|
| - if (!buf_len)
|
| - return 0;
|
| -
|
| - int num = std::min(static_cast<int>(data_[1].size()) - real_offset,
|
| - buf_len);
|
| - memcpy(buf->data(), &data_[1][real_offset], num);
|
| -
|
| - if (GetEffectiveTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ)
|
| - return num;
|
| -
|
| - CallbackLater(callback, num);
|
| - busy_ = true;
|
| - delayed_ = false;
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - virtual int WriteSparseData(int64 offset, net::IOBuffer* buf, int buf_len,
|
| - net::OldCompletionCallback* callback) {
|
| - DCHECK(callback);
|
| - if (busy_)
|
| - return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
|
| - if (!sparse_) {
|
| - if (data_[1].size())
|
| - return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
|
| - sparse_ = true;
|
| - }
|
| - if (offset < 0)
|
| - return net::ERR_FAILED;
|
| - if (!buf_len)
|
| - return 0;
|
| -
|
| - if (fail_requests_)
|
| - return net::ERR_CACHE_READ_FAILURE;
|
| -
|
| - DCHECK(offset < kint32max);
|
| - int real_offset = static_cast<int>(offset);
|
| -
|
| - if (static_cast<int>(data_[1].size()) < real_offset + buf_len)
|
| - data_[1].resize(real_offset + buf_len);
|
| -
|
| - memcpy(&data_[1][real_offset], buf->data(), buf_len);
|
| - if (GetEffectiveTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE)
|
| - return buf_len;
|
| -
|
| - CallbackLater(callback, buf_len);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - virtual int GetAvailableRange(int64 offset, int len, int64* start,
|
| - net::OldCompletionCallback* callback) {
|
| - DCHECK(callback);
|
| - if (!sparse_ || busy_)
|
| - return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
|
| - if (offset < 0)
|
| - return net::ERR_FAILED;
|
| -
|
| - if (fail_requests_)
|
| - return net::ERR_CACHE_READ_FAILURE;
|
| -
|
| - *start = offset;
|
| - DCHECK(offset < kint32max);
|
| - int real_offset = static_cast<int>(offset);
|
| - if (static_cast<int>(data_[1].size()) < real_offset)
|
| - return 0;
|
| -
|
| - int num = std::min(static_cast<int>(data_[1].size()) - real_offset, len);
|
| - int count = 0;
|
| - for (; num > 0; num--, real_offset++) {
|
| - if (!count) {
|
| - if (data_[1][real_offset]) {
|
| - count++;
|
| - *start = real_offset;
|
| - }
|
| - } else {
|
| - if (!data_[1][real_offset])
|
| - break;
|
| - count++;
|
| - }
|
| - }
|
| - if (GetEffectiveTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_WRITE)
|
| - return count;
|
| -
|
| - CallbackLater(callback, count);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - virtual bool CouldBeSparse() const {
|
| - return sparse_;
|
| - }
|
| -
|
| - virtual void CancelSparseIO() { cancel_ = true; }
|
| -
|
| - virtual int ReadyForSparseIO(net::OldCompletionCallback* completion_callback) {
|
| - if (!cancel_)
|
| - return net::OK;
|
| -
|
| - cancel_ = false;
|
| - DCHECK(completion_callback);
|
| - if (GetEffectiveTestMode(test_mode_) & TEST_MODE_SYNC_CACHE_READ)
|
| - return net::OK;
|
| -
|
| - // The pending operation is already in the message loop (and hopefuly
|
| - // already in the second pass). Just notify the caller that it finished.
|
| - CallbackLater(completion_callback, 0);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - // Fail most subsequent requests.
|
| - void set_fail_requests() { fail_requests_ = true; }
|
| -
|
| - // If |value| is true, don't deliver any completion callbacks until called
|
| - // again with |value| set to false. Caution: remember to enable callbacks
|
| - // again or all subsequent tests will fail.
|
| - static void IgnoreCallbacks(bool value) {
|
| - if (ignore_callbacks_ == value)
|
| - return;
|
| - ignore_callbacks_ = value;
|
| - if (!value)
|
| - StoreAndDeliverCallbacks(false, NULL, NULL, 0);
|
| - }
|
| -
|
| - private:
|
| - friend class base::RefCounted<MockDiskEntry>;
|
| -
|
| - struct CallbackInfo {
|
| - scoped_refptr<MockDiskEntry> entry;
|
| - net::OldCompletionCallback* callback;
|
| - int result;
|
| - };
|
| -
|
| - ~MockDiskEntry() {}
|
| -
|
| - // Unlike the callbacks for MockHttpTransaction, we want this one to run even
|
| - // if the consumer called Close on the MockDiskEntry. We achieve that by
|
| - // leveraging the fact that this class is reference counted.
|
| - void CallbackLater(net::OldCompletionCallback* callback, int result) {
|
| - if (ignore_callbacks_)
|
| - return StoreAndDeliverCallbacks(true, this, callback, result);
|
| - MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
|
| - &MockDiskEntry::RunCallback, this, callback, result));
|
| - }
|
| - void RunCallback(net::OldCompletionCallback* callback, int result) {
|
| - if (busy_) {
|
| - // This is kind of hacky, but controlling the behavior of just this entry
|
| - // from a test is sort of complicated. What we really want to do is
|
| - // delay the delivery of a sparse IO operation a little more so that the
|
| - // request start operation (async) will finish without seeing the end of
|
| - // this operation (already posted to the message loop)... and without
|
| - // just delaying for n mS (which may cause trouble with slow bots). So
|
| - // we re-post this operation (all async sparse IO operations will take two
|
| - // trips trhough the message loop instead of one).
|
| - if (!delayed_) {
|
| - delayed_ = true;
|
| - return CallbackLater(callback, result);
|
| - }
|
| - }
|
| - busy_ = false;
|
| - callback->Run(result);
|
| - }
|
| -
|
| - // When |store| is true, stores the callback to be delivered later; otherwise
|
| - // delivers any callback previously stored.
|
| - static void StoreAndDeliverCallbacks(bool store, MockDiskEntry* entry,
|
| - net::OldCompletionCallback* callback,
|
| - int result) {
|
| - static std::vector<CallbackInfo> callback_list;
|
| - if (store) {
|
| - CallbackInfo c = {entry, callback, result};
|
| - callback_list.push_back(c);
|
| - } else {
|
| - for (size_t i = 0; i < callback_list.size(); i++) {
|
| - CallbackInfo& c = callback_list[i];
|
| - c.entry->CallbackLater(c.callback, c.result);
|
| - }
|
| - callback_list.clear();
|
| - }
|
| - }
|
| -
|
| - std::string key_;
|
| - std::vector<char> data_[kNumCacheEntryDataIndices];
|
| - int test_mode_;
|
| - bool doomed_;
|
| - bool sparse_;
|
| - bool fail_requests_;
|
| - bool busy_;
|
| - bool delayed_;
|
| - static bool cancel_;
|
| - static bool ignore_callbacks_;
|
| -};
|
| -
|
| -// Statics.
|
| -bool MockDiskEntry::cancel_ = false;
|
| -bool MockDiskEntry::ignore_callbacks_ = false;
|
| -
|
| -class MockDiskCache : public disk_cache::Backend {
|
| - public:
|
| - MockDiskCache()
|
| - : open_count_(0), create_count_(0), fail_requests_(false),
|
| - soft_failures_(false) {
|
| - }
|
| -
|
| - ~MockDiskCache() {
|
| - ReleaseAll();
|
| - }
|
| -
|
| - virtual int32 GetEntryCount() const {
|
| - return static_cast<int32>(entries_.size());
|
| - }
|
| -
|
| - virtual int OpenEntry(const std::string& key, disk_cache::Entry** entry,
|
| - net::OldCompletionCallback* callback) {
|
| - DCHECK(callback);
|
| - if (fail_requests_)
|
| - return net::ERR_CACHE_OPEN_FAILURE;
|
| -
|
| - EntryMap::iterator it = entries_.find(key);
|
| - if (it == entries_.end())
|
| - return net::ERR_CACHE_OPEN_FAILURE;
|
| -
|
| - if (it->second->is_doomed()) {
|
| - it->second->Release();
|
| - entries_.erase(it);
|
| - return net::ERR_CACHE_OPEN_FAILURE;
|
| - }
|
| -
|
| - open_count_++;
|
| -
|
| - it->second->AddRef();
|
| - *entry = it->second;
|
| -
|
| - if (soft_failures_)
|
| - it->second->set_fail_requests();
|
| -
|
| - if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START)
|
| - return net::OK;
|
| -
|
| - CallbackLater(callback, net::OK);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - virtual int CreateEntry(const std::string& key, disk_cache::Entry** entry,
|
| - net::OldCompletionCallback* callback) {
|
| - DCHECK(callback);
|
| - if (fail_requests_)
|
| - return net::ERR_CACHE_CREATE_FAILURE;
|
| -
|
| - EntryMap::iterator it = entries_.find(key);
|
| - if (it != entries_.end()) {
|
| - DCHECK(it->second->is_doomed());
|
| - it->second->Release();
|
| - entries_.erase(it);
|
| - }
|
| -
|
| - create_count_++;
|
| -
|
| - MockDiskEntry* new_entry = new MockDiskEntry(key);
|
| -
|
| - new_entry->AddRef();
|
| - entries_[key] = new_entry;
|
| -
|
| - new_entry->AddRef();
|
| - *entry = new_entry;
|
| -
|
| - if (soft_failures_)
|
| - new_entry->set_fail_requests();
|
| -
|
| - if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START)
|
| - return net::OK;
|
| -
|
| - CallbackLater(callback, net::OK);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - virtual int DoomEntry(const std::string& key,
|
| - net::OldCompletionCallback* callback) {
|
| - DCHECK(callback);
|
| - EntryMap::iterator it = entries_.find(key);
|
| - if (it != entries_.end()) {
|
| - it->second->Release();
|
| - entries_.erase(it);
|
| - }
|
| -
|
| - if (GetTestModeForEntry(key) & TEST_MODE_SYNC_CACHE_START)
|
| - return net::OK;
|
| -
|
| - CallbackLater(callback, net::OK);
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - virtual int DoomAllEntries(net::OldCompletionCallback* callback) {
|
| - return net::ERR_NOT_IMPLEMENTED;
|
| - }
|
| -
|
| - virtual int DoomEntriesBetween(const base::Time initial_time,
|
| - const base::Time end_time,
|
| - net::OldCompletionCallback* callback) {
|
| - return net::ERR_NOT_IMPLEMENTED;
|
| - }
|
| -
|
| - virtual int DoomEntriesSince(const base::Time initial_time,
|
| - net::OldCompletionCallback* callback) {
|
| - return net::ERR_NOT_IMPLEMENTED;
|
| - }
|
| -
|
| - virtual int OpenNextEntry(void** iter, disk_cache::Entry** next_entry,
|
| - net::OldCompletionCallback* callback) {
|
| - return net::ERR_NOT_IMPLEMENTED;
|
| - }
|
| -
|
| - virtual void EndEnumeration(void** iter) {}
|
| -
|
| - virtual void GetStats(
|
| - std::vector<std::pair<std::string, std::string> >* stats) {
|
| - }
|
| -
|
| - virtual void OnExternalCacheHit(const std::string& key) {}
|
| -
|
| - // returns number of times a cache entry was successfully opened
|
| - int open_count() const { return open_count_; }
|
| -
|
| - // returns number of times a cache entry was successfully created
|
| - int create_count() const { return create_count_; }
|
| -
|
| - // Fail any subsequent CreateEntry and OpenEntry.
|
| - void set_fail_requests() { fail_requests_ = true; }
|
| -
|
| - // Return entries that fail some of their requests.
|
| - void set_soft_failures(bool value) { soft_failures_ = value; }
|
| -
|
| - void ReleaseAll() {
|
| - EntryMap::iterator it = entries_.begin();
|
| - for (; it != entries_.end(); ++it)
|
| - it->second->Release();
|
| - entries_.clear();
|
| - }
|
| -
|
| - private:
|
| - typedef base::hash_map<std::string, MockDiskEntry*> EntryMap;
|
| -
|
| - class CallbackRunner : public Task {
|
| - public:
|
| - CallbackRunner(net::OldCompletionCallback* callback, int result)
|
| - : callback_(callback), result_(result) {}
|
| - virtual void Run() {
|
| - callback_->Run(result_);
|
| - }
|
| -
|
| - private:
|
| - net::OldCompletionCallback* callback_;
|
| - int result_;
|
| - DISALLOW_COPY_AND_ASSIGN(CallbackRunner);
|
| - };
|
| -
|
| - void CallbackLater(net::OldCompletionCallback* callback, int result) {
|
| - MessageLoop::current()->PostTask(FROM_HERE,
|
| - new CallbackRunner(callback, result));
|
| - }
|
| -
|
| - EntryMap entries_;
|
| - int open_count_;
|
| - int create_count_;
|
| - bool fail_requests_;
|
| - bool soft_failures_;
|
| -};
|
| -
|
| -class MockBackendFactory : public net::HttpCache::BackendFactory {
|
| - public:
|
| - virtual int CreateBackend(net::NetLog* /* net_log */,
|
| - disk_cache::Backend** backend,
|
| - net::OldCompletionCallback* callback) {
|
| - *backend = new MockDiskCache();
|
| - return net::OK;
|
| - }
|
| -};
|
| -
|
| -class MockHttpCache {
|
| - public:
|
| - MockHttpCache()
|
| - : http_cache_(new MockNetworkLayer(), NULL, new MockBackendFactory()) {
|
| - }
|
| -
|
| - explicit MockHttpCache(net::HttpCache::BackendFactory* disk_cache_factory)
|
| - : http_cache_(new MockNetworkLayer(), NULL, disk_cache_factory) {
|
| - }
|
| -
|
| - net::HttpCache* http_cache() { return &http_cache_; }
|
| -
|
| - MockNetworkLayer* network_layer() {
|
| - return static_cast<MockNetworkLayer*>(http_cache_.network_layer());
|
| - }
|
| - MockDiskCache* disk_cache() {
|
| - TestOldCompletionCallback cb;
|
| - disk_cache::Backend* backend;
|
| - int rv = http_cache_.GetBackend(&backend, &cb);
|
| - rv = cb.GetResult(rv);
|
| - return (rv == net::OK) ? static_cast<MockDiskCache*>(backend) : NULL;
|
| - }
|
| -
|
| - // Helper function for reading response info from the disk cache.
|
| - static bool ReadResponseInfo(disk_cache::Entry* disk_entry,
|
| - net::HttpResponseInfo* response_info,
|
| - bool* response_truncated) {
|
| - int size = disk_entry->GetDataSize(0);
|
| -
|
| - TestOldCompletionCallback cb;
|
| - scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(size));
|
| - int rv = disk_entry->ReadData(0, 0, buffer, size, &cb);
|
| - rv = cb.GetResult(rv);
|
| - EXPECT_EQ(size, rv);
|
| -
|
| - return net::HttpCache::ParseResponseInfo(buffer->data(), size,
|
| - response_info,
|
| - response_truncated);
|
| - }
|
| -
|
| - // Helper function for writing response info into the disk cache.
|
| - static bool WriteResponseInfo(disk_cache::Entry* disk_entry,
|
| - const net::HttpResponseInfo* response_info,
|
| - bool skip_transient_headers,
|
| - bool response_truncated) {
|
| - Pickle pickle;
|
| - response_info->Persist(
|
| - &pickle, skip_transient_headers, response_truncated);
|
| -
|
| - TestOldCompletionCallback cb;
|
| - scoped_refptr<net::WrappedIOBuffer> data(new net::WrappedIOBuffer(
|
| - reinterpret_cast<const char*>(pickle.data())));
|
| - int len = static_cast<int>(pickle.size());
|
| -
|
| - int rv = disk_entry->WriteData(0, 0, data, len, &cb, true);
|
| - rv = cb.GetResult(rv);
|
| - return (rv == len);
|
| - }
|
| -
|
| - // Helper function to synchronously open a backend entry.
|
| - bool OpenBackendEntry(const std::string& key, disk_cache::Entry** entry) {
|
| - TestOldCompletionCallback cb;
|
| - int rv = disk_cache()->OpenEntry(key, entry, &cb);
|
| - return (cb.GetResult(rv) == net::OK);
|
| - }
|
| -
|
| - // Helper function to synchronously create a backend entry.
|
| - bool CreateBackendEntry(const std::string& key, disk_cache::Entry** entry,
|
| - net::NetLog* /* net_log */) {
|
| - TestOldCompletionCallback cb;
|
| - int rv = disk_cache()->CreateEntry(key, entry, &cb);
|
| - return (cb.GetResult(rv) == net::OK);
|
| - }
|
| -
|
| - private:
|
| - net::HttpCache http_cache_;
|
| -};
|
| -
|
| -// This version of the disk cache doesn't invoke CreateEntry callbacks.
|
| -class MockDiskCacheNoCB : public MockDiskCache {
|
| - virtual int CreateEntry(const std::string& key, disk_cache::Entry** entry,
|
| - net::OldCompletionCallback* callback) {
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -};
|
| -
|
| -class MockBackendNoCbFactory : public net::HttpCache::BackendFactory {
|
| - public:
|
| - virtual int CreateBackend(net::NetLog* /* net_log */,
|
| - disk_cache::Backend** backend,
|
| - net::OldCompletionCallback* callback) {
|
| - *backend = new MockDiskCacheNoCB();
|
| - return net::OK;
|
| - }
|
| -};
|
| -
|
| -// This backend factory allows us to control the backend instantiation.
|
| -class MockBlockingBackendFactory : public net::HttpCache::BackendFactory {
|
| - public:
|
| - MockBlockingBackendFactory()
|
| - : backend_(NULL), callback_(NULL), block_(true), fail_(false) {}
|
| -
|
| - virtual int CreateBackend(net::NetLog* /* net_log */,
|
| - disk_cache::Backend** backend,
|
| - net::OldCompletionCallback* callback) {
|
| - if (!block_) {
|
| - if (!fail_)
|
| - *backend = new MockDiskCache();
|
| - return Result();
|
| - }
|
| -
|
| - backend_ = backend;
|
| - callback_ = callback;
|
| - return net::ERR_IO_PENDING;
|
| - }
|
| -
|
| - // Completes the backend creation. Any blocked call will be notified via the
|
| - // provided callback.
|
| - void FinishCreation() {
|
| - block_ = false;
|
| - if (callback_) {
|
| - if (!fail_)
|
| - *backend_ = new MockDiskCache();
|
| - net::OldCompletionCallback* cb = callback_;
|
| - callback_ = NULL;
|
| - cb->Run(Result()); // This object can be deleted here.
|
| - }
|
| - }
|
| -
|
| - disk_cache::Backend** backend() { return backend_; }
|
| - void set_fail(bool fail) { fail_ = fail; }
|
| -
|
| - net::OldCompletionCallback* callback() { return callback_; }
|
| -
|
| - private:
|
| - int Result() { return fail_ ? net::ERR_FAILED : net::OK; }
|
| -
|
| - disk_cache::Backend** backend_;
|
| - net::OldCompletionCallback* callback_;
|
| - bool block_;
|
| - bool fail_;
|
| -};
|
| -
|
| class DeleteCacheOldCompletionCallback : public TestOldCompletionCallback {
|
| public:
|
| explicit DeleteCacheOldCompletionCallback(MockHttpCache* cache)
|
| @@ -1041,7 +380,7 @@
|
|
|
|
|
| //-----------------------------------------------------------------------------
|
| -// HttpCache tests
|
| +// Tests.
|
|
|
| TEST(HttpCache, CreateThenDestroy) {
|
| MockHttpCache cache;
|
| @@ -4341,11 +3680,11 @@
|
| EXPECT_EQ(net::ERR_IO_PENDING, rv);
|
| EXPECT_FALSE(c->callback.have_result());
|
|
|
| - g_test_mode = TEST_MODE_SYNC_ALL;
|
| + MockHttpCache::SetTestMode(TEST_MODE_SYNC_ALL);
|
|
|
| // Destroy the transaction.
|
| c->trans.reset();
|
| - g_test_mode = 0;
|
| + MockHttpCache::SetTestMode(0);
|
|
|
| // Make sure that we don't invoke the callback. We may have an issue if the
|
| // UrlRequestJob is killed directly (without cancelling the UrlRequest) so we
|
| @@ -5183,41 +4522,3 @@
|
| EXPECT_TRUE(truncated);
|
| entry->Close();
|
| }
|
| -
|
| -//-----------------------------------------------------------------------------
|
| -// DiskCacheBasedSSLHostInfo tests
|
| -
|
| -class DeleteSSLHostInfoOldCompletionCallback : public TestOldCompletionCallback {
|
| - public:
|
| - explicit DeleteSSLHostInfoOldCompletionCallback(net::SSLHostInfo* ssl_host_info)
|
| - : ssl_host_info_(ssl_host_info) {}
|
| -
|
| - virtual void RunWithParams(const Tuple1<int>& params) {
|
| - delete ssl_host_info_;
|
| - TestOldCompletionCallback::RunWithParams(params);
|
| - }
|
| -
|
| - private:
|
| - net::SSLHostInfo* ssl_host_info_;
|
| -};
|
| -
|
| -// Tests that we can delete a DiskCacheBasedSSLHostInfo object in a
|
| -// completion callback for DiskCacheBasedSSLHostInfo::WaitForDataReady.
|
| -TEST(DiskCacheBasedSSLHostInfo, DeleteInCallback) {
|
| - net::CertVerifier cert_verifier;
|
| - // Use the blocking mock backend factory to force asynchronous completion
|
| - // of ssl_host_info->WaitForDataReady(), so that the callback will run.
|
| - MockBlockingBackendFactory* factory = new MockBlockingBackendFactory();
|
| - MockHttpCache cache(factory);
|
| - net::SSLConfig ssl_config;
|
| - net::SSLHostInfo* ssl_host_info =
|
| - new net::DiskCacheBasedSSLHostInfo("https://www.verisign.com", ssl_config,
|
| - &cert_verifier, cache.http_cache());
|
| - ssl_host_info->Start();
|
| - DeleteSSLHostInfoOldCompletionCallback callback(ssl_host_info);
|
| - int rv = ssl_host_info->WaitForDataReady(&callback);
|
| - EXPECT_EQ(net::ERR_IO_PENDING, rv);
|
| - // Now complete the backend creation and let the callback run.
|
| - factory->FinishCreation();
|
| - EXPECT_EQ(net::OK, callback.GetResult(rv));
|
| -}
|
|
|