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.
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/scoped_vector.h"
10 #include "chrome/browser/sync_file_system/drive_backend_v1/local_sync_operation_resolver.h"
11 #include "chrome/browser/sync_file_system/file_change.h"
12 #include "chrome/browser/sync_file_system/sync_file_type.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 namespace sync_file_system {
20 scoped_ptr<FileChange> remote_file_change;
21 SyncFileType remote_file_type_in_metadata;
23 std::string DebugString() const {
24 std::string change_type =
25 (remote_file_change == NULL) ? "none"
26 : remote_file_change->DebugString();
27 std::ostringstream ss;
28 ss << "RemoteFileChange: " << change_type
29 << ", RemoteFileTypeInMetadata: " << remote_file_type_in_metadata;
33 Input(FileChange* remote_file_change,
34 SyncFileType remote_file_type_in_metadata)
35 : remote_file_change(remote_file_change),
36 remote_file_type_in_metadata(remote_file_type_in_metadata) {
40 template <typename type, size_t array_size>
41 std::vector<type> CreateList(const type (&inputs)[array_size]) {
42 return std::vector<type>(inputs, inputs + array_size);
45 ScopedVector<Input> CreateInput() {
46 SyncFileType dummy_file_type = SYNC_FILE_TYPE_UNKNOWN;
48 ScopedVector<Input> vector;
49 vector.push_back(new Input(NULL, SYNC_FILE_TYPE_UNKNOWN));
50 vector.push_back(new Input(NULL, SYNC_FILE_TYPE_FILE));
51 vector.push_back(new Input(NULL, SYNC_FILE_TYPE_DIRECTORY));
53 // When remote_file_change exists, the resolver does not take care of
54 // remote_file_type_in_metadata.
55 vector.push_back(new Input(
56 new FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
59 vector.push_back(new Input(
60 new FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE,
61 SYNC_FILE_TYPE_DIRECTORY),
63 vector.push_back(new Input(
64 new FileChange(FileChange::FILE_CHANGE_DELETE,
67 vector.push_back(new Input(
68 new FileChange(FileChange::FILE_CHANGE_DELETE,
69 SYNC_FILE_TYPE_DIRECTORY),
75 std::string DebugString(const ScopedVector<Input>& inputs, int number) {
76 std::ostringstream ss;
77 ss << "Case " << number << ": (" << inputs[number]->DebugString() << ")";
83 class LocalSyncOperationResolverTest : public testing::Test {
85 LocalSyncOperationResolverTest() {}
88 typedef LocalSyncOperationResolver Resolver;
89 typedef std::vector<SyncOperationType> ExpectedTypes;
92 DISALLOW_COPY_AND_ASSIGN(LocalSyncOperationResolverTest);
95 TEST_F(LocalSyncOperationResolverTest, ResolveForAddOrUpdateFile) {
96 const SyncOperationType kExpectedTypes[] = {
97 SYNC_OPERATION_ADD_FILE,
98 SYNC_OPERATION_UPDATE_FILE,
99 SYNC_OPERATION_RESOLVE_TO_REMOTE,
101 SYNC_OPERATION_CONFLICT,
102 SYNC_OPERATION_RESOLVE_TO_REMOTE,
103 SYNC_OPERATION_RESOLVE_TO_LOCAL,
104 SYNC_OPERATION_RESOLVE_TO_LOCAL,
107 ExpectedTypes expected_types = CreateList(kExpectedTypes);
108 ScopedVector<Input> inputs = CreateInput();
110 ASSERT_EQ(expected_types.size(), inputs.size());
111 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i) {
112 EXPECT_EQ(expected_types[i],
113 Resolver::ResolveForAddOrUpdateFile(
114 inputs[i]->remote_file_change.get(),
115 inputs[i]->remote_file_type_in_metadata))
116 << DebugString(inputs, i);
120 TEST_F(LocalSyncOperationResolverTest, ResolveForAddOrUpdateFileInConflict) {
121 const SyncOperationType kExpectedTypes[] = {
122 SYNC_OPERATION_CONFLICT,
123 SYNC_OPERATION_CONFLICT,
124 SYNC_OPERATION_CONFLICT,
126 SYNC_OPERATION_CONFLICT,
127 SYNC_OPERATION_RESOLVE_TO_REMOTE,
128 SYNC_OPERATION_RESOLVE_TO_LOCAL,
129 SYNC_OPERATION_RESOLVE_TO_LOCAL,
132 ExpectedTypes expected_types = CreateList(kExpectedTypes);
133 ScopedVector<Input> inputs = CreateInput();
135 ASSERT_EQ(expected_types.size(), inputs.size());
136 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i) {
137 EXPECT_EQ(expected_types[i],
138 Resolver::ResolveForAddOrUpdateFileInConflict(
139 inputs[i]->remote_file_change.get()))
140 << DebugString(inputs, i);
144 TEST_F(LocalSyncOperationResolverTest, ResolveForAddDirectory) {
145 const SyncOperationType kExpectedTypes[] = {
146 SYNC_OPERATION_ADD_DIRECTORY,
147 SYNC_OPERATION_RESOLVE_TO_LOCAL,
150 SYNC_OPERATION_RESOLVE_TO_LOCAL,
152 SYNC_OPERATION_ADD_DIRECTORY,
153 SYNC_OPERATION_RESOLVE_TO_LOCAL,
156 ExpectedTypes expected_types = CreateList(kExpectedTypes);
157 ScopedVector<Input> inputs = CreateInput();
159 ASSERT_EQ(expected_types.size(), inputs.size());
160 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i) {
161 EXPECT_EQ(expected_types[i],
162 Resolver::ResolveForAddDirectory(
163 inputs[i]->remote_file_change.get(),
164 inputs[i]->remote_file_type_in_metadata))
165 << DebugString(inputs, i);
169 TEST_F(LocalSyncOperationResolverTest, ResolveForAddDirectoryInConflict) {
170 EXPECT_EQ(SYNC_OPERATION_RESOLVE_TO_LOCAL,
171 Resolver::ResolveForAddDirectoryInConflict());
174 TEST_F(LocalSyncOperationResolverTest, ResolveForDelete) {
175 const SyncOperationType kExpectedTypes[] = {
176 SYNC_OPERATION_DELETE,
177 SYNC_OPERATION_DELETE,
178 SYNC_OPERATION_DELETE,
180 SYNC_OPERATION_RESOLVE_TO_REMOTE,
181 SYNC_OPERATION_RESOLVE_TO_REMOTE,
182 SYNC_OPERATION_DELETE_METADATA,
183 SYNC_OPERATION_DELETE_METADATA,
186 ExpectedTypes expected_types = CreateList(kExpectedTypes);
187 ScopedVector<Input> inputs = CreateInput();
189 ASSERT_EQ(expected_types.size(), inputs.size());
190 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i) {
191 EXPECT_EQ(expected_types[i],
192 Resolver::ResolveForDelete(
193 inputs[i]->remote_file_change.get(),
194 inputs[i]->remote_file_type_in_metadata))
195 << DebugString(inputs, i);
199 TEST_F(LocalSyncOperationResolverTest, ResolveForDeleteInConflict) {
200 const SyncOperationType kExpectedTypes[] = {
201 SYNC_OPERATION_RESOLVE_TO_REMOTE,
202 SYNC_OPERATION_RESOLVE_TO_REMOTE,
203 SYNC_OPERATION_RESOLVE_TO_REMOTE,
205 SYNC_OPERATION_RESOLVE_TO_REMOTE,
206 SYNC_OPERATION_RESOLVE_TO_REMOTE,
207 SYNC_OPERATION_DELETE_METADATA,
208 SYNC_OPERATION_DELETE_METADATA,
211 ExpectedTypes expected_types = CreateList(kExpectedTypes);
212 ScopedVector<Input> inputs = CreateInput();
214 ASSERT_EQ(expected_types.size(), inputs.size());
215 for (ExpectedTypes::size_type i = 0; i < expected_types.size(); ++i) {
216 EXPECT_EQ(expected_types[i],
217 Resolver::ResolveForDeleteInConflict(
218 inputs[i]->remote_file_change.get()))
219 << DebugString(inputs, i);
223 } // namespace sync_file_system