15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache_metadata.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/google_apis/test_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace drive {
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace internal {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FileCacheMetadataTest : public testing::Test {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create cache directories.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    metadata_.reset(new FileCacheMetadata(NULL));
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<FileCacheMetadata> metadata_;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test all the methods of FileCacheMetadata except for
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RemoveTemporaryFiles.
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(FileCacheMetadataTest, CacheTest) {
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_EQ(FileCacheMetadata::INITIALIZE_CREATED,
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            metadata_->Initialize(temp_dir_.path().AppendASCII("test.db")));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save an initial entry.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string test_resource_id("test_resource_id");
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string test_md5("test_md5");
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FileCacheEntry new_cache_entry;
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    new_cache_entry.set_md5(test_md5);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_cache_entry.set_is_present(true);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    metadata_->AddOrUpdateCacheEntry(test_resource_id, new_cache_entry);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that the entry can be retrieved.
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FileCacheEntry cache_entry;
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(test_md5, cache_entry.md5());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_present());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // resource_id doesn't exist.
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(metadata_->GetCacheEntry("not_found_resource_id", &cache_entry));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update all attributes.
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  test_md5 = "test_md5_2";
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FileCacheEntry updated_cache_entry;
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    updated_cache_entry.set_md5(test_md5);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    updated_cache_entry.set_is_pinned(true);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    metadata_->AddOrUpdateCacheEntry(test_resource_id, updated_cache_entry);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the values took.
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(test_md5, cache_entry.md5());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_pinned());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test dirty cache.
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  test_md5 = "test_md5_3";
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FileCacheEntry new_cache_entry;
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    new_cache_entry.set_md5(test_md5);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_cache_entry.set_is_dirty(true);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    metadata_->AddOrUpdateCacheEntry(test_resource_id, new_cache_entry);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the values took.
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(test_md5, cache_entry.md5());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_dirty());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the entry.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metadata_->RemoveCacheEntry(test_resource_id);
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add another one.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_resource_id = "test_resource_id_2";
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  test_md5 = "test_md5_4";
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FileCacheEntry new_cache_entry;
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    new_cache_entry.set_md5(test_md5);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_cache_entry.set_is_present(true);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    metadata_->AddOrUpdateCacheEntry(test_resource_id, new_cache_entry);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the values took.
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(metadata_->GetCacheEntry(test_resource_id, &cache_entry));
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(test_md5, cache_entry.md5());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_present());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(FileCacheMetadataTest, Initialize) {
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const base::FilePath db_path = temp_dir_.path().AppendASCII("test.db");
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Try to open a bogus file.
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      google_apis::test_util::WriteStringToFile(db_path, "Hello world"));
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_EQ(FileCacheMetadata::INITIALIZE_CREATED,
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            metadata_->Initialize(db_path));
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Open an existing DB.
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  metadata_.reset(new FileCacheMetadata(NULL));
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(FileCacheMetadata::INITIALIZE_OPENED,
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            metadata_->Initialize(db_path));
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Try to open a nonexistent path.
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::FilePath non_existent_path(FILE_PATH_LITERAL(
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "/somewhere/nonexistent/test.db"));
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  metadata_.reset(new FileCacheMetadata(NULL));
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(FileCacheMetadata::INITIALIZE_FAILED,
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            metadata_->Initialize(non_existent_path));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}  // namespace internal
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace drive
128