| // 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 "src/ledger/bin/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 |