blob: 5d2af859a31ecfd01840171dd793210bfe45b8ba [file] [log] [blame]
Oliver Smithe1f08442019-12-09 15:13:44 +01001#!/usr/bin/env python3
Jacob Erlbeck0760a832013-09-16 11:20:28 +02002
3# (C) 2013 by Jacob Erlbeck <jerlbeck@sysmocom.de>
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +01004# (C) 2014 by Holger Hans Peter Freyther
Jacob Erlbeck0760a832013-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
Maxf8dc5262017-12-19 18:04:18 +010032from osmopy.osmo_ipa import Ctrl, IPA
Max310b7302017-05-02 16:10:07 +020033
Neels Hofmeyr476c4bb2017-02-24 17:55:11 +010034# to be able to find $top_srcdir/doc/...
35confpath = os.path.join(sys.path[0], '..')
Jacob Erlbeck0760a832013-09-16 11:20:28 +020036verbose = False
37
38class TestCtrlBase(unittest.TestCase):
39
40 def ctrl_command(self):
41 raise Exception("Needs to be implemented by a subclass")
42
43 def ctrl_app(self):
44 raise Exception("Needs to be implemented by a subclass")
45
46 def setUp(self):
47 osmo_ctrl_cmd = self.ctrl_command()[:]
48 config_index = osmo_ctrl_cmd.index('-c')
49 if config_index:
50 cfi = config_index + 1
51 osmo_ctrl_cmd[cfi] = os.path.join(confpath, osmo_ctrl_cmd[cfi])
52
53 try:
Jacob Erlbeck0760a832013-09-16 11:20:28 +020054 self.proc = osmoutil.popen_devnull(osmo_ctrl_cmd)
55 except OSError:
Oliver Smithe1f08442019-12-09 15:13:44 +010056 print("Current directory: %s" % os.getcwd(), file=sys.stderr)
57 print("Consider setting -b", file=sys.stderr)
Jacob Erlbeck0760a832013-09-16 11:20:28 +020058
59 appstring = self.ctrl_app()[2]
60 appport = self.ctrl_app()[0]
61 self.connect("127.0.0.1", appport)
62 self.next_id = 1000
63
64 def tearDown(self):
65 self.disconnect()
66 osmoutil.end_proc(self.proc)
67
Jacob Erlbeck0760a832013-09-16 11:20:28 +020068 def disconnect(self):
69 if not (self.sock is None):
70 self.sock.close()
71
72 def connect(self, host, port):
73 if verbose:
Oliver Smithe1f08442019-12-09 15:13:44 +010074 print("Connecting to host %s:%i" % (host, port))
Jacob Erlbeck0760a832013-09-16 11:20:28 +020075
Neels Hofmeyracc6e832017-02-27 02:01:37 +010076 retries = 30
77 while True:
78 try:
79 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
80 sck.setblocking(1)
81 sck.connect((host, port))
82 except IOError:
83 retries -= 1
84 if retries <= 0:
85 raise
86 time.sleep(.1)
87 continue
88 break
Jacob Erlbeck0760a832013-09-16 11:20:28 +020089 self.sock = sck
90 return sck
91
92 def send(self, data):
93 if verbose:
Oliver Smithe1f08442019-12-09 15:13:44 +010094 print("Sending \"%s\"" %(data))
Max310b7302017-05-02 16:10:07 +020095 data = Ctrl().add_header(data)
Jacob Erlbeck0760a832013-09-16 11:20:28 +020096 return self.sock.send(data) == len(data)
97
98 def send_set(self, var, value, id):
99 setmsg = "SET %s %s %s" %(id, var, value)
100 return self.send(setmsg)
101
102 def send_get(self, var, id):
103 getmsg = "GET %s %s" %(id, var)
104 return self.send(getmsg)
105
106 def do_set(self, var, value):
107 id = self.next_id
108 self.next_id += 1
109 self.send_set(var, value, id)
110 return self.recv_msgs()[id]
111
112 def do_get(self, var):
113 id = self.next_id
114 self.next_id += 1
115 self.send_get(var, id)
116 return self.recv_msgs()[id]
117
118 def recv_msgs(self):
119 responses = {}
120 data = self.sock.recv(4096)
121 while (len(data)>0):
Max310b7302017-05-02 16:10:07 +0200122 (head, data) = IPA().split_combined(data)
Oliver Smithe1f08442019-12-09 15:13:44 +0100123 answer = Ctrl().rem_header(head).decode()
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200124 if verbose:
Oliver Smithe1f08442019-12-09 15:13:44 +0100125 print("Got message:", answer)
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200126 (mtype, id, msg) = answer.split(None, 2)
127 id = int(id)
128 rsp = {'mtype': mtype, 'id': id}
129 if mtype == "ERROR":
130 rsp['error'] = msg
131 else:
Holger Hans Peter Freyther4ecc6872014-03-04 15:38:00 +0100132 split = msg.split(None, 1)
133 rsp['var'] = split[0]
134 if len(split) > 1:
135 rsp['value'] = split[1]
136 else:
137 rsp['value'] = None
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200138 responses[id] = rsp
139
140 if verbose:
Oliver Smithe1f08442019-12-09 15:13:44 +0100141 print("Decoded replies: ", responses)
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200142
143 return responses
144
145
146class TestCtrlBSC(TestCtrlBase):
147
148 def tearDown(self):
149 TestCtrlBase.tearDown(self)
150 os.unlink("tmp_dummy_sock")
151
152 def ctrl_command(self):
153 return ["./src/osmo-bsc/osmo-bsc", "-r", "tmp_dummy_sock", "-c",
154 "doc/examples/osmo-bsc/osmo-bsc.cfg"]
155
156 def ctrl_app(self):
157 return (4249, "./src/osmo-bsc/osmo-bsc", "OsmoBSC", "bsc")
158
159 def testCtrlErrs(self):
160 r = self.do_get('invalid')
Oliver Smithe1f08442019-12-09 15:13:44 +0100161 self.assertEqual(r['mtype'], 'ERROR')
162 self.assertEqual(r['error'], 'Command not found')
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200163
Jacob Erlbeck4f13d032013-09-16 11:20:29 +0200164 r = self.do_set('rf_locked', '999')
Oliver Smithe1f08442019-12-09 15:13:44 +0100165 self.assertEqual(r['mtype'], 'ERROR')
166 self.assertEqual(r['error'], 'Value failed verification.')
Jacob Erlbeck4f13d032013-09-16 11:20:29 +0200167
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200168 r = self.do_get('bts')
Oliver Smithe1f08442019-12-09 15:13:44 +0100169 self.assertEqual(r['mtype'], 'ERROR')
170 self.assertEqual(r['error'], 'Error while parsing the index.')
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200171
172 r = self.do_get('bts.999')
Oliver Smithe1f08442019-12-09 15:13:44 +0100173 self.assertEqual(r['mtype'], 'ERROR')
174 self.assertEqual(r['error'], 'Error while resolving object')
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200175
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100176 def testBtsLac(self):
177 r = self.do_get('bts.0.location-area-code')
Oliver Smithe1f08442019-12-09 15:13:44 +0100178 self.assertEqual(r['mtype'], 'GET_REPLY')
179 self.assertEqual(r['var'], 'bts.0.location-area-code')
180 self.assertEqual(r['value'], '1')
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100181
182 r = self.do_set('bts.0.location-area-code', '23')
Oliver Smithe1f08442019-12-09 15:13:44 +0100183 self.assertEqual(r['mtype'], 'SET_REPLY')
184 self.assertEqual(r['var'], 'bts.0.location-area-code')
185 self.assertEqual(r['value'], '23')
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100186
187 r = self.do_get('bts.0.location-area-code')
Oliver Smithe1f08442019-12-09 15:13:44 +0100188 self.assertEqual(r['mtype'], 'GET_REPLY')
189 self.assertEqual(r['var'], 'bts.0.location-area-code')
190 self.assertEqual(r['value'], '23')
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100191
192 r = self.do_set('bts.0.location-area-code', '-1')
Oliver Smithe1f08442019-12-09 15:13:44 +0100193 self.assertEqual(r['mtype'], 'ERROR')
194 self.assertEqual(r['error'], 'Input not within the range')
Holger Hans Peter Freyther054bc242014-11-10 11:41:03 +0100195
Holger Hans Peter Freyther8a641412014-11-21 10:54:42 +0100196 def testBtsCi(self):
197 r = self.do_get('bts.0.cell-identity')
Oliver Smithe1f08442019-12-09 15:13:44 +0100198 self.assertEqual(r['mtype'], 'GET_REPLY')
199 self.assertEqual(r['var'], 'bts.0.cell-identity')
200 self.assertEqual(r['value'], '6969')
Holger Hans Peter Freyther8a641412014-11-21 10:54:42 +0100201
202 r = self.do_set('bts.0.cell-identity', '23')
Oliver Smithe1f08442019-12-09 15:13:44 +0100203 self.assertEqual(r['mtype'], 'SET_REPLY')
204 self.assertEqual(r['var'], 'bts.0.cell-identity')
205 self.assertEqual(r['value'], '23')
Holger Hans Peter Freyther8a641412014-11-21 10:54:42 +0100206
207 r = self.do_get('bts.0.cell-identity')
Oliver Smithe1f08442019-12-09 15:13:44 +0100208 self.assertEqual(r['mtype'], 'GET_REPLY')
209 self.assertEqual(r['var'], 'bts.0.cell-identity')
210 self.assertEqual(r['value'], '23')
Holger Hans Peter Freyther8a641412014-11-21 10:54:42 +0100211
212 r = self.do_set('bts.0.cell-identity', '-1')
Oliver Smithe1f08442019-12-09 15:13:44 +0100213 self.assertEqual(r['mtype'], 'ERROR')
214 self.assertEqual(r['error'], 'Input not within the range')
Holger Hans Peter Freyther8a641412014-11-21 10:54:42 +0100215
Holger Hans Peter Freythera49b2c02014-11-21 11:18:45 +0100216 def testBtsGenerateSystemInformation(self):
217 r = self.do_get('bts.0.send-new-system-informations')
Oliver Smithe1f08442019-12-09 15:13:44 +0100218 self.assertEqual(r['mtype'], 'ERROR')
219 self.assertEqual(r['error'], 'Write Only attribute')
Holger Hans Peter Freythera49b2c02014-11-21 11:18:45 +0100220
221 # No RSL links so it will fail
222 r = self.do_set('bts.0.send-new-system-informations', '1')
Oliver Smithe1f08442019-12-09 15:13:44 +0100223 self.assertEqual(r['mtype'], 'ERROR')
224 self.assertEqual(r['error'], 'Failed to generate SI')
Holger Hans Peter Freythera49b2c02014-11-21 11:18:45 +0100225
Holger Hans Peter Freyther5eebb7a2014-12-05 12:03:24 +0100226 def testBtsChannelLoad(self):
227 r = self.do_set('bts.0.channel-load', '1')
Oliver Smithe1f08442019-12-09 15:13:44 +0100228 self.assertEqual(r['mtype'], 'ERROR')
229 self.assertEqual(r['error'], 'Read Only attribute')
Holger Hans Peter Freyther5eebb7a2014-12-05 12:03:24 +0100230
231 # No RSL link so everything is 0
232 r = self.do_get('bts.0.channel-load')
Oliver Smithe1f08442019-12-09 15:13:44 +0100233 self.assertEqual(r['mtype'], 'GET_REPLY')
234 self.assertEqual(r['value'],
Neels Hofmeyr17a6bab2016-07-23 16:14:06 +0200235 'CCCH+SDCCH4,0,0 TCH/F,0,0 TCH/H,0,0 SDCCH8,0,0'
236 + ' TCH/F_PDCH,0,0 CCCH+SDCCH4+CBCH,0,0'
237 + ' SDCCH8+CBCH,0,0 TCH/F_TCH/H_PDCH,0,0')
Holger Hans Peter Freyther5eebb7a2014-12-05 12:03:24 +0100238
Holger Hans Peter Freyther1f6cce72014-12-05 14:44:21 +0100239 def testBtsOmlConnectionState(self):
240 """Check OML state. It will not be connected"""
241 r = self.do_set('bts.0.oml-connection-state', '1')
Oliver Smithe1f08442019-12-09 15:13:44 +0100242 self.assertEqual(r['mtype'], 'ERROR')
243 self.assertEqual(r['error'], 'Read Only attribute')
Holger Hans Peter Freyther1f6cce72014-12-05 14:44:21 +0100244
245 # No RSL link so everything is 0
246 r = self.do_get('bts.0.oml-connection-state')
Oliver Smithe1f08442019-12-09 15:13:44 +0100247 self.assertEqual(r['mtype'], 'GET_REPLY')
248 self.assertEqual(r['value'], 'disconnected')
Holger Hans Peter Freyther1f6cce72014-12-05 14:44:21 +0100249
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100250 def testTrxPowerRed(self):
251 r = self.do_get('bts.0.trx.0.max-power-reduction')
Oliver Smithe1f08442019-12-09 15:13:44 +0100252 self.assertEqual(r['mtype'], 'GET_REPLY')
253 self.assertEqual(r['var'], 'bts.0.trx.0.max-power-reduction')
254 self.assertEqual(r['value'], '20')
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100255
256 r = self.do_set('bts.0.trx.0.max-power-reduction', '22')
Oliver Smithe1f08442019-12-09 15:13:44 +0100257 self.assertEqual(r['mtype'], 'SET_REPLY')
258 self.assertEqual(r['var'], 'bts.0.trx.0.max-power-reduction')
259 self.assertEqual(r['value'], '22')
Pau Espin Pedrolf8757832020-10-02 19:30:31 +0200260
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100261 r = self.do_get('bts.0.trx.0.max-power-reduction')
Oliver Smithe1f08442019-12-09 15:13:44 +0100262 self.assertEqual(r['mtype'], 'GET_REPLY')
263 self.assertEqual(r['var'], 'bts.0.trx.0.max-power-reduction')
264 self.assertEqual(r['value'], '22')
Pau Espin Pedrolf8757832020-10-02 19:30:31 +0200265
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100266 r = self.do_set('bts.0.trx.0.max-power-reduction', '1')
Oliver Smithe1f08442019-12-09 15:13:44 +0100267 self.assertEqual(r['mtype'], 'ERROR')
268 self.assertEqual(r['error'], 'Value must be even')
Holger Hans Peter Freytherd092f482014-03-23 11:17:27 +0100269
Holger Hans Peter Freyther175a2402013-01-09 19:55:04 +0100270 def testTrxArfcn(self):
271 r = self.do_get('bts.0.trx.0.arfcn')
Oliver Smithe1f08442019-12-09 15:13:44 +0100272 self.assertEqual(r['mtype'], 'GET_REPLY')
273 self.assertEqual(r['var'], 'bts.0.trx.0.arfcn')
274 self.assertEqual(r['value'], '871')
Holger Hans Peter Freyther175a2402013-01-09 19:55:04 +0100275
276 r = self.do_set('bts.0.trx.0.arfcn', '873')
Oliver Smithe1f08442019-12-09 15:13:44 +0100277 self.assertEqual(r['mtype'], 'SET_REPLY')
278 self.assertEqual(r['var'], 'bts.0.trx.0.arfcn')
279 self.assertEqual(r['value'], '873')
Holger Hans Peter Freyther175a2402013-01-09 19:55:04 +0100280
281 r = self.do_get('bts.0.trx.0.arfcn')
Oliver Smithe1f08442019-12-09 15:13:44 +0100282 self.assertEqual(r['mtype'], 'GET_REPLY')
283 self.assertEqual(r['var'], 'bts.0.trx.0.arfcn')
284 self.assertEqual(r['value'], '873')
Holger Hans Peter Freyther175a2402013-01-09 19:55:04 +0100285
286 r = self.do_set('bts.0.trx.0.arfcn', '2000')
Oliver Smithe1f08442019-12-09 15:13:44 +0100287 self.assertEqual(r['mtype'], 'ERROR')
288 self.assertEqual(r['error'], 'Input not within the range')
Holger Hans Peter Freyther175a2402013-01-09 19:55:04 +0100289
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200290 def testRfLock(self):
291 r = self.do_get('bts.0.rf_state')
Oliver Smithe1f08442019-12-09 15:13:44 +0100292 self.assertEqual(r['mtype'], 'GET_REPLY')
293 self.assertEqual(r['var'], 'bts.0.rf_state')
Pau Espin Pedrol12e15472020-10-01 16:14:44 +0200294 self.assertEqual(r['value'], 'inoperational,locked,on')
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200295
296 r = self.do_set('rf_locked', '1')
Oliver Smithe1f08442019-12-09 15:13:44 +0100297 self.assertEqual(r['mtype'], 'SET_REPLY')
298 self.assertEqual(r['var'], 'rf_locked')
299 self.assertEqual(r['value'], '1')
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200300
301 time.sleep(1.5)
302
303 r = self.do_get('bts.0.rf_state')
Oliver Smithe1f08442019-12-09 15:13:44 +0100304 self.assertEqual(r['mtype'], 'GET_REPLY')
305 self.assertEqual(r['var'], 'bts.0.rf_state')
306 self.assertEqual(r['value'], 'inoperational,locked,off')
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200307
Holger Hans Peter Freyther66105fd2015-02-10 23:03:25 +0100308 r = self.do_get('rf_locked')
Oliver Smithe1f08442019-12-09 15:13:44 +0100309 self.assertEqual(r['mtype'], 'GET_REPLY')
310 self.assertEqual(r['var'], 'rf_locked')
311 self.assertEqual(r['value'], 'state=off,policy=off')
Holger Hans Peter Freyther66105fd2015-02-10 23:03:25 +0100312
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200313 r = self.do_set('rf_locked', '0')
Oliver Smithe1f08442019-12-09 15:13:44 +0100314 self.assertEqual(r['mtype'], 'SET_REPLY')
315 self.assertEqual(r['var'], 'rf_locked')
316 self.assertEqual(r['value'], '0')
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200317
318 time.sleep(1.5)
319
320 r = self.do_get('bts.0.rf_state')
Oliver Smithe1f08442019-12-09 15:13:44 +0100321 self.assertEqual(r['mtype'], 'GET_REPLY')
322 self.assertEqual(r['var'], 'bts.0.rf_state')
Pau Espin Pedrold9d105c2020-09-30 14:43:09 +0200323 self.assertEqual(r['value'], 'inoperational,locked,on')
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200324
Holger Hans Peter Freyther66105fd2015-02-10 23:03:25 +0100325 r = self.do_get('rf_locked')
Oliver Smithe1f08442019-12-09 15:13:44 +0100326 self.assertEqual(r['mtype'], 'GET_REPLY')
327 self.assertEqual(r['var'], 'rf_locked')
328 self.assertEqual(r['value'], 'state=off,policy=on')
Holger Hans Peter Freyther66105fd2015-02-10 23:03:25 +0100329
Jacob Erlbeckcc391b82013-10-01 13:26:42 +0200330 def testTimezone(self):
Neels Hofmeyr73983952016-05-10 13:29:33 +0200331 r = self.do_get('timezone')
Oliver Smithe1f08442019-12-09 15:13:44 +0100332 self.assertEqual(r['mtype'], 'GET_REPLY')
333 self.assertEqual(r['var'], 'timezone')
334 self.assertEqual(r['value'], 'off')
Jacob Erlbeckcc391b82013-10-01 13:26:42 +0200335
Neels Hofmeyr73983952016-05-10 13:29:33 +0200336 r = self.do_set('timezone', '-2,15,2')
Oliver Smithe1f08442019-12-09 15:13:44 +0100337 self.assertEqual(r['mtype'], 'SET_REPLY')
338 self.assertEqual(r['var'], 'timezone')
339 self.assertEqual(r['value'], '-2,15,2')
Jacob Erlbeckcc391b82013-10-01 13:26:42 +0200340
Neels Hofmeyr73983952016-05-10 13:29:33 +0200341 r = self.do_get('timezone')
Oliver Smithe1f08442019-12-09 15:13:44 +0100342 self.assertEqual(r['mtype'], 'GET_REPLY')
343 self.assertEqual(r['var'], 'timezone')
344 self.assertEqual(r['value'], '-2,15,2')
Jacob Erlbeckcc391b82013-10-01 13:26:42 +0200345
346 # Test invalid input
Neels Hofmeyr73983952016-05-10 13:29:33 +0200347 r = self.do_set('timezone', '-2,15,2,5,6,7')
Oliver Smithe1f08442019-12-09 15:13:44 +0100348 self.assertEqual(r['mtype'], 'SET_REPLY')
349 self.assertEqual(r['var'], 'timezone')
350 self.assertEqual(r['value'], '-2,15,2')
Jacob Erlbeckcc391b82013-10-01 13:26:42 +0200351
Neels Hofmeyr73983952016-05-10 13:29:33 +0200352 r = self.do_set('timezone', '-2,15')
Oliver Smithe1f08442019-12-09 15:13:44 +0100353 self.assertEqual(r['mtype'], 'ERROR')
Neels Hofmeyr73983952016-05-10 13:29:33 +0200354 r = self.do_set('timezone', '-2')
Oliver Smithe1f08442019-12-09 15:13:44 +0100355 self.assertEqual(r['mtype'], 'ERROR')
Neels Hofmeyr73983952016-05-10 13:29:33 +0200356 r = self.do_set('timezone', '1')
Jacob Erlbeckcc391b82013-10-01 13:26:42 +0200357
Neels Hofmeyr73983952016-05-10 13:29:33 +0200358 r = self.do_set('timezone', 'off')
Oliver Smithe1f08442019-12-09 15:13:44 +0100359 self.assertEqual(r['mtype'], 'SET_REPLY')
360 self.assertEqual(r['var'], 'timezone')
361 self.assertEqual(r['value'], 'off')
Jacob Erlbeckcc391b82013-10-01 13:26:42 +0200362
Neels Hofmeyr73983952016-05-10 13:29:33 +0200363 r = self.do_get('timezone')
Oliver Smithe1f08442019-12-09 15:13:44 +0100364 self.assertEqual(r['mtype'], 'GET_REPLY')
365 self.assertEqual(r['var'], 'timezone')
366 self.assertEqual(r['value'], 'off')
Jacob Erlbeckcc391b82013-10-01 13:26:42 +0200367
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200368 def testMcc(self):
369 r = self.do_set('mcc', '23')
370 r = self.do_get('mcc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100371 self.assertEqual(r['mtype'], 'GET_REPLY')
372 self.assertEqual(r['var'], 'mcc')
373 self.assertEqual(r['value'], '023')
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200374
375 r = self.do_set('mcc', '023')
376 r = self.do_get('mcc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100377 self.assertEqual(r['mtype'], 'GET_REPLY')
378 self.assertEqual(r['var'], 'mcc')
379 self.assertEqual(r['value'], '023')
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200380
381 def testMnc(self):
382 r = self.do_set('mnc', '9')
383 r = self.do_get('mnc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100384 self.assertEqual(r['mtype'], 'GET_REPLY')
385 self.assertEqual(r['var'], 'mnc')
386 self.assertEqual(r['value'], '09')
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200387
388 r = self.do_set('mnc', '09')
389 r = self.do_get('mnc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100390 self.assertEqual(r['mtype'], 'GET_REPLY')
391 self.assertEqual(r['var'], 'mnc')
392 self.assertEqual(r['value'], '09')
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200393
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100394 r = self.do_set('mnc', '009')
395 r = self.do_get('mnc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100396 self.assertEqual(r['mtype'], 'GET_REPLY')
397 self.assertEqual(r['var'], 'mnc')
398 self.assertEqual(r['value'], '009')
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100399
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200400
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100401 def testMccMncApply(self):
402 # Test some invalid input
403 r = self.do_set('mcc-mnc-apply', 'WRONG')
Oliver Smithe1f08442019-12-09 15:13:44 +0100404 self.assertEqual(r['mtype'], 'ERROR')
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100405
406 r = self.do_set('mcc-mnc-apply', '1,')
Oliver Smithe1f08442019-12-09 15:13:44 +0100407 self.assertEqual(r['mtype'], 'ERROR')
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100408
409 r = self.do_set('mcc-mnc-apply', '200,3')
Oliver Smithe1f08442019-12-09 15:13:44 +0100410 self.assertEqual(r['mtype'], 'SET_REPLY')
411 self.assertEqual(r['var'], 'mcc-mnc-apply')
412 self.assertEqual(r['value'], 'Tried to drop the BTS')
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100413
414 # Set it again
415 r = self.do_set('mcc-mnc-apply', '200,3')
Oliver Smithe1f08442019-12-09 15:13:44 +0100416 self.assertEqual(r['mtype'], 'SET_REPLY')
417 self.assertEqual(r['var'], 'mcc-mnc-apply')
418 self.assertEqual(r['value'], 'Nothing changed')
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100419
420 # Change it
421 r = self.do_set('mcc-mnc-apply', '200,4')
Oliver Smithe1f08442019-12-09 15:13:44 +0100422 self.assertEqual(r['mtype'], 'SET_REPLY')
423 self.assertEqual(r['var'], 'mcc-mnc-apply')
424 self.assertEqual(r['value'], 'Tried to drop the BTS')
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100425
426 # Change it
427 r = self.do_set('mcc-mnc-apply', '201,4')
Oliver Smithe1f08442019-12-09 15:13:44 +0100428 self.assertEqual(r['mtype'], 'SET_REPLY')
429 self.assertEqual(r['var'], 'mcc-mnc-apply')
430 self.assertEqual(r['value'], 'Tried to drop the BTS')
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100431
432 # Verify
433 r = self.do_get('mnc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100434 self.assertEqual(r['mtype'], 'GET_REPLY')
435 self.assertEqual(r['var'], 'mnc')
436 self.assertEqual(r['value'], '04')
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100437
438 r = self.do_get('mcc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100439 self.assertEqual(r['mtype'], 'GET_REPLY')
440 self.assertEqual(r['var'], 'mcc')
441 self.assertEqual(r['value'], '201')
Holger Hans Peter Freyther3adb7722014-03-04 17:16:58 +0100442
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200443 # Change it
444 r = self.do_set('mcc-mnc-apply', '202,03')
Oliver Smithe1f08442019-12-09 15:13:44 +0100445 self.assertEqual(r['mtype'], 'SET_REPLY')
446 self.assertEqual(r['var'], 'mcc-mnc-apply')
447 self.assertEqual(r['value'], 'Tried to drop the BTS')
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200448
449 r = self.do_get('mnc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100450 self.assertEqual(r['mtype'], 'GET_REPLY')
451 self.assertEqual(r['var'], 'mnc')
452 self.assertEqual(r['value'], '03')
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200453
454 r = self.do_get('mcc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100455 self.assertEqual(r['mtype'], 'GET_REPLY')
456 self.assertEqual(r['var'], 'mcc')
457 self.assertEqual(r['value'], '202')
Holger Hans Peter Freythere9faa6f2014-04-24 10:30:05 +0200458
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100459 # Test MNC with 3 digits
460 r = self.do_set('mcc-mnc-apply', '2,003')
Oliver Smithe1f08442019-12-09 15:13:44 +0100461 self.assertEqual(r['mtype'], 'SET_REPLY')
462 self.assertEqual(r['var'], 'mcc-mnc-apply')
463 self.assertEqual(r['value'], 'Tried to drop the BTS')
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100464
465 r = self.do_get('mnc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100466 self.assertEqual(r['mtype'], 'GET_REPLY')
467 self.assertEqual(r['var'], 'mnc')
468 self.assertEqual(r['value'], '003')
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100469
470 r = self.do_get('mcc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100471 self.assertEqual(r['mtype'], 'GET_REPLY')
472 self.assertEqual(r['var'], 'mcc')
473 self.assertEqual(r['value'], '002')
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100474
475 # Set same MNC with 3 digits
476 r = self.do_set('mcc-mnc-apply', '2,003')
Oliver Smithe1f08442019-12-09 15:13:44 +0100477 self.assertEqual(r['mtype'], 'SET_REPLY')
478 self.assertEqual(r['var'], 'mcc-mnc-apply')
479 self.assertEqual(r['value'], 'Nothing changed')
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100480
481 r = self.do_get('mnc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100482 self.assertEqual(r['mtype'], 'GET_REPLY')
483 self.assertEqual(r['var'], 'mnc')
484 self.assertEqual(r['value'], '003')
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100485
486 r = self.do_get('mcc')
Oliver Smithe1f08442019-12-09 15:13:44 +0100487 self.assertEqual(r['mtype'], 'GET_REPLY')
488 self.assertEqual(r['var'], 'mcc')
489 self.assertEqual(r['value'], '002')
Neels Hofmeyr7cdd0692018-03-05 02:03:57 +0100490
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200491def add_bsc_test(suite, workdir):
492 if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc/osmo-bsc")):
493 print("Skipping the BSC test")
494 return
495 test = unittest.TestLoader().loadTestsFromTestCase(TestCtrlBSC)
496 suite.addTest(test)
497
498if __name__ == '__main__':
499 import argparse
500 import sys
501
502 workdir = '.'
503
504 parser = argparse.ArgumentParser()
505 parser.add_argument("-v", "--verbose", dest="verbose",
506 action="store_true", help="verbose mode")
507 parser.add_argument("-p", "--pythonconfpath", dest="p",
508 help="searchpath for config")
509 parser.add_argument("-w", "--workdir", dest="w",
510 help="Working directory")
511 args = parser.parse_args()
512
513 verbose_level = 1
514 if args.verbose:
515 verbose_level = 2
516 verbose = True
517
518 if args.w:
519 workdir = args.w
520
521 if args.p:
522 confpath = args.p
523
Oliver Smithe1f08442019-12-09 15:13:44 +0100524 print("confpath %s, workdir %s" % (confpath, workdir))
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200525 os.chdir(workdir)
Oliver Smithe1f08442019-12-09 15:13:44 +0100526 print("Running tests for specific control commands")
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200527 suite = unittest.TestSuite()
528 add_bsc_test(suite, workdir)
Jacob Erlbeck0760a832013-09-16 11:20:28 +0200529 res = unittest.TextTestRunner(verbosity=verbose_level).run(suite)
530 sys.exit(len(res.errors) + len(res.failures))