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

Side by Side Diff: chrome/browser/sync/engine/syncer_thread_unittest.cc

Issue 2075012: Replace changes_channel with an observer list. (Closed)
Patch Set: Ready for checkin Created 10 years, 6 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
« no previous file with comments | « chrome/browser/sync/engine/syncer_thread.cc ('k') | chrome/browser/sync/engine/syncer_types.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 <list> 5 #include <list>
6 #include <map> 6 #include <map>
7 #include <set> 7 #include <set>
8 8
9 #include "base/scoped_ptr.h" 9 #include "base/scoped_ptr.h"
10 #include "base/time.h" 10 #include "base/time.h"
11 #include "base/waitable_event.h" 11 #include "base/waitable_event.h"
12 #include "chrome/browser/sync/engine/model_safe_worker.h" 12 #include "chrome/browser/sync/engine/model_safe_worker.h"
13 #include "chrome/browser/sync/engine/syncer_thread.h" 13 #include "chrome/browser/sync/engine/syncer_thread.h"
14 #include "chrome/browser/sync/engine/syncer_types.h" 14 #include "chrome/browser/sync/engine/syncer_types.h"
15 #include "chrome/browser/sync/sessions/sync_session_context.h" 15 #include "chrome/browser/sync/sessions/sync_session_context.h"
16 #include "chrome/browser/sync/util/channel.h"
16 #include "chrome/test/sync/engine/mock_server_connection.h" 17 #include "chrome/test/sync/engine/mock_server_connection.h"
17 #include "chrome/test/sync/engine/test_directory_setter_upper.h" 18 #include "chrome/test/sync/engine/test_directory_setter_upper.h"
18 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
20 21
21 using base::TimeTicks; 22 using base::TimeTicks;
22 using base::TimeDelta; 23 using base::TimeDelta;
23 using base::WaitableEvent; 24 using base::WaitableEvent;
24 using testing::_; 25 using testing::_;
25 using testing::AnyNumber; 26 using testing::AnyNumber;
26 using testing::Field; 27 using testing::Field;
27 28
28 namespace browser_sync { 29 namespace browser_sync {
29 using sessions::SyncSessionContext; 30 using sessions::SyncSessionContext;
30 31
31 typedef testing::Test SyncerThreadTest; 32 typedef testing::Test SyncerThreadTest;
32 typedef SyncerThread::WaitInterval WaitInterval; 33 typedef SyncerThread::WaitInterval WaitInterval;
33 34
34 class SyncerThreadWithSyncerTest : public testing::Test, 35 class SyncerThreadWithSyncerTest : public testing::Test,
35 public ModelSafeWorkerRegistrar { 36 public ModelSafeWorkerRegistrar,
37 public ChannelEventHandler<SyncerEvent> {
36 public: 38 public:
37 SyncerThreadWithSyncerTest() : sync_cycle_ended_event_(false, false) {} 39 SyncerThreadWithSyncerTest() : sync_cycle_ended_event_(false, false) {}
38 virtual void SetUp() { 40 virtual void SetUp() {
39 metadb_.SetUp(); 41 metadb_.SetUp();
40 connection_.reset(new MockConnectionManager(metadb_.manager(), 42 connection_.reset(new MockConnectionManager(metadb_.manager(),
41 metadb_.name())); 43 metadb_.name()));
42 allstatus_.reset(new AllStatus()); 44 allstatus_.reset(new AllStatus());
43 worker_ = new ModelSafeWorker(); 45 worker_ = new ModelSafeWorker();
44 SyncSessionContext* context = new SyncSessionContext(connection_.get(), 46 SyncSessionContext* context = new SyncSessionContext(connection_.get(),
45 NULL, metadb_.manager(), this); 47 NULL, metadb_.manager(), this);
46 syncer_thread_ = new SyncerThread(context, allstatus_.get()); 48 syncer_thread_ = new SyncerThread(context, allstatus_.get());
47 syncer_event_hookup_.reset( 49 syncer_event_hookup_.reset(
48 NewEventListenerHookup(syncer_thread_->relay_channel(), this, 50 syncer_thread_->relay_channel()->AddObserver(this));
49 &SyncerThreadWithSyncerTest::HandleSyncerEvent));
50 allstatus_->WatchSyncerThread(syncer_thread_); 51 allstatus_->WatchSyncerThread(syncer_thread_);
51 syncer_thread_->SetConnected(true); 52 syncer_thread_->SetConnected(true);
52 syncable::ModelTypeBitSet expected_types; 53 syncable::ModelTypeBitSet expected_types;
53 expected_types[syncable::BOOKMARKS] = true; 54 expected_types[syncable::BOOKMARKS] = true;
54 connection_->ExpectGetUpdatesRequestTypes(expected_types); 55 connection_->ExpectGetUpdatesRequestTypes(expected_types);
55 } 56 }
56 virtual void TearDown() { 57 virtual void TearDown() {
58 syncer_event_hookup_.reset();
59 allstatus_.reset();
57 syncer_thread_ = NULL; 60 syncer_thread_ = NULL;
58 allstatus_.reset();
59 connection_.reset(); 61 connection_.reset();
60 metadb_.TearDown(); 62 metadb_.TearDown();
61 } 63 }
62 64
63 // ModelSafeWorkerRegistrar implementation. 65 // ModelSafeWorkerRegistrar implementation.
64 virtual void GetWorkers(std::vector<ModelSafeWorker*>* out) { 66 virtual void GetWorkers(std::vector<ModelSafeWorker*>* out) {
65 out->push_back(worker_.get()); 67 out->push_back(worker_.get());
66 } 68 }
67 69
68 virtual void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) { 70 virtual void GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) {
(...skipping 22 matching lines...) Expand all
91 while (syncer_thread()->vault_.connected_) { 93 while (syncer_thread()->vault_.connected_) {
92 syncer_thread()->vault_field_changed_.TimedWait(ten_seconds); 94 syncer_thread()->vault_field_changed_.TimedWait(ten_seconds);
93 if (TimeTicks::Now() - start > ten_seconds) 95 if (TimeTicks::Now() - start > ten_seconds)
94 break; 96 break;
95 } 97 }
96 EXPECT_FALSE(syncer_thread()->vault_.connected_); 98 EXPECT_FALSE(syncer_thread()->vault_.connected_);
97 } 99 }
98 100
99 private: 101 private:
100 102
101 void HandleSyncerEvent(const SyncerEvent& event) { 103 void HandleChannelEvent(const SyncerEvent& event) {
102 if (event.what_happened == SyncerEvent::SYNC_CYCLE_ENDED) 104 if (event.what_happened == SyncerEvent::SYNC_CYCLE_ENDED)
103 sync_cycle_ended_event_.Signal(); 105 sync_cycle_ended_event_.Signal();
104 } 106 }
105 107
106 ManuallyOpenedTestDirectorySetterUpper metadb_; 108 ManuallyOpenedTestDirectorySetterUpper metadb_;
107 scoped_ptr<MockConnectionManager> connection_; 109 scoped_ptr<MockConnectionManager> connection_;
108 scoped_ptr<AllStatus> allstatus_; 110 scoped_ptr<AllStatus> allstatus_;
109 scoped_refptr<SyncerThread> syncer_thread_; 111 scoped_refptr<SyncerThread> syncer_thread_;
110 scoped_refptr<ModelSafeWorker> worker_; 112 scoped_refptr<ModelSafeWorker> worker_;
111 scoped_ptr<EventListenerHookup> syncer_event_hookup_; 113 scoped_ptr<ChannelHookup<SyncerEvent> > syncer_event_hookup_;
112 base::WaitableEvent sync_cycle_ended_event_; 114 base::WaitableEvent sync_cycle_ended_event_;
113 DISALLOW_COPY_AND_ASSIGN(SyncerThreadWithSyncerTest); 115 DISALLOW_COPY_AND_ASSIGN(SyncerThreadWithSyncerTest);
114 }; 116 };
115 117
116 class SyncShareIntercept 118 class SyncShareIntercept
117 : public MockConnectionManager::ResponseCodeOverrideRequestor, 119 : public MockConnectionManager::ResponseCodeOverrideRequestor,
118 public MockConnectionManager::MidCommitObserver { 120 public MockConnectionManager::MidCommitObserver {
119 public: 121 public:
120 SyncShareIntercept() : sync_occured_(false, false), 122 SyncShareIntercept() : sync_occured_(false, false),
121 allow_multiple_interceptions_(true) {} 123 allow_multiple_interceptions_(true) {}
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(10)); 710 interceptor.WaitForSyncShare(1, TimeDelta::FromSeconds(10));
709 EXPECT_FALSE(interceptor.times_sync_occured().empty()); 711 EXPECT_FALSE(interceptor.times_sync_occured().empty());
710 712
711 EXPECT_TRUE(syncer_thread()->Stop(2000)); 713 EXPECT_TRUE(syncer_thread()->Stop(2000));
712 } 714 }
713 715
714 ACTION_P(SignalEvent, event) { 716 ACTION_P(SignalEvent, event) {
715 event->Signal(); 717 event->Signal();
716 } 718 }
717 719
718 class ListenerMock { 720 class ListenerMock : public ChannelEventHandler<SyncerEvent> {
719 public: 721 public:
720 MOCK_METHOD1(HandleEvent, void(const SyncerEvent&)); 722 MOCK_METHOD1(HandleChannelEvent, void(const SyncerEvent&));
721 }; 723 };
722 724
723 // TODO(skrul): Bug 39070. 725 // TODO(skrul): Bug 39070.
724 TEST_F(SyncerThreadWithSyncerTest, DISABLED_Pause) { 726 TEST_F(SyncerThreadWithSyncerTest, DISABLED_Pause) {
725 WaitableEvent sync_cycle_ended_event(false, false); 727 WaitableEvent sync_cycle_ended_event(false, false);
726 WaitableEvent paused_event(false, false); 728 WaitableEvent paused_event(false, false);
727 WaitableEvent resumed_event(false, false); 729 WaitableEvent resumed_event(false, false);
728 // We don't want a poll to happen during this test (except the first one). 730 // We don't want a poll to happen during this test (except the first one).
729 const TimeDelta poll_interval = TimeDelta::FromMinutes(5); 731 const TimeDelta poll_interval = TimeDelta::FromMinutes(5);
730 syncer_thread()->SetSyncerShortPollInterval(poll_interval); 732 syncer_thread()->SetSyncerShortPollInterval(poll_interval);
731 733
732 ListenerMock listener; 734 ListenerMock listener;
733 scoped_ptr<EventListenerHookup> hookup; 735 scoped_ptr<ChannelHookup<SyncerEvent> > hookup;
734 hookup.reset( 736 hookup.reset(syncer_thread()->relay_channel()->AddObserver(&listener));
735 NewEventListenerHookup(syncer_thread()->relay_channel(),
736 &listener,
737 &ListenerMock::HandleEvent));
738 737
739 EXPECT_CALL(listener, HandleEvent( 738 EXPECT_CALL(listener, HandleChannelEvent(
740 Field(&SyncerEvent::what_happened, SyncerEvent::STATUS_CHANGED))). 739 Field(&SyncerEvent::what_happened, SyncerEvent::STATUS_CHANGED))).
741 Times(AnyNumber()); 740 Times(AnyNumber());
742 741
743 // Syncer thread is not running, should fail. 742 // Syncer thread is not running, should fail.
744 EXPECT_FALSE(syncer_thread()->RequestPause()); 743 EXPECT_FALSE(syncer_thread()->RequestPause());
745 EXPECT_FALSE(syncer_thread()->RequestResume()); 744 EXPECT_FALSE(syncer_thread()->RequestResume());
746 745
747 // Wait for the initial sync to complete. 746 // Wait for the initial sync to complete.
748 EXPECT_CALL(listener, HandleEvent( 747 EXPECT_CALL(listener, HandleChannelEvent(
749 Field(&SyncerEvent::what_happened, SyncerEvent::SYNC_CYCLE_ENDED))). 748 Field(&SyncerEvent::what_happened, SyncerEvent::SYNC_CYCLE_ENDED))).
750 WillOnce(SignalEvent(&sync_cycle_ended_event)); 749 WillOnce(SignalEvent(&sync_cycle_ended_event));
751 ASSERT_TRUE(syncer_thread()->Start()); 750 ASSERT_TRUE(syncer_thread()->Start());
752 metadb()->Open(); 751 metadb()->Open();
753 sync_cycle_ended_event.Wait(); 752 sync_cycle_ended_event.Wait();
754 753
755 // Request a pause. 754 // Request a pause.
756 EXPECT_CALL(listener, HandleEvent( 755 EXPECT_CALL(listener, HandleChannelEvent(
757 Field(&SyncerEvent::what_happened, SyncerEvent::PAUSED))). 756 Field(&SyncerEvent::what_happened, SyncerEvent::PAUSED))).
758 WillOnce(SignalEvent(&paused_event)); 757 WillOnce(SignalEvent(&paused_event));
759 ASSERT_TRUE(syncer_thread()->RequestPause()); 758 ASSERT_TRUE(syncer_thread()->RequestPause());
760 paused_event.Wait(); 759 paused_event.Wait();
761 760
762 // Resuming the pause. 761 // Resuming the pause.
763 EXPECT_CALL(listener, HandleEvent( 762 EXPECT_CALL(listener, HandleChannelEvent(
764 Field(&SyncerEvent::what_happened, SyncerEvent::RESUMED))). 763 Field(&SyncerEvent::what_happened, SyncerEvent::RESUMED))).
765 WillOnce(SignalEvent(&resumed_event)); 764 WillOnce(SignalEvent(&resumed_event));
766 ASSERT_TRUE(syncer_thread()->RequestResume()); 765 ASSERT_TRUE(syncer_thread()->RequestResume());
767 resumed_event.Wait(); 766 resumed_event.Wait();
768 767
769 // Not paused, should fail. 768 // Not paused, should fail.
770 EXPECT_FALSE(syncer_thread()->RequestResume()); 769 EXPECT_FALSE(syncer_thread()->RequestResume());
771 770
772 // Request a pause. 771 // Request a pause.
773 EXPECT_CALL(listener, HandleEvent( 772 EXPECT_CALL(listener, HandleChannelEvent(
774 Field(&SyncerEvent::what_happened, SyncerEvent::PAUSED))). 773 Field(&SyncerEvent::what_happened, SyncerEvent::PAUSED))).
775 WillOnce(SignalEvent(&paused_event)); 774 WillOnce(SignalEvent(&paused_event));
776 ASSERT_TRUE(syncer_thread()->RequestPause()); 775 ASSERT_TRUE(syncer_thread()->RequestPause());
777 paused_event.Wait(); 776 paused_event.Wait();
778 777
779 // Nudge the syncer, this should do nothing while we are paused. 778 // Nudge the syncer, this should do nothing while we are paused.
780 syncer_thread()->NudgeSyncer(0, SyncerThread::kUnknown); 779 syncer_thread()->NudgeSyncer(0, SyncerThread::kUnknown);
781 780
782 // Resuming will cause the nudge to be processed and a sync cycle to run. 781 // Resuming will cause the nudge to be processed and a sync cycle to run.
783 EXPECT_CALL(listener, HandleEvent( 782 EXPECT_CALL(listener, HandleChannelEvent(
784 Field(&SyncerEvent::what_happened, SyncerEvent::RESUMED))). 783 Field(&SyncerEvent::what_happened, SyncerEvent::RESUMED))).
785 WillOnce(SignalEvent(&resumed_event)); 784 WillOnce(SignalEvent(&resumed_event));
786 // Wait for the sync cycle to run. 785 // Wait for the sync cycle to run.
787 EXPECT_CALL(listener, HandleEvent( 786 EXPECT_CALL(listener, HandleChannelEvent(
788 Field(&SyncerEvent::what_happened, SyncerEvent::SYNC_CYCLE_ENDED))). 787 Field(&SyncerEvent::what_happened, SyncerEvent::SYNC_CYCLE_ENDED))).
789 WillOnce(SignalEvent(&sync_cycle_ended_event)); 788 WillOnce(SignalEvent(&sync_cycle_ended_event));
790 ASSERT_TRUE(syncer_thread()->RequestResume()); 789 ASSERT_TRUE(syncer_thread()->RequestResume());
791 resumed_event.Wait(); 790 resumed_event.Wait();
792 sync_cycle_ended_event.Wait(); 791 sync_cycle_ended_event.Wait();
793 792
794 EXPECT_TRUE(syncer_thread()->Stop(2000)); 793 EXPECT_TRUE(syncer_thread()->Stop(2000));
795 } 794 }
796 795
797 } // namespace browser_sync 796 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/engine/syncer_thread.cc ('k') | chrome/browser/sync/engine/syncer_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698