1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
9 #include "chrome/browser/sync_file_system/drive_backend_v1/remote_sync_operation_resolver.h"
10 #include "chrome/browser/sync_file_system/file_change.h"
11 #include "chrome/browser/sync_file_system/sync_file_type.h"
12 #include "testing/gtest/include/gtest/gtest.h"
14 namespace sync_file_system {
19 SyncFileType local_file_type;
20 FileChangeList local_changes;
22 std::string DebugString() {
23 std::ostringstream ss;
24 ss << "LocalFileType: " << local_file_type
25 << ", LocalChanges: " << local_changes.DebugString();
30 template <typename type, size_t array_size>
31 std::vector<type> CreateList(const type (&inputs)[array_size]) {
32 return std::vector<type>(inputs, inputs + array_size);
35 FileChangeList CreateEmptyChange() {
36 return FileChangeList();
39 FileChangeList CreateAddOrUpdateFileChange() {
41 list.Update(FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
42 SYNC_FILE_TYPE_FILE));
46 FileChangeList CreateAddDirectoryChange() {
48 list.Update(FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
49 SYNC_FILE_TYPE_DIRECTORY));
53 FileChangeList CreateDeleteFileChange() {
55 list.Update(FileChange(FileChange::FILE_CHANGE_DELETE,
56 SYNC_FILE_TYPE_FILE));
60 FileChangeList CreateDeleteDirectoryChange() {
62 list.Update(FileChange(FileChange::FILE_CHANGE_DELETE,
63 SYNC_FILE_TYPE_DIRECTORY));
67 std::vector<Input> CreateInput() {
68 const Input inputs[] = {
69 { SYNC_FILE_TYPE_UNKNOWN, CreateEmptyChange() },
70 { SYNC_FILE_TYPE_UNKNOWN, CreateAddOrUpdateFileChange() },
71 { SYNC_FILE_TYPE_UNKNOWN, CreateAddDirectoryChange() },
72 { SYNC_FILE_TYPE_UNKNOWN, CreateDeleteFileChange() },
73 { SYNC_FILE_TYPE_UNKNOWN, CreateDeleteDirectoryChange() },
75 { SYNC_FILE_TYPE_FILE, CreateEmptyChange() },
76 { SYNC_FILE_TYPE_FILE, CreateAddOrUpdateFileChange() },
77 { SYNC_FILE_TYPE_FILE, CreateAddDirectoryChange() },
78 { SYNC_FILE_TYPE_FILE, CreateDeleteFileChange() },
79 { SYNC_FILE_TYPE_FILE, CreateDeleteDirectoryChange() },
81 { SYNC_FILE_TYPE_DIRECTORY, CreateEmptyChange() },
82 { SYNC_FILE_TYPE_DIRECTORY, CreateAddOrUpdateFileChange() },
83 { SYNC_FILE_TYPE_DIRECTORY, CreateAddDirectoryChange() },
84 { SYNC_FILE_TYPE_DIRECTORY, CreateDeleteFileChange() },
85 { SYNC_FILE_TYPE_DIRECTORY, CreateDeleteDirectoryChange() },
87 return CreateList(inputs);
92 class RemoteSyncOperationResolverTest : public testing::Test {
94 RemoteSyncOperationResolverTest() {}
97 typedef RemoteSyncOperationResolver Resolver;
98 typedef std::vector<SyncOperationType> ExpectedTypes;
101 DISALLOW_COPY_AND_ASSIGN(RemoteSyncOperationResolverTest);
104 TEST_F(RemoteSyncOperationResolverTest, ResolveForAddOrUpdateFile) {
105 const SyncOperationType kExpectedTypes[] = {
106 SYNC_OPERATION_ADD_FILE,
109 SYNC_OPERATION_ADD_FILE,
110 SYNC_OPERATION_ADD_FILE,
112 SYNC_OPERATION_UPDATE_FILE,
113 SYNC_OPERATION_CONFLICT,
118 SYNC_OPERATION_RESOLVE_TO_LOCAL,
120 SYNC_OPERATION_RESOLVE_TO_LOCAL,
125 ExpectedTypes expected_types = CreateList(kExpectedTypes);
126 std::vector<Input> inputs = CreateInput();
128 ASSERT_EQ(expected_types.size(), inputs.size());
129 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i)
130 EXPECT_EQ(expected_types[i],
131 Resolver::ResolveForAddOrUpdateFile(
132 inputs[i].local_changes, inputs[i].local_file_type))
133 << "Case " << i << ": (" << inputs[i].DebugString() << ")";
136 TEST_F(RemoteSyncOperationResolverTest, ResolveForAddOrUpdateFileInConflict) {
137 const SyncOperationType kExpectedTypes[] = {
141 SYNC_OPERATION_RESOLVE_TO_REMOTE,
142 SYNC_OPERATION_RESOLVE_TO_REMOTE,
144 SYNC_OPERATION_CONFLICT,
145 SYNC_OPERATION_CONFLICT,
152 SYNC_OPERATION_RESOLVE_TO_LOCAL,
157 ExpectedTypes expected_types = CreateList(kExpectedTypes);
158 std::vector<Input> inputs = CreateInput();
160 ASSERT_EQ(expected_types.size(), inputs.size());
161 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i)
162 EXPECT_EQ(expected_types[i],
163 Resolver::ResolveForAddOrUpdateFileInConflict(
164 inputs[i].local_changes, inputs[i].local_file_type))
165 << "Case " << i << ": (" << inputs[i].DebugString() << ")";
168 TEST_F(RemoteSyncOperationResolverTest, ResolveForAddDirectory) {
169 const SyncOperationType kExpectedTypes[] = {
170 SYNC_OPERATION_ADD_DIRECTORY,
173 SYNC_OPERATION_RESOLVE_TO_REMOTE,
174 SYNC_OPERATION_RESOLVE_TO_REMOTE,
176 SYNC_OPERATION_RESOLVE_TO_REMOTE,
177 SYNC_OPERATION_RESOLVE_TO_REMOTE,
189 ExpectedTypes expected_types = CreateList(kExpectedTypes);
190 std::vector<Input> inputs = CreateInput();
192 ASSERT_EQ(expected_types.size(), inputs.size());
193 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i)
194 EXPECT_EQ(expected_types[i],
195 Resolver::ResolveForAddDirectory(
196 inputs[i].local_changes, inputs[i].local_file_type))
197 << "Case " << i << ": (" << inputs[i].DebugString() << ")";
200 TEST_F(RemoteSyncOperationResolverTest, ResolveForAddDirectoryInConflict) {
201 const SyncOperationType kExpectedTypes[] = {
205 SYNC_OPERATION_RESOLVE_TO_REMOTE,
206 SYNC_OPERATION_RESOLVE_TO_REMOTE,
208 SYNC_OPERATION_RESOLVE_TO_REMOTE,
209 SYNC_OPERATION_RESOLVE_TO_REMOTE,
216 SYNC_OPERATION_RESOLVE_TO_LOCAL,
221 ExpectedTypes expected_types = CreateList(kExpectedTypes);
222 std::vector<Input> inputs = CreateInput();
224 ASSERT_EQ(expected_types.size(), inputs.size());
225 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i)
226 EXPECT_EQ(expected_types[i],
227 Resolver::ResolveForAddDirectoryInConflict(
228 inputs[i].local_changes, inputs[i].local_file_type))
229 << "Case " << i << ": (" << inputs[i].DebugString() << ")";
232 TEST_F(RemoteSyncOperationResolverTest, ResolveForDeleteFile) {
233 const SyncOperationType kExpectedTypes[] = {
234 SYNC_OPERATION_DELETE_METADATA,
237 SYNC_OPERATION_DELETE_METADATA,
238 SYNC_OPERATION_DELETE_METADATA,
240 SYNC_OPERATION_DELETE,
253 ExpectedTypes expected_types = CreateList(kExpectedTypes);
254 std::vector<Input> inputs = CreateInput();
256 ASSERT_EQ(expected_types.size(), inputs.size());
257 for (ExpectedTypes::size_type i = 0; i < inputs.size(); ++i)
258 EXPECT_EQ(expected_types[i],
259 Resolver::ResolveForDeleteFile(
260 inputs[i].local_changes, inputs[i].local_file_type))
261 << "Case " << i << ": (" << inputs[i].DebugString() << ")";
264 TEST_F(RemoteSyncOperationResolverTest, ResolveForDeleteFileInConflict) {
265 const SyncOperationType kExpectedTypes[] = {
269 SYNC_OPERATION_DELETE_METADATA,
270 SYNC_OPERATION_DELETE_METADATA,
272 SYNC_OPERATION_RESOLVE_TO_LOCAL,
273 SYNC_OPERATION_RESOLVE_TO_LOCAL,
280 SYNC_OPERATION_RESOLVE_TO_LOCAL,
285 ExpectedTypes expected_types = CreateList(kExpectedTypes);
286 std::vector<Input> inputs = CreateInput();
288 ASSERT_EQ(expected_types.size(), inputs.size());
289 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i)
290 EXPECT_EQ(expected_types[i],
291 Resolver::ResolveForDeleteFileInConflict(
292 inputs[i].local_changes, inputs[i].local_file_type))
293 << "Case " << i << ": (" << inputs[i].DebugString() << ")";
296 TEST_F(RemoteSyncOperationResolverTest, ResolveForDeleteDirectory) {
297 const SyncOperationType kExpectedTypes[] = {
304 SYNC_OPERATION_RESOLVE_TO_LOCAL,
305 SYNC_OPERATION_RESOLVE_TO_LOCAL,
310 SYNC_OPERATION_DELETE,
312 SYNC_OPERATION_RESOLVE_TO_LOCAL,
317 ExpectedTypes expected_types = CreateList(kExpectedTypes);
318 std::vector<Input> inputs = CreateInput();
320 ASSERT_EQ(expected_types.size(), inputs.size());
321 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i)
322 EXPECT_EQ(expected_types[i],
323 Resolver::ResolveForDeleteDirectory(
324 inputs[i].local_changes, inputs[i].local_file_type))
325 << "Case " << i << ": (" << inputs[i].DebugString() << ")";
328 TEST_F(RemoteSyncOperationResolverTest, ResolveForDeleteDirectoryInConflict) {
329 const SyncOperationType kExpectedTypes[] = {
333 SYNC_OPERATION_DELETE_METADATA,
334 SYNC_OPERATION_DELETE_METADATA,
336 SYNC_OPERATION_RESOLVE_TO_LOCAL,
337 SYNC_OPERATION_RESOLVE_TO_LOCAL,
344 SYNC_OPERATION_RESOLVE_TO_LOCAL,
349 ExpectedTypes expected_types = CreateList(kExpectedTypes);
350 std::vector<Input> inputs = CreateInput();
352 ASSERT_EQ(expected_types.size(), inputs.size());
353 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i)
354 EXPECT_EQ(expected_types[i],
355 Resolver::ResolveForDeleteDirectoryInConflict(
356 inputs[i].local_changes, inputs[i].local_file_type))
357 << "Case " << i << ": (" << inputs[i].DebugString() << ")";
360 } // namespace sync_file_system