// 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_METHOD(FilePath, GetTcpv4SocketInfoFilePath, (), (const, override));
  MOCK_METHOD(FilePath, GetTcpv6SocketInfoFilePath, (), (const, override));
};

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
