/** * * \section COPYRIGHT * * Copyright 2013-2021 Software Radio Systems Limited * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the distribution. * */ #include "srsenb/hdr/stack/mac/sched_phy_ch/sched_phy_resource.h" #include "srsran/common/common_lte.h" #include "srsran/common/test_common.h" #include namespace srsenb { std::random_device rd; std::mt19937 rand_gen(rd()); uint32_t get_rand_Nrbg() { return cell_nof_prb_to_rbg(srsran::lte_cell_nof_prbs[std::uniform_int_distribution{ 0, srsran::lte_cell_nof_prbs.size() - 1}(rand_gen)]); } void test_rbg_mask_helpers() { rbgmask_t rbgs(MAX_NOF_RBGS); // TEST: Find contiguous range of zero RBGs in RBG mask rbgs.set(0); rbgs.set(2); rbg_interval interv = find_empty_rbg_interval(1, rbgs); TESTASSERT(not interv.empty() and interv.length() == 1 and interv.start() == 1); interv = find_empty_rbg_interval(2, rbgs); TESTASSERT(not interv.empty() and interv.length() == 2 and interv.start() == 3); interv = find_empty_rbg_interval(rbgs.size(), rbgs); TESTASSERT(interv.length() + 3 == rbgs.size() and interv.start() == 3); // TEST: find mask of zero RBGs in RBG mask rbgmask_t empty_rbgs = find_available_rbgmask(1, false, rbgs); TESTASSERT(empty_rbgs.count() == 1 and empty_rbgs.test(1)); empty_rbgs = find_available_rbgmask(5, false, rbgs); TESTASSERT(empty_rbgs.count() == 5 and empty_rbgs.test(1) and empty_rbgs.test(3) and not empty_rbgs.test(2)); // TEST: find mask of zero RBGs in random RBG mask std::bernoulli_distribution dist{0.5}; rbgs = rbgmask_t(get_rand_Nrbg()); for (size_t i = 0; i < rbgs.size(); ++i) { rbgs.set(i, dist(rand_gen)); } empty_rbgs = find_available_rbgmask(rbgs.size(), false, rbgs); TESTASSERT(empty_rbgs == ~rbgs); uint32_t L = std::uniform_int_distribution{1, (uint32_t)rbgs.size() - 1}(rand_gen); empty_rbgs = find_available_rbgmask(L, false, rbgs); TESTASSERT(empty_rbgs.count() <= L and (empty_rbgs & rbgs).none()); uint32_t nprb = count_prb_per_tb(rbgs); TESTASSERT(nprb <= MAX_NOF_PRBS); } } // namespace srsenb int main() { srsenb::test_rbg_mask_helpers(); }