17757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# Copyright (C) 2012 Google Inc. All rights reserved. 27757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# 37757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# Redistribution and use in source and binary forms, with or without 47757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# modification, are permitted provided that the following conditions are 57757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# met: 67757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# 77757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# * Redistributions of source code must retain the above copyright 87757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# notice, this list of conditions and the following disclaimer. 97757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# * Redistributions in binary form must reproduce the above 107757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# copyright notice, this list of conditions and the following disclaimer 117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# in the documentation and/or other materials provided with the 127757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# distribution. 137757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# * Neither the name of Google Inc. nor the names of its 147757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# contributors may be used to endorse or promote products derived from 157757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# this software without specific prior written permission. 167757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# 177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 187757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 197757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 227757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 237757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 247757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 257757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 277757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 287757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch"""Unit tests for run_perf_tests.""" 307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochimport StringIO 327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochimport json 337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochimport re 347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochimport unittest2 as unittest 357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochfrom webkitpy.common.host_mock import MockHost 377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochfrom webkitpy.common.system.outputcapture import OutputCapture 387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochfrom webkitpy.layout_tests.port.test import TestPort 397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochfrom webkitpy.performance_tests.perftest import DEFAULT_TEST_RUNNER_COUNT 407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochfrom webkitpy.performance_tests.perftestsrunner import PerfTestsRunner 417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 427757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochclass MainTest(unittest.TestCase): 447757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def create_runner(self, args=[]): 457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch options, parsed_args = PerfTestsRunner._parse_args(args) 467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch test_port = TestPort(host=MockHost(), options=options) 477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner = PerfTestsRunner(args=args, port=test_port) 487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner._host.filesystem.maybe_make_directory(runner._base_path, 'inspector') 497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner._host.filesystem.maybe_make_directory(runner._base_path, 'Bindings') 507757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner._host.filesystem.maybe_make_directory(runner._base_path, 'Parser') 517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return runner, test_port 527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def _add_file(self, runner, dirname, filename, content=True): 547757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch dirname = runner._host.filesystem.join(runner._base_path, dirname) if dirname else runner._base_path 557757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner._host.filesystem.maybe_make_directory(dirname) 567757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner._host.filesystem.files[runner._host.filesystem.join(dirname, filename)] = content 577757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 587757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def test_collect_tests(self): 597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner, port = self.create_runner() 607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector', 'a_file.html', 'a content') 617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch tests = runner._collect_tests() 627757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(len(tests), 1) 637757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 647757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def _collect_tests_and_sort_test_name(self, runner): 657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return sorted([test.test_name() for test in runner._collect_tests()]) 667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 677757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def test_collect_tests_with_multile_files(self): 687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner, port = self.create_runner(args=['PerformanceTests/test1.html', 'test2.html']) 697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def add_file(filename): 717757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch port.host.filesystem.files[runner._host.filesystem.join(runner._base_path, filename)] = 'some content' 727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch add_file('test1.html') 747757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch add_file('test2.html') 757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch add_file('test3.html') 767757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch port.host.filesystem.chdir(runner._port.perf_tests_dir()[:runner._port.perf_tests_dir().rfind(runner._host.filesystem.sep)]) 777757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertItemsEqual(self._collect_tests_and_sort_test_name(runner), ['test1.html', 'test2.html']) 787757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 797757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def test_collect_tests_with_skipped_list(self): 807757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner, port = self.create_runner() 817757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 827757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector', 'test1.html') 837757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector', 'unsupported_test1.html') 847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector', 'test2.html') 857757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector/resources', 'resource_file.html') 867757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'unsupported', 'unsupported_test2.html') 877757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch port.skipped_perf_tests = lambda: ['inspector/unsupported_test1.html', 'unsupported'] 887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertItemsEqual(self._collect_tests_and_sort_test_name(runner), ['inspector/test1.html', 'inspector/test2.html']) 897757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def test_collect_tests_with_skipped_list_and_files(self): 917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner, port = self.create_runner(args=['Suite/Test1.html', 'Suite/SkippedTest1.html', 'SkippedSuite/Test1.html']) 927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'SkippedSuite', 'Test1.html') 947757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'SkippedSuite', 'Test2.html') 957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'Suite', 'Test1.html') 967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'Suite', 'Test2.html') 977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'Suite', 'SkippedTest1.html') 987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'Suite', 'SkippedTest2.html') 997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch port.skipped_perf_tests = lambda: ['Suite/SkippedTest1.html', 'Suite/SkippedTest1.html', 'SkippedSuite'] 1007757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertItemsEqual(self._collect_tests_and_sort_test_name(runner), 1017757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch ['SkippedSuite/Test1.html', 'Suite/SkippedTest1.html', 'Suite/Test1.html']) 1027757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1037757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def test_collect_tests_with_ignored_skipped_list(self): 1047757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner, port = self.create_runner(args=['--force']) 1057757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1067757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector', 'test1.html') 1077757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector', 'unsupported_test1.html') 1087757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector', 'test2.html') 1097757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'inspector/resources', 'resource_file.html') 1107757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self._add_file(runner, 'unsupported', 'unsupported_test2.html') 1117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch port.skipped_perf_tests = lambda: ['inspector/unsupported_test1.html', 'unsupported'] 1127757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertItemsEqual(self._collect_tests_and_sort_test_name(runner), ['inspector/test1.html', 'inspector/test2.html', 'inspector/unsupported_test1.html', 'unsupported/unsupported_test2.html']) 1137757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1147757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def test_default_args(self): 1157757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner, port = self.create_runner() 1167757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch options, args = PerfTestsRunner._parse_args([]) 1177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(options.build) 1187757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.time_out_ms, 600 * 1000) 1197757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(options.generate_results) 1207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(options.show_results) 1217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(options.use_skipped_list) 1227757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.repeat, 1) 1237757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.test_runner_count, DEFAULT_TEST_RUNNER_COUNT) 1247757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1257757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def test_parse_args(self): 1267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner, port = self.create_runner() 1277757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch options, args = PerfTestsRunner._parse_args([ 1287757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--build-directory=folder42', 1297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--platform=platform42', 1307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--builder-name', 'webkit-mac-1', 1317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--build-number=56', 1327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--time-out-ms=42', 1337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--no-show-results', 1347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--reset-results', 1357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--output-json-path=a/output.json', 1367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--slave-config-json-path=a/source.json', 1377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--test-results-server=somehost', 1387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--additional-drt-flag=--enable-threaded-parser', 1397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--additional-drt-flag=--awesomesauce', 1407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--repeat=5', 1417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--test-runner-count=5', 1427757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch '--debug']) 1437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(options.build) 1447757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.build_directory, 'folder42') 1457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.platform, 'platform42') 1467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.builder_name, 'webkit-mac-1') 1477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.build_number, '56') 1487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.time_out_ms, '42') 1497757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.configuration, 'Debug') 1507757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertFalse(options.show_results) 1517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(options.reset_results) 1527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.output_json_path, 'a/output.json') 1537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.slave_config_json_path, 'a/source.json') 1547757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.test_results_server, 'somehost') 1557757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.additional_drt_flag, ['--enable-threaded-parser', '--awesomesauce']) 1567757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.repeat, 5) 1577757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(options.test_runner_count, 5) 1587757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def test_upload_json(self): 1607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch runner, port = self.create_runner() 1617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch port.host.filesystem.files['/mock-checkout/some.json'] = 'some content' 1627757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1637757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch class MockFileUploader: 1647757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch called = [] 1657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch upload_single_text_file_throws = False 1667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch upload_single_text_file_return_value = None 1677757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch @classmethod 1697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def reset(cls): 1707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch cls.called = [] 1717757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch cls.upload_single_text_file_throws = False 1727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch cls.upload_single_text_file_return_value = None 1737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1747757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def __init__(mock, url, timeout): 1757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(url, 'https://some.host/some/path') 1767757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(isinstance(timeout, int) and timeout) 1777757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch mock.called.append('FileUploader') 1787757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1797757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch def upload_single_text_file(mock, filesystem, content_type, filename): 1807757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(filesystem, port.host.filesystem) 1817757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(content_type, 'application/json') 1827757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(filename, 'some.json') 1837757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch mock.called.append('upload_single_text_file') 1847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if mock.upload_single_text_file_throws: 1857757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch raise Exception 1867757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return mock.upload_single_text_file_return_value 1877757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.upload_single_text_file_return_value = StringIO.StringIO('OK') 1897757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader)) 1907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(MockFileUploader.called, ['FileUploader', 'upload_single_text_file']) 1917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 1927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.reset() 1937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.upload_single_text_file_return_value = StringIO.StringIO('Some error') 1947757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch output = OutputCapture() 1957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch output.capture_output() 1967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertFalse(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader)) 1977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch _, _, logs = output.restore_output() 1987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(logs, 'Uploaded JSON to https://some.host/some/path but got a bad response:\nSome error\n') 1997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 2007757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch # Throwing an exception upload_single_text_file shouldn't blow up _upload_json 2017757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.reset() 2027757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.upload_single_text_file_throws = True 2037757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertFalse(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader)) 2047757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(MockFileUploader.called, ['FileUploader', 'upload_single_text_file']) 2057757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 2067757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.reset() 2077757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.upload_single_text_file_return_value = StringIO.StringIO('{"status": "OK"}') 2087757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertTrue(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader)) 2097757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(MockFileUploader.called, ['FileUploader', 'upload_single_text_file']) 2107757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 2117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.reset() 2127757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch MockFileUploader.upload_single_text_file_return_value = StringIO.StringIO('{"status": "SomethingHasFailed", "failureStored": false}') 2137757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch output = OutputCapture() 2147757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch output.capture_output() 2157757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertFalse(runner._upload_json('some.host', 'some.json', '/some/path', MockFileUploader)) 2167757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch _, _, logs = output.restore_output() 2177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch serialized_json = json.dumps({'status': 'SomethingHasFailed', 'failureStored': False}, indent=4) 2187757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch self.assertEqual(logs, 'Uploaded JSON to https://some.host/some/path but got an error:\n%s\n' % serialized_json) 219