From 95d2f74188f287a14b461c78a1e8989dd140be43 Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Fri, 14 Apr 2023 11:36:25 +0200 Subject: [PATCH] wifi: Add a unit test for WifiMgtHeader class --- src/wifi/test/wifi-test.cc | 154 +++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/src/wifi/test/wifi-test.cc b/src/wifi/test/wifi-test.cc index c6a3dc249..6b8ff21e5 100644 --- a/src/wifi/test/wifi-test.cc +++ b/src/wifi/test/wifi-test.cc @@ -27,6 +27,7 @@ #include "ns3/error-model.h" #include "ns3/fcfs-wifi-queue-scheduler.h" #include "ns3/frame-exchange-manager.h" +#include "ns3/header-serialization-test.h" #include "ns3/ht-configuration.h" #include "ns3/interference-helper.h" #include "ns3/mgt-headers.h" @@ -47,6 +48,7 @@ #include "ns3/wifi-default-ack-manager.h" #include "ns3/wifi-default-assoc-manager.h" #include "ns3/wifi-default-protection-manager.h" +#include "ns3/wifi-mgt-header.h" #include "ns3/wifi-net-device.h" #include "ns3/wifi-ppdu.h" #include "ns3/wifi-psdu.h" @@ -3626,6 +3628,157 @@ HeRuMcsDataRateTestCase::DoRun() "Data rate verification for RUs above 52-tone RU (included) failed"); } +/// List of Information Elements included in the test management frame +using MgtTestElems = + std::tuple, std::vector>; + +/** + * \ingroup wifi-test + * \ingroup tests + * + * \brief Test management header + */ +class MgtTestHeader : public WifiMgtHeader +{ + public: + ~MgtTestHeader() override = default; + + /** + * Register this type. + * \return The TypeId. + */ + static TypeId GetTypeId(); + + /** + * \return the TypeId for this object. + */ + TypeId GetInstanceTypeId() const override; + + using WifiMgtHeader::GetSerializedSize; + using WifiMgtHeader::Serialize; + using WifiMgtHeader::Deserialize; +}; + +TypeId +MgtTestHeader::GetTypeId() +{ + static TypeId tid = TypeId("ns3::MgtTestHeader") + .SetParent
() + .SetGroupName("Wifi") + .AddConstructor(); + return tid; +} + +TypeId +MgtTestHeader::GetInstanceTypeId() const +{ + return GetTypeId(); +} + +/** + * \ingroup wifi-test + * \ingroup tests + * + * \brief Mgt header (de)serialization Test Suite + */ +class WifiMgtHeaderTest : public HeaderSerializationTestCase +{ + public: + WifiMgtHeaderTest(); + ~WifiMgtHeaderTest() override = default; + + private: + void DoRun() override; +}; + +WifiMgtHeaderTest::WifiMgtHeaderTest() + : HeaderSerializationTestCase("Check (de)serialization of a test management header") +{ +} + +void +WifiMgtHeaderTest::DoRun() +{ + MgtTestHeader frame; + + // Add the mandatory Information Element (SupportedRates) + AllSupportedRates allRates; + allRates.AddSupportedRate(1000000); + allRates.AddSupportedRate(2000000); + allRates.AddSupportedRate(3000000); + allRates.AddSupportedRate(4000000); + allRates.AddSupportedRate(5000000); + + frame.Get() = allRates.rates; + frame.Get() = allRates.extendedRates; + + NS_TEST_EXPECT_MSG_EQ(frame.Get().has_value(), + true, + "Expected a SupportedRates IE to be included"); + NS_TEST_EXPECT_MSG_EQ(frame.Get().has_value(), + false, + "Expected no ExtendedSupportedRatesIE to be included"); + NS_TEST_EXPECT_MSG_EQ(frame.Get().size(), 0, "Expected no Ssid IE to be included"); + + TestHeaderSerialization(frame); + + // Add more rates, so that the optional Information Element (ExtendedSupportedRatesIE) is added + allRates.AddSupportedRate(6000000); + allRates.AddSupportedRate(7000000); + allRates.AddSupportedRate(8000000); + allRates.AddSupportedRate(9000000); + allRates.AddSupportedRate(10000000); + + frame.Get() = allRates.rates; + frame.Get() = allRates.extendedRates; + + NS_TEST_EXPECT_MSG_EQ(frame.Get().has_value(), + true, + "Expected a SupportedRates IE to be included"); + NS_TEST_EXPECT_MSG_EQ(frame.Get().has_value(), + true, + "Expected an ExtendedSupportedRatesIE to be included"); + NS_TEST_EXPECT_MSG_EQ(frame.Get().size(), 0, "Expected no Ssid IE to be included"); + + TestHeaderSerialization(frame); + + // Add a first Ssid IE + Ssid one("Ssid One"); + frame.Get().push_back(one); + + NS_TEST_EXPECT_MSG_EQ(frame.Get().has_value(), + true, + "Expected a SupportedRates IE to be included"); + NS_TEST_EXPECT_MSG_EQ(frame.Get().has_value(), + true, + "Expected an ExtendedSupportedRatesIE to be included"); + NS_TEST_EXPECT_MSG_EQ(frame.Get().size(), 1, "Expected one Ssid IE to be included"); + NS_TEST_EXPECT_MSG_EQ(std::string(frame.Get().front().PeekString()), + "Ssid One", + "Incorrect SSID"); + + TestHeaderSerialization(frame); + + // Add a second Ssid IE + frame.Get().emplace_back("Ssid Two"); + + NS_TEST_EXPECT_MSG_EQ(frame.Get().has_value(), + true, + "Expected a SupportedRates IE to be included"); + NS_TEST_EXPECT_MSG_EQ(frame.Get().has_value(), + true, + "Expected an ExtendedSupportedRatesIE to be included"); + NS_TEST_EXPECT_MSG_EQ(frame.Get().size(), 2, "Expected two Ssid IEs to be included"); + NS_TEST_EXPECT_MSG_EQ(std::string(frame.Get().front().PeekString()), + "Ssid One", + "Incorrect first SSID"); + NS_TEST_EXPECT_MSG_EQ(std::string(frame.Get().back().PeekString()), + "Ssid Two", + "Incorrect second SSID"); + + TestHeaderSerialization(frame); +} + /** * \ingroup wifi-test * \ingroup tests @@ -3658,6 +3811,7 @@ WifiTestSuite::WifiTestSuite() AddTestCase(new IdealRateManagerChannelWidthTest, TestCase::QUICK); AddTestCase(new IdealRateManagerMimoTest, TestCase::QUICK); AddTestCase(new HeRuMcsDataRateTestCase, TestCase::QUICK); + AddTestCase(new WifiMgtHeaderTest, TestCase::QUICK); } static WifiTestSuite g_wifiTestSuite; ///< the test suite