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 := {
		{
			nsei := 123,
			role_sgsn := true,
			handle_sns := false,
			nsvc := {
				{
					provider := {
						fr := {
							netdev := "hdlc2",
							dlci := 123
						}
					},
					nsvci := 123
				}
			}
		}
	};
}

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() );
}


}
