/* (C) 2008 by Jan Luebbe * (C) 2009 by Holger Hans Peter Freyther * (C) 2014 by Alexander Chemeris * All Rights Reserved * * This program 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. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include #include #include struct llist_head *bsc_subscribers; #define VERBOSE_ASSERT(val, expect_op, fmt) \ do { \ printf(#val " == " fmt "\n", (val)); \ OSMO_ASSERT((val) expect_op); \ } while (0); static void assert_bsc_subscr(const struct bsc_subscr *bsub, const char *imsi) { struct bsc_subscr *sfound; OSMO_ASSERT(bsub); OSMO_ASSERT(strcmp(bsub->imsi, imsi) == 0); sfound = bsc_subscr_find_by_imsi(bsc_subscribers, imsi); OSMO_ASSERT(sfound == bsub); bsc_subscr_put(sfound); } static void test_bsc_subscr(void) { struct bsc_subscr *s1, *s2, *s3; const char *imsi1 = "1234567890"; const char *imsi2 = "9876543210"; const char *imsi3 = "5656565656"; printf("Test BSC subscriber allocation and deletion\n"); /* Check for emptiness */ VERBOSE_ASSERT(llist_count(bsc_subscribers), == 0, "%d"); OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1) == NULL); OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2) == NULL); OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi3) == NULL); /* Allocate entry 1 */ s1 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi1); VERBOSE_ASSERT(llist_count(bsc_subscribers), == 1, "%d"); assert_bsc_subscr(s1, imsi1); VERBOSE_ASSERT(llist_count(bsc_subscribers), == 1, "%d"); OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2) == NULL); /* Allocate entry 2 */ s2 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi2); VERBOSE_ASSERT(llist_count(bsc_subscribers), == 2, "%d"); /* Allocate entry 3 */ s3 = bsc_subscr_find_or_create_by_imsi(bsc_subscribers, imsi3); VERBOSE_ASSERT(llist_count(bsc_subscribers), == 3, "%d"); /* Check entries */ assert_bsc_subscr(s1, imsi1); assert_bsc_subscr(s2, imsi2); assert_bsc_subscr(s3, imsi3); /* Free entry 1 */ bsc_subscr_put(s1); s1 = NULL; VERBOSE_ASSERT(llist_count(bsc_subscribers), == 2, "%d"); OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1) == NULL); assert_bsc_subscr(s2, imsi2); assert_bsc_subscr(s3, imsi3); /* Free entry 2 */ bsc_subscr_put(s2); s2 = NULL; VERBOSE_ASSERT(llist_count(bsc_subscribers), == 1, "%d"); OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi1) == NULL); OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi2) == NULL); assert_bsc_subscr(s3, imsi3); /* Free entry 3 */ bsc_subscr_put(s3); s3 = NULL; VERBOSE_ASSERT(llist_count(bsc_subscribers), == 0, "%d"); OSMO_ASSERT(bsc_subscr_find_by_imsi(bsc_subscribers, imsi3) == NULL); OSMO_ASSERT(llist_empty(bsc_subscribers)); } static const struct log_info_cat log_categories[] = { [DREF] = { .name = "DREF", .description = "Reference Counting", .enabled = 1, .loglevel = LOGL_DEBUG, }, }; static const struct log_info log_info = { .cat = log_categories, .num_cat = ARRAY_SIZE(log_categories), }; int main() { void *ctx = talloc_named_const(NULL, 0, "bsc_subscr_test"); printf("Testing BSC subscriber core code.\n"); osmo_init_logging2(ctx, &log_info); log_set_print_filename(osmo_stderr_target, 0); log_set_print_timestamp(osmo_stderr_target, 0); log_set_use_color(osmo_stderr_target, 0); log_set_print_category(osmo_stderr_target, 1); bsc_subscribers = talloc_zero(ctx, struct llist_head); INIT_LLIST_HEAD(bsc_subscribers); test_bsc_subscr(); printf("Done\n"); return 0; }