1//
2// Copyright (C) 2013 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#include "shill/socket_info.h"
18
19#include <gtest/gtest.h>
20
21namespace shill {
22
23namespace {
24
25const unsigned char kIPAddress1[] = { 192, 168, 1, 1 };
26const unsigned char kIPAddress2[] = { 192, 168, 1, 2 };
27const unsigned char kIPAddress3[] = { 192, 168, 1, 3 };
28const uint16_t kPort1 = 1000;
29const uint16_t kPort2 = 2000;
30const uint16_t kPort3 = 3000;
31
32}  // namespace
33
34class SocketInfoTest : public testing::Test {
35 protected:
36  void ExpectSocketInfoEqual(const SocketInfo& info1, const SocketInfo& info2) {
37    EXPECT_EQ(info1.connection_state(), info2.connection_state());
38    EXPECT_TRUE(info1.local_ip_address().Equals(info2.local_ip_address()));
39    EXPECT_EQ(info1.local_port(), info2.local_port());
40    EXPECT_TRUE(info1.remote_ip_address().Equals(info2.remote_ip_address()));
41    EXPECT_EQ(info1.remote_port(), info2.remote_port());
42    EXPECT_EQ(info1.transmit_queue_value(), info2.transmit_queue_value());
43    EXPECT_EQ(info1.receive_queue_value(), info2.receive_queue_value());
44    EXPECT_EQ(info1.timer_state(), info2.timer_state());
45  }
46};
47
48TEST_F(SocketInfoTest, CopyConstructor) {
49  SocketInfo info(SocketInfo::kConnectionStateEstablished,
50                  IPAddress(IPAddress::kFamilyIPv4,
51                            ByteString(kIPAddress1, sizeof(kIPAddress1))),
52                  kPort1,
53                  IPAddress(IPAddress::kFamilyIPv4,
54                            ByteString(kIPAddress2, sizeof(kIPAddress2))),
55                  kPort2,
56                  10,
57                  20,
58                  SocketInfo::kTimerStateRetransmitTimerPending);
59
60  SocketInfo info_copy(info);
61  ExpectSocketInfoEqual(info, info_copy);
62}
63
64TEST_F(SocketInfoTest, AssignmentOperator) {
65  SocketInfo info(SocketInfo::kConnectionStateEstablished,
66                  IPAddress(IPAddress::kFamilyIPv4,
67                            ByteString(kIPAddress1, sizeof(kIPAddress1))),
68                  kPort1,
69                  IPAddress(IPAddress::kFamilyIPv4,
70                            ByteString(kIPAddress2, sizeof(kIPAddress2))),
71                  kPort2,
72                  10,
73                  20,
74                  SocketInfo::kTimerStateRetransmitTimerPending);
75
76  SocketInfo info_copy = info;
77  ExpectSocketInfoEqual(info, info_copy);
78}
79
80TEST_F(SocketInfoTest, IsSameSocketAs) {
81  IPAddress ip_address1(IPAddress::kFamilyIPv4,
82                        ByteString(kIPAddress1, sizeof(kIPAddress1)));
83  IPAddress ip_address2(IPAddress::kFamilyIPv4,
84                        ByteString(kIPAddress2, sizeof(kIPAddress2)));
85  IPAddress ip_address3(IPAddress::kFamilyIPv4,
86                        ByteString(kIPAddress3, sizeof(kIPAddress3)));
87
88  SocketInfo info(SocketInfo::kConnectionStateEstablished,
89                  ip_address1,
90                  kPort1,
91                  ip_address2,
92                  kPort2,
93                  0,
94                  0,
95                  SocketInfo::kTimerStateNoTimerPending);
96
97  // Differs only by local address.
98  EXPECT_FALSE(info.IsSameSocketAs(
99      SocketInfo(SocketInfo::kConnectionStateEstablished,
100                 ip_address3,
101                 kPort1,
102                 ip_address2,
103                 kPort2,
104                 0,
105                 0,
106                 SocketInfo::kTimerStateNoTimerPending)));
107
108  // Differs only by local port.
109  EXPECT_FALSE(info.IsSameSocketAs(
110      SocketInfo(SocketInfo::kConnectionStateEstablished,
111                 ip_address1,
112                 kPort3,
113                 ip_address2,
114                 kPort2,
115                 0,
116                 0,
117                 SocketInfo::kTimerStateNoTimerPending)));
118
119  // Differs only by remote address.
120  EXPECT_FALSE(info.IsSameSocketAs(
121      SocketInfo(SocketInfo::kConnectionStateEstablished,
122                 ip_address1,
123                 kPort1,
124                 ip_address3,
125                 kPort2,
126                 0,
127                 0,
128                 SocketInfo::kTimerStateNoTimerPending)));
129
130  // Differs only by remote port.
131  EXPECT_FALSE(info.IsSameSocketAs(
132      SocketInfo(SocketInfo::kConnectionStateEstablished,
133                 ip_address1,
134                 kPort1,
135                 ip_address2,
136                 kPort3,
137                 0,
138                 0,
139                 SocketInfo::kTimerStateNoTimerPending)));
140
141  // Only local address, local port, remote address, and remote port are
142  // identical.
143  EXPECT_TRUE(info.IsSameSocketAs(
144      SocketInfo(SocketInfo::kConnectionStateClosing,
145                 ip_address1,
146                 kPort1,
147                 ip_address2,
148                 kPort2,
149                 10,
150                 20,
151                 SocketInfo::kTimerStateRetransmitTimerPending)));
152}
153
154}  // namespace shill
155