1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/file_util.h" 6 #include "base/files/scoped_temp_dir.h" 7 #include "base/memory/scoped_ptr.h" 8 #include "base/message_loop/message_loop.h" 9 #include "base/path_service.h" 10 #include "chrome/browser/value_store/value_store_frontend.h" 11 #include "chrome/common/chrome_paths.h" 12 #include "content/public/test/test_browser_thread.h" 13 #include "testing/gtest/include/gtest/gtest.h" 14 15 using content::BrowserThread; 16 17 // Test suite for CachingValueStore, using a test database with a few simple 18 // entries. 19 class ValueStoreFrontendTest : public testing::Test { 20 public: 21 ValueStoreFrontendTest() 22 : ui_thread_(BrowserThread::UI, base::MessageLoop::current()), 23 file_thread_(BrowserThread::FILE, base::MessageLoop::current()) { 24 } 25 26 virtual void SetUp() { 27 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 28 29 base::FilePath test_data_dir; 30 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); 31 base::FilePath src_db(test_data_dir.AppendASCII("value_store_db")); 32 db_path_ = temp_dir_.path().AppendASCII("temp_db"); 33 base::CopyDirectory(src_db, db_path_, true); 34 35 ResetStorage(); 36 } 37 38 virtual void TearDown() { 39 base::MessageLoop::current()->RunUntilIdle(); // wait for storage to delete 40 storage_.reset(); 41 } 42 43 // Reset the value store, reloading the DB from disk. 44 void ResetStorage() { 45 storage_.reset(new ValueStoreFrontend(db_path_)); 46 } 47 48 bool Get(const std::string& key, scoped_ptr<base::Value>* output) { 49 storage_->Get(key, base::Bind(&ValueStoreFrontendTest::GetAndWait, 50 base::Unretained(this), output)); 51 base::MessageLoop::current()->Run(); // wait for GetAndWait 52 return !!output->get(); 53 } 54 55 protected: 56 void GetAndWait(scoped_ptr<base::Value>* output, 57 scoped_ptr<base::Value> result) { 58 *output = result.Pass(); 59 base::MessageLoop::current()->Quit(); 60 } 61 62 scoped_ptr<ValueStoreFrontend> storage_; 63 base::ScopedTempDir temp_dir_; 64 base::FilePath db_path_; 65 base::MessageLoop message_loop_; 66 content::TestBrowserThread ui_thread_; 67 content::TestBrowserThread file_thread_; 68 }; 69 70 TEST_F(ValueStoreFrontendTest, GetExistingData) { 71 scoped_ptr<base::Value> value; 72 ASSERT_FALSE(Get("key0", &value)); 73 74 // Test existing keys in the DB. 75 { 76 ASSERT_TRUE(Get("key1", &value)); 77 std::string result; 78 ASSERT_TRUE(value->GetAsString(&result)); 79 EXPECT_EQ("value1", result); 80 } 81 82 { 83 ASSERT_TRUE(Get("key2", &value)); 84 int result; 85 ASSERT_TRUE(value->GetAsInteger(&result)); 86 EXPECT_EQ(2, result); 87 } 88 } 89 90 TEST_F(ValueStoreFrontendTest, ChangesPersistAfterReload) { 91 storage_->Set("key0", 92 scoped_ptr<base::Value>(base::Value::CreateIntegerValue(0))); 93 storage_->Set("key1", 94 scoped_ptr<base::Value>(base::Value::CreateStringValue("new1"))); 95 storage_->Remove("key2"); 96 97 // Reload the DB and test our changes. 98 ResetStorage(); 99 100 scoped_ptr<base::Value> value; 101 { 102 ASSERT_TRUE(Get("key0", &value)); 103 int result; 104 ASSERT_TRUE(value->GetAsInteger(&result)); 105 EXPECT_EQ(0, result); 106 } 107 108 { 109 ASSERT_TRUE(Get("key1", &value)); 110 std::string result; 111 ASSERT_TRUE(value->GetAsString(&result)); 112 EXPECT_EQ("new1", result); 113 } 114 115 ASSERT_FALSE(Get("key2", &value)); 116 } 117