blob: f1bc5abc818df13b291097ac4a0f9080c9e2a5b2 [file] [log] [blame]
# SPDX-FileCopyrightText: 2020 The Magma Authors.
# SPDX-FileCopyrightText: 2022 Open Networking Foundation <support@opennetworking.org>
#
# SPDX-License-Identifier: BSD-3-Clause
from unittest import TestCase, mock
from xml.etree import ElementTree
import pkg_resources
from enodebd import metrics
from data_models.data_model_parameters import ParameterName
from devices.device_utils import EnodebDeviceName
from state_machines.enb_acs_manager import StateMachineManager
from stats_manager import StatsManager
from tests.test_utils.config_builder import EnodebConfigBuilder
from tests.test_utils.enb_acs_builder import (
EnodebAcsStateMachineBuilder,
)
class StatsManagerTest(TestCase):
"""
Tests for eNodeB statistics manager
"""
def setUp(self) -> None:
service = EnodebConfigBuilder.get_service_config()
self.enb_acs_manager = StateMachineManager(service)
self.mgr = StatsManager(self.enb_acs_manager)
self.is_clear_stats_called = False
def tearDown(self):
self.mgr = None
def test_check_rf_tx(self):
""" Check that stats are cleared when transmit is disabled on eNB """
handler = EnodebAcsStateMachineBuilder \
.build_acs_state_machine(EnodebDeviceName.BAICELLS)
with mock.patch(
'magma.enodebd.devices.baicells.BaicellsHandler.is_enodeb_connected',
return_value=True,
):
handler.device_cfg.set_parameter(ParameterName.RF_TX_STATUS, True)
handler.device_cfg.set_parameter(
ParameterName.SERIAL_NUMBER,
'123454',
)
with mock.patch(
'magma.enodebd.stats_manager.StatsManager'
'._clear_stats',
) as func:
self.mgr._check_rf_tx_for_handler(handler)
func.assert_not_called()
handler.device_cfg.set_parameter(
ParameterName.RF_TX_STATUS,
False,
)
self.mgr._check_rf_tx_for_handler(handler)
func.assert_any_call()
def test_parse_stats(self):
""" Test that example statistics from eNodeB can be parsed, and metrics
updated """
# Example performance metrics structure, sent by eNodeB
pm_file_example = pkg_resources.resource_string(
__name__,
'pm_file_example.xml',
)
root = ElementTree.fromstring(pm_file_example)
self.mgr._parse_pm_xml('1234', root)
# Check that metrics were correctly populated
# See '<V i="5">123</V>' in pm_file_example
rrc_estab_attempts = metrics.STAT_RRC_ESTAB_ATT.collect()
self.assertEqual(rrc_estab_attempts[0].samples[0][2], 123)
# See '<V i="7">99</V>' in pm_file_example
rrc_estab_successes = metrics.STAT_RRC_ESTAB_SUCC.collect()
self.assertEqual(rrc_estab_successes[0].samples[0][2], 99)
# See '<SV>654</SV>' in pm_file_example
rrc_reestab_att_reconf_fail = \
metrics.STAT_RRC_REESTAB_ATT_RECONF_FAIL.collect()
self.assertEqual(rrc_reestab_att_reconf_fail[0].samples[0][2], 654)
# See '<SV>65537</SV>' in pm_file_example
erab_rel_req_radio_conn_lost = \
metrics.STAT_ERAB_REL_REQ_RADIO_CONN_LOST.collect()
self.assertEqual(erab_rel_req_radio_conn_lost[0].samples[0][2], 65537)
pdcp_user_plane_bytes_ul = \
metrics.STAT_PDCP_USER_PLANE_BYTES_UL.collect()
pdcp_user_plane_bytes_dl = \
metrics.STAT_PDCP_USER_PLANE_BYTES_DL.collect()
self.assertEqual(pdcp_user_plane_bytes_ul[0].samples[0][1], {'enodeb': '1234'})
self.assertEqual(pdcp_user_plane_bytes_dl[0].samples[0][1], {'enodeb': '1234'})
self.assertEqual(pdcp_user_plane_bytes_ul[0].samples[0][2], 1000)
self.assertEqual(pdcp_user_plane_bytes_dl[0].samples[0][2], 500)
def test_clear_stats(self):
"""
Check that stats of PMPM_FILE_TO_METRIC_MAP is cleared successfully
"""
# Example performance metrics structure, sent by eNodeB
pm_file_example = pkg_resources.resource_string(
__name__,
'pm_file_example.xml',
)
root = ElementTree.fromstring(pm_file_example)
self.mgr._parse_pm_xml('1234', root)
# Check that metrics were correctly populated
rrc_estab_attempts = metrics.STAT_RRC_ESTAB_ATT.collect()
self.assertEqual(rrc_estab_attempts[0].samples[0][2], 123)
self.mgr._clear_stats()
rrc_estab_attempts = metrics.STAT_RRC_ESTAB_ATT.collect()
# After clearing stats collection of metric should report 0
self.assertEqual(rrc_estab_attempts[0].samples[0][2], 0)