blob: 2e59e13d2d9cedd82a508376b0d75f4f3d18a471 [file] [log] [blame]
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +02001#!/usr/bin/env python
2
3# (C) 2013 by Jacob Erlbeck <jerlbeck@sysmocom.de>
Holger Hans Peter Freythereab2a3f2014-03-04 17:16:58 +01004# (C) 2014 by Holger Hans Peter Freyther
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +02005# based on vty_test_runner.py:
6# (C) 2013 by Katerina Barone-Adesi <kat.obsc@gmail.com>
7# (C) 2013 by Holger Hans Peter Freyther
8# based on bsc_control.py.
9
10# This program is free software: you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation, either version 3 of the License, or
13# (at your option) any later version.
14
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
19
20# You should have received a copy of the GNU General Public License
21# along with this program. If not, see <http://www.gnu.org/licenses/>.
22
23import os
24import time
25import unittest
26import socket
27import sys
28import struct
29
30import osmopy.obscvty as obscvty
31import osmopy.osmoutil as osmoutil
32
Max580fdb52017-05-02 16:10:07 +020033# add $top_srcdir/contrib to find ipa.py
34sys.path.append(os.path.join(sys.path[0], '..', 'contrib'))
35
36from ipa import Ctrl, IPA
37
Neels Hofmeyr6226a362017-02-24 17:55:11 +010038# to be able to find $top_srcdir/doc/...
39confpath = os.path.join(sys.path[0], '..')
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +020040verbose = False
41
42class TestCtrlBase(unittest.TestCase):
43
44 def ctrl_command(self):
45 raise Exception("Needs to be implemented by a subclass")
46
47 def ctrl_app(self):
48 raise Exception("Needs to be implemented by a subclass")
49
50 def setUp(self):
51 osmo_ctrl_cmd = self.ctrl_command()[:]
52 config_index = osmo_ctrl_cmd.index('-c')
53 if config_index:
54 cfi = config_index + 1
55 osmo_ctrl_cmd[cfi] = os.path.join(confpath, osmo_ctrl_cmd[cfi])
56
57 try:
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +020058 self.proc = osmoutil.popen_devnull(osmo_ctrl_cmd)
59 except OSError:
60 print >> sys.stderr, "Current directory: %s" % os.getcwd()
61 print >> sys.stderr, "Consider setting -b"
62 time.sleep(2)
63
64 appstring = self.ctrl_app()[2]
65 appport = self.ctrl_app()[0]
66 self.connect("127.0.0.1", appport)
67 self.next_id = 1000
68
69 def tearDown(self):
70 self.disconnect()
71 osmoutil.end_proc(self.proc)
72
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +020073 def disconnect(self):
74 if not (self.sock is None):
75 self.sock.close()
76
77 def connect(self, host, port):
78 if verbose:
79 print "Connecting to host %s:%i" % (host, port)
80
Neels Hofmeyrfd32c9f2017-02-27 02:01:37 +010081 retries = 30
82 while True:
83 try:
84 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
85 sck.setblocking(1)
86 sck.connect((host, port))
87 except IOError:
88 retries -= 1
89 if retries <= 0:
90 raise
91 time.sleep(.1)
92 continue
93 break
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +020094 self.sock = sck
95 return sck
96
97 def send(self, data):
98 if verbose:
99 print "Sending \"%s\"" %(data)
Max580fdb52017-05-02 16:10:07 +0200100 data = Ctrl().add_header(data)
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200101 return self.sock.send(data) == len(data)
102
103 def send_set(self, var, value, id):
104 setmsg = "SET %s %s %s" %(id, var, value)
105 return self.send(setmsg)
106
107 def send_get(self, var, id):
108 getmsg = "GET %s %s" %(id, var)
109 return self.send(getmsg)
110
111 def do_set(self, var, value):
112 id = self.next_id
113 self.next_id += 1
114 self.send_set(var, value, id)
115 return self.recv_msgs()[id]
116
117 def do_get(self, var):
118 id = self.next_id
119 self.next_id += 1
120 self.send_get(var, id)
121 return self.recv_msgs()[id]
122
123 def recv_msgs(self):
124 responses = {}
125 data = self.sock.recv(4096)
126 while (len(data)>0):
Max580fdb52017-05-02 16:10:07 +0200127 (head, data) = IPA().split_combined(data)
128 answer = Ctrl().rem_header(head)
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200129 if verbose:
130 print "Got message:", answer
131 (mtype, id, msg) = answer.split(None, 2)
132 id = int(id)
133 rsp = {'mtype': mtype, 'id': id}
134 if mtype == "ERROR":
135 rsp['error'] = msg
136 else:
Holger Hans Peter Freyther842137a2014-03-04 15:38:00 +0100137 split = msg.split(None, 1)
138 rsp['var'] = split[0]
139 if len(split) > 1:
140 rsp['value'] = split[1]
141 else:
142 rsp['value'] = None
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200143 responses[id] = rsp
144
145 if verbose:
146 print "Decoded replies: ", responses
147
148 return responses
149
150
151class TestCtrlBSC(TestCtrlBase):
152
153 def tearDown(self):
154 TestCtrlBase.tearDown(self)
155 os.unlink("tmp_dummy_sock")
156
157 def ctrl_command(self):
158 return ["./src/osmo-bsc/osmo-bsc", "-r", "tmp_dummy_sock", "-c",
159 "doc/examples/osmo-bsc/osmo-bsc.cfg"]
160
161 def ctrl_app(self):
162 return (4249, "./src/osmo-bsc/osmo-bsc", "OsmoBSC", "bsc")
163
164 def testCtrlErrs(self):
165 r = self.do_get('invalid')
166 self.assertEquals(r['mtype'], 'ERROR')
167 self.assertEquals(r['error'], 'Command not found')
168
Jacob Erlbeck21f6d152013-09-16 11:20:29 +0200169 r = self.do_set('rf_locked', '999')
170 self.assertEquals(r['mtype'], 'ERROR')
171 self.assertEquals(r['error'], 'Value failed verification.')
172
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200173 r = self.do_get('bts')
174 self.assertEquals(r['mtype'], 'ERROR')
175 self.assertEquals(r['error'], 'Error while parsing the index.')
176
177 r = self.do_get('bts.999')
178 self.assertEquals(r['mtype'], 'ERROR')
179 self.assertEquals(r['error'], 'Error while resolving object')
180
Holger Hans Peter Freytherba8679d2014-11-10 11:41:03 +0100181 def testBtsLac(self):
182 r = self.do_get('bts.0.location-area-code')
183 self.assertEquals(r['mtype'], 'GET_REPLY')
184 self.assertEquals(r['var'], 'bts.0.location-area-code')
185 self.assertEquals(r['value'], '1')
186
187 r = self.do_set('bts.0.location-area-code', '23')
188 self.assertEquals(r['mtype'], 'SET_REPLY')
189 self.assertEquals(r['var'], 'bts.0.location-area-code')
190 self.assertEquals(r['value'], '23')
191
192 r = self.do_get('bts.0.location-area-code')
193 self.assertEquals(r['mtype'], 'GET_REPLY')
194 self.assertEquals(r['var'], 'bts.0.location-area-code')
195 self.assertEquals(r['value'], '23')
196
197 r = self.do_set('bts.0.location-area-code', '-1')
198 self.assertEquals(r['mtype'], 'ERROR')
199 self.assertEquals(r['error'], 'Input not within the range')
200
Holger Hans Peter Freyther982bb292014-11-21 10:54:42 +0100201 def testBtsCi(self):
202 r = self.do_get('bts.0.cell-identity')
203 self.assertEquals(r['mtype'], 'GET_REPLY')
204 self.assertEquals(r['var'], 'bts.0.cell-identity')
205 self.assertEquals(r['value'], '0')
206
207 r = self.do_set('bts.0.cell-identity', '23')
208 self.assertEquals(r['mtype'], 'SET_REPLY')
209 self.assertEquals(r['var'], 'bts.0.cell-identity')
210 self.assertEquals(r['value'], '23')
211
212 r = self.do_get('bts.0.cell-identity')
213 self.assertEquals(r['mtype'], 'GET_REPLY')
214 self.assertEquals(r['var'], 'bts.0.cell-identity')
215 self.assertEquals(r['value'], '23')
216
217 r = self.do_set('bts.0.cell-identity', '-1')
218 self.assertEquals(r['mtype'], 'ERROR')
219 self.assertEquals(r['error'], 'Input not within the range')
220
Holger Hans Peter Freytherd0284c82014-11-21 11:18:45 +0100221 def testBtsGenerateSystemInformation(self):
222 r = self.do_get('bts.0.send-new-system-informations')
223 self.assertEquals(r['mtype'], 'ERROR')
Max78a58032017-01-11 18:37:55 +0100224 self.assertEquals(r['error'], 'Write Only attribute')
Holger Hans Peter Freytherd0284c82014-11-21 11:18:45 +0100225
226 # No RSL links so it will fail
227 r = self.do_set('bts.0.send-new-system-informations', '1')
228 self.assertEquals(r['mtype'], 'ERROR')
229 self.assertEquals(r['error'], 'Failed to generate SI')
230
Holger Hans Peter Freyther9fe98462014-12-05 12:03:24 +0100231 def testBtsChannelLoad(self):
232 r = self.do_set('bts.0.channel-load', '1')
233 self.assertEquals(r['mtype'], 'ERROR')
Max78a58032017-01-11 18:37:55 +0100234 self.assertEquals(r['error'], 'Read Only attribute')
Holger Hans Peter Freyther9fe98462014-12-05 12:03:24 +0100235
236 # No RSL link so everything is 0
237 r = self.do_get('bts.0.channel-load')
238 self.assertEquals(r['mtype'], 'GET_REPLY')
Neels Hofmeyr266e7e02016-07-23 16:14:06 +0200239 self.assertEquals(r['value'],
240 'CCCH+SDCCH4,0,0 TCH/F,0,0 TCH/H,0,0 SDCCH8,0,0'
241 + ' TCH/F_PDCH,0,0 CCCH+SDCCH4+CBCH,0,0'
242 + ' SDCCH8+CBCH,0,0 TCH/F_TCH/H_PDCH,0,0')
Holger Hans Peter Freyther9fe98462014-12-05 12:03:24 +0100243
Holger Hans Peter Freyther0c47d9e2014-12-05 14:44:21 +0100244 def testBtsOmlConnectionState(self):
245 """Check OML state. It will not be connected"""
246 r = self.do_set('bts.0.oml-connection-state', '1')
247 self.assertEquals(r['mtype'], 'ERROR')
Max78a58032017-01-11 18:37:55 +0100248 self.assertEquals(r['error'], 'Read Only attribute')
Holger Hans Peter Freyther0c47d9e2014-12-05 14:44:21 +0100249
250 # No RSL link so everything is 0
251 r = self.do_get('bts.0.oml-connection-state')
252 self.assertEquals(r['mtype'], 'GET_REPLY')
253 self.assertEquals(r['value'], 'disconnected')
254
Holger Hans Peter Freyther2de46892014-03-23 11:17:27 +0100255 def testTrxPowerRed(self):
256 r = self.do_get('bts.0.trx.0.max-power-reduction')
257 self.assertEquals(r['mtype'], 'GET_REPLY')
258 self.assertEquals(r['var'], 'bts.0.trx.0.max-power-reduction')
259 self.assertEquals(r['value'], '20')
260
261 r = self.do_set('bts.0.trx.0.max-power-reduction', '22')
262 self.assertEquals(r['mtype'], 'SET_REPLY')
263 self.assertEquals(r['var'], 'bts.0.trx.0.max-power-reduction')
264 self.assertEquals(r['value'], '22')
265
266 r = self.do_get('bts.0.trx.0.max-power-reduction')
267 self.assertEquals(r['mtype'], 'GET_REPLY')
268 self.assertEquals(r['var'], 'bts.0.trx.0.max-power-reduction')
269 self.assertEquals(r['value'], '22')
270
271 r = self.do_set('bts.0.trx.0.max-power-reduction', '1')
272 self.assertEquals(r['mtype'], 'ERROR')
273 self.assertEquals(r['error'], 'Value must be even')
274
Holger Hans Peter Freytherb96705b2013-01-09 19:55:04 +0100275 def testTrxArfcn(self):
276 r = self.do_get('bts.0.trx.0.arfcn')
277 self.assertEquals(r['mtype'], 'GET_REPLY')
278 self.assertEquals(r['var'], 'bts.0.trx.0.arfcn')
279 self.assertEquals(r['value'], '871')
280
281 r = self.do_set('bts.0.trx.0.arfcn', '873')
282 self.assertEquals(r['mtype'], 'SET_REPLY')
283 self.assertEquals(r['var'], 'bts.0.trx.0.arfcn')
284 self.assertEquals(r['value'], '873')
285
286 r = self.do_get('bts.0.trx.0.arfcn')
287 self.assertEquals(r['mtype'], 'GET_REPLY')
288 self.assertEquals(r['var'], 'bts.0.trx.0.arfcn')
289 self.assertEquals(r['value'], '873')
290
291 r = self.do_set('bts.0.trx.0.arfcn', '2000')
292 self.assertEquals(r['mtype'], 'ERROR')
293 self.assertEquals(r['error'], 'Input not within the range')
294
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200295 def testRfLock(self):
296 r = self.do_get('bts.0.rf_state')
297 self.assertEquals(r['mtype'], 'GET_REPLY')
298 self.assertEquals(r['var'], 'bts.0.rf_state')
299 self.assertEquals(r['value'], 'inoperational,unlocked,on')
300
301 r = self.do_set('rf_locked', '1')
302 self.assertEquals(r['mtype'], 'SET_REPLY')
303 self.assertEquals(r['var'], 'rf_locked')
304 self.assertEquals(r['value'], '1')
305
306 time.sleep(1.5)
307
308 r = self.do_get('bts.0.rf_state')
309 self.assertEquals(r['mtype'], 'GET_REPLY')
310 self.assertEquals(r['var'], 'bts.0.rf_state')
311 self.assertEquals(r['value'], 'inoperational,locked,off')
312
Holger Hans Peter Freytherd476a802015-02-10 23:03:25 +0100313 r = self.do_get('rf_locked')
314 self.assertEquals(r['mtype'], 'GET_REPLY')
315 self.assertEquals(r['var'], 'rf_locked')
316 self.assertEquals(r['value'], 'state=off,policy=off')
317
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200318 r = self.do_set('rf_locked', '0')
319 self.assertEquals(r['mtype'], 'SET_REPLY')
320 self.assertEquals(r['var'], 'rf_locked')
321 self.assertEquals(r['value'], '0')
322
323 time.sleep(1.5)
324
325 r = self.do_get('bts.0.rf_state')
326 self.assertEquals(r['mtype'], 'GET_REPLY')
327 self.assertEquals(r['var'], 'bts.0.rf_state')
328 self.assertEquals(r['value'], 'inoperational,unlocked,on')
329
Holger Hans Peter Freytherd476a802015-02-10 23:03:25 +0100330 r = self.do_get('rf_locked')
331 self.assertEquals(r['mtype'], 'GET_REPLY')
332 self.assertEquals(r['var'], 'rf_locked')
333 self.assertEquals(r['value'], 'state=off,policy=on')
334
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200335 def testTimezone(self):
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200336 r = self.do_get('timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200337 self.assertEquals(r['mtype'], 'GET_REPLY')
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200338 self.assertEquals(r['var'], 'timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200339 self.assertEquals(r['value'], 'off')
340
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200341 r = self.do_set('timezone', '-2,15,2')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200342 self.assertEquals(r['mtype'], 'SET_REPLY')
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200343 self.assertEquals(r['var'], 'timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200344 self.assertEquals(r['value'], '-2,15,2')
345
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200346 r = self.do_get('timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200347 self.assertEquals(r['mtype'], 'GET_REPLY')
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200348 self.assertEquals(r['var'], 'timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200349 self.assertEquals(r['value'], '-2,15,2')
350
351 # Test invalid input
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200352 r = self.do_set('timezone', '-2,15,2,5,6,7')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200353 self.assertEquals(r['mtype'], 'SET_REPLY')
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200354 self.assertEquals(r['var'], 'timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200355 self.assertEquals(r['value'], '-2,15,2')
356
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200357 r = self.do_set('timezone', '-2,15')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200358 self.assertEquals(r['mtype'], 'ERROR')
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200359 r = self.do_set('timezone', '-2')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200360 self.assertEquals(r['mtype'], 'ERROR')
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200361 r = self.do_set('timezone', '1')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200362
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200363 r = self.do_set('timezone', 'off')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200364 self.assertEquals(r['mtype'], 'SET_REPLY')
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200365 self.assertEquals(r['var'], 'timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200366 self.assertEquals(r['value'], 'off')
367
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200368 r = self.do_get('timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200369 self.assertEquals(r['mtype'], 'GET_REPLY')
Neels Hofmeyr21edaef2016-05-10 13:29:33 +0200370 self.assertEquals(r['var'], 'timezone')
Jacob Erlbeck64e143a2013-10-01 13:26:42 +0200371 self.assertEquals(r['value'], 'off')
372
Holger Hans Peter Freytherf9fe3232014-04-24 10:30:05 +0200373 def testMcc(self):
374 r = self.do_set('mcc', '23')
375 r = self.do_get('mcc')
376 self.assertEquals(r['mtype'], 'GET_REPLY')
377 self.assertEquals(r['var'], 'mcc')
378 self.assertEquals(r['value'], '23')
379
380 r = self.do_set('mcc', '023')
381 r = self.do_get('mcc')
382 self.assertEquals(r['mtype'], 'GET_REPLY')
383 self.assertEquals(r['var'], 'mcc')
384 self.assertEquals(r['value'], '23')
385
386 def testMnc(self):
387 r = self.do_set('mnc', '9')
388 r = self.do_get('mnc')
389 self.assertEquals(r['mtype'], 'GET_REPLY')
390 self.assertEquals(r['var'], 'mnc')
391 self.assertEquals(r['value'], '9')
392
393 r = self.do_set('mnc', '09')
394 r = self.do_get('mnc')
395 self.assertEquals(r['mtype'], 'GET_REPLY')
396 self.assertEquals(r['var'], 'mnc')
397 self.assertEquals(r['value'], '9')
398
399
Holger Hans Peter Freythereab2a3f2014-03-04 17:16:58 +0100400 def testMccMncApply(self):
401 # Test some invalid input
402 r = self.do_set('mcc-mnc-apply', 'WRONG')
403 self.assertEquals(r['mtype'], 'ERROR')
404
405 r = self.do_set('mcc-mnc-apply', '1,')
406 self.assertEquals(r['mtype'], 'ERROR')
407
408 r = self.do_set('mcc-mnc-apply', '200,3')
409 self.assertEquals(r['mtype'], 'SET_REPLY')
410 self.assertEquals(r['var'], 'mcc-mnc-apply')
411 self.assertEquals(r['value'], 'Tried to drop the BTS')
412
413 # Set it again
414 r = self.do_set('mcc-mnc-apply', '200,3')
415 self.assertEquals(r['mtype'], 'SET_REPLY')
416 self.assertEquals(r['var'], 'mcc-mnc-apply')
417 self.assertEquals(r['value'], 'Nothing changed')
418
419 # Change it
420 r = self.do_set('mcc-mnc-apply', '200,4')
421 self.assertEquals(r['mtype'], 'SET_REPLY')
422 self.assertEquals(r['var'], 'mcc-mnc-apply')
423 self.assertEquals(r['value'], 'Tried to drop the BTS')
424
425 # Change it
426 r = self.do_set('mcc-mnc-apply', '201,4')
427 self.assertEquals(r['mtype'], 'SET_REPLY')
428 self.assertEquals(r['var'], 'mcc-mnc-apply')
429 self.assertEquals(r['value'], 'Tried to drop the BTS')
430
431 # Verify
432 r = self.do_get('mnc')
433 self.assertEquals(r['mtype'], 'GET_REPLY')
434 self.assertEquals(r['var'], 'mnc')
435 self.assertEquals(r['value'], '4')
436
437 r = self.do_get('mcc')
438 self.assertEquals(r['mtype'], 'GET_REPLY')
439 self.assertEquals(r['var'], 'mcc')
440 self.assertEquals(r['value'], '201')
441
Holger Hans Peter Freytherf9fe3232014-04-24 10:30:05 +0200442 # Change it
443 r = self.do_set('mcc-mnc-apply', '202,03')
444 self.assertEquals(r['mtype'], 'SET_REPLY')
445 self.assertEquals(r['var'], 'mcc-mnc-apply')
446 self.assertEquals(r['value'], 'Tried to drop the BTS')
447
448 r = self.do_get('mnc')
449 self.assertEquals(r['mtype'], 'GET_REPLY')
450 self.assertEquals(r['var'], 'mnc')
451 self.assertEquals(r['value'], '3')
452
453 r = self.do_get('mcc')
454 self.assertEquals(r['mtype'], 'GET_REPLY')
455 self.assertEquals(r['var'], 'mcc')
456 self.assertEquals(r['value'], '202')
457
Holger Hans Peter Freyther842137a2014-03-04 15:38:00 +0100458class TestCtrlNAT(TestCtrlBase):
459
460 def ctrl_command(self):
461 return ["./src/osmo-bsc_nat/osmo-bsc_nat", "-c",
462 "doc/examples/osmo-bsc_nat/osmo-bsc_nat.cfg"]
463
464 def ctrl_app(self):
465 return (4250, "./src/osmo-bsc_nat/osmo-bsc_nat", "OsmoNAT", "nat")
466
467 def testAccessList(self):
468 r = self.do_get('net.0.bsc_cfg.0.access-list-name')
469 self.assertEquals(r['mtype'], 'GET_REPLY')
470 self.assertEquals(r['var'], 'net')
471 self.assertEquals(r['value'], None)
472
473 r = self.do_set('net.0.bsc_cfg.0.access-list-name', 'bla')
474 self.assertEquals(r['mtype'], 'SET_REPLY')
475 self.assertEquals(r['var'], 'net')
476 self.assertEquals(r['value'], 'bla')
477
478 r = self.do_get('net.0.bsc_cfg.0.access-list-name')
479 self.assertEquals(r['mtype'], 'GET_REPLY')
480 self.assertEquals(r['var'], 'net')
481 self.assertEquals(r['value'], 'bla')
482
483 r = self.do_set('net.0.bsc_cfg.0.no-access-list-name', '1')
484 self.assertEquals(r['mtype'], 'SET_REPLY')
485 self.assertEquals(r['var'], 'net')
486 self.assertEquals(r['value'], None)
487
Holger Hans Peter Freyther56ec6a72014-12-09 19:13:00 +0100488 r = self.do_get('net.0.bsc_cfg.0.access-list-name')
489 self.assertEquals(r['mtype'], 'GET_REPLY')
Holger Hans Peter Freyther842137a2014-03-04 15:38:00 +0100490 self.assertEquals(r['var'], 'net')
491 self.assertEquals(r['value'], None)
Holger Hans Peter Freythereab2a3f2014-03-04 17:16:58 +0100492
Holger Hans Peter Freyther5bb90f52015-04-05 15:15:36 +0200493 def testAccessListManagement(self):
494 r = self.do_set("net.0.add.allow.access-list.404", "abc")
495 self.assertEquals(r['mtype'], 'ERROR')
496
497 r = self.do_set("net.0.add.allow.access-list.bla", "^234$")
498 self.assertEquals(r['mtype'], 'SET_REPLY')
499 self.assertEquals(r['var'], 'net.0.add.allow.access-list.bla')
500 self.assertEquals(r['value'], 'IMSI allow added to access list')
501
502 # TODO.. find a way to actually see if this rule has been
503 # added. e.g. by implementing a get for the list.
504
Holger Hans Peter Freythere8e5ef22014-03-23 18:08:26 +0100505class TestCtrlSGSN(TestCtrlBase):
506 def ctrl_command(self):
507 return ["./src/gprs/osmo-sgsn", "-c",
508 "doc/examples/osmo-sgsn/osmo-sgsn.cfg"]
509
510 def ctrl_app(self):
511 return (4251, "./src/gprs/osmo-sgsn", "OsmoSGSN", "sgsn")
512
513 def testListSubscribers(self):
514 # TODO. Add command to mark a subscriber as active
515 r = self.do_get('subscriber-list-active-v1')
516 self.assertEquals(r['mtype'], 'GET_REPLY')
517 self.assertEquals(r['var'], 'subscriber-list-active-v1')
518 self.assertEquals(r['value'], None)
519
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200520def add_bsc_test(suite, workdir):
521 if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc/osmo-bsc")):
522 print("Skipping the BSC test")
523 return
524 test = unittest.TestLoader().loadTestsFromTestCase(TestCtrlBSC)
525 suite.addTest(test)
526
Holger Hans Peter Freyther842137a2014-03-04 15:38:00 +0100527def add_nat_test(suite, workdir):
528 if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")):
529 print("Skipping the NAT test")
530 return
531 test = unittest.TestLoader().loadTestsFromTestCase(TestCtrlNAT)
532 suite.addTest(test)
533
Holger Hans Peter Freythere8e5ef22014-03-23 18:08:26 +0100534def add_sgsn_test(suite, workdir):
535 if not os.path.isfile(os.path.join(workdir, "src/gprs/osmo-sgsn")):
536 print("Skipping the SGSN test")
537 return
538 test = unittest.TestLoader().loadTestsFromTestCase(TestCtrlSGSN)
539 suite.addTest(test)
540
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200541if __name__ == '__main__':
542 import argparse
543 import sys
544
545 workdir = '.'
546
547 parser = argparse.ArgumentParser()
548 parser.add_argument("-v", "--verbose", dest="verbose",
549 action="store_true", help="verbose mode")
550 parser.add_argument("-p", "--pythonconfpath", dest="p",
551 help="searchpath for config")
552 parser.add_argument("-w", "--workdir", dest="w",
553 help="Working directory")
554 args = parser.parse_args()
555
556 verbose_level = 1
557 if args.verbose:
558 verbose_level = 2
559 verbose = True
560
561 if args.w:
562 workdir = args.w
563
564 if args.p:
565 confpath = args.p
566
567 print "confpath %s, workdir %s" % (confpath, workdir)
568 os.chdir(workdir)
569 print "Running tests for specific control commands"
570 suite = unittest.TestSuite()
571 add_bsc_test(suite, workdir)
Holger Hans Peter Freyther842137a2014-03-04 15:38:00 +0100572 add_nat_test(suite, workdir)
Holger Hans Peter Freythere8e5ef22014-03-23 18:08:26 +0100573 add_sgsn_test(suite, workdir)
Jacob Erlbeck5741e1f2013-09-16 11:20:28 +0200574 res = unittest.TextTestRunner(verbosity=verbose_level).run(suite)
575 sys.exit(len(res.errors) + len(res.failures))