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

Side by Side Diff: chrome/browser/chromeos/gdata/gdata_db_unittest.cc

Issue 10701118: gdata: Fix a bug in GDataLevelDB where errors are not handled right (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/gdata/gdata_db.h" 5 #include "chrome/browser/chromeos/gdata/gdata_db.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "chrome/browser/chromeos/gdata/gdata.pb.h"
8 #include "chrome/browser/chromeos/gdata/gdata_db_factory.h" 9 #include "chrome/browser/chromeos/gdata/gdata_db_factory.h"
9 #include "chrome/browser/chromeos/gdata/gdata_files.h" 10 #include "chrome/browser/chromeos/gdata/gdata_files.h"
11 #include "chrome/test/base/testing_profile.h"
10 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
11 #include "chrome/test/base/testing_profile.h"
12 13
13 namespace gdata { 14 namespace gdata {
14 namespace { 15 namespace {
15 16
16 class GDataDBTest : public testing::Test { 17 class GDataDBTest : public testing::Test {
17 public: 18 public:
18 GDataDBTest() { 19 GDataDBTest() {
19 } 20 }
20 21
21 virtual ~GDataDBTest() { 22 virtual ~GDataDBTest() {
22 } 23 }
23 24
24 protected: 25 protected:
25 // testing::Test implementation. 26 // testing::Test implementation.
26 virtual void SetUp() OVERRIDE; 27 virtual void SetUp() OVERRIDE;
27 28
28 // Tests GDataDB::GetPath and GDataDB::ResourceId, ensuring that an entry 29 // Tests GDataDB::GetPath and GDataDB::ResourceId, ensuring that an entry
29 // matching |source| does not exist. 30 // matching |source| does not exist.
30 void TestGetNotFound(const GDataEntry& source); 31 void TestGetNotFound(const GDataEntry& source);
31 32
32 // Tests GDataDB::GetPath and GDataDB::ResourceId, ensuring that an entry 33 // Tests GDataDB::GetPath and GDataDB::ResourceId, ensuring that an entry
33 // matching |source| exists. 34 // matching |source| exists.
34 void TestGetFound(const GDataEntry& source); 35 void TestGetFound(const GDataEntry& source);
35 36
37 // Tests GDataDB::GetPath and GDataDB::ResourceId, ensuring that an entry
38 // matching |source| is corrupt.
39 void TestGetCorrupt(const GDataEntry& source);
40
36 // Initialize the database with the following entries: 41 // Initialize the database with the following entries:
37 // drive/dir1 42 // drive/dir1
38 // drive/dir2 43 // drive/dir2
39 // drive/dir1/dir3 44 // drive/dir1/dir3
40 // drive/dir1/file4 45 // drive/dir1/file4
41 // drive/dir1/file5 46 // drive/dir1/file5
42 // drive/dir2/file6 47 // drive/dir2/file6
43 // drive/dir2/file7 48 // drive/dir2/file7
44 // drive/dir2/file8 49 // drive/dir2/file8
45 // drive/dir1/dir3/file9 50 // drive/dir1/dir3/file9
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 entry.reset(); 96 entry.reset();
92 97
93 status = gdata_db_->GetByResourceId(source.resource_id(), &entry); 98 status = gdata_db_->GetByResourceId(source.resource_id(), &entry);
94 EXPECT_EQ(GDataDB::DB_OK, status); 99 EXPECT_EQ(GDataDB::DB_OK, status);
95 ASSERT_TRUE(entry.get()); 100 ASSERT_TRUE(entry.get());
96 EXPECT_EQ(source.title(), entry->title()); 101 EXPECT_EQ(source.title(), entry->title());
97 EXPECT_EQ(source.resource_id(), entry->resource_id()); 102 EXPECT_EQ(source.resource_id(), entry->resource_id());
98 EXPECT_EQ(source.content_url(), entry->content_url()); 103 EXPECT_EQ(source.content_url(), entry->content_url());
99 } 104 }
100 105
106 void GDataDBTest::TestGetCorrupt(const GDataEntry& source) {
107 scoped_ptr<GDataEntry> entry;
108 GDataDB::Status status = gdata_db_->GetByPath(source.GetFilePath(), &entry);
109 EXPECT_EQ(GDataDB::DB_CORRUPTION, status);
110 EXPECT_FALSE(entry.get());
111
112 status = gdata_db_->GetByResourceId(source.resource_id(), &entry);
113 EXPECT_EQ(GDataDB::DB_CORRUPTION, status);
114 EXPECT_FALSE(entry.get());
115 }
116
101 void GDataDBTest::InitDB() { 117 void GDataDBTest::InitDB() {
102 int sequence_id = 1; 118 int sequence_id = 1;
103 GDataRootDirectory root; 119 GDataRootDirectory root;
104 GDataDirectory* dir1 = AddDirectory(&root, &root, sequence_id++); 120 GDataDirectory* dir1 = AddDirectory(&root, &root, sequence_id++);
105 GDataDirectory* dir2 = AddDirectory(&root, &root, sequence_id++); 121 GDataDirectory* dir2 = AddDirectory(&root, &root, sequence_id++);
106 GDataDirectory* dir3 = AddDirectory(dir1, &root, sequence_id++); 122 GDataDirectory* dir3 = AddDirectory(dir1, &root, sequence_id++);
107 123
108 AddFile(dir1, &root, sequence_id++); 124 AddFile(dir1, &root, sequence_id++);
109 AddFile(dir1, &root, sequence_id++); 125 AddFile(dir1, &root, sequence_id++);
110 126
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 GDataDirectory dir(&root, &root); 195 GDataDirectory dir(&root, &root);
180 dir.set_title("dir"); 196 dir.set_title("dir");
181 dir.set_file_name("dir"); 197 dir.set_file_name("dir");
182 dir.set_resource_id("dir_resource_id"); 198 dir.set_resource_id("dir_resource_id");
183 dir.set_content_url(GURL("http://content/dir")); 199 dir.set_content_url(GURL("http://content/dir"));
184 dir.set_upload_url(GURL("http://upload/dir")); 200 dir.set_upload_url(GURL("http://upload/dir"));
185 201
186 TestGetNotFound(dir); 202 TestGetNotFound(dir);
187 203
188 GDataDB::Status status = gdata_db_->Put(dir); 204 GDataDB::Status status = gdata_db_->Put(dir);
189 EXPECT_EQ(GDataDB::DB_OK, status); 205 ASSERT_EQ(GDataDB::DB_OK, status);
satorux1 2012/07/10 17:10:17 change it to ASSERT. We shouldn't go further if DB
190 206
191 TestGetFound(dir); 207 TestGetFound(dir);
192 208
193 scoped_ptr<GDataEntry> entry; 209 scoped_ptr<GDataEntry> entry;
194 gdata_db_->GetByPath(dir.GetFilePath(), &entry); 210 status = gdata_db_->GetByPath(dir.GetFilePath(), &entry);
211 ASSERT_EQ(GDataDB::DB_OK, status);
195 EXPECT_EQ(dir.upload_url(), entry->AsGDataDirectory()->upload_url()); 212 EXPECT_EQ(dir.upload_url(), entry->AsGDataDirectory()->upload_url());
196 EXPECT_TRUE(entry->AsGDataDirectory()->file_info().is_directory); 213 EXPECT_TRUE(entry->AsGDataDirectory()->file_info().is_directory);
197 214
198 status = gdata_db_->DeleteByPath(dir.GetFilePath()); 215 status = gdata_db_->DeleteByPath(dir.GetFilePath());
199 EXPECT_EQ(GDataDB::DB_OK, status); 216 ASSERT_EQ(GDataDB::DB_OK, status);
200 217
201 TestGetNotFound(dir); 218 TestGetNotFound(dir);
202 219
203 GDataFile file(&dir, &root); 220 GDataFile file(&dir, &root);
204 file.set_title("file"); 221 file.set_title("file");
205 file.set_file_name("file"); 222 file.set_file_name("file");
206 file.set_resource_id("file_resource_id"); 223 file.set_resource_id("file_resource_id");
207 file.set_content_url(GURL("http://content/dir/file")); 224 file.set_content_url(GURL("http://content/dir/file"));
208 file.set_file_md5("file_md5"); 225 file.set_file_md5("file_md5");
209 226
210 TestGetNotFound(file); 227 TestGetNotFound(file);
211 228
212 status = gdata_db_->Put(file); 229 status = gdata_db_->Put(file);
213 EXPECT_EQ(GDataDB::DB_OK, status); 230 ASSERT_EQ(GDataDB::DB_OK, status);
214 231
215 TestGetFound(file); 232 TestGetFound(file);
216 233
217 gdata_db_->GetByPath(file.GetFilePath(), &entry); 234 status = gdata_db_->GetByPath(file.GetFilePath(), &entry);
235 ASSERT_EQ(GDataDB::DB_OK, status);
218 EXPECT_EQ(file.file_md5(), entry->AsGDataFile()->file_md5()); 236 EXPECT_EQ(file.file_md5(), entry->AsGDataFile()->file_md5());
219 EXPECT_FALSE(entry->AsGDataFile()->file_info().is_directory); 237 EXPECT_FALSE(entry->AsGDataFile()->file_info().is_directory);
220 238
221 status = gdata_db_->DeleteByPath(file.GetFilePath()); 239 status = gdata_db_->DeleteByPath(file.GetFilePath());
222 EXPECT_EQ(GDataDB::DB_OK, status); 240 ASSERT_EQ(GDataDB::DB_OK, status);
223 241
224 TestGetNotFound(file); 242 TestGetNotFound(file);
225 } 243 }
226 244
227 TEST_F(GDataDBTest, IterTest) { 245 TEST_F(GDataDBTest, IterTest) {
228 InitDB(); 246 InitDB();
229 247
230 const char* dir1_children[] = { 248 const char* dir1_children[] = {
231 "drive/dir1", 249 "drive/dir1",
232 "drive/dir1/dir3", 250 "drive/dir1/dir3",
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 "drive/dir2", 285 "drive/dir2",
268 "drive/dir2/file6", 286 "drive/dir2/file6",
269 "drive/dir2/file7", 287 "drive/dir2/file7",
270 "drive/dir2/file8", 288 "drive/dir2/file8",
271 }; 289 };
272 TestIter("", all_entries, arraysize(all_entries)); 290 TestIter("", all_entries, arraysize(all_entries));
273 291
274 TestIter("dir4", NULL, 0); 292 TestIter("dir4", NULL, 0);
275 } 293 }
276 294
295 TEST_F(GDataDBTest, IncompatibleProtoTest) {
296 GDataRootDirectory root;
297 GDataFile file(&root, &root);
298 file.set_title("file");
299 file.set_file_name("file");
300 file.set_resource_id("file_resource_id");
301 file.set_content_url(GURL("http://content/dir/file"));
302 file.set_file_md5("file_md5");
303
304 // Add a file and check if it's found.
305 GDataDB::Status status = gdata_db_->Put(file);
306 ASSERT_EQ(GDataDB::DB_OK, status);
307 TestGetFound(file);
308 // Check if the iterator works too.
309 const char* all_entries[] = {
310 "drive/file",
311 };
312 TestIter("", all_entries, arraysize(all_entries));
313
314 // Tweak the file proto to simulate an incompatible proto in the DB.
315 GDataFileProto raw_proto;
316 file.ToProto(&raw_proto);
317 raw_proto.clear_upload_url(); // This will make FromProto() fail.
318 gdata_db_->PutRawForTesting("file_resource_id", raw_proto);
319
320 // Check if the corruption is detected.
321 TestGetCorrupt(file);
322 // We should no longer be able to find the file by iteration.
323 TestIter("", NULL, 0);
324 }
325
277 } // namespace gdata 326 } // namespace gdata
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698