module FR_Tests {

import from General_Types all;
import from Osmocom_Types all;
import from Osmocom_Gb_Types all;

import from NS_Emulation all;
import from BSSGP_Emulation all;

modulepar {
	NSConfigurations mp_nsconfig := {
		{
			provider := {
				fr := {
					netdev := "hdlc1",
					dlci := 123
				}
			},
			nsvci := 123,
			nsei := 123,
			role_sgsn := false,
			handle_sns := false
		}
	};
}

type record GbInstance {
	NS_CT vc_NS,
	BSSGP_CT vc_BSSGP,
	BssgpConfig cfg
};

const integer NUM_GB := 1;
type record length(NUM_GB) of GbInstance GbInstances;
type record length(NUM_GB) of NSConfiguration NSConfigurations;
type record length(NUM_GB) of BssgpCellId BssgpCellIds;


type component test_CT {
	var GbInstances g_gb;
};

private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
	var charstring id_idx := id & int2str(offset);
	gb.vc_NS := NS_CT.create(id_idx & "-NSemu");
	gb.vc_BSSGP := BSSGP_CT.create(id_idx & "-BSSGPemu");
	connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
	gb.vc_NS.start(NSStart(mp_nsconfig[offset], id_idx));
	gb.vc_BSSGP.start(BssgpStart(gb.cfg, testcasename()));
}

testcase TC_foo() runs on test_CT {
	g_gb[0].cfg := {
		nsei := 123,
		sgsn_role := false,
		bvc := {
			{
				bvci := 1123,
				cell_id := {
					ra_id := {
						lai := {
							mcc_mnc := '262F42'H,
							lac := 11123
						},
						rac := 1
					},
					cell_id := 31123
				},
				depth := BSSGP_DECODE_DEPTH_LLC
			}
		}
	};
	f_init_gb(g_gb[0], "gb", 0);
	while (true) {
		f_sleep(100.0);
	}
}

control {
	execute( TC_foo() );
}

}
