From: Andrei Pavel Date: Wed, 3 May 2023 11:59:19 +0000 (+0300) Subject: [#2797] checkStat helper function in unit tests X-Git-Tag: Kea-2.3.8~192 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=12d93e109e0da3e54d8a80a7eacf5b4d32f4f627;p=thirdparty%2Fkea.git [#2797] checkStat helper function in unit tests --- diff --git a/src/bin/dhcp4/tests/dora_unittest.cc b/src/bin/dhcp4/tests/dora_unittest.cc index abba841404..f98f514564 100644 --- a/src/bin/dhcp4/tests/dora_unittest.cc +++ b/src/bin/dhcp4/tests/dora_unittest.cc @@ -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. diff --git a/src/bin/dhcp6/tests/sarr_unittest.cc b/src/bin/dhcp6/tests/sarr_unittest.cc index ee4c8f69a8..00be27b4c7 100644 --- a/src/bin/dhcp6/tests/sarr_unittest.cc +++ b/src/bin/dhcp6/tests/sarr_unittest.cc @@ -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