initial import

The original osmo-gsm-tester was an internal development at sysmocom, mostly by
D. Laszlo Sitzer <dlsitzer@sysmocom.de>, of which this public osmo-gsm-tester
is a refactoring / rewrite.

This imports an early state of the refactoring and is not functional yet. Bits
from the earlier osmo-gsm-tester will be added as needed. The earlier commit
history is not imported.
diff --git a/test/template_test.ok b/test/template_test.ok
new file mode 100644
index 0000000..0ccc23a
--- /dev/null
+++ b/test/template_test.ok
@@ -0,0 +1,151 @@
+- Testing: fill a config file with values
+cnf Templates DBG: rendering osmo-nitb.cfg.tmpl
+!
+! OpenBSC configuration saved from vty
+!
+password foo
+!
+log stderr
+ logging filter all 1
+ logging color 0
+ logging print category 0
+ logging print extended-timestamp 1
+ logging level all debug
+!
+line vty
+ no login
+ bind val_vty_bind_ip
+!
+e1_input
+ e1_line 0 driver ipa
+ ipa bind val_abis_bind_ip
+network
+ network country code val_mcc
+ mobile network code val_mnc
+ short name val_net_name_short
+ long name val_net_name_long
+ auth policy val_net_auth_policy
+ location updating reject cause 13
+ encryption a5 val_encryption
+ neci 1
+ rrlp mode none
+ mm info 1
+ handover 0
+ handover window rxlev averaging 10
+ handover window rxqual averaging 1
+ handover window rxlev neighbor averaging 10
+ handover power budget interval 6
+ handover power budget hysteresis 3
+ handover maximum distance 9999
+ timer t3101 10
+ timer t3103 0
+ timer t3105 0
+ timer t3107 0
+ timer t3109 4
+ timer t3111 0
+ timer t3113 60
+ timer t3115 0
+ timer t3117 0
+ timer t3119 0
+ timer t3141 0
+smpp
+ local-tcp-ip val_smpp_bind_ip 2775
+ system-id test
+ policy closed
+ esme test
+  password test
+  default-route
+ctrl
+ bind val_ctrl_bind_ip
+ bts 0
+  type val_type_bts0
+  band val_band_bts0
+  cell_identity 0
+  location_area_code val_bts.location_area_code_bts0
+  training_sequence_code 7
+  base_station_id_code val_bts.base_station_id_code_bts0
+  ms max power 15
+  cell reselection hysteresis 4
+  rxlev access min 0
+  channel allocator ascending
+  rach tx integer 9
+  rach max transmission 7
+  ip.access unit_id val_bts.unit_id_bts0 0
+  oml ip.access stream_id val_bts.stream_id_bts0 line 0
+  gprs mode none
+  trx 0
+   rf_locked 0
+   arfcn val_trx_arfcn_trx0
+   nominal power 23
+   max_power_red val_trx_max_power_red_trx0
+   rsl e1 tei 0
+   timeslot 0
+    phys_chan_config val_phys_chan_config_0
+   timeslot 1
+    phys_chan_config val_phys_chan_config_1
+   timeslot 2
+    phys_chan_config val_phys_chan_config_2
+   timeslot 3
+    phys_chan_config val_phys_chan_config_3
+  trx 1
+   rf_locked 0
+   arfcn val_trx_arfcn_trx1
+   nominal power 23
+   max_power_red val_trx_max_power_red_trx1
+   rsl e1 tei 0
+   timeslot 0
+    phys_chan_config val_phys_chan_config_0
+   timeslot 1
+    phys_chan_config val_phys_chan_config_1
+   timeslot 2
+    phys_chan_config val_phys_chan_config_2
+   timeslot 3
+    phys_chan_config val_phys_chan_config_3
+ bts 1
+  type val_type_bts1
+  band val_band_bts1
+  cell_identity 0
+  location_area_code val_bts.location_area_code_bts1
+  training_sequence_code 7
+  base_station_id_code val_bts.base_station_id_code_bts1
+  ms max power 15
+  cell reselection hysteresis 4
+  rxlev access min 0
+  channel allocator ascending
+  rach tx integer 9
+  rach max transmission 7
+  ip.access unit_id val_bts.unit_id_bts1 0
+  oml ip.access stream_id val_bts.stream_id_bts1 line 0
+  gprs mode none
+  trx 0
+   rf_locked 0
+   arfcn val_trx_arfcn_trx0
+   nominal power 23
+   max_power_red val_trx_max_power_red_trx0
+   rsl e1 tei 0
+   timeslot 0
+    phys_chan_config val_phys_chan_config_0
+   timeslot 1
+    phys_chan_config val_phys_chan_config_1
+   timeslot 2
+    phys_chan_config val_phys_chan_config_2
+   timeslot 3
+    phys_chan_config val_phys_chan_config_3
+  trx 1
+   rf_locked 0
+   arfcn val_trx_arfcn_trx1
+   nominal power 23
+   max_power_red val_trx_max_power_red_trx1
+   rsl e1 tei 0
+   timeslot 0
+    phys_chan_config val_phys_chan_config_0
+   timeslot 1
+    phys_chan_config val_phys_chan_config_1
+   timeslot 2
+    phys_chan_config val_phys_chan_config_2
+   timeslot 3
+    phys_chan_config val_phys_chan_config_3
+
+- Testing: expect to fail on invalid templates dir
+sucess: setting non-existing templates dir raised RuntimeError
+