Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1231)

Unified Diff: content/browser/indexed_db/indexed_db_browsertest_mock_factory.cc

Issue 334303002: Using a mock LevelDBTransaction for corruption tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Factored the new browser IDB content test objects into own file. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/indexed_db/indexed_db_browsertest_mock_factory.cc
diff --git a/content/browser/indexed_db/indexed_db_browsertest_mock_factory.cc b/content/browser/indexed_db/indexed_db_browsertest_mock_factory.cc
new file mode 100644
index 0000000000000000000000000000000000000000..deda506145b697a54114d5e2da84823c4bca7aab
--- /dev/null
+++ b/content/browser/indexed_db/indexed_db_browsertest_mock_factory.cc
@@ -0,0 +1,163 @@
+// Copyright 2014 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 <string>
+
+#include "base/logging.h"
+#include "content/browser/indexed_db/indexed_db_browsertest_mock_factory.h"
+#include "content/browser/indexed_db/leveldb/leveldb_transaction.h"
+#include "third_party/leveldatabase/src/include/leveldb/status.h"
+
+namespace {
+
+class FunctionTracer {
+ public:
+ FunctionTracer(const std::string& class_name,
+ const std::string& method_name,
+ int instance_num)
+ : class_name_(class_name),
+ method_name_(method_name),
+ instance_count_(instance_num),
+ current_call_num_(0) {}
+
+ void log_call() {
+ current_call_num_++;
+ VLOG(0) << class_name_ << '[' << instance_count_ << "]::" << method_name_
+ << "()[" << current_call_num_ << ']';
+ }
+
+ private:
+ std::string class_name_;
+ std::string method_name_;
+ int instance_count_;
+ int current_call_num_;
+};
+
+} // anonymous namespace
jsbell 2014/06/18 17:03:08 nit: Just `// namespace`
cmumford 2014/06/18 18:06:44 Done.
+
+namespace content {
+
+class LevelDBTestTansaction : public LevelDBTransaction {
+ public:
+ LevelDBTestTansaction(LevelDBDatabase* db,
+ FailMethod fail_method,
+ int fail_on_call_num)
+ : LevelDBTransaction(db),
+ fail_method_(fail_method),
+ fail_on_call_num_(fail_on_call_num),
+ current_call_num_(0) {
+ DCHECK(fail_method != FAIL_METHOD_NOTHING);
+ DCHECK_GT(fail_on_call_num, 0);
+ }
+
+ virtual leveldb::Status Get(const base::StringPiece& key,
+ std::string* value,
+ bool* found) OVERRIDE {
+ if (fail_method_ != FAIL_METHOD_GET ||
+ ++current_call_num_ != fail_on_call_num_)
+ return LevelDBTransaction::Get(key, value, found);
+
+ *found = false;
+ return leveldb::Status::Corruption("Corrupted for the test");
+ }
+
+ virtual leveldb::Status Commit() OVERRIDE {
+ if (fail_method_ != FAIL_METHOD_COMMIT ||
+ ++current_call_num_ != fail_on_call_num_)
+ return LevelDBTransaction::Commit();
+
+ return leveldb::Status::Corruption("Corrupted for the test");
+ }
+
+ private:
+ virtual ~LevelDBTestTansaction() {}
+
+ FailMethod fail_method_;
+ int fail_on_call_num_;
+ int current_call_num_;
+};
+
+class LevelDBTraceTansaction : public LevelDBTransaction {
+ public:
+ LevelDBTraceTansaction(LevelDBDatabase* db, int tx_num)
+ : LevelDBTransaction(db),
+ commit_tracer_(s_class_name, "Commit", tx_num),
+ get_tracer_(s_class_name, "Get", tx_num) {}
+
+ virtual leveldb::Status Get(const base::StringPiece& key,
+ std::string* value,
+ bool* found) OVERRIDE {
+ get_tracer_.log_call();
+ return LevelDBTransaction::Get(key, value, found);
+ }
+
+ virtual leveldb::Status Commit() OVERRIDE {
+ commit_tracer_.log_call();
+ return LevelDBTransaction::Commit();
+ }
+
+ private:
+ virtual ~LevelDBTraceTansaction() {}
+
+ const std::string s_class_name = "LevelDBTransaction";
+
+ FunctionTracer commit_tracer_;
+ FunctionTracer get_tracer_;
+};
+
+IndexedDBBrowserTestClassFactory::IndexedDBBrowserTestClassFactory()
+ : failure_class_(FAIL_CLASS_NOTHING),
+ failure_method_(FAIL_METHOD_NOTHING),
+ only_trace_calls_(false) {
+}
+
+IndexedDBBrowserTestClassFactory::~IndexedDBBrowserTestClassFactory() {
+}
+
+LevelDBTransaction* IndexedDBBrowserTestClassFactory::CreateLevelDBTransaction(
+ LevelDBDatabase* db) {
+ instance_count_[FAIL_CLASS_LEVELDB_TRANSACTION] =
+ instance_count_[FAIL_CLASS_LEVELDB_TRANSACTION] + 1;
+ if (only_trace_calls_) {
+ return new LevelDBTraceTansaction(
+ db, instance_count_[FAIL_CLASS_LEVELDB_TRANSACTION]);
+ } else {
+ if (failure_class_ == FAIL_CLASS_LEVELDB_TRANSACTION &&
+ instance_count_[FAIL_CLASS_LEVELDB_TRANSACTION] ==
+ fail_on_instance_num_[FAIL_CLASS_LEVELDB_TRANSACTION])
+ return new LevelDBTestTansaction(
+ db,
+ failure_method_,
+ fail_on_call_num_[FAIL_CLASS_LEVELDB_TRANSACTION]);
+ else
+ return IndexedDBClassFactory::CreateLevelDBTransaction(db);
+ }
+}
+
+void IndexedDBBrowserTestClassFactory::FailOperation(FailClass failure_class,
+ FailMethod failure_method,
+ int fail_on_instance_num,
+ int fail_on_call_num) {
+ VLOG(0) << "FailOperation: class=" << failure_class
+ << ", method=" << failure_method
+ << ", instanceNum=" << fail_on_instance_num
+ << ", callNum=" << fail_on_call_num;
+ DCHECK(failure_class != FAIL_CLASS_NOTHING);
+ DCHECK(failure_method != FAIL_METHOD_NOTHING);
+ failure_class_ = failure_class;
+ failure_method_ = failure_method;
+ fail_on_instance_num_[failure_class_] = fail_on_instance_num;
+ fail_on_call_num_[failure_class_] = fail_on_call_num;
+ instance_count_.clear();
+}
+
+void IndexedDBBrowserTestClassFactory::Reset() {
+ failure_class_ = FAIL_CLASS_NOTHING;
+ failure_method_ = FAIL_METHOD_NOTHING;
+ instance_count_.clear();
+ fail_on_instance_num_.clear();
+ fail_on_call_num_.clear();
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698