#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
#include "chrome/browser/sync_file_system/sync_status_code.h"
#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
+#include "content/public/test/mock_blob_url_request_context.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "webkit/browser/blob/mock_blob_url_request_context.h"
+#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
+#include "third_party/leveldatabase/src/include/leveldb/env.h"
#include "webkit/browser/fileapi/file_system_context.h"
#include "webkit/browser/quota/quota_manager.h"
using fileapi::FileSystemContext;
using fileapi::FileSystemURL;
using fileapi::FileSystemURLSet;
-using webkit_blob::MockBlobURLRequestContext;
-using webkit_blob::ScopedTextBlob;
+using content::MockBlobURLRequestContext;
+using content::ScopedTextBlob;
namespace sync_file_system {
class LocalFileChangeTrackerTest : public testing::Test {
public:
LocalFileChangeTrackerTest()
- : message_loop_(base::MessageLoop::TYPE_IO),
+ : in_memory_env_(leveldb::NewMemEnv(leveldb::Env::Default())),
file_system_(GURL("http://example.com"),
+ in_memory_env_.get(),
base::MessageLoopProxy::current().get(),
base::MessageLoopProxy::current().get()) {}
virtual void SetUp() OVERRIDE {
- file_system_.SetUp();
+ file_system_.SetUp(CannedSyncableFileSystem::QUOTA_ENABLED);
sync_context_ =
new LocalFileSyncContext(base::FilePath(),
+ in_memory_env_.get(),
base::MessageLoopProxy::current().get(),
base::MessageLoopProxy::current().get());
ASSERT_EQ(
change_tracker()->CollectLastDirtyChanges(file_system_context());
}
+ void GetAllChangedURLs(fileapi::FileSystemURLSet* urls) {
+ change_tracker()->GetAllChangedURLs(urls);
+ }
+
ScopedEnableSyncFSDirectoryOperation enable_directory_operation_;
- base::MessageLoop message_loop_;
+ base::MessageLoopForIO message_loop_;
+ scoped_ptr<leveldb::Env> in_memory_env_;
CannedSyncableFileSystem file_system_;
private:
};
TEST_F(LocalFileChangeTrackerTest, GetChanges) {
- EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.OpenFileSystem());
+ EXPECT_EQ(base::File::FILE_OK, file_system_.OpenFileSystem());
// Test URLs (no parent/child relationships, as we test such cases
// mainly in LocalFileSyncStatusTest).
EXPECT_EQ(URL(kPath5), urls_to_process[3]);
EXPECT_EQ(URL(kPath4), urls_to_process[4]);
+ // No changes to promote yet, we've demoted no changes.
+ EXPECT_FALSE(change_tracker()->PromoteDemotedChanges());
+
+ // Demote changes for kPath1 and kPath3.
+ change_tracker()->DemoteChangesForURL(URL(kPath1));
+ change_tracker()->DemoteChangesForURL(URL(kPath3));
+
+ // Now we'll get no changes for kPath1 and kPath3 (it's in a separate queue).
+ urls_to_process.clear();
+ change_tracker()->GetNextChangedURLs(&urls_to_process, 0);
+ ASSERT_EQ(3U, urls_to_process.size());
+ EXPECT_EQ(URL(kPath2), urls_to_process[0]);
+ EXPECT_EQ(URL(kPath5), urls_to_process[1]);
+ EXPECT_EQ(URL(kPath4), urls_to_process[2]);
+
+ // Promote changes.
+ EXPECT_TRUE(change_tracker()->PromoteDemotedChanges());
+
+ // Now we should have kPath1 and kPath3.
+ urls_to_process.clear();
+ change_tracker()->GetNextChangedURLs(&urls_to_process, 0);
+ ASSERT_EQ(5U, urls_to_process.size());
+ EXPECT_EQ(URL(kPath2), urls_to_process[0]);
+ EXPECT_EQ(URL(kPath5), urls_to_process[1]);
+ EXPECT_EQ(URL(kPath4), urls_to_process[2]);
+ EXPECT_TRUE(URL(kPath1) == urls_to_process[3] ||
+ URL(kPath1) == urls_to_process[4]);
+ EXPECT_TRUE(URL(kPath3) == urls_to_process[3] ||
+ URL(kPath3) == urls_to_process[4]);
+
+ // No changes to promote any more.
+ EXPECT_FALSE(change_tracker()->PromoteDemotedChanges());
+
+
VerifyAndClearChange(URL(kPath1),
FileChange(FileChange::FILE_CHANGE_DELETE,
sync_file_system::SYNC_FILE_TYPE_DIRECTORY));
}
TEST_F(LocalFileChangeTrackerTest, RestoreCreateAndModifyChanges) {
- EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.OpenFileSystem());
+ EXPECT_EQ(base::File::FILE_OK, file_system_.OpenFileSystem());
FileSystemURLSet urls;
ScopedTextBlob blob(url_request_context, "blob_id:test", kData);
// Create files and nested directories.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath0))); // Creates a file.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath1))); // Creates a dir.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath2))); // Creates another dir.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath3))); // Creates a file.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.TruncateFile(URL(kPath3), 1)); // Modifies the file.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath4))); // Creates another file.
EXPECT_EQ(static_cast<int64>(kData.size()), // Modifies the file.
file_system_.Write(&url_request_context,
}
TEST_F(LocalFileChangeTrackerTest, RestoreRemoveChanges) {
- EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.OpenFileSystem());
+ EXPECT_EQ(base::File::FILE_OK, file_system_.OpenFileSystem());
FileSystemURLSet urls;
ASSERT_EQ(0U, urls.size());
// Creates and removes a same file.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath0)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Remove(URL(kPath0), false /* recursive */));
// Creates and removes a same directory.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath1)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Remove(URL(kPath1), false /* recursive */));
// Creates files and nested directories, then removes the parent directory.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath2)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath3)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath4)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath5)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Remove(URL(kPath2), true /* recursive */));
file_system_.GetChangedURLsInTracker(&urls);
}
TEST_F(LocalFileChangeTrackerTest, RestoreCopyChanges) {
- EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.OpenFileSystem());
+ EXPECT_EQ(base::File::FILE_OK, file_system_.OpenFileSystem());
FileSystemURLSet urls;
ScopedTextBlob blob(url_request_context, "blob_id:test", kData);
// Create files and nested directories.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath0))); // Creates a file.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath1))); // Creates a dir.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath2))); // Creates another dir.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath3))); // Creates a file.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.TruncateFile(URL(kPath3), 1)); // Modifies the file.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath4))); // Creates another file.
EXPECT_EQ(static_cast<int64>(kData.size()),
file_system_.Write(&url_request_context, // Modifies the file.
EXPECT_TRUE(urls.empty());
// Copy the file and the parent directory.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Copy(URL(kPath0), URL(kPath0Copy))); // Copy the file.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Copy(URL(kPath1), URL(kPath1Copy))); // Copy the dir.
file_system_.GetChangedURLsInTracker(&urls);
}
TEST_F(LocalFileChangeTrackerTest, RestoreMoveChanges) {
- EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.OpenFileSystem());
+ EXPECT_EQ(base::File::FILE_OK, file_system_.OpenFileSystem());
FileSystemURLSet urls;
ASSERT_EQ(0U, urls.size());
// Create files and nested directories.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath0)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath1)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath2)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath3)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath4)));
// Verify we have 5 changes for preparation.
EXPECT_TRUE(urls.empty());
// Move the file and the parent directory.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Move(URL(kPath0), URL(kPath5)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Move(URL(kPath1), URL(kPath6)));
file_system_.GetChangedURLsInTracker(&urls);
}
TEST_F(LocalFileChangeTrackerTest, NextChangedURLsWithRecursiveCopy) {
- EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.OpenFileSystem());
+ EXPECT_EQ(base::File::FILE_OK, file_system_.OpenFileSystem());
FileSystemURLSet urls;
const char kPath2Copy[] = "dir b/dir";
// Creates kPath0,1,2 and then copies them all.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath0)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath1)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath2)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Copy(URL(kPath0), URL(kPath0Copy)));
std::deque<FileSystemURL> urls_to_process;
}
TEST_F(LocalFileChangeTrackerTest, NextChangedURLsWithRecursiveRemove) {
- EXPECT_EQ(base::PLATFORM_FILE_OK, file_system_.OpenFileSystem());
-
- FileSystemURLSet urls;
+ EXPECT_EQ(base::File::FILE_OK, file_system_.OpenFileSystem());
const char kPath0[] = "dir a";
const char kPath1[] = "dir a/file1";
const char kPath2[] = "dir a/file2";
// Creates kPath0,1,2 and then removes them all.
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateDirectory(URL(kPath0)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath1)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.CreateFile(URL(kPath2)));
- EXPECT_EQ(base::PLATFORM_FILE_OK,
+ EXPECT_EQ(base::File::FILE_OK,
file_system_.Remove(URL(kPath0), true /* recursive */));
- std::deque<FileSystemURL> urls_to_process;
- change_tracker()->GetNextChangedURLs(&urls_to_process, 0);
+ FileSystemURLSet urls;
+ GetAllChangedURLs(&urls);
// This is actually not really desirable, but since the directory
// creation and deletion have been offset now we only have two
// TODO(kinuko): For micro optimization we could probably restore the ADD
// change type (other than ADD_OR_UPDATE) and offset file ADD+DELETE
// changes too.
- ASSERT_EQ(2U, urls_to_process.size());
+ ASSERT_EQ(2U, urls.size());
// The exact order of recursive removal cannot be determined.
- EXPECT_TRUE(URL(kPath1) == urls_to_process[0] ||
- URL(kPath2) == urls_to_process[0]);
- EXPECT_TRUE(URL(kPath1) == urls_to_process[1] ||
- URL(kPath2) == urls_to_process[1]);
+ EXPECT_TRUE(ContainsKey(urls, URL(kPath1)));
+ EXPECT_TRUE(ContainsKey(urls, URL(kPath2)));
+}
+
+TEST_F(LocalFileChangeTrackerTest, ResetForFileSystem) {
+ EXPECT_EQ(base::File::FILE_OK, file_system_.OpenFileSystem());
+
+ const char kPath0[] = "dir a";
+ const char kPath1[] = "dir a/file";
+ const char kPath2[] = "dir a/subdir";
+ const char kPath3[] = "dir b";
+
+ EXPECT_EQ(base::File::FILE_OK,
+ file_system_.CreateDirectory(URL(kPath0)));
+ EXPECT_EQ(base::File::FILE_OK,
+ file_system_.CreateFile(URL(kPath1)));
+ EXPECT_EQ(base::File::FILE_OK,
+ file_system_.CreateDirectory(URL(kPath2)));
+ EXPECT_EQ(base::File::FILE_OK,
+ file_system_.CreateDirectory(URL(kPath3)));
+
+ FileSystemURLSet urls;
+ GetAllChangedURLs(&urls);
+ EXPECT_EQ(4u, urls.size());
+ EXPECT_TRUE(ContainsKey(urls, URL(kPath0)));
+ EXPECT_TRUE(ContainsKey(urls, URL(kPath1)));
+ EXPECT_TRUE(ContainsKey(urls, URL(kPath2)));
+ EXPECT_TRUE(ContainsKey(urls, URL(kPath3)));
+
+ // Reset all changes for the file system.
+ change_tracker()->ResetForFileSystem(
+ file_system_.origin(), file_system_.type());
+
+ GetAllChangedURLs(&urls);
+ EXPECT_TRUE(urls.empty());
+
+ // Make sure they're gone from the database too.
+ DropChangesInTracker();
+ RestoreChangesFromTrackerDB();
+
+ GetAllChangedURLs(&urls);
+ EXPECT_TRUE(urls.empty());
}
} // namespace sync_file_system