// Copyright (c) 2012 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/static_ip_parameters.h"

#include <chromeos/dbus/service_constants.h>
#include <gtest/gtest.h>

#include "shill/ipconfig.h"
#include "shill/mock_store.h"
#include "shill/property_store.h"

using std::string;
using std::vector;
using testing::_;
using testing::DoAll;
using testing::Return;
using testing::SetArgumentPointee;
using testing::StrictMock;
using testing::Test;

namespace shill {

namespace {
static const char kAddress[] = "10.0.0.1";
static const char kGateway[] = "10.0.0.254";
static const int32 kMtu = 512;
static const char kNameServer0[] = "10.0.1.253";
static const char kNameServer1[] = "10.0.1.252";
static const char kNameServers[] = "10.0.1.253,10.0.1.252";
static const char kPeerAddress[] = "10.0.0.2";
static const int32 kPrefixLen = 24;
} // namespace {}

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

  void ExpectEmpty() {
    EXPECT_TRUE(props_.address.empty());
    EXPECT_TRUE(props_.gateway.empty());
    EXPECT_FALSE(props_.mtu);
    EXPECT_TRUE(props_.dns_servers.empty());
    EXPECT_TRUE(props_.peer_address.empty());
    EXPECT_FALSE(props_.subnet_prefix);
  }
  void ExpectPopulated() {
    EXPECT_EQ(kAddress, props_.address);
    EXPECT_EQ(kGateway, props_.gateway);
    EXPECT_EQ(kMtu, props_.mtu);
    EXPECT_EQ(2, props_.dns_servers.size());
    EXPECT_EQ(kNameServer0, props_.dns_servers[0]);
    EXPECT_EQ(kNameServer1, props_.dns_servers[1]);
    EXPECT_EQ(kPeerAddress, props_.peer_address);
    EXPECT_EQ(kPrefixLen, props_.subnet_prefix);
  }
  void Populate() {
    props_.address = kAddress;
    props_.gateway = kGateway;
    props_.mtu = kMtu;
    props_.dns_servers.push_back(kNameServer0);
    props_.dns_servers.push_back(kNameServer1);
    props_.peer_address = kPeerAddress;
    props_.subnet_prefix = kPrefixLen;
  }
 protected:
  StaticIPParameters static_params_;
  IPConfig::Properties props_;
};

TEST_F(StaticIpParametersTest, InitState) {
  EXPECT_TRUE(props_.address.empty());
  EXPECT_TRUE(props_.gateway.empty());
  EXPECT_FALSE(props_.mtu);
  EXPECT_TRUE(props_.dns_servers.empty());
  EXPECT_TRUE(props_.peer_address.empty());
  EXPECT_FALSE(props_.subnet_prefix);

  // Applying an empty set of parameters on an empty set of properties should
  // be a no-op.
  static_params_.ApplyTo(&props_);
  ExpectEmpty();
}

TEST_F(StaticIpParametersTest, ApplyEmptyParameters) {
  Populate();
  static_params_.ApplyTo(&props_);
  ExpectPopulated();
}

TEST_F(StaticIpParametersTest, ControlInterface) {
  PropertyStore store;
  static_params_.PlumbPropertyStore(&store);
  Error error;
  store.SetStringProperty("StaticIP.Address", kAddress, &error);
  store.SetStringProperty("StaticIP.Gateway", kGateway, &error);
  store.SetInt32Property("StaticIP.Mtu", kMtu, &error);
  store.SetStringProperty("StaticIP.NameServers", kNameServers, &error);
  store.SetStringProperty("StaticIP.PeerAddress", kPeerAddress, &error);
  store.SetInt32Property("StaticIP.Prefixlen", kPrefixLen, &error);
  static_params_.ApplyTo(&props_);
  ExpectPopulated();

  EXPECT_TRUE(static_params_.ContainsAddress());
  store.ClearProperty("StaticIP.Address", &error);
  EXPECT_FALSE(static_params_.ContainsAddress());
  store.ClearProperty("StaticIP.Mtu", &error);
  IPConfig::Properties props;
  const string kTestAddress("test_address");
  props.address = kTestAddress;
  const int32 kTestMtu = 256;
  props.mtu = kTestMtu;
  static_params_.ApplyTo(&props);
  EXPECT_EQ(kTestAddress, props.address);
  EXPECT_EQ(kTestMtu, props.mtu);

  {
    Error error;
    EXPECT_FALSE(store.GetStringProperty("StaticIP.Address", NULL, &error));
    EXPECT_EQ(Error::kNotFound, error.type());
  }
  string string_value;
  Error unused_error;
  EXPECT_TRUE(store.GetStringProperty("StaticIP.Gateway", &string_value,
                                      &unused_error));
  EXPECT_EQ(kGateway, string_value);
  {
    Error error;
    EXPECT_FALSE(store.GetInt32Property("StaticIP.Mtu", NULL, &error));
    EXPECT_EQ(Error::kNotFound, error.type());
  }
  EXPECT_TRUE(store.GetStringProperty("StaticIP.NameServers", &string_value,
                                      &unused_error));
  EXPECT_EQ(kNameServers, string_value);
  EXPECT_TRUE(store.GetStringProperty("StaticIP.PeerAddress", &string_value,
                                      &unused_error));
  EXPECT_EQ(kPeerAddress, string_value);
  int32 int_value;
  EXPECT_TRUE(store.GetInt32Property("StaticIP.Prefixlen", &int_value,
                                     &unused_error));
  EXPECT_EQ(kPrefixLen, int_value);
}

TEST_F(StaticIpParametersTest, Profile) {
  StrictMock<MockStore> store;
  const string kID = "storage_id";
  EXPECT_CALL(store, GetString(kID, "StaticIP.Address", _))
      .WillOnce(DoAll(SetArgumentPointee<2>(string(kAddress)), Return(true)));
  EXPECT_CALL(store, GetString(kID, "StaticIP.Gateway", _))
      .WillOnce(DoAll(SetArgumentPointee<2>(string(kGateway)), Return(true)));
  EXPECT_CALL(store, GetInt(kID, "StaticIP.Mtu", _))
      .WillOnce(DoAll(SetArgumentPointee<2>(kMtu), Return(true)));
  EXPECT_CALL(store, GetString(kID, "StaticIP.NameServers", _))
      .WillOnce(DoAll(SetArgumentPointee<2>(string(kNameServers)),
                      Return(true)));
  EXPECT_CALL(store, GetString(kID, "StaticIP.PeerAddress", _))
      .WillOnce(DoAll(SetArgumentPointee<2>(string(kPeerAddress)),
                      Return(true)));
  EXPECT_CALL(store, GetInt(kID, "StaticIP.Prefixlen", _))
      .WillOnce(DoAll(SetArgumentPointee<2>(kPrefixLen), Return(true)));
  static_params_.Load(&store, kID);
  static_params_.ApplyTo(&props_);
  ExpectPopulated();

  EXPECT_CALL(store, SetString(kID, "StaticIP.Address", kAddress))
      .WillOnce(Return(true));
  EXPECT_CALL(store, SetString(kID, "StaticIP.Gateway", kGateway))
      .WillOnce(Return(true));
  EXPECT_CALL(store, SetInt(kID, "StaticIP.Mtu", kMtu))
      .WillOnce(Return(true));
  EXPECT_CALL(store, SetString(kID, "StaticIP.NameServers", kNameServers))
      .WillOnce(Return(true));
  EXPECT_CALL(store, SetString(kID, "StaticIP.PeerAddress", kPeerAddress))
      .WillOnce(Return(true));
  EXPECT_CALL(store, SetInt(kID, "StaticIP.Prefixlen", kPrefixLen))
      .WillOnce(Return(true));
  static_params_.Save(&store, kID);
}

TEST_F(StaticIpParametersTest, SavedParameters) {
  const int32 kOffset = 1234;
  const string kPrefix("xxx");
  PropertyStore store;
  static_params_.PlumbPropertyStore(&store);
  Error error;
  store.SetStringProperty("StaticIP.Address", kPrefix + kAddress, &error);
  store.SetStringProperty("StaticIP.Gateway", kPrefix + kGateway, &error);
  store.SetInt32Property("StaticIP.Mtu", kOffset + kMtu, &error);
  store.SetStringProperty(
      "StaticIP.NameServers", kPrefix + kNameServers, &error);
  store.SetStringProperty(
      "StaticIP.PeerAddress", kPrefix + kPeerAddress, &error);
  store.SetInt32Property("StaticIP.Prefixlen", kOffset + kPrefixLen, &error);
  Populate();
  static_params_.ApplyTo(&props_);

  string string_value;
  Error unused_error;
  EXPECT_TRUE(store.GetStringProperty("SavedIP.Address", &string_value,
                                      &unused_error));
  EXPECT_EQ(kAddress, string_value);
  EXPECT_TRUE(store.GetStringProperty("SavedIP.Gateway", &string_value,
                                      &unused_error));
  EXPECT_EQ(kGateway, string_value);
  int32 int_value;
  EXPECT_TRUE(store.GetInt32Property("SavedIP.Mtu", &int_value,
                                     &unused_error));
  EXPECT_EQ(kMtu, int_value);
  EXPECT_TRUE(store.GetStringProperty("SavedIP.NameServers", &string_value,
                                      &unused_error));
  EXPECT_EQ(kNameServers, string_value);
  EXPECT_TRUE(store.GetStringProperty("SavedIP.PeerAddress", &string_value,
                                      &unused_error));
  EXPECT_EQ(kPeerAddress, string_value);
  EXPECT_TRUE(store.GetInt32Property("SavedIP.Prefixlen", &int_value,
                                     &unused_error));
  EXPECT_EQ(kPrefixLen, int_value);

  store.ClearProperty("StaticIP.Address", &error);
  store.ClearProperty("StaticIP.Gateway", &error);
  store.ClearProperty("StaticIP.Mtu", &error);
  store.ClearProperty( "StaticIP.NameServers", &error);
  store.ClearProperty( "StaticIP.PeerAddress", &error);
  store.ClearProperty("StaticIP.Prefixlen", &error);

  static_params_.ApplyTo(&props_);
  EXPECT_TRUE(store.GetStringProperty("SavedIP.Address", &string_value,
                                      &unused_error));
  EXPECT_EQ(kPrefix + kAddress, string_value);
  EXPECT_TRUE(store.GetStringProperty("SavedIP.Gateway", &string_value,
                                      &unused_error));
  EXPECT_EQ(kPrefix + kGateway, string_value);
  EXPECT_TRUE(store.GetInt32Property("SavedIP.Mtu", &int_value,
                                     &unused_error));
  EXPECT_EQ(kOffset + kMtu, int_value);
  EXPECT_TRUE(store.GetStringProperty("SavedIP.NameServers", &string_value,
                                      &unused_error));
  EXPECT_EQ(kPrefix + kNameServers, string_value);
  EXPECT_TRUE(store.GetStringProperty("SavedIP.PeerAddress", &string_value,
                                      &unused_error));
  EXPECT_EQ(kPrefix + kPeerAddress, string_value);
  EXPECT_TRUE(store.GetInt32Property("SavedIP.Prefixlen", &int_value,
                                     &unused_error));
  EXPECT_EQ(kOffset + kPrefixLen, int_value);
}

}  // namespace shill
