blob: f84be8874cf0b6c01d191ad68b5206ad3ac25949 [file] [log] [blame]
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +00001# osmo_ms_driver: Main test runner
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
18# Local modules
19from .event_server import EventServer
20from .simple_loop import SimpleLoop
Holger Hans Peter Freytherf16a8f72019-04-30 12:01:57 +010021from .location_update_test import MassUpdateLocationTest
Holger Hans Peter Freyther874b4b42018-06-23 21:55:41 +010022from .cdf import cdfs
Holger Hans Peter Freytherf16a8f72019-04-30 12:01:57 +010023from .starter import BinaryOptions, MobileTestStarter
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +000024from .test_support import imsi_ki_gen
Pau Espin Pedrole8bbcbf2020-04-10 19:51:31 +020025from osmo_gsm_tester.core import log, util
Pau Espin Pedrol045245d2020-04-17 19:37:10 +020026from osmo_gsm_tester.obj import ms_osmo_mobile
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000027
28# System modules
Holger Hans Peter Freyther1dc9a042018-06-23 22:27:23 +010029from datetime import timedelta
30
Holger Hans Peter Freyther0f0ebd82018-06-23 14:40:42 +010031import argparse
Holger Hans Peter Freyther94da0452018-06-23 14:41:27 +010032import atexit
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000033import datetime
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000034import signal
35import tempfile
36import os.path
Holger Hans Peter Freyther0f0ebd82018-06-23 14:40:42 +010037import os
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000038
Holger Hans Peter Freyther0f0ebd82018-06-23 14:40:42 +010039def parser():
40 parser = argparse.ArgumentParser(epilog=__doc__, formatter_class=argparse.RawTextHelpFormatter)
41 parser.add_argument('-s', '--launch-duration', dest='launch_duration',
42 default=60, type=int,
43 help="Time launching applications should take in seconds")
44 parser.add_argument('-i', '--launch-interval', dest='launch_interval',
45 default=100, type=int,
46 help="Time between launching in milliseconds")
Holger Hans Peter Freyther1dc9a042018-06-23 22:27:23 +010047 parser.add_argument('-t', '--test-duration', dest="test_duration",
48 default=120, type=int,
49 help="Time of the test duration in seconds")
Holger Hans Peter Freyther0f0ebd82018-06-23 14:40:42 +010050 parser.add_argument('-d', '--distribution', dest="cdf_name",
51 choices=cdfs.keys(), default="ease_in_out",
52 help="Curve to use for starting within launch duration")
53 parser.add_argument('-m', '--number-ms', dest="num_ms",
54 default=10, type=int,
55 help="Number of MobileStations to simulate")
56 return parser
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000057
58def main():
59 # Create a default log to stdout
60 log.LogTarget().style(src=False)
61
Holger Hans Peter Freyther0f0ebd82018-06-23 14:40:42 +010062 args = parser().parse_args()
63
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000064 # We don't care what is happening to child processes we spawn!
65 signal.signal(signal.SIGCHLD, signal.SIG_IGN)
66
67 loop = SimpleLoop()
68
Holger Hans Peter Freyther792614f2018-11-05 06:23:39 +000069 tmp_dir = util.Dir(tempfile.mkdtemp(suffix="osmo-ms-driver"))
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000070 log.log("Going to store files in ", tmp_dir=tmp_dir)
71
72 # How long should starting all apps take
Holger Hans Peter Freyther0f0ebd82018-06-23 14:40:42 +010073 time_start=datetime.timedelta(seconds=args.launch_duration)
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000074 # In which steps to start processes
Holger Hans Peter Freyther0f0ebd82018-06-23 14:40:42 +010075 time_step=datetime.timedelta(milliseconds=args.launch_interval)
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000076
77 # Event server path
Holger Hans Peter Freyther792614f2018-11-05 06:23:39 +000078 event_server_path = os.path.join(str(tmp_dir), "osmo_ms_driver.unix")
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000079
80 # The function that decides when to start something
Holger Hans Peter Freyther0f0ebd82018-06-23 14:40:42 +010081 cdf = cdfs[args.cdf_name](time_start, time_step)
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000082
83 # Event server to handle MS->test events
84 ev_server = EventServer("ev_server", event_server_path)
85 ev_server.listen(loop)
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +000086
87 # Just a single test for now.
Holger Hans Peter Freytherf743afb2018-11-05 06:07:57 +000088 options = BinaryOptions("virtphy", "mobile", os.environ)
Holger Hans Peter Freyther92cc0c92019-04-28 16:55:30 +010089 result = {}
90 starter = MobileTestStarter("lu_test", options, cdf, ev_server, tmp_dir, result)
91 test = MassUpdateLocationTest("lu_test", ev_server, result)
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +000092
93 # Add subscribers to the test.
94 imsi_gen = imsi_ki_gen()
95 for i in range(0, args.num_ms):
96 imsi, ki = next(imsi_gen)
97 conf = {
98 'imsi': imsi,
99 'ki': ki,
100 'auth_algo': 'comp128v1',
Holger Hans Peter Freytherdbb16e82019-04-30 22:03:12 +0100101 'run_lu_test': False,
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +0000102 }
Holger Hans Peter Freyther92cc0c92019-04-28 16:55:30 +0100103 starter.subscriber_add(ms_osmo_mobile.MSOsmoMobile("ms_%d" % i, conf))
Holger Hans Peter Freytherdbb16e82019-04-30 22:03:12 +0100104 starter.configure_tasks()
Holger Hans Peter Freyther92cc0c92019-04-28 16:55:30 +0100105 test.configure(args.num_ms)
Holger Hans Peter Freyther5e67ed42019-02-25 09:48:50 +0000106
Holger Hans Peter Freyther92cc0c92019-04-28 16:55:30 +0100107 atexit.register(starter.stop_all)
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +0000108
109 # Run until everything has been launched
Holger Hans Peter Freyther92cc0c92019-04-28 16:55:30 +0100110 deadline = starter.start_all(loop, timedelta(seconds=args.test_duration))
111 test.wait_for_test(loop, deadline)
Holger Hans Peter Freytherc490cde2018-02-25 21:24:30 +0000112
113 # Print stats
114 test.print_stats()
115
116if __name__ == '__main__':
117 main()