59c9488c094099b7347e96ef202c360d91946303
[WebKit-https.git] / Tools / Scripts / webkitpy / tool / commands / download_unittest.py
1 # Copyright (C) 2009, 2011 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 MockOptions, MockTool
36 from webkitpy.common.checkout.checkout_mock import MockCheckout
37
38
39 class AbstractRolloutPrepCommandTest(unittest.TestCase):
40     def test_commit_info(self):
41         command = AbstractRolloutPrepCommand()
42         tool = MockTool()
43         command.bind_to_tool(tool)
44         output = OutputCapture()
45
46         expected_logs = "Preparing rollout for bug 50000.\n"
47         commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_logs=expected_logs)
48         self.assertTrue(commit_info)
49
50         mock_commit_info = Mock()
51         mock_commit_info.bug_id = lambda: None
52         tool._checkout.commit_info_for_revision = lambda revision: mock_commit_info
53         expected_logs = "Unable to parse bug number from diff.\n"
54         commit_info = output.assert_outputs(self, command._commit_info, [1234], expected_logs=expected_logs)
55         self.assertEqual(commit_info, mock_commit_info)
56
57     def test_prepare_state(self):
58         command = AbstractRolloutPrepCommand()
59         mock_commit_info = MockCheckout().commit_info_for_revision(123)
60         command._commit_info = lambda revision: mock_commit_info
61
62         state = command._prepare_state(None, ["124 123 125", "Reason"], None)
63         self.assertEqual(123, state["revision"])
64         self.assertEqual([123, 124, 125], state["revision_list"])
65
66         self.assertRaises(ScriptError, command._prepare_state, options=None, args=["125 r122  123", "Reason"], tool=None)
67         self.assertRaises(ScriptError, command._prepare_state, options=None, args=["125 foo 123", "Reason"], tool=None)
68
69         command._commit_info = lambda revision: None
70         state = command._prepare_state(None, ["124 123 125", "Reason"], None)
71         self.assertEqual(123, state["revision"])
72         self.assertEqual([123, 124, 125], state["revision_list"])
73
74
75 class DownloadCommandsTest(CommandsTest):
76     def _default_options(self):
77         options = MockOptions()
78         options.build = True
79         options.build_style = "release"
80         options.check_style = True
81         options.check_style_filter = None
82         options.clean = True
83         options.close_bug = True
84         options.force_clean = False
85         options.non_interactive = False
86         options.parent_command = 'MOCK parent command'
87         options.quiet = False
88         options.test = True
89         options.update = True
90         options.architecture = 'MOCK ARCH'
91         options.iterate_on_new_tests = 0
92         options.group = None
93         return options
94
95     def test_build(self):
96         expected_logs = "Updating working directory\nBuilding WebKit\n"
97         self.assert_execute_outputs(Build(), [], options=self._default_options(), expected_logs=expected_logs)
98
99     def test_build_and_test(self):
100         expected_logs = """Updating working directory
101 Building WebKit
102 Running Python unit tests
103 Running Perl unit tests
104 Running JavaScriptCore tests
105 Running bindings generation tests
106 Running run-webkit-tests
107 """
108         self.assert_execute_outputs(BuildAndTest(), [], options=self._default_options(), expected_logs=expected_logs)
109
110     def test_apply_attachment(self):
111         options = self._default_options()
112         options.update = True
113         options.local_commit = True
114         expected_logs = "Updating working directory\nProcessing 1 patch from 1 bug.\nProcessing patch 10000 from bug 50000.\n"
115         self.assert_execute_outputs(ApplyAttachment(), [10000], options=options, expected_logs=expected_logs)
116
117     def test_apply_from_bug(self):
118         options = self._default_options()
119         options.update = True
120         options.local_commit = True
121
122         expected_logs = "Updating working directory\n0 reviewed patches found on bug 50001.\nNo reviewed patches found, looking for unreviewed patches.\n1 patch found on bug 50001.\nProcessing 1 patch from 1 bug.\nProcessing patch 10002 from bug 50001.\n"
123         self.assert_execute_outputs(ApplyFromBug(), [50001], options=options, expected_logs=expected_logs)
124
125         expected_logs = "Updating working directory\n2 reviewed patches found on bug 50000.\nProcessing 2 patches from 1 bug.\nProcessing patch 10000 from bug 50000.\nProcessing patch 10001 from bug 50000.\n"
126         self.assert_execute_outputs(ApplyFromBug(), [50000], options=options, expected_logs=expected_logs)
127
128     def test_apply_watch_list(self):
129         expected_logs = """Processing 1 patch from 1 bug.
130 Updating working directory
131 MOCK run_and_throw_if_fail: ['mock-update-webkit'], cwd=/mock-checkout
132 Processing patch 10000 from bug 50000.
133 MockWatchList: determine_cc_and_messages
134 No bug was updated because no id was given.
135 Result of watchlist: cc "abarth@webkit.org, eric@webkit.org, levin@chromium.org" messages "Message1.
136
137 Message2."
138 """
139         self.assert_execute_outputs(ApplyWatchList(), [10000], options=self._default_options(), expected_logs=expected_logs, tool=MockTool(log_executive=True))
140
141     def test_land(self):
142         expected_logs = """Building WebKit
143 Running Python unit tests
144 Running Perl unit tests
145 Running JavaScriptCore tests
146 Running bindings generation tests
147 Running run-webkit-tests
148 Committed r49824: <http://trac.webkit.org/changeset/49824>
149 Updating bug 50000
150 """
151         mock_tool = MockTool()
152         mock_tool.scm().create_patch = Mock(return_value="Patch1\nMockPatch\n")
153         mock_tool.checkout().modified_changelogs = Mock(return_value=[])
154         self.assert_execute_outputs(Land(), [50000], options=self._default_options(), expected_logs=expected_logs, tool=mock_tool)
155         # Make sure we're not calling expensive calls too often.
156         self.assertEqual(mock_tool.scm().create_patch.call_count, 0)
157         self.assertEqual(mock_tool.checkout().modified_changelogs.call_count, 1)
158
159     def test_land_cowhand(self):
160         expected_logs = """MOCK run_and_throw_if_fail: ['mock-prepare-ChangeLog', '--email=MOCK email', '--merge-base=None', 'MockFile1'], cwd=/mock-checkout
161 MOCK run_and_throw_if_fail: ['mock-check-webkit-style', '--git-commit', 'MOCK git commit', '--diff-files', 'MockFile1', '--filter', '-changelog'], cwd=/mock-checkout
162 MOCK run_command: ['ruby', '-I', '/mock-checkout/Websites/bugs.webkit.org/PrettyPatch', '/mock-checkout/Websites/bugs.webkit.org/PrettyPatch/prettify.rb'], cwd=None, input=Patch1
163 MOCK: user.open_url: file://...
164 Was that diff correct?
165 Building WebKit
166 MOCK run_and_throw_if_fail: ['mock-build-webkit', 'ARCHS=MOCK ARCH'], cwd=/mock-checkout, env={'LC_ALL': 'C', 'TERM': 'none', 'MOCK_ENVIRON_COPY': '1'}
167 Running Python unit tests
168 MOCK run_and_throw_if_fail: ['mock-test-webkitpy'], cwd=/mock-checkout
169 Running Perl unit tests
170 MOCK run_and_throw_if_fail: ['mock-test-webkitperl'], cwd=/mock-checkout
171 Running JavaScriptCore tests
172 MOCK run_and_throw_if_fail: ['mock-run-javacriptcore-tests'], cwd=/mock-checkout
173 Running bindings generation tests
174 MOCK run_and_throw_if_fail: ['mock-run-bindings-tests'], cwd=/mock-checkout
175 Running run-webkit-tests
176 MOCK run_and_throw_if_fail: ['mock-run-webkit-tests', '--quiet'], cwd=/mock-checkout
177 Committed r49824: <http://trac.webkit.org/changeset/49824>
178 Committed r49824: <http://trac.webkit.org/changeset/49824>
179 No bug id provided.
180 """
181         mock_tool = MockTool(log_executive=True)
182         self.assert_execute_outputs(LandCowhand(), [50000], options=self._default_options(), expected_logs=expected_logs, tool=mock_tool)
183
184         expected_logs = "land-cowboy is deprecated, use land-cowhand instead.\n" + expected_logs
185         self.assert_execute_outputs(LandCowboy(), [50000], options=self._default_options(), expected_logs=expected_logs, tool=mock_tool)
186
187     def test_land_red_builders(self):
188         expected_logs = """Building WebKit
189 Running Python unit tests
190 Running Perl unit tests
191 Running JavaScriptCore tests
192 Running bindings generation tests
193 Running run-webkit-tests
194 Committed r49824: <http://trac.webkit.org/changeset/49824>
195 Updating bug 50000
196 """
197         mock_tool = MockTool()
198         mock_tool.buildbot.light_tree_on_fire()
199         self.assert_execute_outputs(Land(), [50000], options=self._default_options(), expected_logs=expected_logs, tool=mock_tool)
200
201     def test_check_style(self):
202         expected_logs = """Processing 1 patch from 1 bug.
203 Updating working directory
204 MOCK run_and_throw_if_fail: ['mock-update-webkit'], cwd=/mock-checkout
205 Processing patch 10000 from bug 50000.
206 MOCK run_and_throw_if_fail: ['mock-check-webkit-style', '--git-commit', 'MOCK git commit', '--diff-files', 'MockFile1'], cwd=/mock-checkout
207 """
208         self.assert_execute_outputs(CheckStyle(), [10000], options=self._default_options(), expected_logs=expected_logs, tool=MockTool(log_executive=True))
209
210     def test_build_attachment(self):
211         expected_logs = "Processing 1 patch from 1 bug.\nUpdating working directory\nProcessing patch 10000 from bug 50000.\nBuilding WebKit\n"
212         self.assert_execute_outputs(BuildAttachment(), [10000], options=self._default_options(), expected_logs=expected_logs)
213
214     def test_land_attachment(self):
215         # 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.
216         expected_logs = """Processing 1 patch from 1 bug.
217 Updating working directory
218 Processing patch 10000 from bug 50000.
219 Building WebKit
220 Running Python unit tests
221 Running Perl unit tests
222 Running JavaScriptCore tests
223 Running bindings generation tests
224 Running run-webkit-tests
225 Committed r49824: <http://trac.webkit.org/changeset/49824>
226 Not closing bug 50000 as attachment 10000 has review=+.  Assuming there are more patches to land from this bug.
227 """
228         self.assert_execute_outputs(LandAttachment(), [10000], options=self._default_options(), expected_logs=expected_logs)
229
230     def test_land_from_bug(self):
231         # 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.
232         expected_logs = """2 reviewed patches found on bug 50000.
233 Processing 2 patches from 1 bug.
234 Updating working directory
235 Processing patch 10000 from bug 50000.
236 Building WebKit
237 Running Python unit tests
238 Running Perl unit tests
239 Running JavaScriptCore tests
240 Running bindings generation tests
241 Running run-webkit-tests
242 Committed r49824: <http://trac.webkit.org/changeset/49824>
243 Not closing bug 50000 as attachment 10000 has review=+.  Assuming there are more patches to land from this bug.
244 Updating working directory
245 Processing patch 10001 from bug 50000.
246 Building WebKit
247 Running Python unit tests
248 Running Perl unit tests
249 Running JavaScriptCore tests
250 Running bindings generation tests
251 Running run-webkit-tests
252 Committed r49824: <http://trac.webkit.org/changeset/49824>
253 Not closing bug 50000 as attachment 10000 has review=+.  Assuming there are more patches to land from this bug.
254 """
255         self.assert_execute_outputs(LandFromBug(), [50000], options=self._default_options(), expected_logs=expected_logs)
256
257     def test_land_from_url(self):
258         # 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.
259         expected_logs = """2 patches found on bug 50000.
260 Processing 2 patches from 1 bug.
261 Updating working directory
262 Processing patch 10000 from bug 50000.
263 Building WebKit
264 Running Python unit tests
265 Running Perl unit tests
266 Running JavaScriptCore tests
267 Running bindings generation tests
268 Running run-webkit-tests
269 Committed r49824: <http://trac.webkit.org/changeset/49824>
270 Not closing bug 50000 as attachment 10000 has review=+.  Assuming there are more patches to land from this bug.
271 Updating working directory
272 Processing patch 10001 from bug 50000.
273 Building WebKit
274 Running Python unit tests
275 Running Perl unit tests
276 Running JavaScriptCore tests
277 Running bindings generation tests
278 Running run-webkit-tests
279 Committed r49824: <http://trac.webkit.org/changeset/49824>
280 Not closing bug 50000 as attachment 10000 has review=+.  Assuming there are more patches to land from this bug.
281 """
282         self.assert_execute_outputs(LandFromURL(), ["https://bugs.webkit.org/show_bug.cgi?id=50000"], options=self._default_options(), expected_logs=expected_logs)
283
284     def test_prepare_rollout(self):
285         expected_logs = "Preparing rollout for bug 50000.\nUpdating working directory\n"
286         self.assert_execute_outputs(PrepareRollout(), [852, "Reason"], options=self._default_options(), expected_logs=expected_logs)
287
288     def test_create_rollout(self):
289         expected_logs = """Preparing rollout for bug 50000.
290 Updating working directory
291 MOCK create_bug
292 bug_title: REGRESSION(r852): Reason
293 bug_description: http://trac.webkit.org/changeset/852 broke the build:
294 Reason
295 component: MOCK component
296 cc: MOCK cc
297 blocked: 50000
298 MOCK add_patch_to_bug: bug_id=60001, description=ROLLOUT of r852, mark_for_review=False, mark_for_commit_queue=True, mark_for_landing=False
299 -- Begin comment --
300 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.
301
302 If you would like to land the rollout faster, you can use the following command:
303
304   webkit-patch land-attachment ATTACHMENT_ID
305
306 where ATTACHMENT_ID is the ID of this attachment.
307 -- End comment --
308 """
309         self.assert_execute_outputs(CreateRollout(), [852, "Reason"], options=self._default_options(), expected_logs=expected_logs)
310
311     def test_create_rollout_multiple_revision(self):
312         expected_logs = """Preparing rollout for bug 50000.
313 Preparing rollout for bug 50000.
314 Unable to parse bug number from diff.
315 Updating working directory
316 MOCK create_bug
317 bug_title: REGRESSION(r852): Reason
318 bug_description: http://trac.webkit.org/changeset/852 broke the build:
319 Reason
320 component: MOCK component
321 cc: MOCK cc
322 blocked: 50000, 50000
323 MOCK add_patch_to_bug: bug_id=60001, description=ROLLOUT of r852, mark_for_review=False, mark_for_commit_queue=True, mark_for_landing=False
324 -- Begin comment --
325 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.
326
327 If you would like to land the rollout faster, you can use the following command:
328
329   webkit-patch land-attachment ATTACHMENT_ID
330
331 where ATTACHMENT_ID is the ID of this attachment.
332 -- End comment --
333 """
334         self.assert_execute_outputs(CreateRollout(), ["855 852 854", "Reason"], options=self._default_options(), expected_logs=expected_logs)
335
336     def test_create_rollout_multiple_revision_with_one_resolved(self):
337         expected_logs = """Preparing rollout for bug 50000.
338 Unable to parse bug number from diff.
339 Preparing rollout for bug 50004.
340 Updating working directory
341 MOCK create_bug
342 bug_title: REGRESSION(r852): Reason
343 bug_description: http://trac.webkit.org/changeset/852 broke the build:
344 Reason
345 component: MOCK component
346 cc: MOCK cc
347 blocked: 50000, 50004
348 MOCK reopen_bug 50004 with comment 'Re-opened since this is blocked by bug 60001'
349 MOCK add_patch_to_bug: bug_id=60001, description=ROLLOUT of r852, mark_for_review=False, mark_for_commit_queue=True, mark_for_landing=False
350 -- Begin comment --
351 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.
352
353 If you would like to land the rollout faster, you can use the following command:
354
355   webkit-patch land-attachment ATTACHMENT_ID
356
357 where ATTACHMENT_ID is the ID of this attachment.
358 -- End comment --
359 """
360         self.assert_execute_outputs(CreateRollout(), ["855 852 3001", "Reason"], options=self._default_options(), expected_logs=expected_logs)
361
362     def test_create_rollout_resolved(self):
363         expected_logs = """Preparing rollout for bug 50004.
364 Updating working directory
365 MOCK create_bug
366 bug_title: REGRESSION(r3001): Reason
367 bug_description: http://trac.webkit.org/changeset/3001 broke the build:
368 Reason
369 component: MOCK component
370 cc: MOCK cc
371 blocked: 50004
372 MOCK reopen_bug 50004 with comment 'Re-opened since this is blocked by bug 60001'
373 MOCK add_patch_to_bug: bug_id=60001, description=ROLLOUT of r3001, mark_for_review=False, mark_for_commit_queue=True, mark_for_landing=False
374 -- Begin comment --
375 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.
376
377 If you would like to land the rollout faster, you can use the following command:
378
379   webkit-patch land-attachment ATTACHMENT_ID
380
381 where ATTACHMENT_ID is the ID of this attachment.
382 -- End comment --
383 """
384         self.assert_execute_outputs(CreateRollout(), [3001, "Reason"], options=self._default_options(), expected_logs=expected_logs)
385
386     def test_create_rollout_multiple_resolved(self):
387         expected_logs = """Preparing rollout for bug 50005.
388 Preparing rollout for bug 50006.
389 Preparing rollout for bug 50004.
390 Updating working directory
391 MOCK create_bug
392 bug_title: REGRESSION(r963): Reason
393 bug_description: http://trac.webkit.org/changeset/963 broke the build:
394 Reason
395 component: MOCK component
396 cc: MOCK cc
397 blocked: 50005, 50006, 50004
398 MOCK reopen_bug 50005 with comment 'Re-opened since this is blocked by bug 60001'
399 MOCK reopen_bug 50006 with comment 'Re-opened since this is blocked by bug 60001'
400 MOCK reopen_bug 50004 with comment 'Re-opened since this is blocked by bug 60001'
401 MOCK add_patch_to_bug: bug_id=60001, description=ROLLOUT of r963, mark_for_review=False, mark_for_commit_queue=True, mark_for_landing=False
402 -- Begin comment --
403 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.
404
405 If you would like to land the rollout faster, you can use the following command:
406
407   webkit-patch land-attachment ATTACHMENT_ID
408
409 where ATTACHMENT_ID is the ID of this attachment.
410 -- End comment --
411 """
412         self.assert_execute_outputs(CreateRollout(), ["987 3001 963", "Reason"], options=self._default_options(), expected_logs=expected_logs)
413
414     def test_rollout(self):
415         expected_logs = """Preparing rollout for bug 50000.
416 Updating working directory
417 MOCK: user.open_url: file://...
418 Was that diff correct?
419 Building WebKit
420 Committed r49824: <http://trac.webkit.org/changeset/49824>
421 MOCK reopen_bug 50000 with comment 'Reverted r852 for reason:
422
423 Reason
424
425 Committed r49824: <http://trac.webkit.org/changeset/49824>'
426 """
427         self.assert_execute_outputs(Rollout(), [852, "Reason", "Description"], options=self._default_options(), expected_logs=expected_logs)
428
429     def test_rollout_two_revisions(self):
430         expected_logs = """Preparing rollout for bug 50000.
431 Preparing rollout for bug 50005.
432 Updating working directory
433 MOCK: user.open_url: file://...
434 Was that diff correct?
435 Building WebKit
436 Committed r49824: <http://trac.webkit.org/changeset/49824>
437 MOCK reopen_bug 50000 with comment 'Reverted r852 and r963 for reason:
438
439 Reason
440
441 Committed r49824: <http://trac.webkit.org/changeset/49824>'
442 MOCK reopen_bug 50005 with comment 'Reverted r852 and r963 for reason:
443
444 Reason
445
446 Committed r49824: <http://trac.webkit.org/changeset/49824>'
447 """
448         self.assert_execute_outputs(Rollout(), ["852 963", "Reason", "Description"], options=self._default_options(), expected_logs=expected_logs)
449
450     def test_rollout_multiple_revisions(self):
451         expected_logs = """Preparing rollout for bug 50000.
452 Preparing rollout for bug 50005.
453 Preparing rollout for bug 50004.
454 Updating working directory
455 MOCK: user.open_url: file://...
456 Was that diff correct?
457 Building WebKit
458 Committed r49824: <http://trac.webkit.org/changeset/49824>
459 MOCK reopen_bug 50000 with comment 'Reverted r852, r963, and r3001 for reason:
460
461 Reason
462
463 Committed r49824: <http://trac.webkit.org/changeset/49824>'
464 MOCK reopen_bug 50005 with comment 'Reverted r852, r963, and r3001 for reason:
465
466 Reason
467
468 Committed r49824: <http://trac.webkit.org/changeset/49824>'
469 MOCK reopen_bug 50004 with comment 'Reverted r852, r963, and r3001 for reason:
470
471 Reason
472
473 Committed r49824: <http://trac.webkit.org/changeset/49824>'
474 """
475         self.assert_execute_outputs(Rollout(), ["852 3001 963", "Reason", "Description"], options=self._default_options(), expected_logs=expected_logs)
476
477     def test_rollout_multiple_revisions_with_a_missing_bug_id(self):
478         expected_logs = """Preparing rollout for bug 50000.
479 Preparing rollout for bug 50005.
480 Unable to parse bug number from diff.
481 Updating working directory
482 MOCK: user.open_url: file://...
483 Was that diff correct?
484 Building WebKit
485 Committed r49824: <http://trac.webkit.org/changeset/49824>
486 MOCK reopen_bug 50000 with comment 'Reverted r852, r963, and r999 for reason:
487
488 Reason
489
490 Committed r49824: <http://trac.webkit.org/changeset/49824>'
491 MOCK reopen_bug 50005 with comment 'Reverted r852, r963, and r999 for reason:
492
493 Reason
494
495 Committed r49824: <http://trac.webkit.org/changeset/49824>'
496 """
497         self.assert_execute_outputs(Rollout(), ["852 999 963", "Reason", "Description"], options=self._default_options(), expected_logs=expected_logs)