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