blob: 8ee93b771f4665e01abb797faa7de9bb2c8c92e6 [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
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010030class MsDriver(log.Origin):
31
32 def __init__(self, suite_run):
33 super().__init__(log.C_RUN, 'ms-driver')
34 self._suite_run = suite_run
35
36 # TODO: take config out of the test scenario
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010037 self._time_start = timedelta(seconds=60)
38 self._time_step = timedelta(milliseconds=100)
39 self._test_duration = timedelta(seconds=120)
40 self._cdf = cdfs["ease_in_out"](self._time_start, self._time_step)
41 self._loop = SimpleLoop()
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010042 self._test_case = None
Holger Hans Peter Freytherd6d32062018-11-05 03:41:38 +000043 self.event_server_sk_tmp_dir = None
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +000044 self._subscribers = []
45 self._configured = False
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010046
47 if len(self.event_server_path().encode()) > 107:
48 raise log.Error('Path for event_server socket is longer than max allowed len for unix socket path (107):', self.event_server_path())
49
50 def event_server_path(self):
51 if self.event_server_sk_tmp_dir is None:
52 self.event_server_sk_tmp_dir = tempfile.mkdtemp('', 'ogteventserversk')
53 return os.path.join(self.event_server_sk_tmp_dir, 'osmo_ms_driver.unix')
54
Holger Hans Peter Freytherbdc18d92018-11-05 06:49:48 +000055 def build_binary_options(self):
56 """Builds an instance of BinaryOptions.
57
58 Populates the BinaryOptions by searching the virtphy and mobile
59 application within the trial directory.
60 """
61
62 # Get the base directory for the virtphy/mobile application
Holger Hans Peter Freyther51ae2b52018-12-02 15:52:17 +000063 inst = util.Dir(os.path.abspath(self._suite_run.trial.get_inst('osmocom-bb')))
Holger Hans Peter Freytherbdc18d92018-11-05 06:49:48 +000064
65 # Assume these are dynamically linked and verify there is a lib dir.
66 lib = inst.child('lib')
67 if not os.path.isdir(lib):
68 raise RuntimeError('No lib/ in %r' % inst)
69 env = { 'LD_LIBRARY_PATH': util.prepend_library_path(lib) }
70
71 def check_and_return_binary(name):
72 """Checks the binary exists and returns the path."""
73 binary = inst.child('bin', name)
Holger Hans Peter Freyther6bf88222018-12-03 14:10:05 +000074 if not os.path.isfile(binary):
Holger Hans Peter Freytherbdc18d92018-11-05 06:49:48 +000075 raise RuntimeError('Binary missing: %r' % binary)
76 return binary
77
78 virtphy = check_and_return_binary('virtphy')
79 mobile = check_and_return_binary('mobile')
80 return BinaryOptions(virtphy, mobile, env)
81
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +000082 def subscriber_add(self, subscriber):
83 """Adds a subscriber to the list of subscribers."""
84 self._subscribers.append(subscriber)
85
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +010086 def configure(self):
87 """
88 Configures the subscribers, tests and registration server. Needs to be
89 called after the complete configuration of this driver.
90 """
91 event_server_path = self.event_server_path()
92
93 self._ev_server = EventServer("ev_server", event_server_path)
94 self._ev_server.listen(self._loop)
Holger Hans Peter Freytherbdc18d92018-11-05 06:49:48 +000095 options = self.build_binary_options()
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +000096 self._test_case = MassUpdateLocationTest("mass", options, self._cdf,
Holger Hans Peter Freyther792614f2018-11-05 06:23:39 +000097 self._ev_server,
Holger Hans Peter Freytherd51c2ea2018-12-03 14:38:06 +000098 util.Dir(self.event_server_sk_tmp_dir),
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +000099 suite_run=self._suite_run)
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +0100100
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +0000101 for sub in self._subscribers:
102 self._test_case.subscriber_add(sub)
103 self._configured = True
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +0100104
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 """
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +0000111 if not self._configured:
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +0100112 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 """
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +0000123 Cleans up the driver (e.g. AF_UNIX files).
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +0100124 """
125
126 # Clean-up the temporary directory.
127 if self.event_server_sk_tmp_dir:
128 shutil.rmtree(path=self.event_server_sk_tmp_dir)
129
Holger Hans Peter Freytherb484aab2018-08-29 04:28:33 +0100130# vim: expandtab tabstop=4 shiftwidth=4