| Index: chrome/browser/extensions/api/file_system/saved_files_service_unittest.cc
|
| diff --git a/chrome/browser/extensions/api/file_system/saved_files_service_unittest.cc b/chrome/browser/extensions/api/file_system/saved_files_service_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..75270eee506f826bfbc74e57f1966c2515956bf4
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/api/file_system/saved_files_service_unittest.cc
|
| @@ -0,0 +1,212 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <algorithm>
|
| +#include "base/basictypes.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/string_number_conversions.h"
|
| +#include "base/test/values_test_util.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/extensions/api/file_system/saved_files_service.h"
|
| +#include "chrome/browser/extensions/extension_prefs.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| +#include "chrome/browser/extensions/extension_system.h"
|
| +#include "chrome/browser/extensions/test_extension_environment.h"
|
| +#include "chrome/common/extensions/extension.h"
|
| +#include "chrome/test/base/testing_profile.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| +#include "chrome/browser/chromeos/settings/cros_settings.h"
|
| +#include "chrome/browser/chromeos/settings/device_settings_service.h"
|
| +#endif
|
| +
|
| +#define TRACE_CALL(expression) \
|
| + do { \
|
| + SCOPED_TRACE(#expression); \
|
| + expression; \
|
| + } while (0)
|
| +
|
| +using extensions::SavedFileEntry;
|
| +using extensions::SavedFilesService;
|
| +
|
| +namespace {
|
| +
|
| +std::string GenerateId(int i) {
|
| + return base::IntToString(i) + ":filename.ext";
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class SavedFilesServiceUnitTest : public testing::Test {
|
| + protected:
|
| + virtual void SetUp() OVERRIDE {
|
| + testing::Test::SetUp();
|
| + extension_ = env_.MakeExtension(*base::test::ParseJson(
|
| + "{\"app\": {\"background\": {\"scripts\": [\"background.js\"]}},"
|
| + "\"permissions\": [{\"fileSystem\": [\"retainFiles\"]}]}"));
|
| + service_ = SavedFilesService::Get(env_.profile());
|
| + path_ = base::FilePath(FILE_PATH_LITERAL("filename.ext"));
|
| + }
|
| +
|
| + virtual void TearDown() OVERRIDE {
|
| + extensions::ClearMaxSequenceNumberForTest();
|
| + extensions::ClearLruSizeForTest();
|
| + testing::Test::TearDown();
|
| + }
|
| +
|
| + void CheckSavedFileEntry(const std::string& id, int sequence_number) {
|
| + SCOPED_TRACE(id);
|
| + SavedFileEntry entry;
|
| + EXPECT_TRUE(service_->IsSaved(extension_->id(), id));
|
| + ASSERT_TRUE(service_->GetFileEntry(extension_->id(), id, &entry));
|
| + EXPECT_EQ(id, entry.id);
|
| + EXPECT_EQ(path_, entry.path);
|
| + EXPECT_TRUE(entry.writable);
|
| + EXPECT_EQ(sequence_number, entry.sequence_number);
|
| + }
|
| +
|
| + void CheckSavedFileEntries(int start, int end) {
|
| + SavedFileEntry entry;
|
| + for (int i = start; i < end; i++) {
|
| + CheckSavedFileEntry(GenerateId(i), i + 1);
|
| + }
|
| + }
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| + chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
|
| + chromeos::ScopedTestCrosSettings test_cros_settings_;
|
| +#endif
|
| + extensions::TestExtensionEnvironment env_;
|
| + const extensions::Extension* extension_;
|
| + SavedFilesService* service_;
|
| + base::FilePath path_;
|
| +};
|
| +
|
| +TEST_F(SavedFilesServiceUnitTest, RetainTwoFilesTest) {
|
| + service_->AddFileEntry(extension_->id(), GenerateId(1), path_, true);
|
| + service_->AddFileEntry(extension_->id(), GenerateId(2), path_, true);
|
| + service_->AddFileEntry(extension_->id(), GenerateId(3), path_, true);
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 0));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 0));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 0));
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 0));
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 0));
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(2));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 2));
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(2));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 2));
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 3));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 2));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 0));
|
| + EXPECT_FALSE(service_->IsSaved(extension_->id(), "another id"));
|
| + SavedFileEntry entry;
|
| + EXPECT_FALSE(service_->GetFileEntry(extension_->id(), "another id", &entry));
|
| + std::vector<SavedFileEntry> entries;
|
| + service_->ClearExtensionForTest(extension_->id());
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 3));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 2));
|
| + EXPECT_FALSE(service_->IsSaved(extension_->id(), GenerateId(3)));
|
| +}
|
| +
|
| +TEST_F(SavedFilesServiceUnitTest, NoRetainFilesPermissionTest) {
|
| + extension_ = env_.MakeExtension(*base::test::ParseJson(
|
| + "{\"app\": {\"background\": {\"scripts\": [\"background.js\"]}},"
|
| + "\"permissions\": [\"fileSystem\"]}"));
|
| + service_->AddFileEntry(extension_->id(), GenerateId(1), path_, true);
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 0));
|
| + SavedFileEntry entry;
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
|
| + EXPECT_FALSE(service_->IsSaved(extension_->id(), "another id"));
|
| + EXPECT_FALSE(service_->GetFileEntry(extension_->id(), "another id", &entry));
|
| + std::vector<SavedFileEntry> entries;
|
| + service_->ClearExtensionForTest(extension_->id());
|
| + service_->GetFileEntries(extension_->id(), &entries);
|
| + EXPECT_TRUE(entries.empty());
|
| +}
|
| +
|
| +TEST_F(SavedFilesServiceUnitTest, EvictionTest) {
|
| + extensions::SetLruSizeForTest(10);
|
| + for (int i = 0; i < 10; i++) {
|
| + service_->AddFileEntry(extension_->id(), GenerateId(i), path_, true);
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(i));
|
| + }
|
| + service_->AddFileEntry(extension_->id(), GenerateId(10), path_, true);
|
| + TRACE_CALL(CheckSavedFileEntries(0, 10));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(10), 0));
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(10));
|
| +
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 0));
|
| + TRACE_CALL(CheckSavedFileEntries(1, 11));
|
| + service_->ClearExtensionForTest(extension_->id());
|
| + SavedFileEntry entry;
|
| + EXPECT_FALSE(service_->GetFileEntry(extension_->id(), GenerateId(0), &entry));
|
| + TRACE_CALL(CheckSavedFileEntries(1, 11));
|
| +
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 12));
|
| + TRACE_CALL(CheckSavedFileEntries(2, 11));
|
| + service_->ClearExtensionForTest(extension_->id());
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 12));
|
| + TRACE_CALL(CheckSavedFileEntries(2, 11));
|
| +}
|
| +
|
| +TEST_F(SavedFilesServiceUnitTest, SequenceNumberCompactionTest) {
|
| + extensions::SetMaxSequenceNumberForTest(8);
|
| + for (int i = 0; i < 4; i++) {
|
| + service_->AddFileEntry(extension_->id(), GenerateId(i), path_, true);
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(i));
|
| + }
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(2));
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(3));
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(2));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 2));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 7));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 6));
|
| + service_->ClearExtensionForTest(extension_->id());
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 1));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 2));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 7));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 6));
|
| +
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(3));
|
| + TRACE_CALL(CheckSavedFileEntries(0, 4));
|
| + service_->ClearExtensionForTest(extension_->id());
|
| + TRACE_CALL(CheckSavedFileEntries(0, 4));
|
| +}
|
| +
|
| +TEST_F(SavedFilesServiceUnitTest, SequenceNumberCompactionFirstAboveOneTest) {
|
| + extensions::SetMaxSequenceNumberForTest(10);
|
| + for (int i = 0; i < 4; i++) {
|
| + service_->AddFileEntry(extension_->id(), GenerateId(i), path_, true);
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(i));
|
| + }
|
| + for (int i = 0; i < 4; i++) {
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(i));
|
| + }
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(2));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 5));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 6));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 9));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 8));
|
| + service_->ClearExtensionForTest(extension_->id());
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 5));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 6));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 9));
|
| + TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 8));
|
| +
|
| + service_->RecordFileAccess(extension_->id(), GenerateId(3));
|
| + TRACE_CALL(CheckSavedFileEntries(0, 4));
|
| + service_->ClearExtensionForTest(extension_->id());
|
| + TRACE_CALL(CheckSavedFileEntries(0, 4));
|
| +}
|
|
|