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

Side by Side Diff: chrome/browser/sync/internal_api/syncapi_unittest.cc

Issue 7926001: [Sync] Move change-related methods out of SyncManager::Observer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unit tests Created 9 years, 3 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // Unit tests for the SyncApi. Note that a lot of the underlying 5 // Unit tests for the SyncApi. Note that a lot of the underlying
6 // functionality is provided by the Syncable layer, which has its own 6 // functionality is provided by the Syncable layer, which has its own
7 // unit tests. We'll test SyncApi specific things in this harness. 7 // unit tests. We'll test SyncApi specific things in this harness.
8 8
9 #include <cstddef> 9 #include <cstddef>
10 #include <map> 10 #include <map>
(...skipping 21 matching lines...) Expand all
32 #include "chrome/browser/sync/internal_api/write_node.h" 32 #include "chrome/browser/sync/internal_api/write_node.h"
33 #include "chrome/browser/sync/internal_api/write_transaction.h" 33 #include "chrome/browser/sync/internal_api/write_transaction.h"
34 #include "chrome/browser/sync/js/js_arg_list.h" 34 #include "chrome/browser/sync/js/js_arg_list.h"
35 #include "chrome/browser/sync/js/js_backend.h" 35 #include "chrome/browser/sync/js/js_backend.h"
36 #include "chrome/browser/sync/js/js_event_handler.h" 36 #include "chrome/browser/sync/js/js_event_handler.h"
37 #include "chrome/browser/sync/js/js_reply_handler.h" 37 #include "chrome/browser/sync/js/js_reply_handler.h"
38 #include "chrome/browser/sync/js/js_test_util.h" 38 #include "chrome/browser/sync/js/js_test_util.h"
39 #include "chrome/browser/sync/notifier/sync_notifier.h" 39 #include "chrome/browser/sync/notifier/sync_notifier.h"
40 #include "chrome/browser/sync/notifier/sync_notifier_observer.h" 40 #include "chrome/browser/sync/notifier/sync_notifier_observer.h"
41 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" 41 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h"
42 #include "chrome/browser/sync/protocol/extension_specifics.pb.h"
42 #include "chrome/browser/sync/protocol/password_specifics.pb.h" 43 #include "chrome/browser/sync/protocol/password_specifics.pb.h"
43 #include "chrome/browser/sync/protocol/proto_value_conversions.h" 44 #include "chrome/browser/sync/protocol/proto_value_conversions.h"
44 #include "chrome/browser/sync/protocol/sync.pb.h" 45 #include "chrome/browser/sync/protocol/sync.pb.h"
45 #include "chrome/browser/sync/sessions/sync_session.h" 46 #include "chrome/browser/sync/sessions/sync_session.h"
46 #include "chrome/browser/sync/syncable/directory_manager.h" 47 #include "chrome/browser/sync/syncable/directory_manager.h"
47 #include "chrome/browser/sync/syncable/syncable.h" 48 #include "chrome/browser/sync/syncable/syncable.h"
48 #include "chrome/browser/sync/syncable/syncable_id.h" 49 #include "chrome/browser/sync/syncable/syncable_id.h"
49 #include "chrome/browser/sync/test/engine/test_user_share.h" 50 #include "chrome/browser/sync/test/engine/test_user_share.h"
50 #include "chrome/browser/sync/util/cryptographer.h" 51 #include "chrome/browser/sync/util/cryptographer.h"
51 #include "chrome/test/base/values_test_util.h" 52 #include "chrome/test/base/values_test_util.h"
(...skipping 13 matching lines...) Expand all
65 using browser_sync::MockJsReplyHandler; 66 using browser_sync::MockJsReplyHandler;
66 using browser_sync::ModelSafeRoutingInfo; 67 using browser_sync::ModelSafeRoutingInfo;
67 using browser_sync::ModelSafeWorker; 68 using browser_sync::ModelSafeWorker;
68 using browser_sync::ModelSafeWorkerRegistrar; 69 using browser_sync::ModelSafeWorkerRegistrar;
69 using browser_sync::sessions::SyncSessionSnapshot; 70 using browser_sync::sessions::SyncSessionSnapshot;
70 using browser_sync::WeakHandle; 71 using browser_sync::WeakHandle;
71 using syncable::GetAllRealModelTypes; 72 using syncable::GetAllRealModelTypes;
72 using syncable::kEncryptedString; 73 using syncable::kEncryptedString;
73 using syncable::ModelType; 74 using syncable::ModelType;
74 using syncable::ModelTypeSet; 75 using syncable::ModelTypeSet;
75 using test::ExpectDictDictionaryValue;
76 using test::ExpectDictStringValue; 76 using test::ExpectDictStringValue;
77 using testing::_; 77 using testing::_;
78 using testing::AnyNumber; 78 using testing::AnyNumber;
79 using testing::AtLeast; 79 using testing::AtLeast;
80 using testing::InSequence; 80 using testing::InSequence;
81 using testing::Invoke; 81 using testing::Invoke;
82 using testing::SaveArg; 82 using testing::SaveArg;
83 using testing::StrictMock; 83 using testing::StrictMock;
84 84
85 namespace sync_api { 85 namespace sync_api {
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 scoped_ptr<DictionaryValue> details(node.GetDetailsAsValue()); 550 scoped_ptr<DictionaryValue> details(node.GetDetailsAsValue());
551 if (details.get()) { 551 if (details.get()) {
552 CheckNodeValue(node, *details, true); 552 CheckNodeValue(node, *details, true);
553 } else { 553 } else {
554 ADD_FAILURE(); 554 ADD_FAILURE();
555 } 555 }
556 } 556 }
557 557
558 namespace { 558 namespace {
559 559
560 void ExpectChangeRecordActionValue(ChangeRecord::Action expected_value,
561 const DictionaryValue& value,
562 const std::string& key) {
563 std::string str_value;
564 EXPECT_TRUE(value.GetString(key, &str_value));
565 switch (expected_value) {
566 case ChangeRecord::ACTION_ADD:
567 EXPECT_EQ("Add", str_value);
568 break;
569 case ChangeRecord::ACTION_UPDATE:
570 EXPECT_EQ("Update", str_value);
571 break;
572 case ChangeRecord::ACTION_DELETE:
573 EXPECT_EQ("Delete", str_value);
574 break;
575 default:
576 NOTREACHED();
577 break;
578 }
579 }
580
581 void CheckNonDeleteChangeRecordValue(const ChangeRecord& record,
582 const DictionaryValue& value,
583 BaseTransaction* trans) {
584 EXPECT_NE(ChangeRecord::ACTION_DELETE, record.action);
585 ExpectChangeRecordActionValue(record.action, value, "action");
586 {
587 ReadNode node(trans);
588 EXPECT_TRUE(node.InitByIdLookup(record.id));
589 scoped_ptr<DictionaryValue> expected_details(node.GetDetailsAsValue());
590 ExpectDictDictionaryValue(*expected_details, value, "node");
591 }
592 }
593
594 void CheckDeleteChangeRecordValue(const ChangeRecord& record,
595 const DictionaryValue& value) {
596 EXPECT_EQ(ChangeRecord::ACTION_DELETE, record.action);
597 ExpectChangeRecordActionValue(record.action, value, "action");
598 DictionaryValue* node_value = NULL;
599 EXPECT_TRUE(value.GetDictionary("node", &node_value));
600 if (node_value) {
601 ExpectInt64Value(record.id, *node_value, "id");
602 scoped_ptr<DictionaryValue> expected_specifics_value(
603 browser_sync::EntitySpecificsToValue(record.specifics));
604 ExpectDictDictionaryValue(*expected_specifics_value,
605 *node_value, "specifics");
606 scoped_ptr<DictionaryValue> expected_extra_value;
607 if (record.extra.get()) {
608 expected_extra_value.reset(record.extra->ToValue());
609 }
610 Value* extra_value = NULL;
611 EXPECT_EQ(record.extra.get() != NULL,
612 node_value->Get("extra", &extra_value));
613 EXPECT_TRUE(Value::Equals(extra_value, expected_extra_value.get()));
614 }
615 }
616
617 class MockExtraChangeRecordData
618 : public ExtraPasswordChangeRecordData {
619 public:
620 MOCK_CONST_METHOD0(ToValue, DictionaryValue*());
621 };
622
623 } // namespace
624
625 TEST_F(SyncApiTest, ChangeRecordToValue) {
626 int64 child_id = MakeNode(test_user_share_.user_share(),
627 syncable::BOOKMARKS, "testtag");
628 sync_pb::EntitySpecifics child_specifics;
629 {
630 ReadTransaction trans(FROM_HERE, test_user_share_.user_share());
631 ReadNode node(&trans);
632 EXPECT_TRUE(node.InitByIdLookup(child_id));
633 child_specifics = node.GetEntry()->Get(syncable::SPECIFICS);
634 }
635
636 // Add
637 {
638 ReadTransaction trans(FROM_HERE, test_user_share_.user_share());
639 ChangeRecord record;
640 record.action = ChangeRecord::ACTION_ADD;
641 record.id = 1;
642 record.specifics = child_specifics;
643 record.extra.reset(new StrictMock<MockExtraChangeRecordData>());
644 scoped_ptr<DictionaryValue> value(record.ToValue(&trans));
645 CheckNonDeleteChangeRecordValue(record, *value, &trans);
646 }
647
648 // Update
649 {
650 ReadTransaction trans(FROM_HERE, test_user_share_.user_share());
651 ChangeRecord record;
652 record.action = ChangeRecord::ACTION_UPDATE;
653 record.id = child_id;
654 record.specifics = child_specifics;
655 record.extra.reset(new StrictMock<MockExtraChangeRecordData>());
656 scoped_ptr<DictionaryValue> value(record.ToValue(&trans));
657 CheckNonDeleteChangeRecordValue(record, *value, &trans);
658 }
659
660 // Delete (no extra)
661 {
662 ReadTransaction trans(FROM_HERE, test_user_share_.user_share());
663 ChangeRecord record;
664 record.action = ChangeRecord::ACTION_DELETE;
665 record.id = child_id + 1;
666 record.specifics = child_specifics;
667 scoped_ptr<DictionaryValue> value(record.ToValue(&trans));
668 CheckDeleteChangeRecordValue(record, *value);
669 }
670
671 // Delete (with extra)
672 {
673 ReadTransaction trans(FROM_HERE, test_user_share_.user_share());
674 ChangeRecord record;
675 record.action = ChangeRecord::ACTION_DELETE;
676 record.id = child_id + 1;
677 record.specifics = child_specifics;
678
679 DictionaryValue extra_value;
680 extra_value.SetString("foo", "bar");
681 scoped_ptr<StrictMock<MockExtraChangeRecordData> > extra(
682 new StrictMock<MockExtraChangeRecordData>());
683 EXPECT_CALL(*extra, ToValue()).Times(2).WillRepeatedly(
684 Invoke(&extra_value, &DictionaryValue::DeepCopy));
685
686 record.extra.reset(extra.release());
687 scoped_ptr<DictionaryValue> value(record.ToValue(&trans));
688 CheckDeleteChangeRecordValue(record, *value);
689 }
690 }
691
692 namespace {
693
694 class TestHttpPostProviderInterface : public HttpPostProviderInterface { 560 class TestHttpPostProviderInterface : public HttpPostProviderInterface {
695 public: 561 public:
696 virtual ~TestHttpPostProviderInterface() {} 562 virtual ~TestHttpPostProviderInterface() {}
697 563
698 virtual void SetUserAgent(const char* user_agent) OVERRIDE {} 564 virtual void SetUserAgent(const char* user_agent) OVERRIDE {}
699 virtual void SetExtraRequestHeaders(const char* headers) OVERRIDE {} 565 virtual void SetExtraRequestHeaders(const char* headers) OVERRIDE {}
700 virtual void SetURL(const char* url, int port) OVERRIDE {} 566 virtual void SetURL(const char* url, int port) OVERRIDE {}
701 virtual void SetPostPayload(const char* content_type, 567 virtual void SetPostPayload(const char* content_type,
702 int content_length, 568 int content_length,
703 const char* content) OVERRIDE {} 569 const char* content) OVERRIDE {}
(...skipping 20 matching lines...) Expand all
724 virtual HttpPostProviderInterface* Create() OVERRIDE { 590 virtual HttpPostProviderInterface* Create() OVERRIDE {
725 return new TestHttpPostProviderInterface(); 591 return new TestHttpPostProviderInterface();
726 } 592 }
727 virtual void Destroy(HttpPostProviderInterface* http) OVERRIDE { 593 virtual void Destroy(HttpPostProviderInterface* http) OVERRIDE {
728 delete http; 594 delete http;
729 } 595 }
730 }; 596 };
731 597
732 class SyncManagerObserverMock : public SyncManager::Observer { 598 class SyncManagerObserverMock : public SyncManager::Observer {
733 public: 599 public:
734 MOCK_METHOD3(OnChangesApplied,
735 void(ModelType,
736 const BaseTransaction*,
737 const ImmutableChangeRecordList&)); // NOLINT
738 MOCK_METHOD1(OnChangesComplete, void(ModelType)); // NOLINT
739 MOCK_METHOD1(OnSyncCycleCompleted, 600 MOCK_METHOD1(OnSyncCycleCompleted,
740 void(const SyncSessionSnapshot*)); // NOLINT 601 void(const SyncSessionSnapshot*)); // NOLINT
741 MOCK_METHOD2(OnInitializationComplete, 602 MOCK_METHOD2(OnInitializationComplete,
742 void(const WeakHandle<JsBackend>&, bool)); // NOLINT 603 void(const WeakHandle<JsBackend>&, bool)); // NOLINT
743 MOCK_METHOD1(OnAuthError, void(const GoogleServiceAuthError&)); // NOLINT 604 MOCK_METHOD1(OnAuthError, void(const GoogleServiceAuthError&)); // NOLINT
744 MOCK_METHOD1(OnPassphraseRequired, 605 MOCK_METHOD1(OnPassphraseRequired,
745 void(sync_api::PassphraseRequiredReason)); // NOLINT 606 void(sync_api::PassphraseRequiredReason)); // NOLINT
746 MOCK_METHOD1(OnPassphraseAccepted, void(const std::string&)); // NOLINT 607 MOCK_METHOD1(OnPassphraseAccepted, void(const std::string&)); // NOLINT
747 MOCK_METHOD0(OnStopSyncingPermanently, void()); // NOLINT 608 MOCK_METHOD0(OnStopSyncingPermanently, void()); // NOLINT
748 MOCK_METHOD1(OnUpdatedToken, void(const std::string&)); // NOLINT 609 MOCK_METHOD1(OnUpdatedToken, void(const std::string&)); // NOLINT
(...skipping 11 matching lines...) Expand all
760 MOCK_METHOD1(SetUniqueId, void(const std::string&)); 621 MOCK_METHOD1(SetUniqueId, void(const std::string&));
761 MOCK_METHOD1(SetState, void(const std::string&)); 622 MOCK_METHOD1(SetState, void(const std::string&));
762 MOCK_METHOD2(UpdateCredentials, 623 MOCK_METHOD2(UpdateCredentials,
763 void(const std::string&, const std::string&)); 624 void(const std::string&, const std::string&));
764 MOCK_METHOD1(UpdateEnabledTypes, 625 MOCK_METHOD1(UpdateEnabledTypes,
765 void(const syncable::ModelTypeSet&)); 626 void(const syncable::ModelTypeSet&));
766 MOCK_METHOD1(SendNotification, void(const syncable::ModelTypeSet&)); 627 MOCK_METHOD1(SendNotification, void(const syncable::ModelTypeSet&));
767 }; 628 };
768 629
769 class SyncManagerTest : public testing::Test, 630 class SyncManagerTest : public testing::Test,
770 public ModelSafeWorkerRegistrar { 631 public ModelSafeWorkerRegistrar,
632 public SyncManager::ChangeDelegate {
771 protected: 633 protected:
772 SyncManagerTest() 634 SyncManagerTest()
773 : ui_thread_(BrowserThread::UI, &ui_loop_), 635 : ui_thread_(BrowserThread::UI, &ui_loop_),
774 sync_notifier_mock_(NULL), 636 sync_notifier_mock_(NULL),
775 sync_manager_("Test sync manager"), 637 sync_manager_("Test sync manager"),
776 sync_notifier_observer_(NULL), 638 sync_notifier_observer_(NULL),
777 update_enabled_types_call_count_(0) {} 639 update_enabled_types_call_count_(0) {}
778 640
779 virtual ~SyncManagerTest() { 641 virtual ~SyncManagerTest() {
780 EXPECT_FALSE(sync_notifier_mock_); 642 EXPECT_FALSE(sync_notifier_mock_);
(...skipping 25 matching lines...) Expand all
806 EXPECT_CALL(observer_, OnInitializationComplete(_, _)). 668 EXPECT_CALL(observer_, OnInitializationComplete(_, _)).
807 WillOnce(SaveArg<0>(&js_backend_)); 669 WillOnce(SaveArg<0>(&js_backend_));
808 670
809 EXPECT_FALSE(sync_notifier_observer_); 671 EXPECT_FALSE(sync_notifier_observer_);
810 EXPECT_FALSE(js_backend_.IsInitialized()); 672 EXPECT_FALSE(js_backend_.IsInitialized());
811 673
812 // Takes ownership of |sync_notifier_mock_|. 674 // Takes ownership of |sync_notifier_mock_|.
813 sync_manager_.Init(temp_dir_.path(), 675 sync_manager_.Init(temp_dir_.path(),
814 WeakHandle<JsEventHandler>(), 676 WeakHandle<JsEventHandler>(),
815 "bogus", 0, false, 677 "bogus", 0, false,
816 new TestHttpPostProviderFactory(), this, "bogus", 678 new TestHttpPostProviderFactory(), this, this, "bogus",
817 credentials, sync_notifier_mock_, "", 679 credentials, sync_notifier_mock_, "",
818 true /* setup_for_test_mode */); 680 true /* setup_for_test_mode */);
819 681
820 EXPECT_TRUE(sync_notifier_observer_); 682 EXPECT_TRUE(sync_notifier_observer_);
821 EXPECT_TRUE(js_backend_.IsInitialized()); 683 EXPECT_TRUE(js_backend_.IsInitialized());
822 684
823 EXPECT_EQ(1, update_enabled_types_call_count_); 685 EXPECT_EQ(1, update_enabled_types_call_count_);
824 686
825 ModelSafeRoutingInfo routes; 687 ModelSafeRoutingInfo routes;
826 GetModelSafeRoutingInfo(&routes); 688 GetModelSafeRoutingInfo(&routes);
827 for (ModelSafeRoutingInfo::iterator i = routes.begin(); i != routes.end(); 689 for (ModelSafeRoutingInfo::iterator i = routes.begin(); i != routes.end();
828 ++i) { 690 ++i) {
829 EXPECT_CALL(observer_, OnChangesApplied(i->first, _, _))
830 .RetiresOnSaturation();
831 EXPECT_CALL(observer_, OnChangesComplete(i->first))
832 .RetiresOnSaturation();
833 type_roots_[i->first] = MakeServerNodeForType( 691 type_roots_[i->first] = MakeServerNodeForType(
834 sync_manager_.GetUserShare(), i->first); 692 sync_manager_.GetUserShare(), i->first);
835 } 693 }
836 PumpLoop(); 694 PumpLoop();
837 } 695 }
838 696
839 void TearDown() { 697 void TearDown() {
840 sync_manager_.RemoveObserver(&observer_); 698 sync_manager_.RemoveObserver(&observer_);
841 sync_manager_.Shutdown(); 699 sync_manager_.Shutdown();
842 sync_notifier_mock_ = NULL; 700 sync_notifier_mock_ = NULL;
843 EXPECT_FALSE(sync_notifier_observer_); 701 EXPECT_FALSE(sync_notifier_observer_);
844 PumpLoop(); 702 PumpLoop();
845 } 703 }
846 704
847 // ModelSafeWorkerRegistrar implementation. 705 // ModelSafeWorkerRegistrar implementation.
848 virtual void GetWorkers(std::vector<ModelSafeWorker*>* out) { 706 virtual void GetWorkers(std::vector<ModelSafeWorker*>* out) OVERRIDE {
849 NOTIMPLEMENTED(); 707 NOTIMPLEMENTED();
850 out->clear(); 708 out->clear();
851 } 709 }
852 virtual void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) { 710 virtual void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) OVERRIDE {
853 (*out)[syncable::NIGORI] = browser_sync::GROUP_PASSIVE; 711 (*out)[syncable::NIGORI] = browser_sync::GROUP_PASSIVE;
854 (*out)[syncable::BOOKMARKS] = browser_sync::GROUP_PASSIVE; 712 (*out)[syncable::BOOKMARKS] = browser_sync::GROUP_PASSIVE;
855 (*out)[syncable::THEMES] = browser_sync::GROUP_PASSIVE; 713 (*out)[syncable::THEMES] = browser_sync::GROUP_PASSIVE;
856 (*out)[syncable::SESSIONS] = browser_sync::GROUP_PASSIVE; 714 (*out)[syncable::SESSIONS] = browser_sync::GROUP_PASSIVE;
857 (*out)[syncable::PASSWORDS] = browser_sync::GROUP_PASSIVE; 715 (*out)[syncable::PASSWORDS] = browser_sync::GROUP_PASSIVE;
858 } 716 }
859 717
718 virtual void OnChangesApplied(
719 syncable::ModelType model_type,
720 const BaseTransaction* trans,
721 const ImmutableChangeRecordList& changes) OVERRIDE {}
722
723 virtual void OnChangesComplete(syncable::ModelType model_type) OVERRIDE {}
724
860 // Helper methods. 725 // Helper methods.
861 bool SetUpEncryption() { 726 bool SetUpEncryption() {
862 // Mock the Mac Keychain service. The real Keychain can block on user input. 727 // Mock the Mac Keychain service. The real Keychain can block on user input.
863 #if defined(OS_MACOSX) 728 #if defined(OS_MACOSX)
864 Encryptor::UseMockKeychain(true); 729 Encryptor::UseMockKeychain(true);
865 #endif 730 #endif
866 731
867 // We need to create the nigori node as if it were an applied server update. 732 // We need to create the nigori node as if it were an applied server update.
868 UserShare* share = sync_manager_.GetUserShare(); 733 UserShare* share = sync_manager_.GetUserShare();
869 int64 nigori_id = GetIdForDataType(syncable::NIGORI); 734 int64 nigori_id = GetIdForDataType(syncable::NIGORI);
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 ReadNode node(&trans); 1412 ReadNode node(&trans);
1548 EXPECT_TRUE(node.InitByIdLookup(node1)); 1413 EXPECT_TRUE(node.InitByIdLookup(node1));
1549 EXPECT_EQ(syncable::BOOKMARKS, node.GetModelType()); 1414 EXPECT_EQ(syncable::BOOKMARKS, node.GetModelType());
1550 EXPECT_EQ(title, node.GetTitle()); 1415 EXPECT_EQ(title, node.GetTitle());
1551 EXPECT_EQ(title, node.GetBookmarkSpecifics().title()); 1416 EXPECT_EQ(title, node.GetBookmarkSpecifics().title());
1552 EXPECT_EQ(url, node.GetBookmarkSpecifics().url()); 1417 EXPECT_EQ(url, node.GetBookmarkSpecifics().url());
1553 } 1418 }
1554 } 1419 }
1555 1420
1556 } // namespace browser_sync 1421 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698