7#include "ns3/channel-condition-model.h"
9#include "ns3/multi-model-spectrum-channel.h"
10#include "ns3/nr-channel-helper.h"
11#include "ns3/nyu-channel-condition-model.h"
12#include "ns3/nyu-propagation-loss-model.h"
13#include "ns3/nyu-spectrum-propagation-loss-model.h"
14#include "ns3/pointer.h"
16#include "ns3/three-gpp-propagation-loss-model.h"
17#include "ns3/three-gpp-spectrum-propagation-loss-model.h"
18#include "ns3/three-gpp-v2v-channel-condition-model.h"
19#include "ns3/three-gpp-v2v-propagation-loss-model.h"
20#include "ns3/two-ray-spectrum-propagation-loss-model.h"
47class NrChannelSetupTest :
public TestSuite
56 std::string condition;
57 std::string channelModel;
67 ~NrChannelSetupTest()
override;
71 void ValidateCreatedChannel(
const Ptr<MultiModelSpectrumChannel> channel,
72 const ChannelConfig& config);
78 void DoRun()
override;
81 std::map<std::string, std::vector<std::string>> supportedScenarios{
106 {
"NYU", {
"RMa",
"UMa",
"UMi",
"InF",
"InH"}}};
109 std::vector<std::string> channelConditions = {
"LOS",
"NLOS",
"Buildings",
"Default"};
111 std::vector<std::string> channelModels = {
"ThreeGpp",
"TwoRay",
"NYU"};
115 std::map<std::pair<std::string, std::string>, std::pair<TypeId, TypeId>> channelInfoTypeId = {
116 {{
"ThreeGpp",
"RMa"},
117 std::make_pair(ThreeGppRmaChannelConditionModel::GetTypeId(),
118 ThreeGppRmaPropagationLossModel::GetTypeId())},
119 {{
"ThreeGpp",
"UMa"},
120 std::make_pair(ThreeGppUmaChannelConditionModel::GetTypeId(),
121 ThreeGppUmaPropagationLossModel::GetTypeId())},
122 {{
"ThreeGpp",
"UMi"},
123 std::make_pair(ThreeGppUmiStreetCanyonChannelConditionModel::GetTypeId(),
124 ThreeGppUmiStreetCanyonPropagationLossModel::GetTypeId())},
125 {{
"ThreeGpp",
"InH-OfficeOpen"},
126 std::make_pair(ThreeGppIndoorOpenOfficeChannelConditionModel::GetTypeId(),
127 ThreeGppIndoorOfficePropagationLossModel::GetTypeId())},
128 {{
"ThreeGpp",
"InH-OfficeMixed"},
129 std::make_pair(ThreeGppIndoorMixedOfficeChannelConditionModel::GetTypeId(),
130 ThreeGppIndoorOfficePropagationLossModel::GetTypeId())},
131 {{
"ThreeGpp",
"V2V-Highway"},
132 std::make_pair(ThreeGppV2vHighwayChannelConditionModel::GetTypeId(),
133 ThreeGppV2vHighwayPropagationLossModel::GetTypeId())},
134 {{
"ThreeGpp",
"V2V-Urban"},
135 std::make_pair(ThreeGppV2vUrbanChannelConditionModel::GetTypeId(),
136 ThreeGppV2vUrbanPropagationLossModel::GetTypeId())},
137 {{
"ThreeGpp",
"NTN-DenseUrban"},
138 std::make_pair(ThreeGppNTNDenseUrbanChannelConditionModel::GetTypeId(),
139 ThreeGppNTNDenseUrbanPropagationLossModel::GetTypeId())},
140 {{
"ThreeGpp",
"NTN-Urban"},
141 std::make_pair(ThreeGppNTNUrbanChannelConditionModel::GetTypeId(),
142 ThreeGppNTNUrbanPropagationLossModel::GetTypeId())},
143 {{
"ThreeGpp",
"NTN-Suburban"},
144 std::make_pair(ThreeGppNTNSuburbanChannelConditionModel::GetTypeId(),
145 ThreeGppNTNSuburbanPropagationLossModel::GetTypeId())},
146 {{
"ThreeGpp",
"NTN-Rural"},
147 std::make_pair(ThreeGppNTNRuralChannelConditionModel::GetTypeId(),
148 ThreeGppNTNRuralPropagationLossModel::GetTypeId())},
150 std::make_pair(NYURmaChannelConditionModel::GetTypeId(),
151 NYURmaPropagationLossModel::GetTypeId())},
153 std::make_pair(NYUUmaChannelConditionModel::GetTypeId(),
154 NYUUmaPropagationLossModel::GetTypeId())},
156 std::make_pair(NYUUmiChannelConditionModel::GetTypeId(),
157 NYUUmiPropagationLossModel::GetTypeId())},
159 std::make_pair(NYUInFChannelConditionModel::GetTypeId(),
160 NYUInFPropagationLossModel::GetTypeId())},
162 std::make_pair(NYUInHChannelConditionModel::GetTypeId(),
163 NYUInHPropagationLossModel::GetTypeId())}};
166 std::map<std::string, TypeId> channelModelTypeId = {
167 {
"ThreeGpp", ThreeGppSpectrumPropagationLossModel::GetTypeId()},
168 {
"TwoRay", TwoRaySpectrumPropagationLossModel::GetTypeId()},
169 {
"NYU", NYUSpectrumPropagationLossModel::GetTypeId()}};
171 std::map<std::string, TypeId> channelConditionTypeId = {
172 {
"LOS", AlwaysLosChannelConditionModel::GetTypeId()},
173 {
"NLOS", NeverLosChannelConditionModel::GetTypeId()},
174 {
"Buildings", BuildingsChannelConditionModel::GetTypeId()}};
177NrChannelSetupTest::NrChannelSetupTest()
178 : TestSuite(
"nr-channel-setup-test")
182NrChannelSetupTest::~NrChannelSetupTest()
187NrChannelSetupTest::DoRun()
189 auto channelHelper = CreateObject<NrChannelHelper>();
190 for (
auto& channel : channelModels)
192 for (
auto& condition : channelConditions)
194 for (
auto& scenario : supportedScenarios[channel])
196 channelHelper->ConfigureFactories(scenario, condition, channel);
197 auto specChannel = channelHelper->CreateChannel();
198 ValidateCreatedChannel(DynamicCast<MultiModelSpectrumChannel>(specChannel),
199 {scenario, condition, channel});
206NrChannelSetupTest::ValidateCreatedChannel(
const Ptr<MultiModelSpectrumChannel> channel,
207 const ChannelConfig& config)
209 auto channelModel = channel->GetPhasedArraySpectrumPropagationLossModel();
210 auto propagationLossModel = channel->GetPropagationLossModel();
212 PointerValue channelConditionModelPtr;
213 propagationLossModel->GetAttribute(
"ChannelConditionModel", channelConditionModelPtr);
214 auto channelConditionModel = channelConditionModelPtr.Get<ChannelConditionModel>();
217 NS_TEST_ASSERT_MSG_EQ(channelModelTypeId[config.channelModel],
218 channelModel->GetInstanceTypeId(),
219 "Channel model is not the one expected");
224 TypeId expectedChannelConditionTypeId = channelConditionTypeId[config.condition];
226 auto currentChannel = (config.channelModel ==
"TwoRay") ?
"ThreeGpp" : config.channelModel;
227 if (config.condition ==
"Default")
229 expectedChannelConditionTypeId = channelInfoTypeId[{currentChannel, config.scenario}].first;
233 NS_TEST_ASSERT_MSG_EQ(expectedChannelConditionTypeId,
234 channelConditionModel->GetInstanceTypeId(),
235 "Channel condition is not the one expected");
238 NS_TEST_ASSERT_MSG_EQ(channelInfoTypeId[std::make_pair(currentChannel, config.scenario)].second,
239 propagationLossModel->GetInstanceTypeId(),
240 "Propagation loss model is not the one expected");
243static NrChannelSetupTest g_NrChannelSetupTest;