// Copyright 2018 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/technology.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "shill/error.h"

using testing::ElementsAre;

namespace shill {

TEST(TechnologyTest, CreateFromName) {
  EXPECT_EQ(Technology::kEthernet, Technology::CreateFromName("ethernet"));
  EXPECT_EQ(Technology::kEthernetEap,
            Technology::CreateFromName("etherneteap"));
  EXPECT_EQ(Technology::kWifi, Technology::CreateFromName("wifi"));
  EXPECT_EQ(Technology::kCellular, Technology::CreateFromName("cellular"));
  EXPECT_EQ(Technology::kTunnel, Technology::CreateFromName("tunnel"));
  EXPECT_EQ(Technology::kLoopback, Technology::CreateFromName("loopback"));
  EXPECT_EQ(Technology::kVPN, Technology::CreateFromName("vpn"));
  EXPECT_EQ(Technology::kPPP, Technology::CreateFromName("ppp"));
  EXPECT_EQ(Technology::kGuestInterface,
            Technology::CreateFromName("guest_interface"));
  EXPECT_EQ(Technology::kUnknown, Technology::CreateFromName("bluetooth"));
  EXPECT_EQ(Technology::kUnknown, Technology::CreateFromName("foo"));
  EXPECT_EQ(Technology::kUnknown, Technology::CreateFromName(""));
}

TEST(TechnologyTest, GetName) {
  EXPECT_EQ("ethernet", Technology(Technology::kEthernet).GetName());
  EXPECT_EQ("etherneteap", Technology(Technology::kEthernetEap).GetName());
  EXPECT_EQ("wifi", Technology(Technology::kWifi).GetName());
  EXPECT_EQ("cellular", Technology(Technology::kCellular).GetName());
  EXPECT_EQ("tunnel", Technology(Technology::kTunnel).GetName());
  EXPECT_EQ("loopback", Technology(Technology::kLoopback).GetName());
  EXPECT_EQ("vpn", Technology(Technology::kVPN).GetName());
  EXPECT_EQ("ppp", Technology(Technology::kPPP).GetName());
  EXPECT_EQ("pppoe", Technology(Technology::kPPPoE).GetName());
  EXPECT_EQ("guest_interface",
            Technology(Technology::kGuestInterface).GetName());
  EXPECT_EQ("unknown", Technology(Technology::kUnknown).GetName());
}

TEST(TechnologyTest, CreateFromStorageGroup) {
  EXPECT_EQ(Technology::kVPN, Technology::CreateFromStorageGroup("vpn"));
  EXPECT_EQ(Technology::kVPN, Technology::CreateFromStorageGroup("vpn_a"));
  EXPECT_EQ(Technology::kVPN, Technology::CreateFromStorageGroup("vpn__a"));
  EXPECT_EQ(Technology::kVPN, Technology::CreateFromStorageGroup("vpn_a_1"));
  EXPECT_EQ(Technology::kUnknown, Technology::CreateFromStorageGroup("_vpn"));
  EXPECT_EQ(Technology::kUnknown, Technology::CreateFromStorageGroup("_"));
  EXPECT_EQ(Technology::kUnknown, Technology::CreateFromStorageGroup(""));
}

TEST(TechnologyTest, GetTechnologyVectorFromStringWithValidTechnologyNames) {
  std::vector<Technology> technologies;
  Error error;

  EXPECT_TRUE(GetTechnologyVectorFromString("", &technologies, &error));
  EXPECT_THAT(technologies, ElementsAre());
  EXPECT_TRUE(error.IsSuccess());

  EXPECT_TRUE(GetTechnologyVectorFromString("ethernet", &technologies, &error));
  EXPECT_THAT(technologies, ElementsAre(Technology::kEthernet));
  EXPECT_TRUE(error.IsSuccess());

  EXPECT_TRUE(
      GetTechnologyVectorFromString("ethernet,vpn", &technologies, &error));
  EXPECT_THAT(technologies,
              ElementsAre(Technology::kEthernet, Technology::kVPN));
  EXPECT_TRUE(error.IsSuccess());

  EXPECT_TRUE(GetTechnologyVectorFromString("wifi,ethernet,vpn", &technologies,
                                            &error));
  EXPECT_THAT(
      technologies,
      ElementsAre(Technology::kWifi, Technology::kEthernet, Technology::kVPN));
  EXPECT_TRUE(error.IsSuccess());
}

TEST(TechnologyTest, GetTechnologyVectorFromStringWithInvalidTechnologyNames) {
  std::vector<Technology> technologies;
  Error error;

  EXPECT_FALSE(GetTechnologyVectorFromString("foo", &technologies, &error));
  EXPECT_EQ(Error::kInvalidArguments, error.type());
  EXPECT_EQ("foo is an unknown technology name", error.message());

  EXPECT_FALSE(
      GetTechnologyVectorFromString("ethernet,bar", &technologies, &error));
  EXPECT_EQ(Error::kInvalidArguments, error.type());
  EXPECT_EQ("bar is an unknown technology name", error.message());

  EXPECT_FALSE(
      GetTechnologyVectorFromString("ethernet,foo,vpn", &technologies, &error));
  EXPECT_EQ(Error::kInvalidArguments, error.type());
  EXPECT_EQ("foo is an unknown technology name", error.message());
}

TEST(TechnologyTest,
     GetTechnologyVectorFromStringWithDuplicateTechnologyNames) {
  std::vector<Technology> technologies;
  Error error;

  EXPECT_FALSE(GetTechnologyVectorFromString("ethernet,vpn,ethernet",
                                             &technologies, &error));
  EXPECT_EQ(Error::kInvalidArguments, error.type());
  EXPECT_EQ("ethernet is duplicated in the list", error.message());
}

}  // namespace shill
