/** * Copyright 2013-2022 Software Radio Systems Limited * * This file is part of srsRAN. * * srsRAN is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * srsRAN is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * A copy of the GNU Affero General Public License can be found in * the LICENSE file in the top-level directory of this distribution * and at http://www.gnu.org/licenses/. * */ #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(); }