1f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
2f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)# found in the LICENSE file.
4f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
55d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)import flakytests
65d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
75d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)from webkitpy.common.checkout.scm.scm_mock import MockSCM
8f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)from webkitpy.tool.commands.commandtest import CommandsTest
9f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)from webkitpy.tool.mocktool import MockTool, MockOptions
10f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
11f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
12f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)class FakeBotTestExpectations(object):
13f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    def expectation_lines(self, only_ignore_very_flaky=False):
14f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return []
15f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
16f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
17f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)class FakeBotTestExpectationsFactory(object):
185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    def expectations_for_builder(self, builder):
19f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return FakeBotTestExpectations()
20f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
21f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class ChangedExpectationsMockSCM(MockSCM):
235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    def changed_files(self):
245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return ['LayoutTests/FlakyTests']
255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
27f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)class FlakyTestsTest(CommandsTest):
28f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    def test_simple(self):
29f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        command = flakytests.FlakyTests()
30f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        factory = FakeBotTestExpectationsFactory()
31f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        lines = command._collect_expectation_lines(['foo'], factory)
32f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        self.assertEqual(lines, [])
33f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
34f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    def test_integration(self):
35f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        command = flakytests.FlakyTests()
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        tool = MockTool()
37f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        command.expectations_factory = FakeBotTestExpectationsFactory
38f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        options = MockOptions(upload=True)
39f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        expected_stdout = """Updated /mock-checkout/third_party/WebKit/LayoutTests/FlakyTests
40f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)LayoutTests/FlakyTests is not changed, not uploading.
41f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)"""
425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        self.assert_execute_outputs(command, options=options, tool=tool, expected_stdout=expected_stdout)
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        port = tool.port_factory.get()
455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        self.assertEqual(tool.filesystem.read_text_file(tool.filesystem.join(port.layout_tests_dir(), 'FlakyTests')), command.FLAKY_TEST_CONTENTS % '')
465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    def test_integration_uploads(self):
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        command = flakytests.FlakyTests()
495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        tool = MockTool()
505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        tool.scm = ChangedExpectationsMockSCM
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        command.expectations_factory = FakeBotTestExpectationsFactory
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        reviewer = 'foo@chromium.org'
535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        options = MockOptions(upload=True, reviewers=reviewer)
545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        expected_stdout = """Updated /mock-checkout/third_party/WebKit/LayoutTests/FlakyTests
555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)"""
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        self.assert_execute_outputs(command, options=options, tool=tool, expected_stdout=expected_stdout)
575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        self.assertEqual(tool.executive.calls,
585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            [
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                ['git', 'commit', '-m', command.COMMIT_MESSAGE % reviewer, '/mock-checkout/third_party/WebKit/LayoutTests/FlakyTests'],
605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                ['git', 'cl', 'upload', '--send-mail', '-f', '--cc', 'ojan@chromium.org,dpranke@chromium.org,eseidel@chromium.org'],
615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            ])
625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        port = tool.port_factory.get()
645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        self.assertEqual(tool.filesystem.read_text_file(tool.filesystem.join(port.layout_tests_dir(), 'FlakyTests')), command.FLAKY_TEST_CONTENTS % '')
65