Add regression test for NAS Registration Accept decoding

This test verifies that a NAS Registration Accept message, as received
from the OAI CN5G, is correctly decoded and matches the expected output
structure. It ensures that future changes to the NAS decoder do not
break compatibility or correctness with existing decoding behavior.
This commit is contained in:
Guido Casati
2025-04-16 09:44:59 +02:00
parent 3fe601fa6b
commit a19c786600
@@ -3,6 +3,7 @@
#include <stdio.h>
#include <arpa/inet.h>
#include "common/utils/ds/byte_array.h"
#include "RegistrationAccept.h"
#include "fgs_service_request.h"
#include "fgmm_service_accept.h"
#include "fgmm_service_reject.h"
@@ -26,6 +27,65 @@ static bool eq_service_request(const fgs_service_request_msg_t *a, const fgs_ser
return result;
}
/** @brief Test regression of NAS Registration Accept decoding
* This test verifies that the NAS Registration Accept message
* is correctly decoded. It decodes a message as it received from
* the OAI CN5G and compares the output with the expected Registration Accept structure.
* The purpose of this regression test is to ensure that changes
* to the NAS decoder do not break the existing decoding behavior with OAI CN5G */
static void test_regression_registration_accept(void)
{
// Registration Accept message
registration_accept_msg orig = {
.guti = malloc_or_fail(sizeof(*orig.guti)),
.result = 0x01,
.nas_allowed_nssai[0].sst = 0x01,
.nas_allowed_nssai[1].sst = 0x02,
.nas_allowed_nssai[2].sst = 0x03,
.num_allowed_slices = 3,
.config_nssai[0].sst = 0x01,
.config_nssai[1].sst = 0x02,
.config_nssai[2].sst = 0x03,
.num_configured_slices = 3,
};
orig.guti->guti.typeofidentity = FGS_MOBILE_IDENTITY_5G_GUTI;
orig.guti->guti.amfpointer = 0x01;
orig.guti->guti.amfregionid = 0x02;
orig.guti->guti.amfsetid = 0x01;
orig.guti->guti.mccdigit1 = 0x00;
orig.guti->guti.mccdigit2 = 0x00;
orig.guti->guti.mccdigit3 = 0x01;
orig.guti->guti.mncdigit1 = 0x00;
orig.guti->guti.mncdigit2 = 0x01;
orig.guti->guti.mncdigit3 = 0x0F;
orig.guti->guti.tmsi = 0xb0207806;
orig.guti->guti.spare = 0b1111;
orig.guti->guti.oddeven = 0;
// Encoded Registration Accept message from OAI CN5G
uint8_t cn5g_msg[] = {0x01, 0x01, // Registration Result
0x77, 0x00, 0x0B, 0xF2, 0x00, 0xF1, 0x10, // 5G-GUTI
0x02, 0x00, 0x41, 0xB0, 0x20, 0x78, 0x06, // 5G-GUTI
0x15, 0x06, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, // Allowed N-NSSAI
0x31, 0x06, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03}; // Configured N-NSSAI
// Decode NAS Registration Accept
int encoded_length;
registration_accept_msg decoded = {0};
byte_array_t ba = {.buf = cn5g_msg, .len = sizeof(cn5g_msg)};
encoded_length = decode_registration_accept(&decoded, ba);
AssertFatal(encoded_length >= 0, "encode_fgs_service_request() failed\n");
// Compare the raw encoded buffer with expected encoded data
bool ret = eq_fgmm_registration_accept(&orig, &decoded);
AssertFatal(ret, "Encoding mismatch!\n");
// Free dynamic allocated memory
free_fgmm_registration_accept(&orig);
free_fgmm_registration_accept(&decoded);
}
/**
* @brief Test NAS Service Request enc/dec
*/
@@ -172,6 +232,7 @@ static void test_service_reject(void)
int main()
{
test_regression_registration_accept();
test_service_request();
test_service_accept();
test_service_reject();