1 # Copyright (C) 2009 Google Inc. All rights reserved. 2 # 3 # Redistribution and use in source and binary forms, with or without 4 # modification, are permitted provided that the following conditions are 5 # met: 6 # 7 # * Redistributions of source code must retain the above copyright 8 # notice, this list of conditions and the following disclaimer. 9 # * Redistributions in binary form must reproduce the above 10 # copyright notice, this list of conditions and the following disclaimer 11 # in the documentation and/or other materials provided with the 12 # distribution. 13 # * Neither the name of Google Inc. nor the names of its 14 # contributors may be used to endorse or promote products derived from 15 # this software without specific prior written permission. 16 # 17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 import unittest 30 31 from webkitpy.common.system.outputcapture import OutputCapture 32 from webkitpy.thirdparty.mock import Mock 33 from webkitpy.tool.commands.commandtest import CommandsTest 34 from webkitpy.tool.commands.download import * 35 from webkitpy.tool.mocktool import MockCheckout, MockOptions, MockTool 36 37 38 class AbstractRolloutPrepCommandTest(unittest.TestCase): 39 def test_commit_info(self): 40 command = AbstractRolloutPrepCommand() 41 tool = MockTool() 42 command.bind_to_tool(tool) 43 output = OutputCapture() 44 45 expected_stderr = "Preparing rollout for bug 42.\n" 46 commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_stderr=expected_stderr) 47 self.assertTrue(commit_info) 48 49 mock_commit_info = Mock() 50 mock_commit_info.bug_id = lambda: None 51 tool._checkout.commit_info_for_revision = lambda revision: mock_commit_info 52 expected_stderr = "Unable to parse bug number from diff.\n" 53 commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_stderr=expected_stderr) 54 self.assertEqual(commit_info, mock_commit_info) 55 56 def test_prepare_state(self): 57 command = AbstractRolloutPrepCommand() 58 mock_commit_info = MockCheckout().commit_info_for_revision(123) 59 command._commit_info = lambda revision: mock_commit_info 60 61 state = command._prepare_state(None, ["124 123 125", "Reason"], None) 62 self.assertEqual(123, state["revision"]) 63 self.assertEqual([123, 124, 125], state["revision_list"]) 64 65 self.assertRaises(ScriptError, command._prepare_state, options=None, args=["125 r122 123", "Reason"], tool=None) 66 self.assertRaises(ScriptError, command._prepare_state, options=None, args=["125 foo 123", "Reason"], tool=None) 67 68 69 class DownloadCommandsTest(CommandsTest): 70 def _default_options(self): 71 options = MockOptions() 72 options.build = True 73 options.build_style = True 74 options.check_builders = True 75 options.check_style = True 76 options.clean = True 77 options.close_bug = True 78 options.force_clean = False 79 options.force_patch = True 80 options.non_interactive = False 81 options.parent_command = 'MOCK parent command' 82 options.quiet = False 83 options.test = True 84 options.update = True 85 return options 86 87 def test_build(self): 88 expected_stderr = "Updating working directory\nBuilding WebKit\n" 89 self.assert_execute_outputs(Build(), [], options=self._default_options(), expected_stderr=expected_stderr) 90 91 def test_build_and_test(self): 92 expected_stderr = "Updating working directory\nBuilding WebKit\nRunning Python unit tests\nRunning Perl unit tests\nRunning JavaScriptCore tests\nRunning run-webkit-tests\n" 93 self.assert_execute_outputs(BuildAndTest(), [], options=self._default_options(), expected_stderr=expected_stderr) 94 95 def test_apply_attachment(self): 96 options = self._default_options() 97 options.update = True 98 options.local_commit = True 99 expected_stderr = "Updating working directory\nProcessing 1 patch from 1 bug.\nProcessing patch 197 from bug 42.\n" 100 self.assert_execute_outputs(ApplyAttachment(), [197], options=options, expected_stderr=expected_stderr) 101 102 def test_apply_patches(self): 103 options = self._default_options() 104 options.update = True 105 options.local_commit = True 106 expected_stderr = "Updating working directory\n2 reviewed patches found on bug 42.\nProcessing 2 patches from 1 bug.\nProcessing patch 197 from bug 42.\nProcessing patch 128 from bug 42.\n" 107 self.assert_execute_outputs(ApplyFromBug(), [42], options=options, expected_stderr=expected_stderr) 108 109 def test_land_diff(self): 110 expected_stderr = "Building WebKit\nRunning Python unit tests\nRunning Perl unit tests\nRunning JavaScriptCore tests\nRunning run-webkit-tests\nCommitted r49824: <http://trac.webkit.org/changeset/49824>\nUpdating bug 42\n" 111 mock_tool = MockTool() 112 mock_tool.scm().create_patch = Mock(return_value="Patch1\nMockPatch\n") 113 mock_tool.checkout().modified_changelogs = Mock(return_value=[]) 114 self.assert_execute_outputs(Land(), [42], options=self._default_options(), expected_stderr=expected_stderr, tool=mock_tool) 115 # Make sure we're not calling expensive calls too often. 116 self.assertEqual(mock_tool.scm().create_patch.call_count, 1) 117 self.assertEqual(mock_tool.checkout().modified_changelogs.call_count, 1) 118 119 def test_land_red_builders(self): 120 expected_stderr = '\nWARNING: Builders ["Builder2"] are red, please watch your commit carefully.\nSee http://dummy_buildbot_host/console?category=core\n\nBuilding WebKit\nRunning Python unit tests\nRunning Perl unit tests\nRunning JavaScriptCore tests\nRunning run-webkit-tests\nCommitted r49824: <http://trac.webkit.org/changeset/49824>\nUpdating bug 42\n' 121 mock_tool = MockTool() 122 mock_tool.buildbot.light_tree_on_fire() 123 self.assert_execute_outputs(Land(), [42], options=self._default_options(), expected_stderr=expected_stderr, tool=mock_tool) 124 125 def test_check_style(self): 126 expected_stderr = """Processing 1 patch from 1 bug. 127 Updating working directory 128 MOCK run_and_throw_if_fail: ['mock-update-webkit'] 129 Processing patch 197 from bug 42. 130 MOCK run_and_throw_if_fail: ['mock-check-webkit-style', '--git-commit', 'MOCK git commit', '--diff-files', 'MockFile1'] 131 """ 132 self.assert_execute_outputs(CheckStyle(), [197], options=self._default_options(), expected_stderr=expected_stderr, tool=MockTool(log_executive=True)) 133 134 def test_build_attachment(self): 135 expected_stderr = "Processing 1 patch from 1 bug.\nUpdating working directory\nProcessing patch 197 from bug 42.\nBuilding WebKit\n" 136 self.assert_execute_outputs(BuildAttachment(), [197], options=self._default_options(), expected_stderr=expected_stderr) 137 138 def test_land_attachment(self): 139 # FIXME: This expected result is imperfect, notice how it's seeing the same patch as still there after it thought it would have cleared the flags. 140 expected_stderr = """Processing 1 patch from 1 bug. 141 Updating working directory 142 Processing patch 197 from bug 42. 143 Building WebKit 144 Running Python unit tests 145 Running Perl unit tests 146 Running JavaScriptCore tests 147 Running run-webkit-tests 148 Committed r49824: <http://trac.webkit.org/changeset/49824> 149 Not closing bug 42 as attachment 197 has review=+. Assuming there are more patches to land from this bug. 150 """ 151 self.assert_execute_outputs(LandAttachment(), [197], options=self._default_options(), expected_stderr=expected_stderr) 152 153 def test_land_patches(self): 154 # FIXME: This expected result is imperfect, notice how it's seeing the same patch as still there after it thought it would have cleared the flags. 155 expected_stderr = """2 reviewed patches found on bug 42. 156 Processing 2 patches from 1 bug. 157 Updating working directory 158 Processing patch 197 from bug 42. 159 Building WebKit 160 Running Python unit tests 161 Running Perl unit tests 162 Running JavaScriptCore tests 163 Running run-webkit-tests 164 Committed r49824: <http://trac.webkit.org/changeset/49824> 165 Not closing bug 42 as attachment 197 has review=+. Assuming there are more patches to land from this bug. 166 Updating working directory 167 Processing patch 128 from bug 42. 168 Building WebKit 169 Running Python unit tests 170 Running Perl unit tests 171 Running JavaScriptCore tests 172 Running run-webkit-tests 173 Committed r49824: <http://trac.webkit.org/changeset/49824> 174 Not closing bug 42 as attachment 197 has review=+. Assuming there are more patches to land from this bug. 175 """ 176 self.assert_execute_outputs(LandFromBug(), [42], options=self._default_options(), expected_stderr=expected_stderr) 177 178 def test_prepare_rollout(self): 179 expected_stderr = "Preparing rollout for bug 42.\nUpdating working directory\n" 180 self.assert_execute_outputs(PrepareRollout(), [852, "Reason"], options=self._default_options(), expected_stderr=expected_stderr) 181 182 def test_create_rollout(self): 183 expected_stderr = """Preparing rollout for bug 42. 184 Updating working directory 185 MOCK create_bug 186 bug_title: REGRESSION(r852): Reason 187 bug_description: http://trac.webkit.org/changeset/852 broke the build: 188 Reason 189 component: MOCK component 190 cc: MOCK cc 191 blocked: 42 192 MOCK add_patch_to_bug: bug_id=78, description=ROLLOUT of r852, mark_for_review=False, mark_for_commit_queue=True, mark_for_landing=False 193 -- Begin comment -- 194 Any committer can land this patch automatically by marking it commit-queue+. The commit-queue will build and test the patch before landing to ensure that the rollout will be successful. This process takes approximately 15 minutes. 195 196 If you would like to land the rollout faster, you can use the following command: 197 198 webkit-patch land-attachment ATTACHMENT_ID --ignore-builders 199 200 where ATTACHMENT_ID is the ID of this attachment. 201 -- End comment -- 202 """ 203 self.assert_execute_outputs(CreateRollout(), [852, "Reason"], options=self._default_options(), expected_stderr=expected_stderr) 204 self.assert_execute_outputs(CreateRollout(), ["855 852 854", "Reason"], options=self._default_options(), expected_stderr=expected_stderr) 205 206 def test_rollout(self): 207 expected_stderr = """Preparing rollout for bug 42. 208 Updating working directory 209 MOCK: user.open_url: file://... 210 Was that diff correct? 211 Building WebKit 212 Committed r49824: <http://trac.webkit.org/changeset/49824> 213 """ 214 self.assert_execute_outputs(Rollout(), [852, "Reason"], options=self._default_options(), expected_stderr=expected_stderr) 215 216