| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 // This class defines tests that implementations of InvalidationFrontend should | 5 // This class defines tests that implementations of InvalidationService should |
| 6 // pass in order to be conformant. Here's how you use it to test your | 6 // pass in order to be conformant. Here's how you use it to test your |
| 7 // implementation. | 7 // implementation. |
| 8 // | 8 // |
| 9 // Say your class is called MyInvalidationFrontend. Then you need to define a | 9 // Say your class is called MyInvalidationService. Then you need to define a |
| 10 // class called MyInvalidationFrontendTestDelegate in | 10 // class called MyInvalidationServiceTestDelegate in |
| 11 // my_invalidation_frontend_unittest.cc like this: | 11 // my_invalidation_frontend_unittest.cc like this: |
| 12 // | 12 // |
| 13 // class MyInvalidationFrontendTestDelegate { | 13 // class MyInvalidationServiceTestDelegate { |
| 14 // public: | 14 // public: |
| 15 // MyInvalidationFrontendTestDelegate() ... | 15 // MyInvalidationServiceTestDelegate() ... |
| 16 // | 16 // |
| 17 // ~MyInvalidationFrontendTestDelegate() { | 17 // ~MyInvalidationServiceTestDelegate() { |
| 18 // // DestroyInvalidator() may not be explicitly called by tests. | 18 // // DestroyInvalidator() may not be explicitly called by tests. |
| 19 // DestroyInvalidator(); | 19 // DestroyInvalidator(); |
| 20 // } | 20 // } |
| 21 // | 21 // |
| 22 // // Create the InvalidationFrontend implementation with the given params. | 22 // // Create the InvalidationService implementation with the given params. |
| 23 // void CreateInvalidationFrontend() { | 23 // void CreateInvalidationService() { |
| 24 // ... | 24 // ... |
| 25 // } | 25 // } |
| 26 // | 26 // |
| 27 // // Should return the InvalidationFrontend implementation. Only called | 27 // // Should return the InvalidationService implementation. Only called |
| 28 // // after CreateInvalidator and before DestroyInvalidator. | 28 // // after CreateInvalidator and before DestroyInvalidator. |
| 29 // MyInvalidationFrontend* GetInvalidationFrontend() { | 29 // MyInvalidationService* GetInvalidationService() { |
| 30 // ... | 30 // ... |
| 31 // } | 31 // } |
| 32 // | 32 // |
| 33 // // Destroy the InvalidationFrontend implementation. | 33 // // Destroy the InvalidationService implementation. |
| 34 // void DestroyInvalidationFrontend() { | 34 // void DestroyInvalidationService() { |
| 35 // ... | 35 // ... |
| 36 // } | 36 // } |
| 37 // | 37 // |
| 38 // // The Trigger* functions below should block until the effects of | 38 // // The Trigger* functions below should block until the effects of |
| 39 // // the call are visible on the current thread. | 39 // // the call are visible on the current thread. |
| 40 // | 40 // |
| 41 // // Should cause OnInvalidatorStateChange() to be called on all | 41 // // Should cause OnInvalidatorStateChange() to be called on all |
| 42 // // observers of the InvalidationFrontend implementation with the given | 42 // // observers of the InvalidationService implementation with the given |
| 43 // // parameters. | 43 // // parameters. |
| 44 // void TriggerOnInvalidatorStateChange(InvalidatorState state) { | 44 // void TriggerOnInvalidatorStateChange(InvalidatorState state) { |
| 45 // ... | 45 // ... |
| 46 // } | 46 // } |
| 47 // | 47 // |
| 48 // // Should cause OnIncomingInvalidation() to be called on all | 48 // // Should cause OnIncomingInvalidation() to be called on all |
| 49 // // observers of the InvalidationFrontend implementation with the given | 49 // // observers of the InvalidationService implementation with the given |
| 50 // // parameters. | 50 // // parameters. |
| 51 // void TriggerOnIncomingInvalidation( | 51 // void TriggerOnIncomingInvalidation( |
| 52 // const ObjectIdInvalidationMap& invalidation_map) { | 52 // const ObjectIdInvalidationMap& invalidation_map) { |
| 53 // ... | 53 // ... |
| 54 // } | 54 // } |
| 55 // }; | 55 // }; |
| 56 // | 56 // |
| 57 // The InvalidationFrontendTest test harness will have a member variable of | 57 // The InvalidationServiceTest test harness will have a member variable of |
| 58 // this delegate type and will call its functions in the various | 58 // this delegate type and will call its functions in the various |
| 59 // tests. | 59 // tests. |
| 60 // | 60 // |
| 61 // Then you simply #include this file as well as gtest.h and add the | 61 // Then you simply #include this file as well as gtest.h and add the |
| 62 // following statement to my_sync_notifier_unittest.cc: | 62 // following statement to my_sync_notifier_unittest.cc: |
| 63 // | 63 // |
| 64 // INSTANTIATE_TYPED_TEST_CASE_P( | 64 // INSTANTIATE_TYPED_TEST_CASE_P( |
| 65 // MyInvalidationFrontend, | 65 // MyInvalidationService, |
| 66 // InvalidationFrontendTest, | 66 // InvalidationServiceTest, |
| 67 // MyInvalidatorTestDelegate); | 67 // MyInvalidatorTestDelegate); |
| 68 // | 68 // |
| 69 // Easy! | 69 // Easy! |
| 70 | 70 |
| 71 #ifndef CHROME_BROWSER_INVALIDATION_INVALIDATION_FRONTEND_TEST_TEMPLATE_H_ | 71 #ifndef CHROME_BROWSER_INVALIDATION_INVALIDATION_SERVICE_TEST_TEMPLATE_H_ |
| 72 #define CHROME_BROWSER_INVALIDATION_INVALIDATION_FRONTEND_TEST_TEMPLATE_H_ | 72 #define CHROME_BROWSER_INVALIDATION_INVALIDATION_SERVICE_TEST_TEMPLATE_H_ |
| 73 | 73 |
| 74 #include "base/basictypes.h" | 74 #include "base/basictypes.h" |
| 75 #include "base/compiler_specific.h" | 75 #include "base/compiler_specific.h" |
| 76 #include "chrome/browser/invalidation/invalidation_frontend.h" | 76 #include "chrome/browser/invalidation/invalidation_service.h" |
| 77 #include "google/cacheinvalidation/include/types.h" | 77 #include "google/cacheinvalidation/include/types.h" |
| 78 #include "google/cacheinvalidation/types.pb.h" | 78 #include "google/cacheinvalidation/types.pb.h" |
| 79 #include "sync/notifier/fake_invalidation_handler.h" | 79 #include "sync/notifier/fake_invalidation_handler.h" |
| 80 #include "sync/notifier/object_id_invalidation_map.h" | 80 #include "sync/notifier/object_id_invalidation_map.h" |
| 81 #include "sync/notifier/object_id_invalidation_map_test_util.h" | 81 #include "sync/notifier/object_id_invalidation_map_test_util.h" |
| 82 #include "testing/gtest/include/gtest/gtest.h" | 82 #include "testing/gtest/include/gtest/gtest.h" |
| 83 | 83 |
| 84 template <typename InvalidatorTestDelegate> | 84 template <typename InvalidatorTestDelegate> |
| 85 class InvalidationFrontendTest : public testing::Test { | 85 class InvalidationServiceTest : public testing::Test { |
| 86 protected: | 86 protected: |
| 87 // Note: The IDs defined below must be valid. Otherwise they won't make it | 87 // Note: The IDs defined below must be valid. Otherwise they won't make it |
| 88 // through the round-trip to ModelTypeInvalidationMap and back that the | 88 // through the round-trip to ModelTypeInvalidationMap and back that the |
| 89 // AndroidInvalidation test requires. | 89 // AndroidInvalidation test requires. |
| 90 InvalidationFrontendTest() | 90 InvalidationServiceTest() |
| 91 : id1(ipc::invalidation::ObjectSource::CHROME_SYNC, "BOOKMARK"), | 91 : id1(ipc::invalidation::ObjectSource::CHROME_SYNC, "BOOKMARK"), |
| 92 id2(ipc::invalidation::ObjectSource::CHROME_SYNC, "PREFERENCE"), | 92 id2(ipc::invalidation::ObjectSource::CHROME_SYNC, "PREFERENCE"), |
| 93 id3(ipc::invalidation::ObjectSource::CHROME_SYNC, "AUTOFILL"), | 93 id3(ipc::invalidation::ObjectSource::CHROME_SYNC, "AUTOFILL"), |
| 94 id4(ipc::invalidation::ObjectSource::CHROME_SYNC, "EXPERIMENTS") { | 94 id4(ipc::invalidation::ObjectSource::CHROME_SYNC, "EXPERIMENTS") { |
| 95 } | 95 } |
| 96 | 96 |
| 97 invalidation::InvalidationFrontend* | 97 invalidation::InvalidationService* |
| 98 CreateAndInitializeInvalidationFrontend() { | 98 CreateAndInitializeInvalidationService() { |
| 99 this->delegate_.CreateInvalidationFrontend(); | 99 this->delegate_.CreateInvalidationService(); |
| 100 return this->delegate_.GetInvalidationFrontend(); | 100 return this->delegate_.GetInvalidationService(); |
| 101 } | 101 } |
| 102 | 102 |
| 103 InvalidatorTestDelegate delegate_; | 103 InvalidatorTestDelegate delegate_; |
| 104 | 104 |
| 105 const invalidation::ObjectId id1; | 105 const invalidation::ObjectId id1; |
| 106 const invalidation::ObjectId id2; | 106 const invalidation::ObjectId id2; |
| 107 const invalidation::ObjectId id3; | 107 const invalidation::ObjectId id3; |
| 108 const invalidation::ObjectId id4; | 108 const invalidation::ObjectId id4; |
| 109 }; | 109 }; |
| 110 | 110 |
| 111 TYPED_TEST_CASE_P(InvalidationFrontendTest); | 111 TYPED_TEST_CASE_P(InvalidationServiceTest); |
| 112 | 112 |
| 113 // Initialize the invalidator, register a handler, register some IDs for that | 113 // Initialize the invalidator, register a handler, register some IDs for that |
| 114 // handler, and then unregister the handler, dispatching invalidations in | 114 // handler, and then unregister the handler, dispatching invalidations in |
| 115 // between. The handler should only see invalidations when its registered and | 115 // between. The handler should only see invalidations when its registered and |
| 116 // its IDs are registered. | 116 // its IDs are registered. |
| 117 TYPED_TEST_P(InvalidationFrontendTest, Basic) { | 117 TYPED_TEST_P(InvalidationServiceTest, Basic) { |
| 118 invalidation::InvalidationFrontend* const invalidator = | 118 invalidation::InvalidationService* const invalidator = |
| 119 this->CreateAndInitializeInvalidationFrontend(); | 119 this->CreateAndInitializeInvalidationService(); |
| 120 | 120 |
| 121 syncer::FakeInvalidationHandler handler; | 121 syncer::FakeInvalidationHandler handler; |
| 122 | 122 |
| 123 invalidator->RegisterInvalidationHandler(&handler); | 123 invalidator->RegisterInvalidationHandler(&handler); |
| 124 | 124 |
| 125 syncer::ObjectIdInvalidationMap states; | 125 syncer::ObjectIdInvalidationMap states; |
| 126 states[this->id1].payload = "1"; | 126 states[this->id1].payload = "1"; |
| 127 states[this->id2].payload = "2"; | 127 states[this->id2].payload = "2"; |
| 128 states[this->id3].payload = "3"; | 128 states[this->id3].payload = "3"; |
| 129 | 129 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 // Should be ignored since |handler| isn't registered anymore. | 175 // Should be ignored since |handler| isn't registered anymore. |
| 176 this->delegate_.TriggerOnIncomingInvalidation(states); | 176 this->delegate_.TriggerOnIncomingInvalidation(states); |
| 177 EXPECT_EQ(2, handler.GetInvalidationCount()); | 177 EXPECT_EQ(2, handler.GetInvalidationCount()); |
| 178 } | 178 } |
| 179 | 179 |
| 180 // Register handlers and some IDs for those handlers, register a handler with | 180 // Register handlers and some IDs for those handlers, register a handler with |
| 181 // no IDs, and register a handler with some IDs but unregister it. Then, | 181 // no IDs, and register a handler with some IDs but unregister it. Then, |
| 182 // dispatch some invalidations and invalidations. Handlers that are registered | 182 // dispatch some invalidations and invalidations. Handlers that are registered |
| 183 // should get invalidations, and the ones that have registered IDs should | 183 // should get invalidations, and the ones that have registered IDs should |
| 184 // receive invalidations for those IDs. | 184 // receive invalidations for those IDs. |
| 185 TYPED_TEST_P(InvalidationFrontendTest, MultipleHandlers) { | 185 TYPED_TEST_P(InvalidationServiceTest, MultipleHandlers) { |
| 186 invalidation::InvalidationFrontend* const invalidator = | 186 invalidation::InvalidationService* const invalidator = |
| 187 this->CreateAndInitializeInvalidationFrontend(); | 187 this->CreateAndInitializeInvalidationService(); |
| 188 | 188 |
| 189 syncer::FakeInvalidationHandler handler1; | 189 syncer::FakeInvalidationHandler handler1; |
| 190 syncer::FakeInvalidationHandler handler2; | 190 syncer::FakeInvalidationHandler handler2; |
| 191 syncer::FakeInvalidationHandler handler3; | 191 syncer::FakeInvalidationHandler handler3; |
| 192 syncer::FakeInvalidationHandler handler4; | 192 syncer::FakeInvalidationHandler handler4; |
| 193 | 193 |
| 194 invalidator->RegisterInvalidationHandler(&handler1); | 194 invalidator->RegisterInvalidationHandler(&handler1); |
| 195 invalidator->RegisterInvalidationHandler(&handler2); | 195 invalidator->RegisterInvalidationHandler(&handler2); |
| 196 invalidator->RegisterInvalidationHandler(&handler3); | 196 invalidator->RegisterInvalidationHandler(&handler3); |
| 197 invalidator->RegisterInvalidationHandler(&handler4); | 197 invalidator->RegisterInvalidationHandler(&handler4); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 EXPECT_EQ(syncer::TRANSIENT_INVALIDATION_ERROR, | 263 EXPECT_EQ(syncer::TRANSIENT_INVALIDATION_ERROR, |
| 264 handler4.GetInvalidatorState()); | 264 handler4.GetInvalidatorState()); |
| 265 | 265 |
| 266 invalidator->UnregisterInvalidationHandler(&handler3); | 266 invalidator->UnregisterInvalidationHandler(&handler3); |
| 267 invalidator->UnregisterInvalidationHandler(&handler2); | 267 invalidator->UnregisterInvalidationHandler(&handler2); |
| 268 invalidator->UnregisterInvalidationHandler(&handler1); | 268 invalidator->UnregisterInvalidationHandler(&handler1); |
| 269 } | 269 } |
| 270 | 270 |
| 271 // Make sure that passing an empty set to UpdateRegisteredInvalidationIds clears | 271 // Make sure that passing an empty set to UpdateRegisteredInvalidationIds clears |
| 272 // the corresponding entries for the handler. | 272 // the corresponding entries for the handler. |
| 273 TYPED_TEST_P(InvalidationFrontendTest, EmptySetUnregisters) { | 273 TYPED_TEST_P(InvalidationServiceTest, EmptySetUnregisters) { |
| 274 invalidation::InvalidationFrontend* const invalidator = | 274 invalidation::InvalidationService* const invalidator = |
| 275 this->CreateAndInitializeInvalidationFrontend(); | 275 this->CreateAndInitializeInvalidationService(); |
| 276 | 276 |
| 277 syncer::FakeInvalidationHandler handler1; | 277 syncer::FakeInvalidationHandler handler1; |
| 278 | 278 |
| 279 // Control observer. | 279 // Control observer. |
| 280 syncer::FakeInvalidationHandler handler2; | 280 syncer::FakeInvalidationHandler handler2; |
| 281 | 281 |
| 282 invalidator->RegisterInvalidationHandler(&handler1); | 282 invalidator->RegisterInvalidationHandler(&handler1); |
| 283 invalidator->RegisterInvalidationHandler(&handler2); | 283 invalidator->RegisterInvalidationHandler(&handler2); |
| 284 | 284 |
| 285 { | 285 { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 EXPECT_EQ(syncer::TRANSIENT_INVALIDATION_ERROR, | 322 EXPECT_EQ(syncer::TRANSIENT_INVALIDATION_ERROR, |
| 323 handler2.GetInvalidatorState()); | 323 handler2.GetInvalidatorState()); |
| 324 | 324 |
| 325 invalidator->UnregisterInvalidationHandler(&handler2); | 325 invalidator->UnregisterInvalidationHandler(&handler2); |
| 326 invalidator->UnregisterInvalidationHandler(&handler1); | 326 invalidator->UnregisterInvalidationHandler(&handler1); |
| 327 } | 327 } |
| 328 | 328 |
| 329 namespace internal { | 329 namespace internal { |
| 330 | 330 |
| 331 // A FakeInvalidationHandler that is "bound" to a specific | 331 // A FakeInvalidationHandler that is "bound" to a specific |
| 332 // InvalidationFrontend. This is for cross-referencing state information with | 332 // InvalidationService. This is for cross-referencing state information with |
| 333 // the bound InvalidationFrontend. | 333 // the bound InvalidationService. |
| 334 class BoundFakeInvalidationHandler : public syncer::FakeInvalidationHandler { | 334 class BoundFakeInvalidationHandler : public syncer::FakeInvalidationHandler { |
| 335 public: | 335 public: |
| 336 explicit BoundFakeInvalidationHandler( | 336 explicit BoundFakeInvalidationHandler( |
| 337 const invalidation::InvalidationFrontend& invalidator); | 337 const invalidation::InvalidationService& invalidator); |
| 338 virtual ~BoundFakeInvalidationHandler(); | 338 virtual ~BoundFakeInvalidationHandler(); |
| 339 | 339 |
| 340 // Returns the last return value of GetInvalidatorState() on the | 340 // Returns the last return value of GetInvalidatorState() on the |
| 341 // bound invalidator from the last time the invalidator state | 341 // bound invalidator from the last time the invalidator state |
| 342 // changed. | 342 // changed. |
| 343 syncer::InvalidatorState GetLastRetrievedState() const; | 343 syncer::InvalidatorState GetLastRetrievedState() const; |
| 344 | 344 |
| 345 // InvalidationHandler implementation. | 345 // InvalidationHandler implementation. |
| 346 virtual void OnInvalidatorStateChange( | 346 virtual void OnInvalidatorStateChange( |
| 347 syncer::InvalidatorState state) OVERRIDE; | 347 syncer::InvalidatorState state) OVERRIDE; |
| 348 | 348 |
| 349 private: | 349 private: |
| 350 const invalidation::InvalidationFrontend& invalidator_; | 350 const invalidation::InvalidationService& invalidator_; |
| 351 syncer::InvalidatorState last_retrieved_state_; | 351 syncer::InvalidatorState last_retrieved_state_; |
| 352 | 352 |
| 353 DISALLOW_COPY_AND_ASSIGN(BoundFakeInvalidationHandler); | 353 DISALLOW_COPY_AND_ASSIGN(BoundFakeInvalidationHandler); |
| 354 }; | 354 }; |
| 355 | 355 |
| 356 } // namespace internal | 356 } // namespace internal |
| 357 | 357 |
| 358 TYPED_TEST_P(InvalidationFrontendTest, GetInvalidatorStateAlwaysCurrent) { | 358 TYPED_TEST_P(InvalidationServiceTest, GetInvalidatorStateAlwaysCurrent) { |
| 359 invalidation::InvalidationFrontend* const invalidator = | 359 invalidation::InvalidationService* const invalidator = |
| 360 this->CreateAndInitializeInvalidationFrontend(); | 360 this->CreateAndInitializeInvalidationService(); |
| 361 | 361 |
| 362 internal::BoundFakeInvalidationHandler handler(*invalidator); | 362 internal::BoundFakeInvalidationHandler handler(*invalidator); |
| 363 invalidator->RegisterInvalidationHandler(&handler); | 363 invalidator->RegisterInvalidationHandler(&handler); |
| 364 | 364 |
| 365 this->delegate_.TriggerOnInvalidatorStateChange( | 365 this->delegate_.TriggerOnInvalidatorStateChange( |
| 366 syncer::INVALIDATIONS_ENABLED); | 366 syncer::INVALIDATIONS_ENABLED); |
| 367 EXPECT_EQ(syncer::INVALIDATIONS_ENABLED, handler.GetInvalidatorState()); | 367 EXPECT_EQ(syncer::INVALIDATIONS_ENABLED, handler.GetInvalidatorState()); |
| 368 EXPECT_EQ(syncer::INVALIDATIONS_ENABLED, handler.GetLastRetrievedState()); | 368 EXPECT_EQ(syncer::INVALIDATIONS_ENABLED, handler.GetLastRetrievedState()); |
| 369 | 369 |
| 370 this->delegate_.TriggerOnInvalidatorStateChange( | 370 this->delegate_.TriggerOnInvalidatorStateChange( |
| 371 syncer::TRANSIENT_INVALIDATION_ERROR); | 371 syncer::TRANSIENT_INVALIDATION_ERROR); |
| 372 EXPECT_EQ(syncer::TRANSIENT_INVALIDATION_ERROR, | 372 EXPECT_EQ(syncer::TRANSIENT_INVALIDATION_ERROR, |
| 373 handler.GetInvalidatorState()); | 373 handler.GetInvalidatorState()); |
| 374 EXPECT_EQ(syncer::TRANSIENT_INVALIDATION_ERROR, | 374 EXPECT_EQ(syncer::TRANSIENT_INVALIDATION_ERROR, |
| 375 handler.GetLastRetrievedState()); | 375 handler.GetLastRetrievedState()); |
| 376 | 376 |
| 377 invalidator->UnregisterInvalidationHandler(&handler); | 377 invalidator->UnregisterInvalidationHandler(&handler); |
| 378 } | 378 } |
| 379 | 379 |
| 380 REGISTER_TYPED_TEST_CASE_P(InvalidationFrontendTest, | 380 REGISTER_TYPED_TEST_CASE_P(InvalidationServiceTest, |
| 381 Basic, MultipleHandlers, EmptySetUnregisters, | 381 Basic, MultipleHandlers, EmptySetUnregisters, |
| 382 GetInvalidatorStateAlwaysCurrent); | 382 GetInvalidatorStateAlwaysCurrent); |
| 383 | 383 |
| 384 #endif // CHROME_BROWSER_INVALIDATION_INVALIDATION_FRONTEND_TEST_TEMPLATE_H_ | 384 #endif // CHROME_BROWSER_INVALIDATION_INVALIDATION_SERVICE_TEST_TEMPLATE_H_ |
| OLD | NEW |