// 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
