blob: 54a3456bec8978073916d61abbdf5475f24300bd [file] [log] [blame]
Kata7185c62013-04-04 17:31:13 +02001#!/usr/bin/env python
2
3# (C) 2013 by Katerina Barone-Adesi <kat.obsc@gmail.com>
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13
14# You should have received a copy of the GNU General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
Max6ccd0782017-12-15 12:15:39 +010017from __future__ import print_function
Kata7185c62013-04-04 17:31:13 +020018import subprocess
19import os
20import sys
21import importlib
Neels Hofmeyrb59b6772017-02-24 20:49:39 +010022import time
Neels Hofmeyr119bed52017-02-28 02:44:25 +010023import unittest
Kata7185c62013-04-04 17:31:13 +020024
25
26"""Run a command, with stdout and stderr directed to devnull"""
27
Neels Hofmeyrf6ab3d82017-02-24 20:49:51 +010028devnull = None
Kata7185c62013-04-04 17:31:13 +020029
Neels Hofmeyr3ef39e92017-02-24 20:49:27 +010030def popen_devnull(cmd, verbose=True):
Neels Hofmeyrf6ab3d82017-02-24 20:49:51 +010031 global devnull
32 if devnull is None:
33 if verbose:
Max6ccd0782017-12-15 12:15:39 +010034 print("Opening /dev/null")
Neels Hofmeyrf6ab3d82017-02-24 20:49:51 +010035 devnull = open(os.devnull, 'w')
Neels Hofmeyr3ef39e92017-02-24 20:49:27 +010036 if verbose:
Max6ccd0782017-12-15 12:15:39 +010037 print("Launching: PWD=%s %s" % (os.getcwd(), ' '.join([repr(c) for c in cmd])))
Kata7185c62013-04-04 17:31:13 +020038 return subprocess.Popen(cmd, stdout=devnull, stderr=devnull)
39
40
41"""End a process.
42
43If the process doesn't appear to exist (for instance, is None), do nothing"""
44
45
46def end_proc(proc):
Neels Hofmeyrb59b6772017-02-24 20:49:39 +010047 if not proc:
48 return
49
50 proc.terminate()
Neels Hofmeyr9b0a51f2017-02-27 02:38:42 +010051 time_to_wait_for_term = 5
52 wait_step = 0.001
53 waited_time = 0
54 while True:
55 # poll returns None if proc is still running
56 rc = proc.poll()
57 if rc is not None:
58 break
59 waited_time += wait_step
60 # make wait_step approach 1.0
61 wait_step = (1. + 5. * wait_step) / 6.
62 if waited_time >= time_to_wait_for_term:
63 break
64 time.sleep(wait_step)
65
66 if proc.poll() is None:
67 # termination seems to be slower than that, let's just kill
Kata7185c62013-04-04 17:31:13 +020068 proc.kill()
Max6ccd0782017-12-15 12:15:39 +010069 print("Killed child process")
Neels Hofmeyr9b0a51f2017-02-27 02:38:42 +010070 elif waited_time > .002:
Max6ccd0782017-12-15 12:15:39 +010071 print("Terminating took %.3fs" % waited_time)
Neels Hofmeyrb59b6772017-02-24 20:49:39 +010072 proc.wait()
Kata7185c62013-04-04 17:31:13 +020073
74
Kat0270be42013-04-05 21:34:52 +020075"""Add a directory to sys.path, try to import a config file."""
Kata7185c62013-04-04 17:31:13 +020076
Kat0270be42013-04-05 21:34:52 +020077def importappconf_or_quit(dirname, confname, p_set):
Kata7185c62013-04-04 17:31:13 +020078 if dirname not in sys.path:
79 sys.path.append(dirname)
Kat0270be42013-04-05 21:34:52 +020080 try:
81 return importlib.import_module(confname)
82 except ImportError as e:
83 if p_set:
Max6ccd0782017-12-15 12:15:39 +010084 print("osmoappdesc not found in %s" % dirname, file=sys.stderr)
Kat0270be42013-04-05 21:34:52 +020085 else:
Max6ccd0782017-12-15 12:15:39 +010086 print("set osmoappdesc location with -p <dir>", file=sys.stderr)
Kat0270be42013-04-05 21:34:52 +020087 sys.exit(1)
Neels Hofmeyr119bed52017-02-28 02:44:25 +010088
89
90def pick_tests(suite, *name_snippets):
91 '''for unittest: Non-standard way of picking only selected tests to run,
92 by name. Kind of stupid of python unittest to not provide this feature
93 more easily.'''
94
95 new_tests = []
96 for t in suite._tests:
97 if isinstance(t, unittest.suite.TestSuite):
98 pick_tests(t, *name_snippets)
99 new_tests.append(t)
100 continue
101
102 if not isinstance(t, unittest.TestCase):
103 new_tests.append(t)
104 continue
105
106 if any([n.lower() in t._testMethodName.lower() for n in name_snippets]):
107 new_tests.append(t)
108 suite._tests = new_tests