]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2797] checkStat helper function in unit tests
authorAndrei Pavel <andrei@isc.org>
Wed, 3 May 2023 11:59:19 +0000 (14:59 +0300)
committerAndrei Pavel <andrei@isc.org>
Wed, 3 May 2023 19:27:09 +0000 (22:27 +0300)
src/bin/dhcp4/tests/dora_unittest.cc
src/bin/dhcp6/tests/sarr_unittest.cc

index abba841404b8b577d0ff097ddd6ed675fe3042eb..f98f5145649ecd302086886ff647a0bfa06a3f6e 100644 (file)
@@ -859,6 +859,15 @@ public:
     /// @brief Checks that features related to lease caching (such as lease reuse statistics) work.
     void leaseCaching();
 
+    /// @brief Checks the value of a statistic.
+    ///
+    /// @param name name of statistic to check
+    /// @param expected_size expected number of statistic samples
+    /// @param expected_value expected value of the latest statistic sample
+    void checkStat(string const& name,
+                   size_t const expected_size,
+                   int64_t const expected_value);
+
     /// @brief Interface Manager's fake configuration control.
     IfaceMgrTestConfig iface_mgr_test_config_;
 };
@@ -2854,22 +2863,13 @@ DORATest::leaseCaching() {
     ASSERT_EQ("10.0.0.10", client.config_.lease_.addr_.toText());
 
     // There should only be the default global statistic point.
-    ObservationPtr lease_reuses(StatsMgr::instance().getObservation("v4-lease-reuses"));
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("v4-lease-reuses", 1, 0);
 
     // There should only be the default subnet statistic point.
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("subnet[1].v4-lease-reuses", 1, 0);
 
     // There should only be the default statistic point in the other subnet.
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("subnet[2].v4-lease-reuses", 1, 0);
 
     // Assume the client enters init-reboot and does a request.
     client.setState(Dhcp4Client::INIT_REBOOT);
@@ -2889,22 +2889,13 @@ DORATest::leaseCaching() {
     ASSERT_EQ("10.0.0.10", client.config_.lease_.addr_.toText());
 
     // There should be one global lease reuse.
-    lease_reuses = StatsMgr::instance().getObservation("v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(2, lease_reuses->getSize());
-    EXPECT_EQ(1, lease_reuses->getInteger().first);
+    checkStat("v4-lease-reuses", 2, 1);
 
     // There should be one subnet lease reuse.
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(2, lease_reuses->getSize());
-    EXPECT_EQ(1, lease_reuses->getInteger().first);
+    checkStat("subnet[1].v4-lease-reuses", 2, 1);
 
     // Statistics for the other subnet should not be affected.
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("subnet[2].v4-lease-reuses", 1, 0);
 
     // Let's say the client suddenly decides to do a full DORA.
     ASSERT_NO_THROW(client.doDORA());
@@ -2923,22 +2914,13 @@ DORATest::leaseCaching() {
     ASSERT_EQ("10.0.0.10", client.config_.lease_.addr_.toText());
 
     // There should be three global lease reuses (REQUEST + DISCOVER + REQUEST).
-    lease_reuses = StatsMgr::instance().getObservation("v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(4, lease_reuses->getSize());
-    EXPECT_EQ(3, lease_reuses->getInteger().first);
+    checkStat("v4-lease-reuses", 4, 3);
 
     // There should be three subnet lease reuses (REQUEST + DISCOVER + REQUEST).
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(4, lease_reuses->getSize());
-    EXPECT_EQ(3, lease_reuses->getInteger().first);
+    checkStat("subnet[1].v4-lease-reuses", 4, 3);
 
     // Statistics for the other subnet should not be affected.
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("subnet[2].v4-lease-reuses", 1, 0);
 
     // Try to request a different address than the client has. The server
     // should respond with DHCPNAK.
@@ -2957,22 +2939,13 @@ DORATest::leaseCaching() {
     ASSERT_FALSE(client.getContext().response_);
 
     // Global statistics should remain unchanged.
-    lease_reuses = StatsMgr::instance().getObservation("v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(4, lease_reuses->getSize());
-    EXPECT_EQ(3, lease_reuses->getInteger().first);
+    checkStat("v4-lease-reuses", 4, 3);
 
     // Subnet statistics should remain unchanged.
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(4, lease_reuses->getSize());
-    EXPECT_EQ(3, lease_reuses->getInteger().first);
+    checkStat("subnet[1].v4-lease-reuses", 4, 3);
 
     // Statistics for the other subnet should certainly not be affected.
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v4-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("subnet[2].v4-lease-reuses", 1, 0);
 }
 
 TEST_F(DORATest, leaseCaching) {
@@ -2985,6 +2958,24 @@ TEST_F(DORATest, leaseCachingMultiThreading) {
     leaseCaching();
 }
 
+/// @brief Checks the value of a statistic.
+///
+/// @param name name of statistic to check
+/// @param expected_size expected number of statistic samples
+/// @param expected_value expected value of the latest statistic sample
+void DORATest::checkStat(string const& name,
+                         size_t const expected_size,
+                         int64_t const expected_value) {
+    ObservationPtr const stats(StatsMgr::instance().getObservation(name));
+    ASSERT_TRUE(stats) << "no such stat: " << name;
+    EXPECT_EQ(expected_size, stats->getSize())
+        << name << " stat has wrong size: found " << stats->getSize() << ", expected "
+        << expected_size;
+    EXPECT_EQ(expected_value, stats->getInteger().first)
+        << name << " stat has wrong value: found " << stats->getInteger().first << ", expected "
+        << expected_value;
+}
+
 // Starting tests which require MySQL backend availability. Those tests
 // will not be executed if Kea has been compiled without the
 // --with-mysql.
index ee4c8f69a88a1840339099244d22a1f7aeecd5aa..00be27b4c7272d26cefd3c1975992d6e47419d27 100644 (file)
@@ -424,6 +424,15 @@ public:
     /// @brief Checks that features related to lease caching (such as lease reuse statistics) work.
     void leaseCaching();
 
+    /// @brief Checks the value of a statistic.
+    ///
+    /// @param name name of statistic to check
+    /// @param expected_size expected number of statistic samples
+    /// @param expected_value expected value of the latest statistic sample
+    void checkStat(string const& name,
+                   size_t const expected_size,
+                   int64_t const expected_value);
+
     /// @brief Interface Manager's fake configuration control.
     IfaceMgrTestConfig iface_mgr_test_config_;
 };
@@ -1205,30 +1214,12 @@ SARRTest::leaseCaching() {
     configure(CONFIGS[7], *client.getServer());
 
     // Statistics should have default values.
-    ObservationPtr lease_reuses(StatsMgr::instance().getObservation("v6-ia-na-lease-reuses"));
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("v6-ia-na-lease-reuses", 1, 0);
+    checkStat("subnet[1].v6-ia-na-lease-reuses", 1, 0);
+    checkStat("subnet[2].v6-ia-na-lease-reuses", 1, 0);
+    checkStat("v6-ia-pd-lease-reuses", 1, 0);
+    checkStat("subnet[1].v6-ia-pd-lease-reuses", 1, 0);
+    checkStat("subnet[2].v6-ia-pd-lease-reuses", 1, 0);
 
     // Append IAADDR and IAPREFIX options to the client's message.
     ASSERT_NO_THROW(client.requestAddress(1234, asiolink::IOAddress("2001:db8::10")));
@@ -1253,30 +1244,12 @@ SARRTest::leaseCaching() {
     EXPECT_TRUE(lease_server);
 
     // Check statistics.
-    lease_reuses = StatsMgr::instance().getObservation("v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("v6-ia-na-lease-reuses", 1, 0);
+    checkStat("subnet[1].v6-ia-na-lease-reuses", 1, 0);
+    checkStat("subnet[2].v6-ia-na-lease-reuses", 1, 0);
+    checkStat("v6-ia-pd-lease-reuses", 1, 0);
+    checkStat("subnet[1].v6-ia-pd-lease-reuses", 1, 0);
+    checkStat("subnet[2].v6-ia-pd-lease-reuses", 1, 0);
 
     // Request the same prefix with a different length. The server should
     // return an existing lease.
@@ -1293,30 +1266,12 @@ SARRTest::leaseCaching() {
     EXPECT_EQ(96, lease_client.prefixlen_);
 
     // Check statistics.
-    lease_reuses = StatsMgr::instance().getObservation("v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(2, lease_reuses->getSize());
-    EXPECT_EQ(1, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(2, lease_reuses->getSize());
-    EXPECT_EQ(1, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(2, lease_reuses->getSize());
-    EXPECT_EQ(1, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(2, lease_reuses->getSize());
-    EXPECT_EQ(1, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("v6-ia-na-lease-reuses", 2, 1);
+    checkStat("subnet[1].v6-ia-na-lease-reuses", 2, 1);
+    checkStat("subnet[2].v6-ia-na-lease-reuses", 1, 0);
+    checkStat("v6-ia-pd-lease-reuses", 2, 1);
+    checkStat("subnet[1].v6-ia-pd-lease-reuses", 2, 1);
+    checkStat("subnet[2].v6-ia-pd-lease-reuses", 1, 0);
 
     // Try to request another prefix. The client should still get the existing
     // lease.
@@ -1333,30 +1288,12 @@ SARRTest::leaseCaching() {
     EXPECT_EQ(96, lease_client.prefixlen_);
 
     // Check statistics.
-    lease_reuses = StatsMgr::instance().getObservation("v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(3, lease_reuses->getSize());
-    EXPECT_EQ(2, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(3, lease_reuses->getSize());
-    EXPECT_EQ(2, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v6-ia-na-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(3, lease_reuses->getSize());
-    EXPECT_EQ(2, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[1].v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(3, lease_reuses->getSize());
-    EXPECT_EQ(2, lease_reuses->getInteger().first);
-    lease_reuses = StatsMgr::instance().getObservation("subnet[2].v6-ia-pd-lease-reuses");
-    ASSERT_TRUE(lease_reuses);
-    EXPECT_EQ(1, lease_reuses->getSize());
-    EXPECT_EQ(0, lease_reuses->getInteger().first);
+    checkStat("v6-ia-na-lease-reuses", 3, 2);
+    checkStat("subnet[1].v6-ia-na-lease-reuses", 3, 2);
+    checkStat("subnet[2].v6-ia-na-lease-reuses", 1, 0);
+    checkStat("v6-ia-pd-lease-reuses", 3, 2);
+    checkStat("subnet[1].v6-ia-pd-lease-reuses", 3, 2);
+    checkStat("subnet[2].v6-ia-pd-lease-reuses", 1, 0);
 }
 
 TEST_F(SARRTest, leaseCaching) {
@@ -1369,4 +1306,22 @@ TEST_F(SARRTest, leaseCachingMultiThreading) {
     leaseCaching();
 }
 
+/// @brief Checks the value of a statistic.
+///
+/// @param name name of statistic to check
+/// @param expected_size expected number of statistic samples
+/// @param expected_value expected value of the latest statistic sample
+void SARRTest::checkStat(string const& name,
+                         size_t const expected_size,
+                         int64_t const expected_value) {
+    ObservationPtr const stats(StatsMgr::instance().getObservation(name));
+    ASSERT_TRUE(stats) << "no such stat: " << name;
+    EXPECT_EQ(expected_size, stats->getSize())
+        << name << " stat has wrong size: found " << stats->getSize() << ", expected "
+        << expected_size;
+    EXPECT_EQ(expected_value, stats->getInteger().first)
+        << name << " stat has wrong value: found " << stats->getInteger().first << ", expected "
+        << expected_value;
+}
+
 } // end of anonymous namespace