Test DnsTlsServer comparison operators
This also includes scope in the v6 address for comparisons
Test: Tests pass
Bug: 63731765
Change-Id: Iadb3ce74c3b11b2aab0c878f23e914e84c46aff3
diff --git a/tests/dns_tls_test.cpp b/tests/dns_tls_test.cpp
index 5ab95bd..4cb4d50 100644
--- a/tests/dns_tls_test.cpp
+++ b/tests/dns_tls_test.cpp
@@ -60,8 +60,10 @@
}
bytevec FINGERPRINT1 = { 1 };
+bytevec FINGERPRINT2 = { 2 };
std::string SERVERNAME1 = "dns.example.com";
+std::string SERVERNAME2 = "dns.example.org";
// BaseTest just provides constants that are useful for the tests.
class BaseTest : public ::testing::Test {
@@ -69,6 +71,8 @@
BaseTest() {
parseServer("192.0.2.1", 853, &V4ADDR1);
parseServer("192.0.2.2", 853, &V4ADDR2);
+ parseServer("2001:db8::1", 853, &V6ADDR1);
+ parseServer("2001:db8::2", 853, &V6ADDR2);
SERVER1 = DnsTlsServer(V4ADDR1);
SERVER1.fingerprints.insert(FINGERPRINT1);
@@ -77,6 +81,8 @@
sockaddr_storage V4ADDR1;
sockaddr_storage V4ADDR2;
+ sockaddr_storage V6ADDR1;
+ sockaddr_storage V6ADDR2;
DnsTlsServer SERVER1;
};
@@ -261,5 +267,106 @@
}
}
+// Check DnsTlsServer's comparison logic.
+AddressComparator ADDRESS_COMPARATOR;
+bool isAddressEqual(const DnsTlsServer& s1, const DnsTlsServer& s2) {
+ bool cmp1 = ADDRESS_COMPARATOR(s1, s2);
+ bool cmp2 = ADDRESS_COMPARATOR(s2, s1);
+ EXPECT_FALSE(cmp1 && cmp2);
+ return !cmp1 && !cmp2;
+}
+
+void checkUnequal(const DnsTlsServer& s1, const DnsTlsServer& s2) {
+ EXPECT_TRUE(s1 == s1);
+ EXPECT_TRUE(s2 == s2);
+ EXPECT_TRUE(isAddressEqual(s1, s1));
+ EXPECT_TRUE(isAddressEqual(s2, s2));
+
+ EXPECT_TRUE(s1 < s2 ^ s2 < s1);
+ EXPECT_FALSE(s1 == s2);
+ EXPECT_FALSE(s2 == s1);
+}
+
+class ServerTest : public BaseTest {};
+
+TEST_F(ServerTest, IPv4) {
+ checkUnequal(V4ADDR1, V4ADDR2);
+ EXPECT_FALSE(isAddressEqual(V4ADDR1, V4ADDR2));
+}
+
+TEST_F(ServerTest, IPv6) {
+ checkUnequal(V6ADDR1, V6ADDR2);
+ EXPECT_FALSE(isAddressEqual(V6ADDR1, V6ADDR2));
+}
+
+TEST_F(ServerTest, MixedAddressFamily) {
+ checkUnequal(V6ADDR1, V4ADDR1);
+ EXPECT_FALSE(isAddressEqual(V6ADDR1, V4ADDR1));
+}
+
+TEST_F(ServerTest, IPv6ScopeId) {
+ DnsTlsServer s1(V6ADDR1), s2(V6ADDR1);
+ sockaddr_in6* addr1 = reinterpret_cast<sockaddr_in6*>(&s1.ss);
+ addr1->sin6_scope_id = 1;
+ sockaddr_in6* addr2 = reinterpret_cast<sockaddr_in6*>(&s2.ss);
+ addr2->sin6_scope_id = 2;
+ checkUnequal(s1, s2);
+ EXPECT_FALSE(isAddressEqual(s1, s2));
+}
+
+TEST_F(ServerTest, IPv6FlowInfo) {
+ DnsTlsServer s1(V6ADDR1), s2(V6ADDR1);
+ sockaddr_in6* addr1 = reinterpret_cast<sockaddr_in6*>(&s1.ss);
+ addr1->sin6_flowinfo = 1;
+ sockaddr_in6* addr2 = reinterpret_cast<sockaddr_in6*>(&s2.ss);
+ addr2->sin6_flowinfo = 2;
+ // All comparisons ignore flowinfo.
+ EXPECT_EQ(s1, s2);
+ EXPECT_TRUE(isAddressEqual(s1, s2));
+}
+
+TEST_F(ServerTest, Port) {
+ DnsTlsServer s1, s2;
+ parseServer("192.0.2.1", 853, &s1.ss);
+ parseServer("192.0.2.1", 854, &s2.ss);
+ checkUnequal(s1, s2);
+ EXPECT_TRUE(isAddressEqual(s1, s2));
+
+ DnsTlsServer s3, s4;
+ parseServer("2001:db8::1", 853, &s3.ss);
+ parseServer("2001:db8::1", 852, &s4.ss);
+ checkUnequal(s3, s4);
+ EXPECT_TRUE(isAddressEqual(s3, s4));
+}
+
+TEST_F(ServerTest, Name) {
+ DnsTlsServer s1(V4ADDR1), s2(V4ADDR1);
+ s1.name = SERVERNAME1;
+ checkUnequal(s1, s2);
+ s2.name = SERVERNAME2;
+ checkUnequal(s1, s2);
+ EXPECT_TRUE(isAddressEqual(s1, s2));
+}
+
+TEST_F(ServerTest, Fingerprint) {
+ DnsTlsServer s1(V4ADDR1), s2(V4ADDR1);
+
+ s1.fingerprints.insert(FINGERPRINT1);
+ checkUnequal(s1, s2);
+ EXPECT_TRUE(isAddressEqual(s1, s2));
+
+ s2.fingerprints.insert(FINGERPRINT2);
+ checkUnequal(s1, s2);
+ EXPECT_TRUE(isAddressEqual(s1, s2));
+
+ s2.fingerprints.insert(FINGERPRINT1);
+ checkUnequal(s1, s2);
+ EXPECT_TRUE(isAddressEqual(s1, s2));
+
+ s1.fingerprints.insert(FINGERPRINT2);
+ EXPECT_EQ(s1, s2);
+ EXPECT_TRUE(isAddressEqual(s1, s2));
+}
+
} // end of namespace net
} // end of namespace android