module FRNET_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 := "hdlc2",
					dlci := 123
				}
			},
			nsvci := 123,
			nsei := 123,
			role_sgsn := true,
			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 := true,
		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() );
}


}
