blob: 0e2f9b949bcdb86d7708cd556cf36c611c3e4010 [file] [log] [blame]
// 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