blob: b87dae47ddbaed4df8f87c6ec1f6c58029e99ced [file] [log] [blame]
// Copyright (c) 2012 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 "webkit/fileapi/syncable/file_change.h"
#include "base/basictypes.h"
#include "base/logging.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace fileapi {
namespace {
FileChange AddFile() {
return FileChange(FileChange::FILE_CHANGE_ADD,
FileChange::FILE_TYPE_FILE);
}
FileChange DeleteFile() {
return FileChange(FileChange::FILE_CHANGE_DELETE,
FileChange::FILE_TYPE_FILE);
}
FileChange UpdateFile() {
return FileChange(FileChange::FILE_CHANGE_UPDATE,
FileChange::FILE_TYPE_FILE);
}
FileChange AddDirectory() {
return FileChange(FileChange::FILE_CHANGE_ADD,
FileChange::FILE_TYPE_DIRECTORY);
}
FileChange DeleteDirectory() {
return FileChange(FileChange::FILE_CHANGE_DELETE,
FileChange::FILE_TYPE_DIRECTORY);
}
template <size_t INPUT_SIZE>
void CreateList(FileChangeList* list, const FileChange (&inputs)[INPUT_SIZE]) {
list->clear();
for (size_t i = 0; i < INPUT_SIZE; ++i)
list->Update(inputs[i]);
}
template <size_t EXPECTED_SIZE>
void VerifyList(const FileChangeList& list,
const FileChange (&expected)[EXPECTED_SIZE]) {
SCOPED_TRACE(testing::Message() << list.DebugString());
ASSERT_EQ(EXPECTED_SIZE, list.size());
for (size_t i = 0; i < list.size(); ++i) {
SCOPED_TRACE(testing::Message() << i << ": "
<< " expected:" << expected[i].DebugString()
<< " actual:" << list.list().at(i).DebugString());
EXPECT_EQ(expected[i], list.list().at(i));
}
}
} // namespace
TEST(FileChangeListTest, UpdateSimple) {
FileChangeList list;
const FileChange kInput1[] = { AddFile() };
const FileChange kExpected1[] = { AddFile() };
CreateList(&list, kInput1);
VerifyList(list, kExpected1);
// Add + Delete -> empty.
const FileChange kInput2[] = { AddFile(), DeleteFile() };
CreateList(&list, kInput2);
ASSERT_TRUE(list.empty());
// Add + Delete -> empty (directory).
const FileChange kInput3[] = { AddDirectory(), DeleteDirectory() };
CreateList(&list, kInput3);
ASSERT_TRUE(list.empty());
// Add + Update -> Add.
const FileChange kInput4[] = { AddFile(), UpdateFile() };
const FileChange kExpected4[] = { AddFile() };
CreateList(&list, kInput4);
VerifyList(list, kExpected4);
// Delete + Add -> Add.
const FileChange kInput5[] = { DeleteFile(), AddFile() };
const FileChange kExpected5[] = { AddFile() };
CreateList(&list, kInput5);
VerifyList(list, kExpected5);
// Delete + Add -> Add (directory).
const FileChange kInput6[] = { DeleteDirectory(), AddDirectory() };
const FileChange kExpected6[] = { AddDirectory() };
CreateList(&list, kInput6);
VerifyList(list, kExpected6);
// Update + Delete -> Delete.
const FileChange kInput7[] = { UpdateFile(), DeleteFile() };
const FileChange kExpected7[] = { DeleteFile() };
CreateList(&list, kInput7);
VerifyList(list, kExpected7);
}
TEST(FileChangeListTest, UpdateCombined) {
FileChangeList list;
// Longer ones.
const FileChange kInput1[] = {
AddFile(),
UpdateFile(),
UpdateFile(),
UpdateFile(),
DeleteFile(),
AddDirectory(),
};
const FileChange kExpected1[] = { AddDirectory() };
CreateList(&list, kInput1);
VerifyList(list, kExpected1);
const FileChange kInput2[] = {
AddFile(),
DeleteFile(),
AddFile(),
UpdateFile(),
UpdateFile(),
};
const FileChange kExpected2[] = { AddFile() };
CreateList(&list, kInput2);
VerifyList(list, kExpected2);
const FileChange kInput3[] = {
AddDirectory(),
DeleteDirectory(),
AddFile(),
UpdateFile(),
UpdateFile(),
};
const FileChange kExpected3[] = { AddFile() };
CreateList(&list, kInput3);
VerifyList(list, kExpected3);
}
} // namespace fileapi