| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/ledger/bin/cloud_sync/impl/aggregator.h" |
| |
| #include "gtest/gtest.h" |
| #include "src/ledger/bin/cloud_sync/public/sync_state_watcher.h" |
| |
| namespace cloud_sync { |
| |
| namespace { |
| |
| class RecordingWatcher : public SyncStateWatcher { |
| public: |
| void Notify(SyncStateContainer sync_state) override { |
| states.push_back(sync_state); |
| } |
| |
| std::vector<SyncStateContainer> states; |
| }; |
| |
| TEST(AggregatorTest, SendFirstNotification) { |
| std::unique_ptr<RecordingWatcher> base_watcher = |
| std::make_unique<RecordingWatcher>(); |
| Aggregator aggregator; |
| aggregator.SetBaseWatcher(base_watcher.get()); |
| |
| std::unique_ptr<SyncStateWatcher> watcher1 = aggregator.GetNewStateWatcher(); |
| watcher1->Notify(DOWNLOAD_IN_PROGRESS, UPLOAD_WAIT_REMOTE_DOWNLOAD); |
| |
| ASSERT_EQ(2u, base_watcher->states.size()); |
| EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher->states[1].download); |
| EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher->states[1].upload); |
| } |
| |
| TEST(AggregatorTest, AggregateTwo) { |
| std::unique_ptr<RecordingWatcher> base_watcher = |
| std::make_unique<RecordingWatcher>(); |
| |
| Aggregator aggregator; |
| aggregator.SetBaseWatcher(base_watcher.get()); |
| |
| std::unique_ptr<SyncStateWatcher> watcher1 = aggregator.GetNewStateWatcher(); |
| std::unique_ptr<SyncStateWatcher> watcher2 = aggregator.GetNewStateWatcher(); |
| |
| EXPECT_EQ(DOWNLOAD_IDLE, base_watcher->states.rbegin()->download); |
| EXPECT_EQ(UPLOAD_IDLE, base_watcher->states.rbegin()->upload); |
| |
| watcher1->Notify(DOWNLOAD_IN_PROGRESS, UPLOAD_WAIT_REMOTE_DOWNLOAD); |
| |
| EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher->states.rbegin()->download); |
| EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher->states.rbegin()->upload); |
| |
| watcher2->Notify(DOWNLOAD_IDLE, UPLOAD_IDLE); |
| EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher->states.rbegin()->download); |
| EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher->states.rbegin()->upload); |
| |
| watcher1->Notify(DOWNLOAD_IDLE, UPLOAD_IN_PROGRESS); |
| EXPECT_EQ(DOWNLOAD_IDLE, base_watcher->states.rbegin()->download); |
| EXPECT_EQ(UPLOAD_IN_PROGRESS, base_watcher->states.rbegin()->upload); |
| } |
| |
| TEST(AggregatorTest, ResetWatcher) { |
| std::unique_ptr<RecordingWatcher> base_watcher = |
| std::make_unique<RecordingWatcher>(); |
| Aggregator aggregator; |
| aggregator.SetBaseWatcher(base_watcher.get()); |
| |
| std::unique_ptr<SyncStateWatcher> watcher1 = aggregator.GetNewStateWatcher(); |
| watcher1->Notify(DOWNLOAD_IN_PROGRESS, UPLOAD_WAIT_REMOTE_DOWNLOAD); |
| |
| ASSERT_EQ(2u, base_watcher->states.size()); |
| EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher->states[1].download); |
| EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher->states[1].upload); |
| |
| std::unique_ptr<RecordingWatcher> base_watcher2 = |
| std::make_unique<RecordingWatcher>(); |
| aggregator.SetBaseWatcher(base_watcher2.get()); |
| |
| ASSERT_EQ(1u, base_watcher2->states.size()); |
| EXPECT_EQ(DOWNLOAD_IN_PROGRESS, base_watcher2->states[0].download); |
| EXPECT_EQ(UPLOAD_WAIT_REMOTE_DOWNLOAD, base_watcher2->states[0].upload); |
| |
| watcher1->Notify(DOWNLOAD_IDLE, UPLOAD_IDLE); |
| |
| ASSERT_EQ(2u, base_watcher2->states.size()); |
| EXPECT_EQ(DOWNLOAD_IDLE, base_watcher2->states[1].download); |
| EXPECT_EQ(UPLOAD_IDLE, base_watcher2->states[1].upload); |
| |
| // States in first base watcher have not changed. |
| EXPECT_EQ(2u, base_watcher->states.size()); |
| } |
| |
| } // namespace |
| |
| } // namespace cloud_sync |