OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <cstddef> | 5 #include <cstddef> |
6 #include <set> | 6 #include <set> |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 private: | 124 private: |
125 bool started_; | 125 bool started_; |
126 ObjectIdSet registered_ids_; | 126 ObjectIdSet registered_ids_; |
127 AckHandleSet acked_handles_; | 127 AckHandleSet acked_handles_; |
128 }; | 128 }; |
129 | 129 |
130 // Fake listener tkat keeps track of invalidation counts, payloads, | 130 // Fake listener tkat keeps track of invalidation counts, payloads, |
131 // and state. | 131 // and state. |
132 class FakeListener : public ChromeInvalidationClient::Listener { | 132 class FakeListener : public ChromeInvalidationClient::Listener { |
133 public: | 133 public: |
134 FakeListener() : reason_(TRANSIENT_NOTIFICATION_ERROR) {} | 134 FakeListener() : state_(TRANSIENT_INVALIDATION_ERROR) {} |
135 virtual ~FakeListener() {} | 135 virtual ~FakeListener() {} |
136 | 136 |
137 int GetInvalidationCount(const ObjectId& id) const { | 137 int GetInvalidationCount(const ObjectId& id) const { |
138 ObjectIdCountMap::const_iterator it = invalidation_counts_.find(id); | 138 ObjectIdCountMap::const_iterator it = invalidation_counts_.find(id); |
139 return (it == invalidation_counts_.end()) ? 0 : it->second; | 139 return (it == invalidation_counts_.end()) ? 0 : it->second; |
140 } | 140 } |
141 | 141 |
142 std::string GetPayload(const ObjectId& id) const { | 142 std::string GetPayload(const ObjectId& id) const { |
143 ObjectIdStateMap::const_iterator it = states_.find(id); | 143 ObjectIdStateMap::const_iterator it = states_.find(id); |
144 return (it == states_.end()) ? "" : it->second.payload; | 144 return (it == states_.end()) ? "" : it->second.payload; |
145 } | 145 } |
146 | 146 |
147 // NO_NOTIFICATION_ERROR is the enabled state. | 147 InvalidatorState GetInvalidatorState() const { |
148 NotificationsDisabledReason GetNotificationsDisabledReason() const { | 148 return state_; |
149 return reason_; | |
150 } | 149 } |
151 | 150 |
152 // ChromeInvalidationClient::Listener implementation. | 151 // ChromeInvalidationClient::Listener implementation. |
153 | 152 |
154 virtual void OnInvalidate(const ObjectIdStateMap& id_state_map) OVERRIDE { | 153 virtual void OnInvalidate(const ObjectIdStateMap& id_state_map) OVERRIDE { |
155 for (ObjectIdStateMap::const_iterator it = id_state_map.begin(); | 154 for (ObjectIdStateMap::const_iterator it = id_state_map.begin(); |
156 it != id_state_map.end(); ++it) { | 155 it != id_state_map.end(); ++it) { |
157 ++invalidation_counts_[it->first]; | 156 ++invalidation_counts_[it->first]; |
158 states_[it->first] = it->second; | 157 states_[it->first] = it->second; |
159 } | 158 } |
160 } | 159 } |
161 | 160 |
162 virtual void OnNotificationsEnabled() { | 161 virtual void OnInvalidatorStateChange(InvalidatorState state) { |
163 reason_ = NO_NOTIFICATION_ERROR; | 162 state_ = state; |
164 } | |
165 | |
166 virtual void OnNotificationsDisabled(NotificationsDisabledReason reason) { | |
167 reason_ = reason; | |
168 } | 163 } |
169 | 164 |
170 private: | 165 private: |
171 typedef std::map<ObjectId, int, ObjectIdLessThan> ObjectIdCountMap; | 166 typedef std::map<ObjectId, int, ObjectIdLessThan> ObjectIdCountMap; |
172 ObjectIdCountMap invalidation_counts_; | 167 ObjectIdCountMap invalidation_counts_; |
173 ObjectIdStateMap states_; | 168 ObjectIdStateMap states_; |
174 NotificationsDisabledReason reason_; | 169 InvalidatorState state_; |
175 }; | 170 }; |
176 | 171 |
177 invalidation::InvalidationClient* CreateFakeInvalidationClient( | 172 invalidation::InvalidationClient* CreateFakeInvalidationClient( |
178 FakeInvalidationClient** fake_invalidation_client, | 173 FakeInvalidationClient** fake_invalidation_client, |
179 invalidation::SystemResources* resources, | 174 invalidation::SystemResources* resources, |
180 int client_type, | 175 int client_type, |
181 const invalidation::string& client_name, | 176 const invalidation::string& client_name, |
182 const invalidation::string& application_name, | 177 const invalidation::string& application_name, |
183 invalidation::InvalidationListener* listener) { | 178 invalidation::InvalidationListener* listener) { |
184 *fake_invalidation_client = new FakeInvalidationClient(); | 179 *fake_invalidation_client = new FakeInvalidationClient(); |
(...skipping 30 matching lines...) Expand all Loading... |
215 } | 210 } |
216 | 211 |
217 int GetInvalidationCount(const ObjectId& id) const { | 212 int GetInvalidationCount(const ObjectId& id) const { |
218 return fake_listener_.GetInvalidationCount(id); | 213 return fake_listener_.GetInvalidationCount(id); |
219 } | 214 } |
220 | 215 |
221 std::string GetPayload(const ObjectId& id) const { | 216 std::string GetPayload(const ObjectId& id) const { |
222 return fake_listener_.GetPayload(id); | 217 return fake_listener_.GetPayload(id); |
223 } | 218 } |
224 | 219 |
225 NotificationsDisabledReason GetNotificationsDisabledReason() const { | 220 InvalidatorState GetInvalidatorState() const { |
226 return fake_listener_.GetNotificationsDisabledReason(); | 221 return fake_listener_.GetInvalidatorState(); |
227 } | 222 } |
228 | 223 |
229 int64 GetMaxVersion(const ObjectId& id) const { | 224 int64 GetMaxVersion(const ObjectId& id) const { |
230 return fake_tracker_.GetMaxVersion(id); | 225 return fake_tracker_.GetMaxVersion(id); |
231 } | 226 } |
232 | 227 |
233 std::string GetInvalidationState() const { | 228 std::string GetInvalidationState() const { |
234 return fake_tracker_.GetInvalidationState(); | 229 return fake_tracker_.GetInvalidationState(); |
235 } | 230 } |
236 | 231 |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 EXPECT_TRUE(GetRegisteredIds().empty()); | 635 EXPECT_TRUE(GetRegisteredIds().empty()); |
641 | 636 |
642 client_.Ready(fake_invalidation_client_); | 637 client_.Ready(fake_invalidation_client_); |
643 | 638 |
644 EXPECT_EQ(registered_ids_, GetRegisteredIds()); | 639 EXPECT_EQ(registered_ids_, GetRegisteredIds()); |
645 } | 640 } |
646 | 641 |
647 // Without readying the client, disable notifications, then enable | 642 // Without readying the client, disable notifications, then enable |
648 // them. The listener should still think notifications are disabled. | 643 // them. The listener should still think notifications are disabled. |
649 TEST_F(ChromeInvalidationClientTest, EnableNotificationsNotReady) { | 644 TEST_F(ChromeInvalidationClientTest, EnableNotificationsNotReady) { |
650 EXPECT_EQ(TRANSIENT_NOTIFICATION_ERROR, | 645 EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, |
651 GetNotificationsDisabledReason()); | 646 GetInvalidatorState()); |
652 | 647 |
653 DisableNotifications( | 648 DisableNotifications( |
654 notifier::TRANSIENT_NOTIFICATION_ERROR); | 649 notifier::TRANSIENT_NOTIFICATION_ERROR); |
655 | 650 |
656 EXPECT_EQ(TRANSIENT_NOTIFICATION_ERROR, | 651 EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, GetInvalidatorState()); |
657 GetNotificationsDisabledReason()); | |
658 | 652 |
659 DisableNotifications( | 653 DisableNotifications(notifier::NOTIFICATION_CREDENTIALS_REJECTED); |
660 notifier::NOTIFICATION_CREDENTIALS_REJECTED); | |
661 | 654 |
662 EXPECT_EQ(NOTIFICATION_CREDENTIALS_REJECTED, | 655 EXPECT_EQ(INVALIDATION_CREDENTIALS_REJECTED, GetInvalidatorState()); |
663 GetNotificationsDisabledReason()); | |
664 | 656 |
665 EnableNotifications(); | 657 EnableNotifications(); |
666 | 658 |
667 EXPECT_EQ(TRANSIENT_NOTIFICATION_ERROR, | 659 EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, GetInvalidatorState()); |
668 GetNotificationsDisabledReason()); | |
669 } | 660 } |
670 | 661 |
671 // Enable notifications then Ready the invalidation client. The | 662 // Enable notifications then Ready the invalidation client. The |
672 // listener should then be ready. | 663 // listener should then be ready. |
673 TEST_F(ChromeInvalidationClientTest, EnableNotificationsThenReady) { | 664 TEST_F(ChromeInvalidationClientTest, EnableNotificationsThenReady) { |
674 EXPECT_EQ(TRANSIENT_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 665 EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, GetInvalidatorState()); |
675 | 666 |
676 EnableNotifications(); | 667 EnableNotifications(); |
677 | 668 |
678 EXPECT_EQ(TRANSIENT_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 669 EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, GetInvalidatorState()); |
679 | 670 |
680 client_.Ready(fake_invalidation_client_); | 671 client_.Ready(fake_invalidation_client_); |
681 | 672 |
682 EXPECT_EQ(NO_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 673 EXPECT_EQ(INVALIDATIONS_ENABLED, GetInvalidatorState()); |
683 } | 674 } |
684 | 675 |
685 // Ready the invalidation client then enable notifications. The | 676 // Ready the invalidation client then enable notifications. The |
686 // listener should then be ready. | 677 // listener should then be ready. |
687 TEST_F(ChromeInvalidationClientTest, ReadyThenEnableNotifications) { | 678 TEST_F(ChromeInvalidationClientTest, ReadyThenEnableNotifications) { |
688 EXPECT_EQ(TRANSIENT_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 679 EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, GetInvalidatorState()); |
689 | 680 |
690 client_.Ready(fake_invalidation_client_); | 681 client_.Ready(fake_invalidation_client_); |
691 | 682 |
692 EXPECT_EQ(TRANSIENT_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 683 EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, GetInvalidatorState()); |
693 | 684 |
694 EnableNotifications(); | 685 EnableNotifications(); |
695 | 686 |
696 EXPECT_EQ(NO_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 687 EXPECT_EQ(INVALIDATIONS_ENABLED, GetInvalidatorState()); |
697 } | 688 } |
698 | 689 |
699 // Enable notifications and ready the client. Then disable | 690 // Enable notifications and ready the client. Then disable |
700 // notifications with an auth error and re-enable notifications. The | 691 // notifications with an auth error and re-enable notifications. The |
701 // listener should go into an auth error mode and then back out. | 692 // listener should go into an auth error mode and then back out. |
702 TEST_F(ChromeInvalidationClientTest, PushClientAuthError) { | 693 TEST_F(ChromeInvalidationClientTest, PushClientAuthError) { |
703 EnableNotifications(); | 694 EnableNotifications(); |
704 client_.Ready(fake_invalidation_client_); | 695 client_.Ready(fake_invalidation_client_); |
705 | 696 |
706 EXPECT_EQ(NO_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 697 EXPECT_EQ(INVALIDATIONS_ENABLED, GetInvalidatorState()); |
707 | 698 |
708 DisableNotifications( | 699 DisableNotifications( |
709 notifier::NOTIFICATION_CREDENTIALS_REJECTED); | 700 notifier::NOTIFICATION_CREDENTIALS_REJECTED); |
710 | 701 |
711 EXPECT_EQ(NOTIFICATION_CREDENTIALS_REJECTED, | 702 EXPECT_EQ(INVALIDATION_CREDENTIALS_REJECTED, GetInvalidatorState()); |
712 GetNotificationsDisabledReason()); | |
713 | 703 |
714 EnableNotifications(); | 704 EnableNotifications(); |
715 | 705 |
716 EXPECT_EQ(NO_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 706 EXPECT_EQ(INVALIDATIONS_ENABLED, GetInvalidatorState()); |
717 } | 707 } |
718 | 708 |
719 // Enable notifications and ready the client. Then simulate an auth | 709 // Enable notifications and ready the client. Then simulate an auth |
720 // error from the invalidation client. Simulate some notification | 710 // error from the invalidation client. Simulate some notification |
721 // events, then re-ready the client. The listener should go into an | 711 // events, then re-ready the client. The listener should go into an |
722 // auth error mode and come out of it only after the client is ready. | 712 // auth error mode and come out of it only after the client is ready. |
723 TEST_F(ChromeInvalidationClientTest, InvalidationClientAuthError) { | 713 TEST_F(ChromeInvalidationClientTest, InvalidationClientAuthError) { |
724 EnableNotifications(); | 714 EnableNotifications(); |
725 client_.Ready(fake_invalidation_client_); | 715 client_.Ready(fake_invalidation_client_); |
726 | 716 |
727 EXPECT_EQ(NO_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 717 EXPECT_EQ(INVALIDATIONS_ENABLED, GetInvalidatorState()); |
728 | 718 |
729 client_.InformError( | 719 client_.InformError( |
730 fake_invalidation_client_, | 720 fake_invalidation_client_, |
731 invalidation::ErrorInfo( | 721 invalidation::ErrorInfo( |
732 invalidation::ErrorReason::AUTH_FAILURE, | 722 invalidation::ErrorReason::AUTH_FAILURE, |
733 false /* is_transient */, | 723 false /* is_transient */, |
734 "auth error", | 724 "auth error", |
735 invalidation::ErrorContext())); | 725 invalidation::ErrorContext())); |
736 | 726 |
737 EXPECT_EQ(NOTIFICATION_CREDENTIALS_REJECTED, | 727 EXPECT_EQ(INVALIDATION_CREDENTIALS_REJECTED, GetInvalidatorState()); |
738 GetNotificationsDisabledReason()); | |
739 | 728 |
740 DisableNotifications( | 729 DisableNotifications(notifier::TRANSIENT_NOTIFICATION_ERROR); |
741 notifier::TRANSIENT_NOTIFICATION_ERROR); | |
742 | 730 |
743 EXPECT_EQ(NOTIFICATION_CREDENTIALS_REJECTED, | 731 EXPECT_EQ(INVALIDATION_CREDENTIALS_REJECTED, GetInvalidatorState()); |
744 GetNotificationsDisabledReason()); | |
745 | 732 |
746 DisableNotifications( | 733 DisableNotifications(notifier::TRANSIENT_NOTIFICATION_ERROR); |
747 notifier::TRANSIENT_NOTIFICATION_ERROR); | |
748 | 734 |
749 EXPECT_EQ(NOTIFICATION_CREDENTIALS_REJECTED, | 735 EXPECT_EQ(INVALIDATION_CREDENTIALS_REJECTED, GetInvalidatorState()); |
750 GetNotificationsDisabledReason()); | |
751 | 736 |
752 EnableNotifications(); | 737 EnableNotifications(); |
753 | 738 |
754 EXPECT_EQ(NOTIFICATION_CREDENTIALS_REJECTED, | 739 EXPECT_EQ(INVALIDATION_CREDENTIALS_REJECTED, GetInvalidatorState()); |
755 GetNotificationsDisabledReason()); | |
756 | 740 |
757 client_.Ready(fake_invalidation_client_); | 741 client_.Ready(fake_invalidation_client_); |
758 | 742 |
759 EXPECT_EQ(NO_NOTIFICATION_ERROR, GetNotificationsDisabledReason()); | 743 EXPECT_EQ(INVALIDATIONS_ENABLED, GetInvalidatorState()); |
760 } | 744 } |
761 | 745 |
762 } // namespace | 746 } // namespace |
763 | 747 |
764 } // namespace syncer | 748 } // namespace syncer |
OLD | NEW |