]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add test case and comments 10623/head
authorOtto <otto.moerbeek@open-xchange.com>
Tue, 3 Aug 2021 08:32:57 +0000 (10:32 +0200)
committerOtto <otto.moerbeek@open-xchange.com>
Tue, 3 Aug 2021 08:47:29 +0000 (10:47 +0200)
pdns/recursordist/test-syncres_cc10.cc
pdns/syncres.hh

index 3d6808c0ea3c157f9c3e5e0334c3a5224bc68428..2397952941152da6fbe24020201bc1e29b3237bc 100644 (file)
@@ -1013,4 +1013,50 @@ BOOST_AUTO_TEST_CASE(test_dnssec_bogus_dnskey_loop)
   BOOST_CHECK_EQUAL(queriesCount, 5U);
 }
 
+static auto createPID(std::string rem, int tcpsock, uint16_t type, std::string domain, int fd, uint16_t id)
+{
+  PacketID pid;
+  pid.remote = ComboAddress(rem);
+  pid.tcpsock = tcpsock;
+  pid.type = type;
+  pid.domain = DNSName(domain);
+  pid.fd = fd;
+  pid.id = id;
+  return std::make_shared<PacketID>(pid);
+}
+
+BOOST_AUTO_TEST_CASE(test_PacketIDCompare)
+{
+  // Ordered by domain, but not by id
+  auto a = createPID("1.2.3.4", -1, 1, "powerdns.com", -1, 1000);
+  auto b = createPID("1.2.3.4", -1, 1, "powerdns.net", -1, 999);
+
+  auto cmp = PacketIDCompare();
+  auto bcmp = PacketIDBirthdayCompare();
+
+  bool r1 = cmp.operator()(a, b);
+  bool br1 = bcmp.operator()(a, b);
+  bool r2 = cmp.operator()(b, a);
+  bool br2 = bcmp.operator()(b, a);
+
+  BOOST_CHECK(r1);
+  BOOST_CHECK(br1);
+  BOOST_CHECK(!r2);
+  BOOST_CHECK(!br2);
+
+  // Ordered by domain, but not by fd
+  a = createPID("1.2.3.4", -1, 1, "powerdns.com", 1, 1000);
+  b = createPID("1.2.3.4", -1, 1, "powerdns.net", -1, 1000);
+
+  r1 = cmp.operator()(a, b);
+  br1 = bcmp.operator()(a, b);
+  r2 = cmp.operator()(b, a);
+  br2 = bcmp.operator()(b, a);
+
+  BOOST_CHECK(r1);
+  BOOST_CHECK(br1);
+  BOOST_CHECK(!r2);
+  BOOST_CHECK(!br2);
+}
+
 BOOST_AUTO_TEST_SUITE_END()
index acca4f9951b9b38d804da7848ceeda4169bd6c45..a5f9caf4c096cf64c8d727df0872fc854241ef31 100644 (file)
@@ -967,7 +967,7 @@ struct PacketID
 
   bool operator<(const PacketID& b) const
   {
-    // We don't want explcit PacketID compare here, but always via predicate classes below
+    // We don't want explicit PacketID compare here, but always via predicate classes below
     assert(0);
   }
 };
@@ -983,6 +983,11 @@ inline ostream& operator<<(ostream & os, const shared_ptr<PacketID>& pid)
   return os << *pid;
 }
 
+/*
+ * The two compare predicates below must be consistent!
+ * PacketIDBirthdayCompare can omit minor fields, but not change the or skip fields
+ * order! See boost docs on CompatibleCompare.
+ */
 struct PacketIDCompare
 {
   bool operator()(const std::shared_ptr<PacketID>& a, const std::shared_ptr<PacketID>& b) const