| #!/usr/bin/python |
| # Copyright 2018 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Tests for perf_device_trigger_unittest.py.""" |
| |
| import unittest |
| |
| import perf_device_trigger |
| |
| class Args(object): |
| def __init__(self): |
| self.shards = 1 |
| self.dump_json = '' |
| self.multiple_trigger_configs = [] |
| self.multiple_dimension_script_verbose = False |
| |
| |
| class FakeTriggerer(perf_device_trigger.PerfDeviceTriggerer): |
| def __init__(self, bot_configs): |
| super(FakeTriggerer, self).__init__() |
| self._bot_configs = bot_configs |
| self._bot_statuses = [] |
| self._swarming_runs = [] |
| self._files = {} |
| self._temp_file_id = 0 |
| |
| def set_files(self, files): |
| self._files = files |
| |
| def make_temp_file(self, prefix=None, suffix=None): |
| result = prefix + str(self._temp_file_id) + suffix |
| self._temp_file_id += 1 |
| return result |
| |
| def delete_temp_file(self, temp_file): |
| pass |
| |
| def read_json_from_temp_file(self, temp_file): |
| return self._files[temp_file] |
| |
| def write_json_to_file(self, merged_json, output_file): |
| self._files[output_file] = merged_json |
| |
| def parse_bot_configs(self, args): |
| pass |
| |
| def run_swarming(self, args, verbose): |
| self._swarming_runs.append(args) |
| |
| |
| PERF_BOT1 = { |
| 'pool': 'Chrome-perf-fyi', |
| 'id': 'build1' |
| } |
| |
| PERF_BOT2 = { |
| 'pool': 'Chrome-perf-fyi', |
| 'id': 'build2' |
| } |
| |
| class UnitTest(unittest.TestCase): |
| def basic_setup(self): |
| triggerer = FakeTriggerer( |
| [ |
| PERF_BOT1, |
| PERF_BOT2 |
| ] |
| ) |
| # Note: the contents of these JSON files don't accurately reflect |
| # that produced by "swarming.py trigger". The unit tests only |
| # verify that shard 0's JSON is preserved. |
| triggerer.set_files({ |
| 'base_trigger_dimensions0.json': { |
| 'base_task_name': 'webgl_conformance_tests', |
| 'request': { |
| 'expiration_secs': 3600, |
| 'properties': { |
| 'execution_timeout_secs': 3600, |
| }, |
| }, |
| 'tasks': { |
| 'webgl_conformance_tests on NVIDIA GPU on Windows': { |
| 'task_id': 'f001', |
| }, |
| }, |
| }, |
| 'base_trigger_dimensions1.json': { |
| 'tasks': { |
| 'webgl_conformance_tests on NVIDIA GPU on Windows': { |
| 'task_id': 'f002', |
| }, |
| }, |
| }, |
| }) |
| args = Args() |
| args.shards = 2 |
| args.dump_json = 'output.json' |
| args.multiple_dimension_script_verbose = False |
| triggerer.trigger_tasks( |
| args, |
| [ |
| 'trigger', |
| '--dimension', |
| 'pool', |
| 'chrome-perf-fyi', |
| '--dimension', |
| 'id', |
| 'build1', |
| '--', |
| 'benchmark1', |
| ]) |
| return triggerer |
| |
| def list_contains_sublist(self, main_list, sub_list): |
| return any(sub_list == main_list[offset:offset + len(sub_list)] |
| for offset in xrange(len(main_list) - (len(sub_list) - 1))) |
| |
| def test_shard_env_vars_and_bot_id(self): |
| triggerer = self.basic_setup() |
| self.assertTrue(self.list_contains_sublist( |
| triggerer._swarming_runs[0], ['--bot', 'build1'])) |
| self.assertTrue(self.list_contains_sublist( |
| triggerer._swarming_runs[1], ['--bot', 'build2'])) |
| self.assertTrue(self.list_contains_sublist( |
| triggerer._swarming_runs[0], ['--env', 'GTEST_SHARD_INDEX', '0'])) |
| self.assertTrue(self.list_contains_sublist( |
| triggerer._swarming_runs[1], ['--env', 'GTEST_SHARD_INDEX', '1'])) |
| self.assertTrue(self.list_contains_sublist( |
| triggerer._swarming_runs[0], ['--env', 'GTEST_TOTAL_SHARDS', '2'])) |
| self.assertTrue(self.list_contains_sublist( |
| triggerer._swarming_runs[1], ['--env', 'GTEST_TOTAL_SHARDS', '2'])) |
| |
| def test_json_merging(self): |
| triggerer = self.basic_setup() |
| self.assertTrue('output.json' in triggerer._files) |
| output_json = triggerer._files['output.json'] |
| self.assertTrue('base_task_name' in output_json) |
| self.assertTrue('request' in output_json) |
| self.assertEqual(output_json['request']['expiration_secs'], 3600) |
| self.assertEqual( |
| output_json['request']['properties']['execution_timeout_secs'], 3600) |
| |
| if __name__ == '__main__': |
| unittest.main() |