blob: 36ba713b9c5ccc1e2cd4108f2eebc4c444c152c3 [file] [log] [blame]
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +01001# ms_driver: Launch OsmocomBB mobile's virtually connected to a BTS
2#
3# Copyright (C) 2018 by Holger Hans Peter Freyther
4#
5# This program is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as
7# published by the Free Software Foundation, either version 3 of the
8# License, or (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18from datetime import timedelta
Holger Hans Peter Freyther792614f2018-11-05 06:23:39 +000019from . import log, util
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010020from osmo_ms_driver.cdf import cdfs
21from osmo_ms_driver.event_server import EventServer
22from osmo_ms_driver.simple_loop import SimpleLoop
23from osmo_ms_driver.location_update_test import MassUpdateLocationTest
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000024from osmo_ms_driver.starter import BinaryOptions
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010025
26import os.path
27import shutil
28import tempfile
29
30class Subscriber(log.Origin):
31 def __init__(self, imsi, ki):
32 super().__init__(log.C_RUN, 'subscriber')
33 self._imsi = imsi
34 self._ki = ki
35 self._auth_algo = "comp128v1"
36 self._msisdn = None
37
38 def msisdn(self):
39 return self._msisdn
40
41 def set_msisdn(self, msisdn):
42 self._msisdn = msisdn
43
44 def imsi(self):
45 return self._imsi
46
47 def ki(self):
48 return self._ki
49
50 def auth_algo(self):
51 return self._auth_algo
52
53class MsDriver(log.Origin):
54
55 def __init__(self, suite_run):
56 super().__init__(log.C_RUN, 'ms-driver')
57 self._suite_run = suite_run
58
59 # TODO: take config out of the test scenario
60 self._num_ms = 10
61 self._time_start = timedelta(seconds=60)
62 self._time_step = timedelta(milliseconds=100)
63 self._test_duration = timedelta(seconds=120)
64 self._cdf = cdfs["ease_in_out"](self._time_start, self._time_step)
65 self._loop = SimpleLoop()
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010066 self._test_case = None
Holger Hans Peter Freytherd6d32062018-11-05 03:41:38 +000067 self.event_server_sk_tmp_dir = None
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010068
69 if len(self.event_server_path().encode()) > 107:
70 raise log.Error('Path for event_server socket is longer than max allowed len for unix socket path (107):', self.event_server_path())
71
72 def event_server_path(self):
73 if self.event_server_sk_tmp_dir is None:
74 self.event_server_sk_tmp_dir = tempfile.mkdtemp('', 'ogteventserversk')
75 return os.path.join(self.event_server_sk_tmp_dir, 'osmo_ms_driver.unix')
76
77 def configure(self):
78 """
79 Configures the subscribers, tests and registration server. Needs to be
80 called after the complete configuration of this driver.
81 """
82 event_server_path = self.event_server_path()
83
84 self._ev_server = EventServer("ev_server", event_server_path)
85 self._ev_server.listen(self._loop)
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000086 options = BinaryOptions("virtphy", "mobile", None)
87 self._test_case = MassUpdateLocationTest("mass", options, self._num_ms, self._cdf,
Holger Hans Peter Freyther792614f2018-11-05 06:23:39 +000088 self._ev_server,
89 util.Dir(self.event_server_sk_tmp_dir),
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +000090 suite_run=self._suite_run)
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010091
92 # TODO: We should pass subscribers down to the test and not get it from
93 # there.
94 self._subs = [Subscriber(imsi=mob.imsi(), ki=mob.ki()) for mob in self._test_case.mobiles()]
95
96
97 def ms_subscribers(self):
98 """
99 Returns a list of 'subscribers' that were configured in the
100 current scenario.
101 """
102 if not hasattr(self, '_subs'):
103 self.configure()
104 return self._subs
105
106 def run_test(self):
107 """
108 Runs the configured tests by starting the configured amount of mobile
109 devices according to their schedule. Returns once all tests succeeded
110 or the configured timeout has passed.
111 """
112 if not hasattr(self, '_subs'):
113 self.configure()
114 self._test_case.run_test(self._loop, self._test_duration)
115
116 def print_stats(self):
117 """
118 Prints statistics about the test run.
119 """
120 self._test_case.print_stats()
121
122 def cleanup(self):
123 """
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +0000124 Cleans up the driver (e.g. AF_UNIX files).
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +0100125 """
126
127 # Clean-up the temporary directory.
128 if self.event_server_sk_tmp_dir:
129 shutil.rmtree(path=self.event_server_sk_tmp_dir)
130
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +0100131# vim: expandtab tabstop=4 shiftwidth=4