// 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/socket_info_reader.h"

#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <base/strings/stringprintf.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

using base::FilePath;
using base::ScopedTempDir;
using std::string;
using std::vector;
using testing::Return;

namespace shill {

namespace {

const char kIPv4AddressAllZeros[] = "0.0.0.0";
const char kIPv4AddressAllOnes[] = "255.255.255.255";
const char kIPv4Address_127_0_0_1[] = "127.0.0.1";
const char kIPv4Address_192_168_1_10[] = "192.168.1.10";
const char kIPv6AddressAllZeros[] = "0000:0000:0000:0000:0000:0000:0000:0000";
const char kIPv6AddressAllOnes[] = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff";
const char kIPv6AddressPattern1[] = "0123:4567:89ab:cdef:ffee:ddcc:bbaa:9988";

const char* const kIPv4SocketInfoLines[] = {
    "  sl  local_address rem_address   st tx_queue rx_queue tr tm->when "
    "retrnsmt   uid  timeout inode                                      ",
    "   0: 0100007F:0019 00000000:0000 0A 0000000A:00000005 00:00000000 "
    "00000000     0        0 36948 1 0000000000000000 100 0 0 10 -1     ",
    "   1: 0A01A8C0:0050 0100007F:03FC 01 00000000:00000000 00:00000000 "
    "00000000 65534        0 2787034 1 0000000000000000 100 0 0 10 -1   ",
};
const char* const kIPv6SocketInfoLines[] = {
    "  sl  local_address                         "
    "remote_address                        st tx_queue rx_queue tr tm->when "
    "retrnsmt   uid  timeout inode",
    "   0: 67452301EFCDAB89CCDDEEFF8899AABB:0019 "
    "00000000000000000000000000000000:0000 0A 0000000A:00000005 00:00000000 "
    "00000000     0        0 36412 1 0000000000000000 100 0 0 2 -1",
    "   1: 00000000000000000000000000000000:0050 "
    "67452301EFCDAB89CCDDEEFF8899AABB:03FC 01 00000000:00000000 00:00000000 "
    "00000000     0        0 36412 1 0000000000000000 100 0 0 2 -1",
};

}  // namespace

class SocketInfoReaderUnderTest : public SocketInfoReader {
 public:
  // Mock out GetTcpv4SocketInfoFilePath and GetTcpv6SocketInfoFilePath to
  // use a temporary created socket info file instead of the actual path
  // in procfs (i.e. /proc/net/tcp and /proc/net/tcp6).
  MOCK_CONST_METHOD0(GetTcpv4SocketInfoFilePath, FilePath());
  MOCK_CONST_METHOD0(GetTcpv6SocketInfoFilePath, FilePath());
};

class SocketInfoReaderTest : public testing::Test {
 protected:
  IPAddress StringToIPv4Address(const string& address_string) {
    IPAddress ip_address(IPAddress::kFamilyIPv4);
    EXPECT_TRUE(ip_address.SetAddressFromString(address_string));
    return ip_address;
  }

  IPAddress StringToIPv6Address(const string& address_string) {
    IPAddress ip_address(IPAddress::kFamilyIPv6);
    EXPECT_TRUE(ip_address.SetAddressFromString(address_string));
    return ip_address;
  }

  void CreateSocketInfoFile(const char* const* lines, size_t num_lines,
                            const FilePath& dir_path, FilePath* file_path) {
    ASSERT_TRUE(base::CreateTemporaryFileInDir(dir_path, file_path));
    for (size_t i = 0; i < num_lines; ++i) {
      string line = lines[i];
      line += '\n';
      ASSERT_TRUE(base::AppendToFile(*file_path, line.data(), line.size()));
    }
  }

  void ExpectSocketInfoEqual(const SocketInfo& info1, const SocketInfo& info2) {
    EXPECT_EQ(info1.connection_state, info2.connection_state);
    EXPECT_TRUE(info1.local_ip_address.Equals(info2.local_ip_address));
    EXPECT_EQ(info1.local_port, info2.local_port);
    EXPECT_TRUE(info1.remote_ip_address.Equals(info2.remote_ip_address));
    EXPECT_EQ(info1.remote_port, info2.remote_port);
    EXPECT_EQ(info1.transmit_queue_value, info2.transmit_queue_value);
    EXPECT_EQ(info1.receive_queue_value, info2.receive_queue_value);
    EXPECT_EQ(info1.timer_state, info2.timer_state);
  }

  SocketInfoReaderUnderTest reader_;
};

TEST_F(SocketInfoReaderTest, LoadTcpSocketInfo) {
  FilePath invalid_path("/non-existent-file"), v4_path, v6_path;
  ScopedTempDir temp_dir;
  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
  CreateSocketInfoFile(kIPv4SocketInfoLines, 2, temp_dir.GetPath(), &v4_path);
  CreateSocketInfoFile(kIPv6SocketInfoLines, 2, temp_dir.GetPath(), &v6_path);

  SocketInfo v4_info(SocketInfo::kConnectionStateListen,
                     StringToIPv4Address(kIPv4Address_127_0_0_1),
                     25,
                     StringToIPv4Address(kIPv4AddressAllZeros),
                     0,
                     10,
                     5,
                     SocketInfo::kTimerStateNoTimerPending);
  SocketInfo v6_info(SocketInfo::kConnectionStateListen,
                     StringToIPv6Address(kIPv6AddressPattern1),
                     25,
                     StringToIPv6Address(kIPv6AddressAllZeros),
                     0,
                     10,
                     5,
                     SocketInfo::kTimerStateNoTimerPending);

  vector<SocketInfo> info_list;
  EXPECT_CALL(reader_, GetTcpv4SocketInfoFilePath())
      .WillOnce(Return(invalid_path));
  EXPECT_CALL(reader_, GetTcpv6SocketInfoFilePath())
      .WillOnce(Return(invalid_path));
  EXPECT_FALSE(reader_.LoadTcpSocketInfo(&info_list));

  EXPECT_CALL(reader_, GetTcpv4SocketInfoFilePath())
      .WillOnce(Return(v4_path));
  EXPECT_CALL(reader_, GetTcpv6SocketInfoFilePath())
      .WillOnce(Return(invalid_path));
  EXPECT_TRUE(reader_.LoadTcpSocketInfo(&info_list));
  EXPECT_EQ(1, info_list.size());
  ExpectSocketInfoEqual(v4_info, info_list[0]);

  EXPECT_CALL(reader_, GetTcpv4SocketInfoFilePath())
      .WillOnce(Return(invalid_path));
  EXPECT_CALL(reader_, GetTcpv6SocketInfoFilePath())
      .WillOnce(Return(v6_path));
  EXPECT_TRUE(reader_.LoadTcpSocketInfo(&info_list));
  EXPECT_EQ(1, info_list.size());
  ExpectSocketInfoEqual(v6_info, info_list[0]);

  EXPECT_CALL(reader_, GetTcpv4SocketInfoFilePath())
      .WillOnce(Return(v4_path));
  EXPECT_CALL(reader_, GetTcpv6SocketInfoFilePath())
      .WillOnce(Return(v6_path));
  EXPECT_TRUE(reader_.LoadTcpSocketInfo(&info_list));
  EXPECT_EQ(2, info_list.size());
  ExpectSocketInfoEqual(v4_info, info_list[0]);
  ExpectSocketInfoEqual(v6_info, info_list[1]);
}

TEST_F(SocketInfoReaderTest, AppendSocketInfo) {
  FilePath file_path("/non-existent-file");
  vector<SocketInfo> info_list;

  EXPECT_FALSE(reader_.AppendSocketInfo(file_path, &info_list));
  EXPECT_TRUE(info_list.empty());

  ScopedTempDir temp_dir;
  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());

  CreateSocketInfoFile(kIPv4SocketInfoLines, 1, temp_dir.GetPath(), &file_path);
  EXPECT_TRUE(reader_.AppendSocketInfo(file_path, &info_list));
  EXPECT_TRUE(info_list.empty());

  SocketInfo v4_info1(SocketInfo::kConnectionStateListen,
                      StringToIPv4Address(kIPv4Address_127_0_0_1),
                      25,
                      StringToIPv4Address(kIPv4AddressAllZeros),
                      0,
                      10,
                      5,
                      SocketInfo::kTimerStateNoTimerPending);
  SocketInfo v4_info2(SocketInfo::kConnectionStateEstablished,
                      StringToIPv4Address(kIPv4Address_192_168_1_10),
                      80,
                      StringToIPv4Address(kIPv4Address_127_0_0_1),
                      1020,
                      0,
                      0,
                      SocketInfo::kTimerStateNoTimerPending);
  SocketInfo v6_info1(SocketInfo::kConnectionStateListen,
                      StringToIPv6Address(kIPv6AddressPattern1),
                      25,
                      StringToIPv6Address(kIPv6AddressAllZeros),
                      0,
                      10,
                      5,
                      SocketInfo::kTimerStateNoTimerPending);
  SocketInfo v6_info2(SocketInfo::kConnectionStateEstablished,
                      StringToIPv6Address(kIPv6AddressAllZeros),
                      80,
                      StringToIPv6Address(kIPv6AddressPattern1),
                      1020,
                      0,
                      0,
                      SocketInfo::kTimerStateNoTimerPending);

  CreateSocketInfoFile(kIPv4SocketInfoLines,
                       arraysize(kIPv4SocketInfoLines),
                       temp_dir.GetPath(),
                       &file_path);
  EXPECT_TRUE(reader_.AppendSocketInfo(file_path, &info_list));
  EXPECT_EQ(arraysize(kIPv4SocketInfoLines) - 1, info_list.size());
  ExpectSocketInfoEqual(v4_info1, info_list[0]);
  ExpectSocketInfoEqual(v4_info2, info_list[1]);

  CreateSocketInfoFile(kIPv6SocketInfoLines,
                       arraysize(kIPv6SocketInfoLines),
                       temp_dir.GetPath(),
                       &file_path);
  EXPECT_TRUE(reader_.AppendSocketInfo(file_path, &info_list));
  EXPECT_EQ(
      arraysize(kIPv4SocketInfoLines) + arraysize(kIPv6SocketInfoLines) - 2,
      info_list.size());
  ExpectSocketInfoEqual(v4_info1, info_list[0]);
  ExpectSocketInfoEqual(v4_info2, info_list[1]);
  ExpectSocketInfoEqual(v6_info1, info_list[2]);
  ExpectSocketInfoEqual(v6_info2, info_list[3]);
}

TEST_F(SocketInfoReaderTest, ParseSocketInfo) {
  SocketInfo info;

  EXPECT_FALSE(reader_.ParseSocketInfo("", &info));
  EXPECT_FALSE(reader_.ParseSocketInfo(kIPv4SocketInfoLines[0], &info));

  EXPECT_TRUE(reader_.ParseSocketInfo(kIPv4SocketInfoLines[1], &info));
  ExpectSocketInfoEqual(SocketInfo(SocketInfo::kConnectionStateListen,
                                   StringToIPv4Address(kIPv4Address_127_0_0_1),
                                   25,
                                   StringToIPv4Address(kIPv4AddressAllZeros),
                                   0,
                                   10,
                                   5,
                                   SocketInfo::kTimerStateNoTimerPending),
                        info);
}

TEST_F(SocketInfoReaderTest, ParseIPAddressAndPort) {
  IPAddress ip_address(IPAddress::kFamilyUnknown);
  uint16_t port = 0;

  EXPECT_FALSE(reader_.ParseIPAddressAndPort("", &ip_address, &port));
  EXPECT_FALSE(reader_.ParseIPAddressAndPort("00000000", &ip_address, &port));
  EXPECT_FALSE(reader_.ParseIPAddressAndPort("00000000:", &ip_address, &port));
  EXPECT_FALSE(reader_.ParseIPAddressAndPort(":0000", &ip_address, &port));
  EXPECT_FALSE(reader_.ParseIPAddressAndPort(
      "0000000Y:0000", &ip_address, &port));
  EXPECT_FALSE(reader_.ParseIPAddressAndPort(
      "00000000:000Y", &ip_address, &port));

  EXPECT_FALSE(reader_.ParseIPAddressAndPort(
      "00000000000000000000000000000000", &ip_address, &port));
  EXPECT_FALSE(reader_.ParseIPAddressAndPort(
      "00000000000000000000000000000000:", &ip_address, &port));
  EXPECT_FALSE(reader_.ParseIPAddressAndPort(
      "00000000000000000000000000000000Y:0000", &ip_address, &port));
  EXPECT_FALSE(reader_.ParseIPAddressAndPort(
      "000000000000000000000000000000000:000Y", &ip_address, &port));

  EXPECT_TRUE(reader_.ParseIPAddressAndPort(
      "0a01A8c0:0050", &ip_address, &port));
  EXPECT_TRUE(ip_address.Equals(
      StringToIPv4Address(kIPv4Address_192_168_1_10)));
  EXPECT_EQ(80, port);

  EXPECT_TRUE(reader_.ParseIPAddressAndPort(
      "67452301efcdab89CCDDEEFF8899AABB:1F90", &ip_address, &port));
  EXPECT_TRUE(ip_address.Equals(StringToIPv6Address(kIPv6AddressPattern1)));
  EXPECT_EQ(8080, port);
}

TEST_F(SocketInfoReaderTest, ParseIPAddress) {
  IPAddress ip_address(IPAddress::kFamilyUnknown);

  EXPECT_FALSE(reader_.ParseIPAddress("", &ip_address));
  EXPECT_FALSE(reader_.ParseIPAddress("0", &ip_address));
  EXPECT_FALSE(reader_.ParseIPAddress("00", &ip_address));
  EXPECT_FALSE(reader_.ParseIPAddress("0000000Y", &ip_address));
  EXPECT_FALSE(reader_.ParseIPAddress("0000000000000000000000000000000Y",
                                      &ip_address));

  EXPECT_TRUE(reader_.ParseIPAddress("00000000", &ip_address));
  EXPECT_TRUE(ip_address.Equals(StringToIPv4Address(kIPv4AddressAllZeros)));

  EXPECT_TRUE(reader_.ParseIPAddress("0100007F", &ip_address));
  EXPECT_TRUE(ip_address.Equals(StringToIPv4Address(kIPv4Address_127_0_0_1)));

  EXPECT_TRUE(reader_.ParseIPAddress("0a01A8c0", &ip_address));
  EXPECT_TRUE(ip_address.Equals(
      StringToIPv4Address(kIPv4Address_192_168_1_10)));

  EXPECT_TRUE(reader_.ParseIPAddress("ffffffff", &ip_address));
  EXPECT_TRUE(ip_address.Equals(
      StringToIPv4Address(kIPv4AddressAllOnes)));

  EXPECT_TRUE(reader_.ParseIPAddress("00000000000000000000000000000000",
                                     &ip_address));
  EXPECT_TRUE(ip_address.Equals(StringToIPv6Address(kIPv6AddressAllZeros)));

  EXPECT_TRUE(reader_.ParseIPAddress("67452301efcdab89CCDDEEFF8899AABB",
                                     &ip_address));
  EXPECT_TRUE(ip_address.Equals(StringToIPv6Address(kIPv6AddressPattern1)));

  EXPECT_TRUE(reader_.ParseIPAddress("ffffffffffffffffffffffffffffffff",
                                     &ip_address));
  EXPECT_TRUE(ip_address.Equals(StringToIPv6Address(kIPv6AddressAllOnes)));
}

TEST_F(SocketInfoReaderTest, ParsePort) {
  uint16_t port = 0;

  EXPECT_FALSE(reader_.ParsePort("", &port));
  EXPECT_FALSE(reader_.ParsePort("0", &port));
  EXPECT_FALSE(reader_.ParsePort("00", &port));
  EXPECT_FALSE(reader_.ParsePort("000", &port));
  EXPECT_FALSE(reader_.ParsePort("000Y", &port));

  EXPECT_TRUE(reader_.ParsePort("0000", &port));
  EXPECT_EQ(0, port);

  EXPECT_TRUE(reader_.ParsePort("0050", &port));
  EXPECT_EQ(80, port);

  EXPECT_TRUE(reader_.ParsePort("abCD", &port));
  EXPECT_EQ(43981, port);

  EXPECT_TRUE(reader_.ParsePort("ffff", &port));
  EXPECT_EQ(65535, port);
}

TEST_F(SocketInfoReaderTest, ParseTransimitAndReceiveQueueValues) {
  uint64_t transmit_queue_value = 0, receive_queue_value = 0;

  EXPECT_FALSE(reader_.ParseTransimitAndReceiveQueueValues(
      "", &transmit_queue_value, &receive_queue_value));
  EXPECT_FALSE(reader_.ParseTransimitAndReceiveQueueValues(
      "00000000", &transmit_queue_value, &receive_queue_value));
  EXPECT_FALSE(reader_.ParseTransimitAndReceiveQueueValues(
      "00000000:", &transmit_queue_value, &receive_queue_value));
  EXPECT_FALSE(reader_.ParseTransimitAndReceiveQueueValues(
      ":00000000", &transmit_queue_value, &receive_queue_value));
  EXPECT_FALSE(reader_.ParseTransimitAndReceiveQueueValues(
      "0000000Y:00000000", &transmit_queue_value, &receive_queue_value));
  EXPECT_FALSE(reader_.ParseTransimitAndReceiveQueueValues(
      "00000000:0000000Y", &transmit_queue_value, &receive_queue_value));

  EXPECT_TRUE(reader_.ParseTransimitAndReceiveQueueValues(
      "00000001:FFFFFFFF", &transmit_queue_value, &receive_queue_value));
  EXPECT_EQ(1, transmit_queue_value);
  EXPECT_EQ(0xffffffff, receive_queue_value);
}

TEST_F(SocketInfoReaderTest, ParseConnectionState) {
  SocketInfo::ConnectionState connection_state =
      SocketInfo::kConnectionStateUnknown;

  EXPECT_FALSE(reader_.ParseConnectionState("", &connection_state));
  EXPECT_FALSE(reader_.ParseConnectionState("0", &connection_state));
  EXPECT_FALSE(reader_.ParseConnectionState("X", &connection_state));

  EXPECT_TRUE(reader_.ParseConnectionState("00", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateUnknown, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("01", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateEstablished, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("02", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateSynSent, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("03", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateSynRecv, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("04", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateFinWait1, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("05", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateFinWait2, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("06", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateTimeWait, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("07", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateClose, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("08", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateCloseWait, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("09", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateLastAck, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("0A", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateListen, connection_state);
  EXPECT_TRUE(reader_.ParseConnectionState("0B", &connection_state));
  EXPECT_EQ(SocketInfo::kConnectionStateClosing, connection_state);

  for (int i = SocketInfo::kConnectionStateMax; i < 256; ++i) {
    EXPECT_TRUE(reader_.ParseConnectionState(
        base::StringPrintf("%02X", i), &connection_state));
    EXPECT_EQ(SocketInfo::kConnectionStateUnknown, connection_state);
  }
}

TEST_F(SocketInfoReaderTest, ParseTimerState) {
  SocketInfo::TimerState timer_state = SocketInfo::kTimerStateUnknown;

  EXPECT_FALSE(reader_.ParseTimerState("", &timer_state));
  EXPECT_FALSE(reader_.ParseTimerState("0", &timer_state));
  EXPECT_FALSE(reader_.ParseTimerState("X", &timer_state));
  EXPECT_FALSE(reader_.ParseTimerState("00", &timer_state));

  EXPECT_TRUE(reader_.ParseTimerState("00:00000000", &timer_state));
  EXPECT_EQ(SocketInfo::kTimerStateNoTimerPending, timer_state);
  EXPECT_TRUE(reader_.ParseTimerState("01:00000000", &timer_state));
  EXPECT_EQ(SocketInfo::kTimerStateRetransmitTimerPending, timer_state);
  EXPECT_TRUE(reader_.ParseTimerState("02:00000000", &timer_state));
  EXPECT_EQ(SocketInfo::kTimerStateAnotherTimerPending, timer_state);
  EXPECT_TRUE(reader_.ParseTimerState("03:00000000", &timer_state));
  EXPECT_EQ(SocketInfo::kTimerStateInTimeWaitState, timer_state);
  EXPECT_TRUE(reader_.ParseTimerState("04:00000000", &timer_state));
  EXPECT_EQ(SocketInfo::kTimerStateZeroWindowProbeTimerPending, timer_state);

  for (int i = SocketInfo::kTimerStateMax; i < 256; ++i) {
    EXPECT_TRUE(reader_.ParseTimerState(
        base::StringPrintf("%02X:00000000", i), &timer_state));
    EXPECT_EQ(SocketInfo::kTimerStateUnknown, timer_state);
  }
}

}  // namespace shill
