blob: d65d0c0cf51dfd07304b6975230bc78217db54ae [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 "peridot/bin/ledger/cache/lru_cache.h"
#include <lib/callback/capture.h>
#include <lib/callback/set_when_called.h>
#include <lib/fit/function.h>
#include "gtest/gtest.h"
namespace cache {
namespace {
TEST(LRUCacheTest, SimpleGet) {
auto generator = [](size_t i, fit::function<void(size_t, size_t)> callback) {
callback(0, 2 * i);
};
LRUCache<size_t, size_t, size_t> cache(200, 0, generator);
bool called;
size_t status;
size_t value;
cache.Get(
0, callback::Capture(callback::SetWhenCalled(&called), &status, &value));
ASSERT_TRUE(called);
EXPECT_EQ(0u, status);
EXPECT_EQ(0u, value);
cache.Get(
42, callback::Capture(callback::SetWhenCalled(&called), &status, &value));
ASSERT_TRUE(called);
EXPECT_EQ(0u, status);
EXPECT_EQ(84u, value);
}
TEST(LRUCacheTest, FailingGenerator) {
size_t nb_called = 0;
auto generator = [&nb_called](size_t i,
fit::function<void(size_t, size_t)> callback) {
++nb_called;
callback(1, 0);
};
LRUCache<size_t, size_t, size_t> cache(200, 0, generator);
bool called;
size_t status;
size_t value;
cache.Get(
0, callback::Capture(callback::SetWhenCalled(&called), &status, &value));
ASSERT_TRUE(called);
EXPECT_EQ(1u, status);
EXPECT_EQ(1u, nb_called);
cache.Get(
0, callback::Capture(callback::SetWhenCalled(&called), &status, &value));
ASSERT_TRUE(called);
EXPECT_EQ(1u, status);
EXPECT_EQ(2u, nb_called);
}
TEST(LRUCacheTest, CacheCallback) {
size_t nb_called = 0;
fit::function<void(size_t, size_t)> generator_callback;
auto generator = [&nb_called, &generator_callback](
size_t i, fit::function<void(size_t, size_t)> callback) {
++nb_called;
generator_callback = std::move(callback);
};
LRUCache<size_t, size_t, size_t> cache(200, 0, generator);
bool called1, called2;
size_t status1, status2;
size_t value1, value2;
cache.Get(0, callback::Capture(callback::SetWhenCalled(&called1), &status1,
&value1));
EXPECT_FALSE(called1);
EXPECT_EQ(1u, nb_called);
cache.Get(0, callback::Capture(callback::SetWhenCalled(&called2), &status2,
&value2));
EXPECT_FALSE(called2);
EXPECT_EQ(1u, nb_called);
generator_callback(0, 42);
ASSERT_TRUE(called1);
ASSERT_TRUE(called2);
EXPECT_EQ(1u, nb_called);
EXPECT_EQ(0u, status1);
EXPECT_EQ(42u, value1);
EXPECT_EQ(0u, status2);
EXPECT_EQ(42u, value2);
}
TEST(LRUCacheTest, LRUPolicy) {
size_t nb_called = 0;
fit::function<void(size_t, size_t)> generator_callback;
auto generator = [&nb_called](size_t i,
fit::function<void(size_t, size_t)> callback) {
++nb_called;
callback(0u, 0u);
};
LRUCache<size_t, size_t, size_t> cache(3, 0, generator);
size_t status;
size_t value;
cache.Get(0, callback::Capture([] {}, &status, &value));
EXPECT_EQ(1u, nb_called);
cache.Get(0, callback::Capture([] {}, &status, &value));
EXPECT_EQ(1u, nb_called);
cache.Get(1, callback::Capture([] {}, &status, &value));
EXPECT_EQ(2u, nb_called);
cache.Get(2, callback::Capture([] {}, &status, &value));
EXPECT_EQ(3u, nb_called);
cache.Get(0, callback::Capture([] {}, &status, &value));
EXPECT_EQ(3u, nb_called);
cache.Get(1, callback::Capture([] {}, &status, &value));
EXPECT_EQ(3u, nb_called);
cache.Get(2, callback::Capture([] {}, &status, &value));
EXPECT_EQ(3u, nb_called);
cache.Get(3, callback::Capture([] {}, &status, &value));
EXPECT_EQ(4u, nb_called);
cache.Get(1, callback::Capture([] {}, &status, &value));
EXPECT_EQ(4u, nb_called);
cache.Get(2, callback::Capture([] {}, &status, &value));
EXPECT_EQ(4u, nb_called);
cache.Get(3, callback::Capture([] {}, &status, &value));
EXPECT_EQ(4u, nb_called);
cache.Get(0, callback::Capture([] {}, &status, &value));
EXPECT_EQ(5u, nb_called);
}
} // namespace
} // namespace cache