Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: components/reading_list/ios/reading_list_store_unittest.mm

Issue 2558183004: Add merge rules for first read time (Closed)
Patch Set: =0 Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/reading_list/ios/reading_list_store.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/reading_list/ios/reading_list_store.h" 5 #include "components/reading_list/ios/reading_list_store.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #import "base/test/ios/wait_util.h" 14 #import "base/test/ios/wait_util.h"
15 #include "components/reading_list/ios/reading_list_model_impl.h" 15 #include "components/reading_list/ios/reading_list_model_impl.h"
16 #include "components/sync/model/fake_model_type_change_processor.h" 16 #include "components/sync/model/fake_model_type_change_processor.h"
17 #include "components/sync/model/model_type_store_test_util.h" 17 #include "components/sync/model/model_type_store_test_util.h"
18 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
19 19
20 // Tests that the transition from |entryA| to |entryB| is possible (|possible|
21 // is true) or not.
22 void ExpectAB(const sync_pb::ReadingListSpecifics& entryA,
23 const sync_pb::ReadingListSpecifics& entryB,
24 bool possible) {
25 EXPECT_EQ(ReadingListStore::CompareEntriesForSync(entryA, entryB), possible);
26 std::unique_ptr<ReadingListEntry> a =
27 ReadingListEntry::FromReadingListSpecifics(entryA);
28 std::unique_ptr<ReadingListEntry> b =
29 ReadingListEntry::FromReadingListSpecifics(entryB);
30 a->MergeWithEntry(*b);
31 std::unique_ptr<sync_pb::ReadingListSpecifics> mergedEntry =
32 a->AsReadingListSpecifics();
33 if (possible) {
34 // If transition is possible, the merge should be B.
35 EXPECT_EQ(entryB.SerializeAsString(), mergedEntry->SerializeAsString());
36 } else {
37 // If transition is not possible, the transition shold be possible to the
38 // merged state.
39 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, *mergedEntry));
40 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryB, *mergedEntry));
41 }
42 }
43
20 class FakeModelTypeChangeProcessorObserver { 44 class FakeModelTypeChangeProcessorObserver {
21 public: 45 public:
22 virtual void Put(const std::string& client_tag, 46 virtual void Put(const std::string& client_tag,
23 std::unique_ptr<syncer::EntityData> entity_data, 47 std::unique_ptr<syncer::EntityData> entity_data,
24 syncer::MetadataChangeList* metadata_change_list) = 0; 48 syncer::MetadataChangeList* metadata_change_list) = 0;
25 49
26 virtual void Delete(const std::string& client_tag, 50 virtual void Delete(const std::string& client_tag,
27 syncer::MetadataChangeList* metadata_change_list) = 0; 51 syncer::MetadataChangeList* metadata_change_list) = 0;
28 }; 52 };
29 53
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 syncer::SyncError error = reading_list_store_->ApplySyncChanges( 310 syncer::SyncError error = reading_list_store_->ApplySyncChanges(
287 reading_list_store_->CreateMetadataChangeList(), delete_changes); 311 reading_list_store_->CreateMetadataChangeList(), delete_changes);
288 AssertCounts(0, 0, 0, 1, 0); 312 AssertCounts(0, 0, 0, 1, 0);
289 EXPECT_EQ(sync_removed_.size(), 1u); 313 EXPECT_EQ(sync_removed_.size(), 1u);
290 EXPECT_EQ(sync_removed_.count("http://read.example.com/"), 1u); 314 EXPECT_EQ(sync_removed_.count("http://read.example.com/"), 1u);
291 } 315 }
292 316
293 TEST_F(ReadingListStoreTest, CompareEntriesForSync) { 317 TEST_F(ReadingListStoreTest, CompareEntriesForSync) {
294 sync_pb::ReadingListSpecifics entryA; 318 sync_pb::ReadingListSpecifics entryA;
295 sync_pb::ReadingListSpecifics entryB; 319 sync_pb::ReadingListSpecifics entryB;
296 entryA.set_url("http://foo.bar"); 320 entryA.set_entry_id("http://foo.bar/");
297 entryB.set_url("http://foo.bar"); 321 entryB.set_entry_id("http://foo.bar/");
322 entryA.set_url("http://foo.bar/");
323 entryB.set_url("http://foo.bar/");
298 entryA.set_title("Foo Bar"); 324 entryA.set_title("Foo Bar");
299 entryB.set_title("Foo Bar"); 325 entryB.set_title("Foo Bar");
300 entryA.set_status(sync_pb::ReadingListSpecifics::UNREAD); 326 entryA.set_status(sync_pb::ReadingListSpecifics::UNREAD);
301 entryB.set_status(sync_pb::ReadingListSpecifics::UNREAD); 327 entryB.set_status(sync_pb::ReadingListSpecifics::UNREAD);
302 entryA.set_creation_time_us(10); 328 entryA.set_creation_time_us(10);
303 entryB.set_creation_time_us(10); 329 entryB.set_creation_time_us(10);
330 entryA.set_first_read_time_us(50);
331 entryB.set_first_read_time_us(50);
304 entryA.set_update_time_us(100); 332 entryA.set_update_time_us(100);
305 entryB.set_update_time_us(100); 333 entryB.set_update_time_us(100);
306 // Equal entries can be submitted. 334 // Equal entries can be submitted.
307 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 335 ExpectAB(entryA, entryB, true);
308 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 336 ExpectAB(entryB, entryA, true);
309 337
310 // Try to update each field. 338 // Try to update each field.
311 339
312 // You cannot change the URL of an entry. 340 // You cannot change the URL of an entry.
313 entryA.set_url("http://foo.foo"); 341 entryA.set_url("http://foo.foo/");
314 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 342 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryA, entryB));
315 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 343 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA));
316 entryA.set_url("http://foo.bar"); 344 entryA.set_url("http://foo.bar/");
317 345
318 // You can set a title to a title later in alphabetical order. 346 // You can set a title to a title later in alphabetical order.
319 entryA.set_title(""); 347 entryA.set_title("");
320 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 348 ExpectAB(entryA, entryB, true);
321 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 349 ExpectAB(entryB, entryA, false);
322 entryA.set_title("Foo Aar"); 350 entryA.set_title("Foo Aar");
323 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 351 ExpectAB(entryA, entryB, true);
324 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 352 ExpectAB(entryB, entryA, false);
325 entryA.set_title("Foo Ba"); 353 entryA.set_title("Foo Ba");
326 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 354 ExpectAB(entryA, entryB, true);
327 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 355 ExpectAB(entryB, entryA, false);
328 entryA.set_title("Foo Bar"); 356 entryA.set_title("Foo Bar");
329 357
330 entryA.set_creation_time_us(9); 358 entryA.set_creation_time_us(9);
331 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 359 ExpectAB(entryA, entryB, true);
332 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 360 ExpectAB(entryB, entryA, false);
361 entryA.set_first_read_time_us(51);
362 ExpectAB(entryA, entryB, true);
363 ExpectAB(entryB, entryA, false);
364 entryA.set_first_read_time_us(49);
365 ExpectAB(entryA, entryB, true);
366 ExpectAB(entryB, entryA, false);
367 entryA.set_first_read_time_us(0);
368 ExpectAB(entryA, entryB, true);
369 ExpectAB(entryB, entryA, false);
370 entryA.set_first_read_time_us(50);
371 entryB.set_first_read_time_us(0);
372 ExpectAB(entryA, entryB, true);
373 ExpectAB(entryB, entryA, false);
374 entryB.set_first_read_time_us(50);
333 entryA.set_creation_time_us(10); 375 entryA.set_creation_time_us(10);
376 entryA.set_first_read_time_us(51);
377 ExpectAB(entryA, entryB, true);
378 ExpectAB(entryB, entryA, false);
379 entryA.set_first_read_time_us(0);
380 ExpectAB(entryA, entryB, true);
381 ExpectAB(entryB, entryA, false);
382 entryA.set_first_read_time_us(50);
334 383
335 entryA.set_update_time_us(99); 384 entryA.set_update_time_us(99);
336 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 385 ExpectAB(entryA, entryB, true);
337 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 386 ExpectAB(entryB, entryA, false);
338 sync_pb::ReadingListSpecifics::ReadingListEntryStatus status_oder[3] = { 387 sync_pb::ReadingListSpecifics::ReadingListEntryStatus status_oder[3] = {
339 sync_pb::ReadingListSpecifics::UNSEEN, 388 sync_pb::ReadingListSpecifics::UNSEEN,
340 sync_pb::ReadingListSpecifics::UNREAD, 389 sync_pb::ReadingListSpecifics::UNREAD,
341 sync_pb::ReadingListSpecifics::READ}; 390 sync_pb::ReadingListSpecifics::READ};
342 for (int index_a = 0; index_a < 3; index_a++) { 391 for (int index_a = 0; index_a < 3; index_a++) {
343 entryA.set_status(status_oder[index_a]); 392 entryA.set_status(status_oder[index_a]);
344 for (int index_b = 0; index_b < 3; index_b++) { 393 for (int index_b = 0; index_b < 3; index_b++) {
345 entryB.set_status(status_oder[index_b]); 394 entryB.set_status(status_oder[index_b]);
346 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 395 ExpectAB(entryA, entryB, true);
347 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 396 ExpectAB(entryB, entryA, false);
348 } 397 }
349 } 398 }
350 entryA.set_update_time_us(100); 399 entryA.set_update_time_us(100);
351 for (int index_a = 0; index_a < 3; index_a++) { 400 for (int index_a = 0; index_a < 3; index_a++) {
352 entryA.set_status(status_oder[index_a]); 401 entryA.set_status(status_oder[index_a]);
353 entryB.set_status(status_oder[index_a]); 402 entryB.set_status(status_oder[index_a]);
354 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 403 ExpectAB(entryA, entryB, true);
355 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 404 ExpectAB(entryB, entryA, true);
356 for (int index_b = index_a + 1; index_b < 3; index_b++) { 405 for (int index_b = index_a + 1; index_b < 3; index_b++) {
357 entryB.set_status(status_oder[index_b]); 406 entryB.set_status(status_oder[index_b]);
358 EXPECT_TRUE(ReadingListStore::CompareEntriesForSync(entryA, entryB)); 407 ExpectAB(entryA, entryB, true);
359 EXPECT_FALSE(ReadingListStore::CompareEntriesForSync(entryB, entryA)); 408 ExpectAB(entryB, entryA, false);
360 } 409 }
361 } 410 }
362 } 411 }
OLDNEW
« no previous file with comments | « components/reading_list/ios/reading_list_store.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698