blob: 0512a2868c30aa4415ea5f5af7dc09704c01b134 [file] [log] [blame]
// Copyright 2018 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 <fuchsia/ledger/internal/cpp/fidl.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <lib/callback/capture.h>
#include <lib/callback/set_when_called.h>
#include <lib/callback/waiter.h>
#include "src/ledger/bin/testing/ledger_matcher.h"
#include "src/ledger/bin/tests/integration/integration_test.h"
#include "src/ledger/bin/tests/integration/test_utils.h"
using testing::IsEmpty;
namespace ledger {
namespace {
// Tests in this suite execute a series of operations and check the content of
// the Page afterwards.
class PageMutationTest : public IntegrationTest {
public:
void SetUp() override {
IntegrationTest::SetUp();
app_instance_ = NewLedgerAppInstance();
page_ = app_instance_->GetTestPage();
}
std::vector<Entry> GetEntries() {
PageSnapshotPtr snapshot;
page_->GetSnapshot(snapshot.NewRequest(), fidl::VectorPtr<uint8_t>::New(0),
nullptr);
return SnapshotGetEntries(this, &snapshot);
}
void Put(std::string key, std::string value) {
page_->Put(convert::ToArray(key), convert::ToArray(value));
}
void Delete(std::string key) { page_->Delete(convert::ToArray(key)); }
protected:
std::unique_ptr<LedgerAppInstanceFactory::LedgerAppInstance> app_instance_;
PagePtr page_;
};
TEST_P(PageMutationTest, InitialSnapshotIsEmpty) {
EXPECT_THAT(GetEntries(), IsEmpty());
}
TEST_P(PageMutationTest, PutOutsideOfTransaction) {
Put("key", "value");
ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
Put("key2", "value2");
ASSERT_THAT(GetEntries(),
MatchEntries({{"key", "value"}, {"key2", "value2"}}));
}
TEST_P(PageMutationTest, PutInsideOfTransaction) {
page_->StartTransaction();
Put("key", "value");
ASSERT_THAT(GetEntries(), IsEmpty());
Put("key2", "value2");
page_->Commit();
ASSERT_THAT(GetEntries(),
MatchEntries({{"key", "value"}, {"key2", "value2"}}));
}
TEST_P(PageMutationTest, RollbackTransaction) {
page_->StartTransaction();
Put("key", "value");
ASSERT_THAT(GetEntries(), IsEmpty());
Put("key2", "value2");
page_->Rollback();
ASSERT_THAT(GetEntries(), IsEmpty());
}
TEST_P(PageMutationTest, DeleteOutsideOfTransaction) {
Put("key", "value");
Put("key2", "value2");
ASSERT_THAT(GetEntries(),
MatchEntries({{"key", "value"}, {"key2", "value2"}}));
Delete("key");
ASSERT_THAT(GetEntries(), MatchEntries({{"key2", "value2"}}));
}
TEST_P(PageMutationTest, DeleteInsideOfTransaction) {
Put("key", "value");
Put("key2", "value2");
ASSERT_THAT(GetEntries(),
MatchEntries({{"key", "value"}, {"key2", "value2"}}));
page_->StartTransaction();
Delete("key");
Put("key3", "value3");
Delete("key3");
page_->Commit();
ASSERT_THAT(GetEntries(), MatchEntries({{"key2", "value2"}}));
}
TEST_P(PageMutationTest, ClearOutsideOfTransaction) {
Put("key", "value");
Put("key2", "value2");
ASSERT_THAT(GetEntries(),
MatchEntries({{"key", "value"}, {"key2", "value2"}}));
page_->Clear();
ASSERT_THAT(GetEntries(), IsEmpty());
}
TEST_P(PageMutationTest, ClearInsideOfTransaction) {
Put("key", "value");
Put("key2", "value2");
ASSERT_THAT(GetEntries(),
MatchEntries({{"key", "value"}, {"key2", "value2"}}));
page_->StartTransaction();
Put("key3", "value3");
page_->Clear();
Put("key4", "value4");
page_->Commit();
ASSERT_THAT(GetEntries(), MatchEntries({{"key4", "value4"}}));
}
TEST_P(PageMutationTest, MultipleClearCallsInsideOfTransaction) {
Put("key", "value");
Put("key2", "value2");
ASSERT_THAT(GetEntries(),
MatchEntries({{"key", "value"}, {"key2", "value2"}}));
page_->StartTransaction();
Put("key3", "value3");
page_->Clear();
Put("key4", "value4");
page_->Clear();
Put("key5", "value5");
page_->Commit();
ASSERT_THAT(GetEntries(), MatchEntries({{"key5", "value5"}}));
}
TEST_P(PageMutationTest, ClearAndDeleteInsideOfTransaction) {
Put("key", "value");
ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
page_->StartTransaction();
page_->Clear();
Delete("key");
page_->Commit();
ASSERT_THAT(GetEntries(), IsEmpty());
}
TEST_P(PageMutationTest, DeleteAndClearInsideOfTransaction) {
Put("key", "value");
ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
page_->StartTransaction();
Delete("key");
page_->Clear();
page_->Commit();
ASSERT_THAT(GetEntries(), IsEmpty());
}
TEST_P(PageMutationTest, ClearAndRestoreInsideTransaction) {
Put("key", "value");
ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
page_->StartTransaction();
page_->Clear();
Put("key", "value");
page_->Commit();
ASSERT_THAT(GetEntries(), MatchEntries({{"key", "value"}}));
}
INSTANTIATE_TEST_SUITE_P(
PageMutationTest, PageMutationTest,
::testing::ValuesIn(GetLedgerAppInstanceFactoryBuilders()));
} // namespace
} // namespace ledger