@@ -82,4 +82,90 @@ TEST(IpParseAddr, FormatsIPv6)
8282 EXPECT_EQ (std::string (ip_str), " ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" );
8383}
8484
85+ TEST (IpportCmp, BehavesLikeMemcmp)
86+ {
87+ auto cmp_val = [](int val) { return val < 0 ? -1 : val > 0 ? 1 : 0 ; };
88+
89+ IP_Port a = {0 };
90+ IP_Port b = {0 };
91+
92+ a.ip .family = net_family_ipv4 ();
93+ b.ip .family = net_family_ipv4 ();
94+
95+ a.port = 10 ;
96+ b.port = 20 ;
97+
98+ EXPECT_EQ ( //
99+ ipport_cmp_handler (&a, &b, sizeof (IP_Port)), -1 )
100+ << " a=" << a << " \n "
101+ << " b=" << b;
102+ EXPECT_EQ ( //
103+ ipport_cmp_handler (&a, &b, sizeof (IP_Port)), //
104+ cmp_val (memcmp (&a, &b, sizeof (IP_Port))))
105+ << " a=" << a << " \n "
106+ << " b=" << b;
107+
108+ a.ip .ip .v4 .uint8 [0 ] = 192 ;
109+ b.ip .ip .v4 .uint8 [0 ] = 10 ;
110+
111+ EXPECT_EQ ( //
112+ ipport_cmp_handler (&a, &b, sizeof (IP_Port)), 1 )
113+ << " a=" << a << " \n "
114+ << " b=" << b;
115+ EXPECT_EQ ( //
116+ ipport_cmp_handler (&a, &b, sizeof (IP_Port)), //
117+ cmp_val (memcmp (&a, &b, sizeof (IP_Port))))
118+ << " a=" << a << " \n "
119+ << " b=" << b;
120+ }
121+
122+ TEST (IpportCmp, Ipv6BeginAndEndCompareCorrectly)
123+ {
124+ IP_Port a = {0 };
125+ IP_Port b = {0 };
126+
127+ a.ip .family = net_family_ipv6 ();
128+ b.ip .family = net_family_ipv6 ();
129+
130+ a.ip .ip .v6 .uint8 [0 ] = 0xab ;
131+ b.ip .ip .v6 .uint8 [0 ] = 0xba ;
132+
133+ EXPECT_EQ (ipport_cmp_handler (&a, &b, sizeof (IP_Port)), -1 );
134+
135+ a.ip .ip .v6 .uint8 [0 ] = 0 ;
136+ b.ip .ip .v6 .uint8 [0 ] = 0 ;
137+
138+ a.ip .ip .v6 .uint8 [15 ] = 0xba ;
139+
140+ EXPECT_EQ (ipport_cmp_handler (&a, &b, sizeof (IP_Port)), 1 );
141+ }
142+
143+ TEST (IpportCmp, UnspecAlwaysComparesEqual)
144+ {
145+ IP_Port a = {0 };
146+ IP_Port b = {0 };
147+
148+ a.ip .family = net_family_unspec ();
149+ b.ip .family = net_family_unspec ();
150+
151+ a.ip .ip .v4 .uint8 [0 ] = 0xab ;
152+ b.ip .ip .v4 .uint8 [0 ] = 0xba ;
153+
154+ EXPECT_EQ (ipport_cmp_handler (&a, &b, sizeof (IP_Port)), 0 );
155+ }
156+
157+ TEST (IpportCmp, InvalidAlwaysComparesEqual)
158+ {
159+ IP_Port a = {0 };
160+ IP_Port b = {0 };
161+
162+ a.ip .family .value = 0xff ;
163+ b.ip .family .value = 0xff ;
164+
165+ a.ip .ip .v4 .uint8 [0 ] = 0xab ;
166+ b.ip .ip .v4 .uint8 [0 ] = 0xba ;
167+
168+ EXPECT_EQ (ipport_cmp_handler (&a, &b, sizeof (IP_Port)), 0 );
169+ }
170+
85171} // namespace
0 commit comments