190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 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)
52385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/file_change.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace sync_file_system {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileChange AddOrUpdateFile() {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_FILE);
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileChange DeleteFile() {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FileChange(FileChange::FILE_CHANGE_DELETE, SYNC_FILE_TYPE_FILE);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileChange AddDirectory() {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    SYNC_FILE_TYPE_DIRECTORY);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FileChange DeleteDirectory() {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FileChange(FileChange::FILE_CHANGE_DELETE, SYNC_FILE_TYPE_DIRECTORY);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <size_t INPUT_SIZE>
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreateList(FileChangeList* list, const FileChange (&inputs)[INPUT_SIZE]) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  list->clear();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < INPUT_SIZE; ++i)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    list->Update(inputs[i]);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <size_t EXPECTED_SIZE>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VerifyList(const FileChangeList& list,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const FileChange (&expected)[EXPECTED_SIZE]) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SCOPED_TRACE(testing::Message() << "actual:" << list.DebugString());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(EXPECTED_SIZE, list.size());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < list.size(); ++i) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(testing::Message() << i << ": "
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << " expected:" << expected[i].DebugString()
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << " actual:" << list.list().at(i).DebugString());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected[i], list.list().at(i));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileChangeListTest, UpdateSimple) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileChangeList list;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput1[] = { AddOrUpdateFile() };
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kExpected1[] = { AddOrUpdateFile() };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput1);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyList(list, kExpected1);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AddOrUpdate + Delete -> Delete.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput2[] = { AddOrUpdateFile(), DeleteFile() };
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kExpected2[] = { DeleteFile() };
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput2);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyList(list, kExpected2);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add + Delete -> empty (directory).
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput3[] = { AddDirectory(), DeleteDirectory() };
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput3);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(list.empty());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete + AddOrUpdate -> AddOrUpdate.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput4[] = { DeleteFile(), AddOrUpdateFile() };
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kExpected4[] = { AddOrUpdateFile() };
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput4);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyList(list, kExpected4);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete + Add -> Add (directory).
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput5[] = { DeleteDirectory(), AddDirectory() };
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kExpected5[] = { AddDirectory() };
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput5);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyList(list, kExpected5);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(FileChangeListTest, UpdateCombined) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileChangeList list;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Longer ones.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput1[] = {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteFile(),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddDirectory(),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kExpected1[] = { DeleteFile(), AddDirectory() };
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput1);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyList(list, kExpected1);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput2[] = {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteFile(),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kExpected2[] = { AddOrUpdateFile() };
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput2);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyList(list, kExpected2);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput3[] = {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddDirectory(),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteDirectory(),
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kExpected3[] = { AddOrUpdateFile() };
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput3);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyList(list, kExpected3);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kInput4[] = {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddDirectory(),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteDirectory(),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteFile(),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddOrUpdateFile(),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DeleteFile(),
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FileChange kExpected4[] = { DeleteFile() };
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateList(&list, kInput4);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VerifyList(list, kExpected4);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace sync_file_system
137