blob: 419a6fbccc9454f2826dc6c69d397338e9fba82a [file] [log] [blame]
// Copyright 2019 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/app/page_manager_container.h"
#include <lib/callback/capture.h>
#include <lib/callback/set_when_called.h>
#include "gtest/gtest.h"
#include "src/ledger/bin/fidl/include/types.h"
#include "src/ledger/bin/storage/fake/fake_page_storage.h"
#include "src/ledger/bin/storage/public/types.h"
#include "src/ledger/bin/testing/fake_disk_cleanup_manager.h"
#include "src/ledger/bin/testing/test_with_environment.h"
namespace ledger {
namespace {
constexpr char kLedgerName[] = "test_ledger_name";
using PageManagerContainerTest = TestWithEnvironment;
TEST_F(PageManagerContainerTest, OneEarlyBindingNoPageManager) {
storage::PageId page_id = std::string(::fuchsia::ledger::PAGE_ID_SIZE, 'a');
FakeDiskCleanupManager page_usage_listener;
PagePtr page;
bool callback_called;
storage::Status status;
bool on_empty_called;
PageManagerContainer page_manager_container(kLedgerName, page_id,
&page_usage_listener);
page_manager_container.set_on_empty(
callback::SetWhenCalled(&on_empty_called));
page_manager_container.BindPage(
page.NewRequest(),
callback::Capture(callback::SetWhenCalled(&callback_called), &status));
RunLoopUntilIdle();
EXPECT_FALSE(callback_called);
EXPECT_FALSE(on_empty_called);
page_manager_container.SetPageManager(storage::Status::IO_ERROR, nullptr);
RunLoopUntilIdle();
EXPECT_TRUE(callback_called);
EXPECT_EQ(storage::Status::IO_ERROR, status);
EXPECT_TRUE(on_empty_called);
// We expect that the page unbinding will have no further effect.
callback_called = false;
on_empty_called = false;
page.Unbind();
RunLoopUntilIdle();
EXPECT_FALSE(callback_called);
EXPECT_FALSE(on_empty_called);
}
TEST_F(PageManagerContainerTest, BindBeforePageManager) {
storage::PageId page_id = std::string(::fuchsia::ledger::PAGE_ID_SIZE, '3');
FakeDiskCleanupManager page_usage_listener;
auto page_storage =
std::make_unique<storage::fake::FakePageStorage>(&environment_, page_id);
auto merge_resolver = std::make_unique<MergeResolver>(
[] {}, &environment_, page_storage.get(), nullptr);
auto page_manager = std::make_unique<PageManager>(
&environment_, std::move(page_storage), nullptr,
std::move(merge_resolver), PageManager::PageStorageState::AVAILABLE);
PagePtr page;
bool callback_called;
storage::Status status;
bool on_empty_called;
PageManagerContainer page_manager_container(kLedgerName, page_id,
&page_usage_listener);
page_manager_container.set_on_empty(
callback::SetWhenCalled(&on_empty_called));
page_manager_container.BindPage(
page.NewRequest(),
callback::Capture(callback::SetWhenCalled(&callback_called), &status));
RunLoopUntilIdle();
EXPECT_FALSE(callback_called);
page_manager_container.SetPageManager(storage::Status::OK,
std::move(page_manager));
EXPECT_TRUE(callback_called);
EXPECT_EQ(storage::Status::OK, status);
EXPECT_FALSE(on_empty_called);
// We expect that the page unbinding will empty the PageManagerContainer but
// will not cause the page's own callback to be called again.
callback_called = false;
page.Unbind();
RunLoopUntilIdle();
EXPECT_FALSE(callback_called);
EXPECT_TRUE(on_empty_called);
}
} // namespace
} // namespace ledger