// Copyright (c) 2013 The Chromium OS 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 "shill/ip_address_store.h"

#include <string>

#include <gtest/gtest.h>

using ::std::string;
using ::std::vector;
using ::testing::Test;

namespace shill {

namespace {
const char kInterfaceName[] = "int0";
const char kIPAddress_0_0_0_0[] = "0.0.0.0";
const char kIPAddress_8_8_8_8[] = "8.8.8.8";
const char kIPAddress_7_7_7_7[] = "7.7.7.7";
}  // namespace {}

class IPAddressStoreTest : public Test {
 public:
  IPAddressStoreTest() {}

 protected:
  IPAddress StringToIPv4Address(const string &address_string) {
    IPAddress ip_address(IPAddress::kFamilyIPv4);
    EXPECT_TRUE(ip_address.SetAddressFromString(address_string));
    return ip_address;
  }

  void PopulateIPAddressStore() {
    ip_address_store_.AddUnique(StringToIPv4Address(kIPAddress_0_0_0_0));
    ip_address_store_.AddUnique(StringToIPv4Address(kIPAddress_8_8_8_8));
    ip_address_store_.AddUnique(StringToIPv4Address(kIPAddress_7_7_7_7));
  }

  bool Contains(const IPAddress& ip) {
    return ip_address_store_.ip_addresses_.find(ip) !=
        ip_address_store_.ip_addresses_.end();
  }

  IPAddressStore ip_address_store_;
};

TEST_F(IPAddressStoreTest, AddUnique) {
  IPAddress ip_0_0_0_0 = StringToIPv4Address(kIPAddress_0_0_0_0);
  IPAddress ip_8_8_8_8 = StringToIPv4Address(kIPAddress_8_8_8_8);
  IPAddress ip_7_7_7_7 = StringToIPv4Address(kIPAddress_7_7_7_7);

  EXPECT_EQ(0, ip_address_store_.Count());
  ip_address_store_.AddUnique(ip_0_0_0_0);
  EXPECT_TRUE(Contains(ip_0_0_0_0));
  EXPECT_EQ(1, ip_address_store_.Count());
  ip_address_store_.AddUnique(ip_8_8_8_8);
  EXPECT_TRUE(Contains(ip_8_8_8_8));
  EXPECT_EQ(2, ip_address_store_.Count());
  ip_address_store_.AddUnique(ip_8_8_8_8);
  EXPECT_TRUE(Contains(ip_0_0_0_0));
  EXPECT_TRUE(Contains(ip_8_8_8_8));
  EXPECT_EQ(2, ip_address_store_.Count());
  ip_address_store_.AddUnique(ip_0_0_0_0);
  EXPECT_EQ(2, ip_address_store_.Count());
  ip_address_store_.AddUnique(ip_7_7_7_7);
  EXPECT_TRUE(Contains(ip_7_7_7_7));
  EXPECT_EQ(3, ip_address_store_.Count());
}

}  // namespace shill
