Skip to content

Commit a4d7898

Browse files
authored
Gauge adapter error (#204)
2 parents d063fb6 + f8b826e commit a4d7898

10 files changed

+74
-16
lines changed

rebench/environment.py

+8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ def extract_base(branch_or_tag):
4141
return branch_or_tag.replace('HEAD -> ', '')
4242

4343

44+
def git_not_available():
45+
return _exec(['git', '--version']) is None
46+
47+
48+
def git_repo_not_initialized():
49+
return _exec(['git', 'rev-parse']) is None
50+
51+
4452
def determine_source_details(configurator):
4553
global _source # pylint: disable=global-statement
4654
if _source:

rebench/executor.py

+15-4
Original file line numberDiff line numberDiff line change
@@ -402,8 +402,9 @@ def process_output(self, name, stdout_result, stderr_result):
402402
log_file.write(stderr_result)
403403

404404
def execute_run(self, run_id):
405-
gauge_adapter = self._get_gauge_adapter_instance(
406-
run_id.get_gauge_adapter_name())
405+
gauge_adapter = self._get_gauge_adapter_instance(run_id)
406+
if gauge_adapter is None:
407+
return True
407408

408409
cmdline = self._construct_cmdline(run_id, gauge_adapter)
409410

@@ -441,8 +442,18 @@ def execute_run(self, run_id):
441442

442443
return terminate
443444

444-
def _get_gauge_adapter_instance(self, adapter_name):
445-
return instantiate_adapter(adapter_name, self._include_faulty, self)
445+
def _get_gauge_adapter_instance(self, run_id):
446+
adapter_name = run_id.get_gauge_adapter_name()
447+
adapter = instantiate_adapter(adapter_name,
448+
self._include_faulty,
449+
self)
450+
451+
if adapter is None:
452+
run_id.fail_immediately()
453+
msg = "{ind}Couldn't find gauge adapter: %s\n" % adapter_name
454+
self.ui.error_once(msg, run_id)
455+
456+
return adapter
446457

447458
def _generate_data_point(self, cmdline, gauge_adapter, run_id,
448459
termination_check):

rebench/tests/configurator_test.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,15 @@ def test_number_of_experiments_testconf(self):
5252
self.ui, None, None, 'all')
5353
self.assertEqual(6, len(cnf.get_experiments()))
5454

55-
def test_get_experiment(self):
55+
def _get_experiment(self):
5656
cnf = Configurator(load_config(self._path + '/small.conf'), DataStore(self.ui),
5757
self.ui, None)
5858
exp = cnf.get_experiment('Test')
5959
self.assertIsNotNone(exp)
6060
return exp
6161

6262
def test_get_runs(self):
63-
exp = self.test_get_experiment()
63+
exp = self._get_experiment()
6464
runs = exp.runs
6565
self.assertEqual(2 * 2 * 2, len(runs))
6666

@@ -139,7 +139,7 @@ def test_machine_filter_m1_and_m2(self):
139139

140140
# allow command-line execution
141141
def test_suite():
142-
return unittest.makeSuite(ConfiguratorTest)
142+
unittest.defaultTestLoader.loadTestsFromTestCase(ConfiguratorTest)
143143

144144

145145
if __name__ == "__main__":

rebench/tests/environment_test.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
from unittest import TestCase
1+
from unittest import TestCase, skipIf
22

33
from ..denoise import DenoiseResult
44
from ..environment import determine_source_details, determine_environment,\
5-
init_environment, extract_base
5+
init_environment, extract_base, git_not_available, git_repo_not_initialized
66
from ..ui import TestDummyUI
77

88

9-
class ReBenchTestCase(TestCase):
9+
class EnvironmentTest(TestCase):
1010

11+
@skipIf(git_not_available() or git_repo_not_initialized(),
12+
"git seems not to be installed, or on the path, or the .git dir is missing")
1113
def test_source_details(self):
1214
details = determine_source_details(None)
1315
self.assertEqual(len(details['commitId']), 40)

rebench/tests/executor_test.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ def test_determine_exp_name_and_filters_only_others(self):
184184

185185

186186
def test_suite():
187-
return unittest.makeSuite(ExecutorTest)
187+
unittest.defaultTestLoader.loadTestsFromTestCase(ExecutorTest)
188188

189189

190190
if __name__ == "__main__":

rebench/tests/perf/issue_166_profiling_test.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from unittest import skipIf
12
from ..mock_http_server import MockHTTPServer
23
from ...configurator import Configurator, load_config
4+
from ...environment import git_not_available, git_repo_not_initialized
35
from ...executor import Executor
46
from ...model.profile_data import ProfileData
57
from ...persistence import DataStore
@@ -148,6 +150,8 @@ def test_execute_profiling_profile2(self):
148150
self.assertEqual(7, run_id.completed_invocations)
149151
self.assertEqual(7, run_id.get_number_of_data_points())
150152

153+
@skipIf(git_not_available() or git_repo_not_initialized(),
154+
"git source info not available, but needed for reporting to ReBenchDB")
151155
def test_send_to_rebench_db(self):
152156
server = MockHTTPServer()
153157
port = server.get_free_port()

rebench/tests/persistency_test.py

+4
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1818
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
1919
# IN THE SOFTWARE.
20+
from unittest import skipIf
2021
from .mock_http_server import MockHTTPServer
2122
from .rebench_test_case import ReBenchTestCase
2223

2324
from ..persistence import DataStore
2425

2526
from ..configurator import Configurator, load_config
27+
from ..environment import git_not_available, git_repo_not_initialized
2628
from ..executor import Executor
2729
from ..model.benchmark import Benchmark
2830
from ..model.benchmark_suite import BenchmarkSuite
@@ -115,6 +117,8 @@ def test_data_discarding(self):
115117

116118
self._assert_runs(cnf2, 1, 10, 10)
117119

120+
@skipIf(git_not_available() or git_repo_not_initialized(),
121+
"git source info not available, but needed for reporting to ReBenchDB")
118122
def test_rebench_db(self):
119123
option_parser = ReBench().shell_options()
120124
cmd_config = option_parser.parse_args(['--experiment=Test', 'persistency.conf'])

rebench/tests/subprocess_timeout_test.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def test_exec_with_timeout_python_interpreter(self):
6565

6666

6767
def test_suite():
68-
return unittest.makeSuite(SubprocessTimeoutTest)
68+
unittest.defaultTestLoader.loadTestsFromTestCase(SubprocessTimeoutTest)
6969

7070

7171
if __name__ == "__main__":

rebench/tests/ui_test.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from yaml import YAMLError
33

44
from ..configurator import load_config
5-
from ..ui import UIError, escape_braces
5+
from ..ui import UI, UIError, escape_braces
66

77
from .rebench_test_case import ReBenchTestCase
88

@@ -36,3 +36,9 @@ def test_config_not_proper_yaml(self):
3636
with self.assertRaises(UIError) as err:
3737
load_config(self._path + '/broken-yaml.conf')
3838
self.assertIsInstance(err.exception.source_exception, YAMLError)
39+
40+
def test_is_first_error_with(self):
41+
ui = UI()
42+
self.assertTrue(ui._is_first_error_with("a"))
43+
self.assertFalse(ui._is_first_error_with("a"))
44+
self.assertTrue(ui._is_first_error_with("b"))

rebench/ui.py

+26-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
# IN THE SOFTWARE.
2020
import sys
2121

22+
from io import StringIO
2223
from os import getcwd
2324

2425
from humanfriendly.terminal import terminal_supports_colors, ansi_wrap, auto_encode
@@ -43,6 +44,7 @@ def __init__(self):
4344
self._prev_cwd = None
4445
self._progress_spinner = None
4546
self._need_to_erase_spinner = False
47+
self._error_once_cache = set()
4648

4749
def init(self, verbose, debug):
4850
self._verbose = verbose
@@ -112,12 +114,15 @@ def output(self, text, *args, **kw):
112114
auto_encode(sys.stdout, text + '\n', *args, **kw)
113115
sys.stdout.flush()
114116

117+
def _output_on_stream(self, tmp_stream, out_stream, text, color, *args, **kw):
118+
if terminal_supports_colors(out_stream):
119+
text = ansi_wrap(text, color=color)
120+
auto_encode(tmp_stream, text, ind=_DETAIL_INDENT, *args, **kw)
121+
115122
def _output(self, text, color, *args, **kw):
116123
self._erase_spinner()
117124

118-
if terminal_supports_colors(sys.stdout):
119-
text = ansi_wrap(text, color=color)
120-
auto_encode(sys.stdout, text, ind=_DETAIL_INDENT, *args, **kw)
125+
self._output_on_stream(sys.stdout, sys.stdout, text, color, *args, **kw)
121126
sys.stdout.flush()
122127

123128
def warning(self, text, run_id=None, cmd=None, cwd=None, **kw):
@@ -128,6 +133,21 @@ def error(self, text, run_id=None, cmd=None, cwd=None, **kw):
128133
self._output_detail_header(run_id, cmd, cwd)
129134
self._output(text, 'red', **kw)
130135

136+
def _is_first_error_with(self, text):
137+
if text not in self._error_once_cache:
138+
self._error_once_cache.add(text)
139+
return True
140+
return False
141+
142+
def error_once(self, text, run_id=None, cmd=None, cwd=None, **kw):
143+
stream = StringIO("")
144+
self._output_on_stream(stream, sys.stdout, text, 'red', **kw)
145+
stream_str = stream.getvalue()
146+
147+
if self._is_first_error_with(stream_str):
148+
self._output_detail_header(run_id, cmd, cwd)
149+
self._output(text, 'red', **kw)
150+
131151
def verbose_output_info(self, text, run_id=None, cmd=None, cwd=None, **kw):
132152
if self._verbose:
133153
self._output_detail_header(run_id, cmd, cwd)
@@ -191,6 +211,9 @@ def warning(self, text, run_id=None, cmd=None, cwd=None, **kw):
191211
def error(self, text, run_id=None, cmd=None, cwd=None, **kw):
192212
pass
193213

214+
def error_once(self, text, run_id=None, cmd=None, cwd=None, **kw):
215+
pass
216+
194217
def verbose_output_info(self, text, run_id=None, cmd=None, cwd=None, **kw):
195218
pass
196219

0 commit comments

Comments
 (0)