sgsn/test: Add test case for Detach Request (MO, power-off = 1)

Currently only a Detach Request (MO) message with power_off = 0 is
checked.

This commit adds a new test case with power_off set to 1. It also
adds checks for the number of messages generated by the SGSN to
verify that these messages are handled differently.

Note that the handling of power_off isn't implemented yet. Therefore
the corresponding assertion is being disabled yet.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2014-10-27 14:34:13 +01:00 committed by Holger Hans Peter Freyther
parent abc16a55b2
commit 189999d654
2 changed files with 64 additions and 0 deletions

View File

@ -24,10 +24,13 @@
#include <openbsc/gprs_gmm.h>
#include <openbsc/debug.h>
#include <osmocom/gprs/gprs_bssgp.h>
#include <osmocom/gsm/gsm_utils.h>
#include <osmocom/core/application.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/rate_ctr.h>
#include <stdio.h>
@ -42,6 +45,15 @@ static struct sgsn_instance sgsn_inst = {
},
};
struct sgsn_instance *sgsn = &sgsn_inst;
unsigned sgsn_tx_counter = 0;
/* override */
int bssgp_tx_dl_ud(struct msgb *msg, uint16_t pdu_lifetime,
struct bssgp_dl_ud_par *dup)
{
sgsn_tx_counter += 1;
return 0;
}
static int count(struct llist_head *head)
{
@ -131,6 +143,7 @@ static void test_gmm_detach(void)
struct sgsn_mm_ctx *ctx, *ictx;
uint32_t local_tlli;
struct msgb *msg;
int sgsn_tx_counter_old;
printf("Testing GMM detach\n");
@ -148,11 +161,60 @@ static void test_gmm_detach(void)
ctx = alloc_mm_ctx(local_tlli, &raid);
/* inject the detach */
sgsn_tx_counter_old = sgsn_tx_counter;
msg = create_msg(detach_req, ARRAY_SIZE(detach_req));
msgb_tlli(msg) = local_tlli;
gsm0408_gprs_rcvmsg(msg, ctx->llme);
msgb_free(msg);
/* verify that a single message (hopefully the Detach Accept) has been
* sent by the SGSN */
OSMO_ASSERT(sgsn_tx_counter_old + 1 == sgsn_tx_counter);
/* verify that things are gone */
OSMO_ASSERT(count(gprs_llme_list()) == 0);
ictx = sgsn_mm_ctx_by_tlli(local_tlli, &raid);
OSMO_ASSERT(!ictx);
}
/*
* Test that a GMM Detach will remove the MMCTX and the associated LLME but
* will not sent a Detach Accept message (power_off = 1)
*/
static void test_gmm_detach_power_off(void)
{
struct gprs_ra_id raid = { 0, };
struct sgsn_mm_ctx *ctx, *ictx;
uint32_t local_tlli;
struct msgb *msg;
int sgsn_tx_counter_old;
printf("Testing GMM detach (power off)\n");
/* DTAP - Detach Request (MO) */
/* normal detach, power_off = 1 */
static const unsigned char detach_req[] = {
0x08, 0x05, 0x09, 0x18, 0x05, 0xf4, 0xef, 0xe2,
0xb7, 0x00, 0x19, 0x03, 0xb9, 0x97, 0xcb
};
local_tlli = gprs_tmsi2tlli(0x23, TLLI_LOCAL);
/* Create a context */
OSMO_ASSERT(count(gprs_llme_list()) == 0);
ctx = alloc_mm_ctx(local_tlli, &raid);
/* inject the detach */
sgsn_tx_counter_old = sgsn_tx_counter;
msg = create_msg(detach_req, ARRAY_SIZE(detach_req));
msgb_tlli(msg) = local_tlli;
gsm0408_gprs_rcvmsg(msg, ctx->llme);
msgb_free(msg);
/* verify that no message (and therefore no Detach Accept) has been
* sent by the SGSN */
/* OSMO_ASSERT(sgsn_tx_counter_old == sgsn_tx_counter); */
/* verify that things are gone */
OSMO_ASSERT(count(gprs_llme_list()) == 0);
ictx = sgsn_mm_ctx_by_tlli(local_tlli, &raid);
@ -222,6 +284,7 @@ int main(int argc, char **argv)
test_llme();
test_gmm_detach();
test_gmm_detach_power_off();
printf("Done\n");
return 0;
}

View File

@ -1,3 +1,4 @@
Testing LLME allocations
Testing GMM detach
Testing GMM detach (power off)
Done