blob: 01240591c79b33f93d81d3d827d446b98312288f [file] [log] [blame]
// Copyright 2017 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 "peridot/bin/ledger/app/sync_watcher_set.h"
#include <algorithm>
#include <string>
#include <lib/fidl/cpp/binding.h>
#include <lib/fxl/macros.h>
#include <lib/gtest/test_loop_fixture.h>
#include "gtest/gtest.h"
namespace ledger {
namespace {
class SyncWatcherSetTest : public gtest::TestLoopFixture {
public:
SyncWatcherSetTest() {}
~SyncWatcherSetTest() override {}
protected:
void SetUp() override { ::testing::Test::SetUp(); }
private:
FXL_DISALLOW_COPY_AND_ASSIGN(SyncWatcherSetTest);
};
class SyncWatcherImpl : public SyncWatcher {
public:
explicit SyncWatcherImpl(fidl::InterfaceRequest<SyncWatcher> request)
: binding_(this, std::move(request)) {}
void SyncStateChanged(SyncState download_status, SyncState upload_status,
SyncStateChangedCallback callback) override {
download_states.push_back(download_status);
upload_states.push_back(upload_status);
callback();
}
std::vector<SyncState> download_states;
std::vector<SyncState> upload_states;
private:
fidl::Binding<SyncWatcher> binding_;
FXL_DISALLOW_COPY_AND_ASSIGN(SyncWatcherImpl);
};
TEST_F(SyncWatcherSetTest, OneWatcher) {
SyncWatcherSet watcher_set;
SyncWatcherPtr watcher_ptr;
SyncWatcherImpl impl(watcher_ptr.NewRequest());
watcher_set.Notify({sync_coordinator::DOWNLOAD_IN_PROGRESS,
sync_coordinator::UPLOAD_PENDING});
watcher_set.AddSyncWatcher(std::move(watcher_ptr));
RunLoopUntilIdle();
ASSERT_EQ(1u, impl.download_states.size());
EXPECT_EQ(SyncState::IN_PROGRESS, *impl.download_states.rbegin());
ASSERT_EQ(1u, impl.upload_states.size());
EXPECT_EQ(SyncState::PENDING, *impl.upload_states.rbegin());
watcher_set.Notify(
{sync_coordinator::DOWNLOAD_ERROR, sync_coordinator::UPLOAD_IDLE});
RunLoopUntilIdle();
ASSERT_EQ(2u, impl.download_states.size());
EXPECT_EQ(SyncState::ERROR, *impl.download_states.rbegin());
ASSERT_EQ(2u, impl.upload_states.size());
EXPECT_EQ(SyncState::IDLE, *impl.upload_states.rbegin());
}
TEST_F(SyncWatcherSetTest, TwoWatchers) {
SyncWatcherSet watcher_set;
SyncWatcherPtr watcher_ptr1;
SyncWatcherImpl impl1(watcher_ptr1.NewRequest());
watcher_set.AddSyncWatcher(std::move(watcher_ptr1));
RunLoopUntilIdle();
EXPECT_EQ(1u, impl1.download_states.size());
EXPECT_EQ(SyncState::IDLE, *impl1.download_states.rbegin());
EXPECT_EQ(1u, impl1.upload_states.size());
EXPECT_EQ(SyncState::IDLE, *impl1.upload_states.rbegin());
SyncWatcherPtr watcher_ptr2;
SyncWatcherImpl impl2(watcher_ptr2.NewRequest());
watcher_set.AddSyncWatcher(std::move(watcher_ptr2));
RunLoopUntilIdle();
EXPECT_EQ(1u, impl2.download_states.size());
EXPECT_EQ(SyncState::IDLE, *impl2.download_states.rbegin());
EXPECT_EQ(1u, impl2.upload_states.size());
EXPECT_EQ(SyncState::IDLE, *impl2.upload_states.rbegin());
watcher_set.Notify({sync_coordinator::DOWNLOAD_IN_PROGRESS,
sync_coordinator::UPLOAD_PENDING});
RunLoopUntilIdle();
ASSERT_EQ(2u, impl1.download_states.size());
EXPECT_EQ(SyncState::IN_PROGRESS, *impl1.download_states.rbegin());
ASSERT_EQ(2u, impl1.upload_states.size());
EXPECT_EQ(SyncState::PENDING, *impl1.upload_states.rbegin());
ASSERT_EQ(2u, impl2.download_states.size());
EXPECT_EQ(SyncState::IN_PROGRESS, *impl2.download_states.rbegin());
ASSERT_EQ(2u, impl2.upload_states.size());
EXPECT_EQ(SyncState::PENDING, *impl2.upload_states.rbegin());
}
} // namespace
} // namespace ledger