blob: 86186b708b095e372fd8285f7a2c4de3d002f3c9 [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
19from . import log
20from 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()
66 self._suite_run.remember_to_stop(self)
67 self._test_case = None
Holger Hans Peter Freytherd6d32062018-11-05 03:41:38 +000068 self.event_server_sk_tmp_dir = None
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010069
70 if len(self.event_server_path().encode()) > 107:
71 raise log.Error('Path for event_server socket is longer than max allowed len for unix socket path (107):', self.event_server_path())
72
73 def event_server_path(self):
74 if self.event_server_sk_tmp_dir is None:
75 self.event_server_sk_tmp_dir = tempfile.mkdtemp('', 'ogteventserversk')
76 return os.path.join(self.event_server_sk_tmp_dir, 'osmo_ms_driver.unix')
77
78 def configure(self):
79 """
80 Configures the subscribers, tests and registration server. Needs to be
81 called after the complete configuration of this driver.
82 """
83 event_server_path = self.event_server_path()
84
85 self._ev_server = EventServer("ev_server", event_server_path)
86 self._ev_server.listen(self._loop)
Holger Hans Peter Freytherf658b832018-11-05 05:05:43 +000087 options = BinaryOptions("virtphy", "mobile", None)
88 self._test_case = MassUpdateLocationTest("mass", options, self._num_ms, self._cdf,
89 self._ev_server, self.event_server_sk_tmp_dir)
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010090
91 # TODO: We should pass subscribers down to the test and not get it from
92 # there.
93 self._subs = [Subscriber(imsi=mob.imsi(), ki=mob.ki()) for mob in self._test_case.mobiles()]
94
95
96 def ms_subscribers(self):
97 """
98 Returns a list of 'subscribers' that were configured in the
99 current scenario.
100 """
101 if not hasattr(self, '_subs'):
102 self.configure()
103 return self._subs
104
105 def run_test(self):
106 """
107 Runs the configured tests by starting the configured amount of mobile
108 devices according to their schedule. Returns once all tests succeeded
109 or the configured timeout has passed.
110 """
111 if not hasattr(self, '_subs'):
112 self.configure()
113 self._test_case.run_test(self._loop, self._test_duration)
114
115 def print_stats(self):
116 """
117 Prints statistics about the test run.
118 """
119 self._test_case.print_stats()
120
121 def cleanup(self):
122 """
123 Stops the testcase and all launched processes. Called by the
124 suite.
125 """
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
131 if not self._test_case:
132 return
133 self._test_case.stop_all()
134
135# vim: expandtab tabstop=4 shiftwidth=4