summaryrefslogtreecommitdiff
path: root/chromium/net/disk_cache/disk_cache_test_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/disk_cache/disk_cache_test_util.cc')
-rw-r--r--chromium/net/disk_cache/disk_cache_test_util.cc146
1 files changed, 146 insertions, 0 deletions
diff --git a/chromium/net/disk_cache/disk_cache_test_util.cc b/chromium/net/disk_cache/disk_cache_test_util.cc
new file mode 100644
index 00000000000..8f334f05370
--- /dev/null
+++ b/chromium/net/disk_cache/disk_cache_test_util.cc
@@ -0,0 +1,146 @@
+// Copyright (c) 2011 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 "net/disk_cache/disk_cache_test_util.h"
+
+#include "base/files/file_path.h"
+#include "base/logging.h"
+#include "base/message_loop/message_loop_proxy.h"
+#include "base/path_service.h"
+#include "net/base/net_errors.h"
+#include "net/disk_cache/backend_impl.h"
+#include "net/disk_cache/cache_util.h"
+#include "net/disk_cache/file.h"
+
+using base::Time;
+using base::TimeDelta;
+
+std::string GenerateKey(bool same_length) {
+ char key[200];
+ CacheTestFillBuffer(key, sizeof(key), same_length);
+
+ key[199] = '\0';
+ return std::string(key);
+}
+
+void CacheTestFillBuffer(char* buffer, size_t len, bool no_nulls) {
+ static bool called = false;
+ if (!called) {
+ called = true;
+ int seed = static_cast<int>(Time::Now().ToInternalValue());
+ srand(seed);
+ }
+
+ for (size_t i = 0; i < len; i++) {
+ buffer[i] = static_cast<char>(rand());
+ if (!buffer[i] && no_nulls)
+ buffer[i] = 'g';
+ }
+ if (len && !buffer[0])
+ buffer[0] = 'g';
+}
+
+bool CreateCacheTestFile(const base::FilePath& name) {
+ int flags = base::PLATFORM_FILE_CREATE_ALWAYS |
+ base::PLATFORM_FILE_READ |
+ base::PLATFORM_FILE_WRITE;
+
+ scoped_refptr<disk_cache::File> file(new disk_cache::File(
+ base::CreatePlatformFile(name, flags, NULL, NULL)));
+ if (!file->IsValid())
+ return false;
+
+ file->SetLength(4 * 1024 * 1024);
+ return true;
+}
+
+bool DeleteCache(const base::FilePath& path) {
+ disk_cache::DeleteCache(path, false);
+ return true;
+}
+
+bool CheckCacheIntegrity(const base::FilePath& path, bool new_eviction,
+ uint32 mask) {
+ scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
+ path, mask, base::MessageLoopProxy::current().get(), NULL));
+ if (!cache.get())
+ return false;
+ if (new_eviction)
+ cache->SetNewEviction();
+ cache->SetFlags(disk_cache::kNoRandom);
+ if (cache->SyncInit() != net::OK)
+ return false;
+ return cache->SelfCheck() >= 0;
+}
+
+// -----------------------------------------------------------------------
+
+MessageLoopHelper::MessageLoopHelper()
+ : num_callbacks_(0),
+ num_iterations_(0),
+ last_(0),
+ completed_(false),
+ callback_reused_error_(false),
+ callbacks_called_(0) {
+}
+
+MessageLoopHelper::~MessageLoopHelper() {
+}
+
+bool MessageLoopHelper::WaitUntilCacheIoFinished(int num_callbacks) {
+ if (num_callbacks == callbacks_called_)
+ return true;
+
+ ExpectCallbacks(num_callbacks);
+ // Create a recurrent timer of 50 mS.
+ if (!timer_.IsRunning())
+ timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(50), this,
+ &MessageLoopHelper::TimerExpired);
+ base::MessageLoop::current()->Run();
+ return completed_;
+}
+
+// Quits the message loop when all callbacks are called or we've been waiting
+// too long for them (2 secs without a callback).
+void MessageLoopHelper::TimerExpired() {
+ CHECK_LE(callbacks_called_, num_callbacks_);
+ if (callbacks_called_ == num_callbacks_) {
+ completed_ = true;
+ base::MessageLoop::current()->Quit();
+ } else {
+ // Not finished yet. See if we have to abort.
+ if (last_ == callbacks_called_)
+ num_iterations_++;
+ else
+ last_ = callbacks_called_;
+ if (40 == num_iterations_)
+ base::MessageLoop::current()->Quit();
+ }
+}
+
+// -----------------------------------------------------------------------
+
+CallbackTest::CallbackTest(MessageLoopHelper* helper,
+ bool reuse)
+ : helper_(helper),
+ reuse_(reuse ? 0 : 1) {
+}
+
+CallbackTest::~CallbackTest() {
+}
+
+// On the actual callback, increase the number of tests received and check for
+// errors (an unexpected test received)
+void CallbackTest::Run(int result) {
+ last_result_ = result;
+
+ if (reuse_) {
+ DCHECK_EQ(1, reuse_);
+ if (2 == reuse_)
+ helper_->set_callback_reused_error(true);
+ reuse_++;
+ }
+
+ helper_->CallbackWasCalled();
+}