blob: 9ea85e21c52ec55881b0f349f278dec0eb114691 [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/environment/environment.h"
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/async/cpp/task.h>
#include <lib/sys/cpp/testing/component_context_provider.h>
#include "src/ledger/bin/environment/test_loop_notification.h"
#include "src/ledger/bin/storage/public/types.h"
#include "src/ledger/lib/loop_fixture/test_loop_fixture.h"
#include "src/ledger/lib/rng/test_random.h"
#include "src/ledger/lib/timekeeper/test_clock.h"
namespace ledger {
namespace {
class EnvironmentTest : public TestLoopFixture {
public:
sys::testing::ComponentContextProvider component_context_provider_;
};
TEST_F(EnvironmentTest, InitializationOfAsyncAndIOAsync) {
auto io_loop = test_loop().StartNewLoop();
Environment env = EnvironmentBuilder()
.SetStartupContext(component_context_provider_.context())
.SetAsync(dispatcher())
.SetIOAsync(io_loop->dispatcher())
.SetNotificationFactory(TestLoopNotification::NewFactory(&test_loop()))
.Build();
EXPECT_EQ(env.dispatcher(), dispatcher());
EXPECT_EQ(env.io_dispatcher(), io_loop->dispatcher());
}
TEST_F(EnvironmentTest, InitializationClock) {
auto io_loop = test_loop().StartNewLoop();
auto clock = std::make_unique<TestClock>();
auto clock_ptr = clock.get();
Environment env = EnvironmentBuilder()
.SetStartupContext(component_context_provider_.context())
.SetAsync(dispatcher())
.SetIOAsync(io_loop->dispatcher())
.SetNotificationFactory(TestLoopNotification::NewFactory(&test_loop()))
.SetClock(std::move(clock))
.Build();
EXPECT_EQ(env.clock(), clock_ptr);
}
TEST_F(EnvironmentTest, InitializationRandom) {
auto io_loop = test_loop().StartNewLoop();
auto random = std::make_unique<TestRandom>(0);
auto random_ptr = random.get();
Environment env = EnvironmentBuilder()
.SetStartupContext(component_context_provider_.context())
.SetAsync(dispatcher())
.SetIOAsync(io_loop->dispatcher())
.SetNotificationFactory(TestLoopNotification::NewFactory(&test_loop()))
.SetRandom(std::move(random))
.Build();
EXPECT_EQ(env.random(), random_ptr);
}
TEST_F(EnvironmentTest, InitializationGcPolicy) {
auto io_loop = test_loop().StartNewLoop();
Environment env = EnvironmentBuilder()
.SetStartupContext(component_context_provider_.context())
.SetAsync(dispatcher())
.SetIOAsync(io_loop->dispatcher())
.SetNotificationFactory(TestLoopNotification::NewFactory(&test_loop()))
.SetGcPolicy(storage::GarbageCollectionPolicy::EAGER_LIVE_REFERENCES)
.Build();
EXPECT_EQ(env.gc_policy(), storage::GarbageCollectionPolicy::EAGER_LIVE_REFERENCES);
}
TEST_F(EnvironmentTest, NotificationFactoryTest) {
auto io_loop = test_loop().StartNewLoop();
Environment env = EnvironmentBuilder()
.SetStartupContext(component_context_provider_.context())
.SetAsync(dispatcher())
.SetIOAsync(io_loop->dispatcher())
.SetNotificationFactory(TestLoopNotification::NewFactory(&test_loop()))
.Build();
bool called = false;
async::PostTask(env.dispatcher(), [&] {
auto notification = env.MakeNotification();
async::PostTask(env.io_dispatcher(), [&] { notification->Notify(); });
notification->WaitForNotification();
EXPECT_TRUE(notification->HasBeenNotified());
called = true;
});
RunLoopUntilIdle();
EXPECT_TRUE(called);
}
TEST(EnvironmentWithRealLoopTest, NotificationFactoryTest) {
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
async::Loop io_loop(&kAsyncLoopConfigNoAttachToCurrentThread);
io_loop.StartThread();
sys::testing::ComponentContextProvider component_context_provider;
Environment env = EnvironmentBuilder()
.SetStartupContext(component_context_provider.context())
.SetAsync(loop.dispatcher())
.SetIOAsync(io_loop.dispatcher())
.Build();
bool called = false;
async::PostTask(env.dispatcher(), [&] {
auto notification = env.MakeNotification();
async::PostTask(env.io_dispatcher(), [&] { notification->Notify(); });
notification->WaitForNotification();
EXPECT_TRUE(notification->HasBeenNotified());
called = true;
});
loop.RunUntilIdle();
EXPECT_TRUE(called);
}
TEST_F(EnvironmentTest, IniatilizationDefaultDiffCompatibilityPolicy) {
auto io_loop = test_loop().StartNewLoop();
Environment env = EnvironmentBuilder()
.SetStartupContext(component_context_provider_.context())
.SetAsync(dispatcher())
.SetIOAsync(io_loop->dispatcher())
.Build();
EXPECT_EQ(env.diff_compatibility_policy(),
storage::DiffCompatibilityPolicy::USE_DIFFS_AND_TREE_NODES);
}
TEST_F(EnvironmentTest, IniatilizationDiffCompatibilityPolicy) {
auto io_loop = test_loop().StartNewLoop();
Environment env =
EnvironmentBuilder()
.SetStartupContext(component_context_provider_.context())
.SetAsync(dispatcher())
.SetIOAsync(io_loop->dispatcher())
.SetDiffCompatibilityPolicy(storage::DiffCompatibilityPolicy::USE_ONLY_DIFFS)
.Build();
EXPECT_EQ(env.diff_compatibility_policy(), storage::DiffCompatibilityPolicy::USE_ONLY_DIFFS);
}
} // namespace
} // namespace ledger