Fix tests after rate_ctr change

Recent change lin libosmocore disallow registering rate_ctr with the
same name and indexing multiple times. To accommodate to this:

* allocate network struct once and use it for all tests
* deregister rate_ctr group after each test
* free bts struct after each test

Related: OS#2757
Change-Id: Ie1537a1ee9ee812eaaf9f58dc4bc86d4add8c31f
diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c
index 72a1772..d2085a9 100644
--- a/tests/gsm0408/gsm0408_test.c
+++ b/tests/gsm0408/gsm0408_test.c
@@ -144,31 +144,38 @@
 	}
 }
 
-static inline void test_si2q_segfault(void)
+static inline struct gsm_bts *bts_init(void *ctx, struct gsm_network *net, const char *msg)
 {
-	struct gsm_bts *bts;
-	struct gsm_network *network = bsc_network_init(tall_bsc_ctx, 1, 1, NULL);
-	printf("Test SI2quater UARFCN (same scrambling code and diversity):\n");
-
-	if (!network)
+	struct gsm_bts *bts = gsm_bts_alloc(net, 0);
+	if (!bts) {
+		printf("BTS allocation failure in %s()\n", msg);
 		exit(1);
-	bts = gsm_bts_alloc(network, 0);
+	}
+	printf("BTS allocation OK in %s()\n", msg);
+
+	bts->network = net;
+
+	return bts;
+}
+
+static inline void test_si2q_segfault(struct gsm_network *net)
+{
+	struct gsm_bts *bts = bts_init(tall_bsc_ctx, net, __func__);
+	printf("Test SI2quater UARFCN (same scrambling code and diversity):\n");
 
 	_bts_uarfcn_add(bts, 10564, 319, 0);
 	_bts_uarfcn_add(bts, 10612, 319, 0);
 	gen(bts, __func__);
+
+	rate_ctr_group_free(bts->bts_ctrs);
+	talloc_free(bts);
 }
 
-static inline void test_si2q_mu(void)
+static inline void test_si2q_mu(struct gsm_network *net)
 {
-	struct gsm_bts *bts;
-	struct gsm_network *network = bsc_network_init(tall_bsc_ctx, 1, 1, NULL);
+	struct gsm_bts *bts = bts_init(tall_bsc_ctx, net, __func__);
 	printf("Test SI2quater multiple UARFCNs:\n");
 
-	if (!network)
-		exit(1);
-	bts = gsm_bts_alloc(network, 0);
-
 	_bts_uarfcn_add(bts, 10564, 318, 0);
 	_bts_uarfcn_add(bts, 10612, 319, 0);
 	_bts_uarfcn_add(bts, 10612, 31, 0);
@@ -176,19 +183,16 @@
 	_bts_uarfcn_add(bts, 10613, 64, 0);
 	_bts_uarfcn_add(bts, 10613, 164, 0);
 	_bts_uarfcn_add(bts, 10613, 14, 0);
+
+	rate_ctr_group_free(bts->bts_ctrs);
+	talloc_free(bts);
 }
 
-static inline void test_si2q_u(void)
+static inline void test_si2q_u(struct gsm_network *net)
 {
-	struct gsm_bts *bts;
-	struct gsm_network *network = bsc_network_init(NULL, 1, 1, NULL);
+	struct gsm_bts *bts = bts_init(tall_bsc_ctx, net, __func__);
 	printf("Testing SYSINFO_TYPE_2quater UARFCN generation:\n");
 
-	if (!network)
-		exit(1);
-
-	bts = gsm_bts_alloc(network, 0);
-
 	/* first generate invalid SI as no UARFCN added */
 	gen(bts, __func__);
 
@@ -204,19 +208,16 @@
 	_bts_uarfcn_add(bts, 1982, 223, 1);
 	_bts_uarfcn_add(bts, 1982, 14, 0);
 	_bts_uarfcn_add(bts, 1982, 88, 0);
+
+	rate_ctr_group_free(bts->bts_ctrs);
+	talloc_free(bts);
 }
 
-static inline void test_si2q_e(void)
+static inline void test_si2q_e(struct gsm_network *net)
 {
-	struct gsm_bts *bts;
-	struct gsm_network *network = bsc_network_init(NULL, 1, 1, NULL);
+	struct gsm_bts *bts = bts_init(tall_bsc_ctx, net, __func__);
 	printf("Testing SYSINFO_TYPE_2quater EARFCN generation:\n");
 
-	if (!network)
-		exit(1);
-
-	bts = gsm_bts_alloc(network, 0);
-
 	bts->si_common.si2quater_neigh_list.arfcn = bts->si_common.data.earfcn_list;
 	bts->si_common.si2quater_neigh_list.meas_bw = bts->si_common.data.meas_bw_list;
 	bts->si_common.si2quater_neigh_list.length = MAX_EARFCN_LIST;
@@ -237,19 +238,16 @@
 	add_earfcn_b(bts, 1965, OSMO_EARFCN_MEAS_INVALID);
 	add_earfcn_b(bts, 1967, 4);
 	add_earfcn_b(bts, 1982, 3);
+
+	rate_ctr_group_free(bts->bts_ctrs);
+	talloc_free(bts);
 }
 
-static inline void test_si2q_long(void)
+static inline void test_si2q_long(struct gsm_network *net)
 {
-	struct gsm_bts *bts;
-	struct gsm_network *network = bsc_network_init(tall_bsc_ctx, 1, 1, NULL);
+	struct gsm_bts *bts = bts_init(tall_bsc_ctx, net, __func__);
 	printf("Testing SYSINFO_TYPE_2quater combined EARFCN & UARFCN generation:\n");
 
-	if (!network)
-		exit(1);
-
-	bts = gsm_bts_alloc(network, 0);
-
 	bts->si_common.si2quater_neigh_list.arfcn = bts->si_common.data.earfcn_list;
 	bts->si_common.si2quater_neigh_list.meas_bw = bts->si_common.data.meas_bw_list;
 	bts->si_common.si2quater_neigh_list.length = MAX_EARFCN_LIST;
@@ -285,6 +283,9 @@
 	_bts_uarfcn_add(bts, 1976, 224, 1);
 	_bts_uarfcn_add(bts, 1976, 225, 1);
 	_bts_uarfcn_add(bts, 1976, 226, 1);
+
+	rate_ctr_group_free(bts->bts_ctrs);
+	talloc_free(bts);
 }
 
 static void test_mi_functionality(void)
@@ -647,10 +648,10 @@
 	VERIFY(f0, ==, 1);
 }
 
-static void test_si_ba_ind(void)
+static void test_si_ba_ind(struct gsm_network *net)
 {
-	struct gsm_network *network = bsc_network_init(tall_bsc_ctx, 1, 1, NULL);
-	struct gsm_bts *bts = gsm_bts_alloc(network, 0);
+	struct gsm_bts *bts = bts_init(tall_bsc_ctx, net, __func__);
+
 	const struct gsm48_system_information_type_2 *si2 =
 		(struct gsm48_system_information_type_2 *) GSM_BTS_SI(bts, SYSINFO_TYPE_2);
 	const struct gsm48_system_information_type_2bis *si2bis =
@@ -666,7 +667,6 @@
 
 	int rc;
 
-	bts->network = network;
 	bts->c0->arfcn = 23;
 
 	printf("Testing if BA-IND is set as expected in SI2xxx and SI5xxx\n");
@@ -710,9 +710,17 @@
 
 int main(int argc, char **argv)
 {
+	struct gsm_network *net;
+
 	osmo_init_logging(&log_info);
 	log_set_log_level(osmo_stderr_target, LOGL_INFO);
 
+	net = bsc_network_init(tall_bsc_ctx, 1, 1, NULL);
+	if (!net) {
+		printf("Network init failure.\n");
+		return EXIT_FAILURE;
+	}
+
 	test_location_area_identifier();
 	test_mi_functionality();
 
@@ -721,13 +729,13 @@
 	test_print_encoding();
 	test_range_encoding();
 
-	test_si2q_segfault();
-	test_si2q_e();
-	test_si2q_u();
-	test_si2q_mu();
-	test_si2q_long();
+	test_si2q_segfault(net);
+	test_si2q_e(net);
+	test_si2q_u(net);
+	test_si2q_mu(net);
+	test_si2q_long(net);
 
-	test_si_ba_ind();
+	test_si_ba_ind(net);
 
 	printf("Done.\n");