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 "chrome/browser/chromeos/drive/file_cache_metadata.h"
6
7#include "base/file_util.h"
8#include "base/files/scoped_temp_dir.h"
9#include "chrome/browser/chromeos/drive/drive.pb.h"
10#include "chrome/browser/chromeos/drive/file_system_util.h"
11#include "chrome/browser/chromeos/drive/test_util.h"
12#include "chrome/browser/google_apis/test_util.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15namespace drive {
16namespace internal {
17
18class FileCacheMetadataTest : public testing::Test {
19 public:
20  virtual void SetUp() OVERRIDE {
21    // Create cache directories.
22    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
23    metadata_.reset(new FileCacheMetadata(NULL));
24  }
25
26 protected:
27  base::ScopedTempDir temp_dir_;
28  scoped_ptr<FileCacheMetadata> metadata_;
29};
30
31// Test all the methods of FileCacheMetadata except for
32// RemoveTemporaryFiles.
33TEST_F(FileCacheMetadataTest, CacheTest) {
34  ASSERT_EQ(FileCacheMetadata::INITIALIZE_CREATED,
35            metadata_->Initialize(temp_dir_.path().AppendASCII("test.db")));
36
37  // Save an initial entry.
38  std::string test_resource_id("test_resource_id");
39  std::string test_md5("test_md5");
40  {
41    FileCacheEntry new_cache_entry;
42    new_cache_entry.set_md5(test_md5);
43    new_cache_entry.set_is_present(true);
44    metadata_->AddOrUpdateCacheEntry(test_resource_id, new_cache_entry);
45  }
46
47  // Test that the entry can be retrieved.
48  FileCacheEntry cache_entry;
49  ASSERT_TRUE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
50  EXPECT_EQ(test_md5, cache_entry.md5());
51  EXPECT_TRUE(cache_entry.is_present());
52
53  // resource_id doesn't exist.
54  EXPECT_FALSE(metadata_->GetCacheEntry("not_found_resource_id", &cache_entry));
55
56  // Update all attributes.
57  test_md5 = "test_md5_2";
58  {
59    FileCacheEntry updated_cache_entry;
60    updated_cache_entry.set_md5(test_md5);
61    updated_cache_entry.set_is_pinned(true);
62    metadata_->AddOrUpdateCacheEntry(test_resource_id, updated_cache_entry);
63  }
64
65  // Make sure the values took.
66  ASSERT_TRUE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
67  EXPECT_EQ(test_md5, cache_entry.md5());
68  EXPECT_TRUE(cache_entry.is_pinned());
69
70  // Test dirty cache.
71  test_md5 = "test_md5_3";
72  {
73    FileCacheEntry new_cache_entry;
74    new_cache_entry.set_md5(test_md5);
75    new_cache_entry.set_is_dirty(true);
76    metadata_->AddOrUpdateCacheEntry(test_resource_id, new_cache_entry);
77  }
78
79  // Make sure the values took.
80  ASSERT_TRUE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
81  EXPECT_EQ(test_md5, cache_entry.md5());
82  EXPECT_TRUE(cache_entry.is_dirty());
83
84  // Remove the entry.
85  metadata_->RemoveCacheEntry(test_resource_id);
86  EXPECT_FALSE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
87
88  // Add another one.
89  test_resource_id = "test_resource_id_2";
90  test_md5 = "test_md5_4";
91  {
92    FileCacheEntry new_cache_entry;
93    new_cache_entry.set_md5(test_md5);
94    new_cache_entry.set_is_present(true);
95    metadata_->AddOrUpdateCacheEntry(test_resource_id, new_cache_entry);
96  }
97
98  // Make sure the values took.
99  ASSERT_TRUE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
100  EXPECT_EQ(test_md5, cache_entry.md5());
101  EXPECT_TRUE(cache_entry.is_present());
102}
103
104TEST_F(FileCacheMetadataTest, Initialize) {
105  const base::FilePath db_path = temp_dir_.path().AppendASCII("test.db");
106
107  // Try to open a bogus file.
108  ASSERT_TRUE(
109      google_apis::test_util::WriteStringToFile(db_path, "Hello world"));
110  ASSERT_EQ(FileCacheMetadata::INITIALIZE_CREATED,
111            metadata_->Initialize(db_path));
112
113  // Open an existing DB.
114  metadata_.reset(new FileCacheMetadata(NULL));
115  EXPECT_EQ(FileCacheMetadata::INITIALIZE_OPENED,
116            metadata_->Initialize(db_path));
117
118  // Try to open a nonexistent path.
119  base::FilePath non_existent_path(FILE_PATH_LITERAL(
120      "/somewhere/nonexistent/test.db"));
121  metadata_.reset(new FileCacheMetadata(NULL));
122  EXPECT_EQ(FileCacheMetadata::INITIALIZE_FAILED,
123            metadata_->Initialize(non_existent_path));
124}
125
126}  // namespace internal
127}  // namespace drive
128