db_query / tests /test_ue_capability_parser.py
DavMelchi's picture
feat: add 3gpp ue capability parser with volte assessment
7b6d659
from queries.process_ue_capability import infer_release, parse_uecap_files, parse_uecap_text
SAMPLE_UECAP_TEXT = """
08:33:50.000 LTE RRC Signaling
{
ueCapabilityInformation
{
ueCapabilityInformation-r8
{
uE-EUTRA-Capability
{
UE-EUTRA-Capability
{
accessStratumRelease
{
rel15
}
rf-Parameters
{
supportedBandListEUTRA
{
SupportedBandEUTRA #1
{
bandEUTRA
{
3
}
}
SupportedBandEUTRA #2
{
bandEUTRA
{
7
}
}
}
}
interRAT-Parameters
{
utraFDD
{
supportedBandListUTRA-FDD
{
SupportedBandUTRA-FDD #1
{
bandI
}
}
}
geran
{
supportedBandListGERAN
{
SupportedBandGERAN #1
{
gsm900E
}
}
}
}
featureGroupIndicators
{
01111111110011111111111010111110
}
nonCriticalExtension
{
rf-Parameters-v1020
{
supportedBandCombination-r10
{
BandCombinationParameters-r10 #1
{
BandParameters-r10 #1
{
bandEUTRA-r10
{
3
}
bandParametersDL-r10
{
CA-MIMO-ParametersDL-r10 #1
{
ca-BandwidthClassDL-r10
{
a
}
}
}
}
BandParameters-r10 #2
{
bandEUTRA-r10
{
7
}
bandParametersDL-r10
{
CA-MIMO-ParametersDL-r10 #1
{
ca-BandwidthClassDL-r10
{
a
}
}
}
}
}
}
}
}
}
}
}
}
}
"""
def test_parse_uecap_extracts_core_sections_and_new_assessments() -> None:
sheets = parse_uecap_text(SAMPLE_UECAP_TEXT, source_name="sample.txt")
assert not sheets["Summary"].empty
assert not sheets["Bands_LTE"].empty
assert not sheets["Bands_UTRA"].empty
assert not sheets["Bands_GERAN"].empty
assert not sheets["CA_Combinations"].empty
assert not sheets["CA_Assessment"].empty
assert not sheets["VoLTE_Assessment"].empty
summary = sheets["Summary"].iloc[0].to_dict()
assert str(summary["release_final"]).startswith("rel")
assert int(summary["lte_band_count"]) > 0
assert "volte_status" in summary
assert "ca_combo_normalized_count" in summary
def test_parse_files_is_stable_for_same_content_and_source() -> None:
content_bytes = SAMPLE_UECAP_TEXT.encode("utf-8")
first = parse_uecap_files([("sample.txt", content_bytes)])
second = parse_uecap_files([("sample.txt", content_bytes)])
first_ue_id = first["Summary"].iloc[0]["ue_id"]
second_ue_id = second["Summary"].iloc[0]["ue_id"]
assert first_ue_id == second_ue_id
def test_infer_release_prefers_explicit_release() -> None:
result = infer_release(
{
"explicit_release": "rel15",
"evidence": ["accessstratumrelease=rel15", "featuregroupindrel10-r10"],
}
)
assert result["explicit_release"] == "rel15"
assert result["final_release"] == "rel15"
assert result["confidence"] == 1.0