OLD | NEW |
| (Empty) |
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/memory/scoped_ptr.h" | |
7 #include "base/message_loop.h" | |
8 #include "base/path_service.h" | |
9 #include "base/scoped_temp_dir.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, MessageLoop::current()), | |
23 file_thread_(BrowserThread::FILE, MessageLoop::current()) { | |
24 } | |
25 | |
26 virtual void SetUp() { | |
27 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | |
28 | |
29 FilePath test_data_dir; | |
30 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)); | |
31 FilePath src_db(test_data_dir.AppendASCII("value_store_db")); | |
32 db_path_ = temp_dir_.path().AppendASCII("temp_db"); | |
33 file_util::CopyDirectory(src_db, db_path_, true); | |
34 | |
35 ResetStorage(); | |
36 } | |
37 | |
38 virtual void TearDown() { | |
39 MessageLoop::current()->RunAllPending(); // 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 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 MessageLoop::current()->Quit(); | |
60 } | |
61 | |
62 scoped_ptr<ValueStoreFrontend> storage_; | |
63 ScopedTempDir temp_dir_; | |
64 FilePath db_path_; | |
65 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(NULL); | |
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(NULL); | |
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 } | |
OLD | NEW |