// Copyright 2017 The Chromium 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 "chromeos/components/tether/host_scan_cache.h"

#include <memory>
#include <unordered_map>

#include "chromeos/components/tether/fake_host_scan_cache.h"
#include "chromeos/components/tether/host_scan_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace chromeos {

namespace tether {

namespace {

class TestObserver final : public HostScanCache::Observer {
 public:
  TestObserver() : empty_cache_count_(0) {}

  uint32_t empty_cache_count() const { return empty_cache_count_; }

  // HostScanCache::Observer:
  void OnCacheBecameEmpty() override { empty_cache_count_++; }

 private:
  uint32_t empty_cache_count_;

  DISALLOW_COPY_AND_ASSIGN(TestObserver);
};

}  // namespace

class HostScanCacheTest : public testing::Test {
 protected:
  HostScanCacheTest()
      : test_entries_(host_scan_test_util::CreateTestEntries()) {}

  void SetUp() override {
    host_scan_cache_ = std::make_unique<FakeHostScanCache>();
    observer_ = std::make_unique<TestObserver>();

    host_scan_cache_->AddObserver(observer_.get());
  }

  void TearDown() override {
    host_scan_cache_->RemoveObserver(observer_.get());
  }

  const std::unordered_map<std::string, HostScanCacheEntry> test_entries_;

  std::unique_ptr<FakeHostScanCache> host_scan_cache_;
  std::unique_ptr<TestObserver> observer_;

 private:
  DISALLOW_COPY_AND_ASSIGN(HostScanCacheTest);
};

TEST_F(HostScanCacheTest, TestSetAndRemove) {
  // Set and remove a single entry
  host_scan_cache_->SetHostScanResult(
      test_entries_.at(host_scan_test_util::kTetherGuid0));
  EXPECT_FALSE(host_scan_cache_->empty());
  EXPECT_EQ(0u, observer_->empty_cache_count());

  host_scan_cache_->RemoveHostScanResult(host_scan_test_util::kTetherGuid0);
  EXPECT_TRUE(host_scan_cache_->empty());
  EXPECT_EQ(1u, observer_->empty_cache_count());

  // Set and remove multiple entries
  host_scan_cache_->SetHostScanResult(
      test_entries_.at(host_scan_test_util::kTetherGuid0));
  EXPECT_FALSE(host_scan_cache_->empty());

  host_scan_cache_->SetHostScanResult(
      test_entries_.at(host_scan_test_util::kTetherGuid1));
  EXPECT_FALSE(host_scan_cache_->empty());

  host_scan_cache_->RemoveHostScanResult(host_scan_test_util::kTetherGuid0);
  EXPECT_FALSE(host_scan_cache_->empty());
  EXPECT_EQ(1u, observer_->empty_cache_count());

  host_scan_cache_->RemoveHostScanResult(host_scan_test_util::kTetherGuid1);
  EXPECT_TRUE(host_scan_cache_->empty());
  EXPECT_EQ(2u, observer_->empty_cache_count());
}

}  // namespace tether

}  // namespace chromeos
