Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: tools/push-to-trunk/test_scripts.py

Issue 181453002: Reset trunk to 3.24.35.4 (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « tools/push-to-trunk/push_to_trunk.py ('k') | tools/run-tests.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2013 the V8 project authors. All rights reserved. 2 # Copyright 2013 the V8 project authors. All rights reserved.
3 # Redistribution and use in source and binary forms, with or without 3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are 4 # modification, are permitted provided that the following conditions are
5 # met: 5 # met:
6 # 6 #
7 # * Redistributions of source code must retain the above copyright 7 # * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer. 8 # notice, this list of conditions and the following disclaimer.
9 # * Redistributions in binary form must reproduce the above 9 # * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following 10 # copyright notice, this list of conditions and the following
(...skipping 13 matching lines...) Expand all
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 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. 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 28
29 import os 29 import os
30 import tempfile 30 import tempfile
31 import traceback 31 import traceback
32 import unittest 32 import unittest
33 33
34 import common_includes
35 from common_includes import *
36 import push_to_trunk
37 from push_to_trunk import *
34 import auto_roll 38 import auto_roll
35 from auto_roll import AutoRollOptions 39 from auto_roll import AutoRollOptions
36 from auto_roll import CheckLastPush 40 from auto_roll import CheckLastPush
37 from auto_roll import FetchLatestRevision 41 from auto_roll import FetchLatestRevision
38 from auto_roll import SETTINGS_LOCATION 42 from auto_roll import SETTINGS_LOCATION
39 import common_includes
40 from common_includes import *
41 import merge_to_branch
42 from merge_to_branch import *
43 import push_to_trunk
44 from push_to_trunk import *
45 43
46 44
47 TEST_CONFIG = { 45 TEST_CONFIG = {
48 BRANCHNAME: "test-prepare-push", 46 BRANCHNAME: "test-prepare-push",
49 TRUNKBRANCH: "test-trunk-push", 47 TRUNKBRANCH: "test-trunk-push",
50 PERSISTFILE_BASENAME: "/tmp/test-v8-push-to-trunk-tempfile", 48 PERSISTFILE_BASENAME: "/tmp/test-v8-push-to-trunk-tempfile",
51 TEMP_BRANCH: "test-prepare-push-temporary-branch-created-by-script", 49 TEMP_BRANCH: "test-prepare-push-temporary-branch-created-by-script",
52 DOT_GIT_LOCATION: None, 50 DOT_GIT_LOCATION: None,
53 VERSION_FILE: None, 51 VERSION_FILE: None,
54 CHANGELOG_FILE: None, 52 CHANGELOG_FILE: None,
55 CHANGELOG_ENTRY_FILE: "/tmp/test-v8-push-to-trunk-tempfile-changelog-entry", 53 CHANGELOG_ENTRY_FILE: "/tmp/test-v8-push-to-trunk-tempfile-changelog-entry",
56 PATCH_FILE: "/tmp/test-v8-push-to-trunk-tempfile-patch", 54 PATCH_FILE: "/tmp/test-v8-push-to-trunk-tempfile-patch",
57 COMMITMSG_FILE: "/tmp/test-v8-push-to-trunk-tempfile-commitmsg", 55 COMMITMSG_FILE: "/tmp/test-v8-push-to-trunk-tempfile-commitmsg",
58 CHROMIUM: "/tmp/test-v8-push-to-trunk-tempfile-chromium", 56 CHROMIUM: "/tmp/test-v8-push-to-trunk-tempfile-chromium",
59 DEPS_FILE: "/tmp/test-v8-push-to-trunk-tempfile-chromium/DEPS", 57 DEPS_FILE: "/tmp/test-v8-push-to-trunk-tempfile-chromium/DEPS",
60 SETTINGS_LOCATION: None, 58 SETTINGS_LOCATION: None,
61 ALREADY_MERGING_SENTINEL_FILE:
62 "/tmp/test-merge-to-branch-tempfile-already-merging",
63 COMMIT_HASHES_FILE: "/tmp/test-merge-to-branch-tempfile-PATCH_COMMIT_HASHES",
64 TEMPORARY_PATCH_FILE: "/tmp/test-merge-to-branch-tempfile-temporary-patch",
65 } 59 }
66 60
67 AUTO_ROLL_ARGS = [
68 "-a", "author@chromium.org",
69 "-c", TEST_CONFIG[CHROMIUM],
70 "-r", "reviewer@chromium.org",
71 ]
72 61
73 62 def MakeOptions(s=0, l=None, f=False, m=True, r=None, c=None,
74 def MakeOptions(s=0, l=None, f=False, m=True, r=None, c=None, a=None, 63 status_password=None):
75 status_password=None, revert_bleeding_edge=None, p=None):
76 """Convenience wrapper.""" 64 """Convenience wrapper."""
77 class Options(object): 65 class Options(object):
78 pass 66 pass
79 options = Options() 67 options = Options()
80 options.s = s 68 options.s = s
81 options.l = l 69 options.l = l
82 options.f = f 70 options.f = f
83 options.m = m 71 options.m = m
84 options.reviewer = r 72 options.r = r
85 options.c = c 73 options.c = c
86 options.a = a
87 options.p = p
88 options.status_password = status_password 74 options.status_password = status_password
89 options.revert_bleeding_edge = revert_bleeding_edge
90 return options 75 return options
91 76
92 77
93 class ToplevelTest(unittest.TestCase): 78 class ToplevelTest(unittest.TestCase):
94 def testMakeComment(self): 79 def testMakeComment(self):
95 self.assertEquals("# Line 1\n# Line 2\n#", 80 self.assertEquals("# Line 1\n# Line 2\n#",
96 MakeComment(" Line 1\n Line 2\n")) 81 MakeComment(" Line 1\n Line 2\n"))
97 self.assertEquals("#Line 1\n#Line 2", 82 self.assertEquals("#Line 1\n#Line 2",
98 MakeComment("Line 1\n Line 2")) 83 MakeComment("Line 1\n Line 2"))
99 84
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 self._index = -1 220 self._index = -1
236 221
237 def Expect(self, recipe): 222 def Expect(self, recipe):
238 self._recipe = recipe 223 self._recipe = recipe
239 224
240 def Call(self, *args): 225 def Call(self, *args):
241 self._index += 1 226 self._index += 1
242 try: 227 try:
243 expected_call = self._recipe[self._index] 228 expected_call = self._recipe[self._index]
244 except IndexError: 229 except IndexError:
245 raise NoRetryException("Calling %s %s" % (self._name, " ".join(args))) 230 raise Exception("Calling %s %s" % (self._name, " ".join(args)))
246 231
247 # Pack expectations without arguments into a list. 232 # Pack expectations without arguments into a list.
248 if not isinstance(expected_call, list): 233 if not isinstance(expected_call, list):
249 expected_call = [expected_call] 234 expected_call = [expected_call]
250 235
251 # The number of arguments in the expectation must match the actual 236 # The number of arguments in the expectation must match the actual
252 # arguments. 237 # arguments.
253 if len(args) > len(expected_call): 238 if len(args) > len(expected_call):
254 raise NoRetryException("When calling %s with arguments, the " 239 raise NoRetryException("When calling %s with arguments, the "
255 "expectations must consist of at least as many arguments.") 240 "expectations must consist of at least as many arguments.")
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 f.write("#define MINOR_VERSION 22\n") 282 f.write("#define MINOR_VERSION 22\n")
298 f.write("#define BUILD_NUMBER 5\n") 283 f.write("#define BUILD_NUMBER 5\n")
299 f.write("#define PATCH_LEVEL 0\n") 284 f.write("#define PATCH_LEVEL 0\n")
300 f.write(" // Some line...\n") 285 f.write(" // Some line...\n")
301 f.write("#define IS_CANDIDATE_VERSION 0\n") 286 f.write("#define IS_CANDIDATE_VERSION 0\n")
302 return name 287 return name
303 288
304 def MakeStep(self, step_class=Step, state=None, options=None): 289 def MakeStep(self, step_class=Step, state=None, options=None):
305 """Convenience wrapper.""" 290 """Convenience wrapper."""
306 options = options or CommonOptions(MakeOptions()) 291 options = options or CommonOptions(MakeOptions())
307 state = state if state is not None else self._state
308 return MakeStep(step_class=step_class, number=0, state=state, 292 return MakeStep(step_class=step_class, number=0, state=state,
309 config=TEST_CONFIG, options=options, 293 config=TEST_CONFIG, options=options,
310 side_effect_handler=self) 294 side_effect_handler=self)
311 295
312 def GitMock(self, cmd, args="", pipe=True): 296 def GitMock(self, cmd, args="", pipe=True):
313 print "%s %s" % (cmd, args) 297 print "%s %s" % (cmd, args)
314 return self._git_mock.Call(args) 298 return self._git_mock.Call(args)
315 299
316 def LogMock(self, cmd, args=""): 300 def LogMock(self, cmd, args=""):
317 print "Log: %s %s" % (cmd, args) 301 print "Log: %s %s" % (cmd, args)
318 302
319 MOCKS = { 303 MOCKS = {
320 "git": GitMock, 304 "git": GitMock,
321 # TODO(machenbach): Little hack to reuse the git mock for the one svn call
322 # in merge-to-branch. The command should be made explicit in the test
323 # expectations.
324 "svn": GitMock,
325 "vi": LogMock, 305 "vi": LogMock,
326 } 306 }
327 307
328 def Call(self, fun, *args, **kwargs): 308 def Call(self, fun, *args, **kwargs):
329 print "Calling %s with %s and %s" % (str(fun), str(args), str(kwargs)) 309 print "Calling %s with %s and %s" % (str(fun), str(args), str(kwargs))
330 310
331 def Command(self, cmd, args="", prefix="", pipe=True): 311 def Command(self, cmd, args="", prefix="", pipe=True):
332 return ScriptTest.MOCKS[cmd](self, cmd, args) 312 return ScriptTest.MOCKS[cmd](self, cmd, args)
333 313
334 def ReadLine(self): 314 def ReadLine(self):
(...skipping 21 matching lines...) Expand all
356 336
357 def ExpectReadURL(self, *args): 337 def ExpectReadURL(self, *args):
358 """Convenience wrapper.""" 338 """Convenience wrapper."""
359 self._url_mock.Expect(*args) 339 self._url_mock.Expect(*args)
360 340
361 def setUp(self): 341 def setUp(self):
362 self._git_mock = SimpleMock("git") 342 self._git_mock = SimpleMock("git")
363 self._rl_mock = SimpleMock("readline") 343 self._rl_mock = SimpleMock("readline")
364 self._url_mock = SimpleMock("readurl") 344 self._url_mock = SimpleMock("readurl")
365 self._tmp_files = [] 345 self._tmp_files = []
366 self._state = {}
367 346
368 def tearDown(self): 347 def tearDown(self):
369 Command("rm", "-rf %s*" % TEST_CONFIG[PERSISTFILE_BASENAME]) 348 Command("rm", "-rf %s*" % TEST_CONFIG[PERSISTFILE_BASENAME])
370 349
371 # Clean up temps. Doesn't work automatically. 350 # Clean up temps. Doesn't work automatically.
372 for name in self._tmp_files: 351 for name in self._tmp_files:
373 if os.path.exists(name): 352 if os.path.exists(name):
374 os.remove(name) 353 os.remove(name)
375 354
376 self._git_mock.AssertFinished() 355 self._git_mock.AssertFinished()
377 self._rl_mock.AssertFinished() 356 self._rl_mock.AssertFinished()
378 self._url_mock.AssertFinished() 357 self._url_mock.AssertFinished()
379 358
359 def testPersistRestore(self):
360 self.MakeStep().Persist("test1", "")
361 self.assertEquals("", self.MakeStep().Restore("test1"))
362 self.MakeStep().Persist("test2", "AB123")
363 self.assertEquals("AB123", self.MakeStep().Restore("test2"))
364
380 def testGitOrig(self): 365 def testGitOrig(self):
381 self.assertTrue(Command("git", "--version").startswith("git version")) 366 self.assertTrue(Command("git", "--version").startswith("git version"))
382 367
383 def testGitMock(self): 368 def testGitMock(self):
384 self.ExpectGit([["--version", "git version 1.2.3"], ["dummy", ""]]) 369 self.ExpectGit([["--version", "git version 1.2.3"], ["dummy", ""]])
385 self.assertEquals("git version 1.2.3", self.MakeStep().Git("--version")) 370 self.assertEquals("git version 1.2.3", self.MakeStep().Git("--version"))
386 self.assertEquals("", self.MakeStep().Git("dummy")) 371 self.assertEquals("", self.MakeStep().Git("dummy"))
387 372
388 def testCommonPrepareDefault(self): 373 def testCommonPrepareDefault(self):
389 self.ExpectGit([ 374 self.ExpectGit([
390 ["status -s -uno", ""], 375 ["status -s -uno", ""],
391 ["status -s -b -uno", "## some_branch"], 376 ["status -s -b -uno", "## some_branch"],
392 ["svn fetch", ""], 377 ["svn fetch", ""],
393 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], 378 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]],
394 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], 379 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""],
395 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], 380 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""],
396 ["branch", ""], 381 ["branch", ""],
397 ]) 382 ])
398 self.ExpectReadline(["Y"]) 383 self.ExpectReadline(["Y"])
399 self.MakeStep().CommonPrepare() 384 self.MakeStep().CommonPrepare()
400 self.MakeStep().PrepareBranch() 385 self.MakeStep().PrepareBranch()
401 self.assertEquals("some_branch", self._state["current_branch"]) 386 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch"))
402 387
403 def testCommonPrepareNoConfirm(self): 388 def testCommonPrepareNoConfirm(self):
404 self.ExpectGit([ 389 self.ExpectGit([
405 ["status -s -uno", ""], 390 ["status -s -uno", ""],
406 ["status -s -b -uno", "## some_branch"], 391 ["status -s -b -uno", "## some_branch"],
407 ["svn fetch", ""], 392 ["svn fetch", ""],
408 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], 393 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]],
409 ]) 394 ])
410 self.ExpectReadline(["n"]) 395 self.ExpectReadline(["n"])
411 self.MakeStep().CommonPrepare() 396 self.MakeStep().CommonPrepare()
412 self.assertRaises(Exception, self.MakeStep().PrepareBranch) 397 self.assertRaises(Exception, self.MakeStep().PrepareBranch)
413 self.assertEquals("some_branch", self._state["current_branch"]) 398 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch"))
414 399
415 def testCommonPrepareDeleteBranchFailure(self): 400 def testCommonPrepareDeleteBranchFailure(self):
416 self.ExpectGit([ 401 self.ExpectGit([
417 ["status -s -uno", ""], 402 ["status -s -uno", ""],
418 ["status -s -b -uno", "## some_branch"], 403 ["status -s -b -uno", "## some_branch"],
419 ["svn fetch", ""], 404 ["svn fetch", ""],
420 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], 405 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]],
421 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], None], 406 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], None],
422 ]) 407 ])
423 self.ExpectReadline(["Y"]) 408 self.ExpectReadline(["Y"])
424 self.MakeStep().CommonPrepare() 409 self.MakeStep().CommonPrepare()
425 self.assertRaises(Exception, self.MakeStep().PrepareBranch) 410 self.assertRaises(Exception, self.MakeStep().PrepareBranch)
426 self.assertEquals("some_branch", self._state["current_branch"]) 411 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch"))
427 412
428 def testInitialEnvironmentChecks(self): 413 def testInitialEnvironmentChecks(self):
429 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() 414 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile()
430 os.environ["EDITOR"] = "vi" 415 os.environ["EDITOR"] = "vi"
431 self.MakeStep().InitialEnvironmentChecks() 416 self.MakeStep().InitialEnvironmentChecks()
432 417
433 def testReadAndPersistVersion(self): 418 def testReadAndPersistVersion(self):
434 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() 419 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile()
435 step = self.MakeStep() 420 step = self.MakeStep()
436 step.ReadAndPersistVersion() 421 step.ReadAndPersistVersion()
437 self.assertEquals("3", step["major"]) 422 self.assertEquals("3", self.MakeStep().Restore("major"))
438 self.assertEquals("22", step["minor"]) 423 self.assertEquals("22", self.MakeStep().Restore("minor"))
439 self.assertEquals("5", step["build"]) 424 self.assertEquals("5", self.MakeStep().Restore("build"))
440 self.assertEquals("0", step["patch"]) 425 self.assertEquals("0", self.MakeStep().Restore("patch"))
426 self.assertEquals("3", step._state["major"])
427 self.assertEquals("22", step._state["minor"])
428 self.assertEquals("5", step._state["build"])
429 self.assertEquals("0", step._state["patch"])
441 430
442 def testRegex(self): 431 def testRegex(self):
443 self.assertEqual("(issue 321)", 432 self.assertEqual("(issue 321)",
444 re.sub(r"BUG=v8:(.*)$", r"(issue \1)", "BUG=v8:321")) 433 re.sub(r"BUG=v8:(.*)$", r"(issue \1)", "BUG=v8:321"))
445 self.assertEqual("(Chromium issue 321)", 434 self.assertEqual("(Chromium issue 321)",
446 re.sub(r"BUG=(.*)$", r"(Chromium issue \1)", "BUG=321")) 435 re.sub(r"BUG=(.*)$", r"(Chromium issue \1)", "BUG=321"))
447 436
448 cl = " too little\n\ttab\ttab\n too much\n trailing " 437 cl = " too little\n\ttab\ttab\n too much\n trailing "
449 cl = MSub(r"\t", r" ", cl) 438 cl = MSub(r"\t", r" ", cl)
450 cl = MSub(r"^ {1,7}([^ ])", r" \1", cl) 439 cl = MSub(r"^ {1,7}([^ ])", r" \1", cl)
451 cl = MSub(r"^ {9,80}([^ ])", r" \1", cl) 440 cl = MSub(r"^ {9,80}([^ ])", r" \1", cl)
452 cl = MSub(r" +$", r"", cl) 441 cl = MSub(r" +$", r"", cl)
453 self.assertEqual(" too little\n" 442 self.assertEqual(" too little\n"
454 " tab tab\n" 443 " tab tab\n"
455 " too much\n" 444 " too much\n"
456 " trailing", cl) 445 " trailing", cl)
457 446
458 self.assertEqual("//\n#define BUILD_NUMBER 3\n", 447 self.assertEqual("//\n#define BUILD_NUMBER 3\n",
459 MSub(r"(?<=#define BUILD_NUMBER)(?P<space>\s+)\d*$", 448 MSub(r"(?<=#define BUILD_NUMBER)(?P<space>\s+)\d*$",
460 r"\g<space>3", 449 r"\g<space>3",
461 "//\n#define BUILD_NUMBER 321\n")) 450 "//\n#define BUILD_NUMBER 321\n"))
462 451
463 def testPrepareChangeLog(self): 452 def testPrepareChangeLog(self):
464 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() 453 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile()
465 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() 454 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile()
466 455
467 self.ExpectGit([ 456 self.ExpectGit([
468 ["log --format=%H 1234..HEAD", "rev1\nrev2\nrev3\nrev4"], 457 ["log 1234..HEAD --format=%H", "rev1\nrev2\nrev3\nrev4"],
469 ["log -1 --format=%s rev1", "Title text 1"], 458 ["log -1 rev1 --format=\"%s\"", "Title text 1"],
470 ["log -1 --format=%B rev1", "Title\n\nBUG=\nLOG=y\n"], 459 ["log -1 rev1 --format=\"%B\"", "Title\n\nBUG=\nLOG=y\n"],
471 ["log -1 --format=%an rev1", "author1@chromium.org"], 460 ["log -1 rev1 --format=\"%an\"", "author1@chromium.org"],
472 ["log -1 --format=%s rev2", "Title text 2."], 461 ["log -1 rev2 --format=\"%s\"", "Title text 2."],
473 ["log -1 --format=%B rev2", "Title\n\nBUG=123\nLOG= \n"], 462 ["log -1 rev2 --format=\"%B\"", "Title\n\nBUG=123\nLOG= \n"],
474 ["log -1 --format=%an rev2", "author2@chromium.org"], 463 ["log -1 rev2 --format=\"%an\"", "author2@chromium.org"],
475 ["log -1 --format=%s rev3", "Title text 3"], 464 ["log -1 rev3 --format=\"%s\"", "Title text 3"],
476 ["log -1 --format=%B rev3", "Title\n\nBUG=321\nLOG=true\n"], 465 ["log -1 rev3 --format=\"%B\"", "Title\n\nBUG=321\nLOG=true\n"],
477 ["log -1 --format=%an rev3", "author3@chromium.org"], 466 ["log -1 rev3 --format=\"%an\"", "author3@chromium.org"],
478 ["log -1 --format=%s rev4", "Title text 4"], 467 ["log -1 rev4 --format=\"%s\"", "Title text 4"],
479 ["log -1 --format=%B rev4", 468 ["log -1 rev4 --format=\"%B\"",
480 ("Title\n\nBUG=456\nLOG=Y\n\n" 469 ("Title\n\nBUG=456\nLOG=Y\n\n"
481 "Review URL: https://codereview.chromium.org/9876543210\n")], 470 "Review URL: https://codereview.chromium.org/9876543210\n")],
482 ["log -1 --format=%an rev4", "author4@chromium.org"], 471 ["log -1 rev4 --format=\"%an\"", "author4@chromium.org"],
483 ]) 472 ])
484 473
485 # The cl for rev4 on rietveld has an updated LOG flag. 474 # The cl for rev4 on rietveld has an updated LOG flag.
486 self.ExpectReadURL([ 475 self.ExpectReadURL([
487 ["https://codereview.chromium.org/9876543210/description", 476 ["https://codereview.chromium.org/9876543210/description",
488 "Title\n\nBUG=456\nLOG=N\n\n"], 477 "Title\n\nBUG=456\nLOG=N\n\n"],
489 ]) 478 ])
490 479
491 self._state["last_push_bleeding_edge"] = "1234" 480 self.MakeStep().Persist("last_push", "1234")
492 self.MakeStep(PrepareChangeLog).Run() 481 self.MakeStep(PrepareChangeLog).Run()
493 482
494 actual_cl = FileToText(TEST_CONFIG[CHANGELOG_ENTRY_FILE]) 483 actual_cl = FileToText(TEST_CONFIG[CHANGELOG_ENTRY_FILE])
495 484
496 expected_cl = """1999-07-31: Version 3.22.5 485 expected_cl = """1999-07-31: Version 3.22.5
497 486
498 Title text 1. 487 Title text 1.
499 488
500 Title text 3 (Chromium issue 321). 489 Title text 3 (Chromium issue 321).
501 490
(...skipping 11 matching lines...) Expand all
513 # 502 #
514 # Title text 3 (Chromium issue 321). 503 # Title text 3 (Chromium issue 321).
515 # (author3@chromium.org) 504 # (author3@chromium.org)
516 # 505 #
517 # Title text 4 (Chromium issue 456). 506 # Title text 4 (Chromium issue 456).
518 # (author4@chromium.org) 507 # (author4@chromium.org)
519 # 508 #
520 #""" 509 #"""
521 510
522 self.assertEquals(expected_cl, actual_cl) 511 self.assertEquals(expected_cl, actual_cl)
523 self.assertEquals("3", self._state["major"]) 512 self.assertEquals("3", self.MakeStep().Restore("major"))
524 self.assertEquals("22", self._state["minor"]) 513 self.assertEquals("22", self.MakeStep().Restore("minor"))
525 self.assertEquals("5", self._state["build"]) 514 self.assertEquals("5", self.MakeStep().Restore("build"))
526 self.assertEquals("0", self._state["patch"]) 515 self.assertEquals("0", self.MakeStep().Restore("patch"))
527 516
528 def testEditChangeLog(self): 517 def testEditChangeLog(self):
529 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() 518 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile()
530 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() 519 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile()
531 TextToFile(" Original CL", TEST_CONFIG[CHANGELOG_FILE]) 520 TextToFile(" Original CL", TEST_CONFIG[CHANGELOG_FILE])
532 TextToFile(" New \n\tLines \n", TEST_CONFIG[CHANGELOG_ENTRY_FILE]) 521 TextToFile(" New \n\tLines \n", TEST_CONFIG[CHANGELOG_ENTRY_FILE])
533 os.environ["EDITOR"] = "vi" 522 os.environ["EDITOR"] = "vi"
534 523
535 self.ExpectReadline([ 524 self.ExpectReadline([
536 "", # Open editor. 525 "", # Open editor.
537 ]) 526 ])
538 527
539 self.MakeStep(EditChangeLog).Run() 528 self.MakeStep(EditChangeLog).Run()
540 529
541 self.assertEquals("New\n Lines\n\n\n Original CL", 530 self.assertEquals("New\n Lines\n\n\n Original CL",
542 FileToText(TEST_CONFIG[CHANGELOG_FILE])) 531 FileToText(TEST_CONFIG[CHANGELOG_FILE]))
543 532
544 def testIncrementVersion(self): 533 def testIncrementVersion(self):
545 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() 534 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile()
546 self._state["build"] = "5" 535 self.MakeStep().Persist("build", "5")
547 536
548 self.ExpectReadline([ 537 self.ExpectReadline([
549 "Y", # Increment build number. 538 "Y", # Increment build number.
550 ]) 539 ])
551 540
552 self.MakeStep(IncrementVersion).Run() 541 self.MakeStep(IncrementVersion).Run()
553 542
554 self.assertEquals("3", self._state["new_major"]) 543 self.assertEquals("3", self.MakeStep().Restore("new_major"))
555 self.assertEquals("22", self._state["new_minor"]) 544 self.assertEquals("22", self.MakeStep().Restore("new_minor"))
556 self.assertEquals("6", self._state["new_build"]) 545 self.assertEquals("6", self.MakeStep().Restore("new_build"))
557 self.assertEquals("0", self._state["new_patch"]) 546 self.assertEquals("0", self.MakeStep().Restore("new_patch"))
558 547
559 def testLastChangeLogEntries(self): 548 def testLastChangeLogEntries(self):
560 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() 549 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile()
561 l = """ 550 l = """
562 Fixed something. 551 Fixed something.
563 (issue 1234)\n""" 552 (issue 1234)\n"""
564 for _ in xrange(10): l = l + l 553 for _ in xrange(10): l = l + l
565 554
566 cl_chunk = """2013-11-12: Version 3.23.2\n%s 555 cl_chunk = """2013-11-12: Version 3.23.2\n%s
567 Performance and stability improvements on all platforms.\n\n\n""" % l 556 Performance and stability improvements on all platforms.\n\n\n""" % l
568 557
569 cl_chunk_full = cl_chunk + cl_chunk + cl_chunk 558 cl_chunk_full = cl_chunk + cl_chunk + cl_chunk
570 TextToFile(cl_chunk_full, TEST_CONFIG[CHANGELOG_FILE]) 559 TextToFile(cl_chunk_full, TEST_CONFIG[CHANGELOG_FILE])
571 560
572 cl = GetLastChangeLogEntries(TEST_CONFIG[CHANGELOG_FILE]) 561 cl = GetLastChangeLogEntries(TEST_CONFIG[CHANGELOG_FILE])
573 self.assertEquals(cl_chunk, cl) 562 self.assertEquals(cl_chunk, cl)
574 563
575 def _TestSquashCommits(self, change_log, expected_msg): 564 def _TestSquashCommits(self, change_log, expected_msg):
576 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() 565 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile()
577 with open(TEST_CONFIG[CHANGELOG_ENTRY_FILE], "w") as f: 566 with open(TEST_CONFIG[CHANGELOG_ENTRY_FILE], "w") as f:
578 f.write(change_log) 567 f.write(change_log)
579 568
580 self.ExpectGit([ 569 self.ExpectGit([
581 ["diff svn/trunk hash1", "patch content"], 570 ["diff svn/trunk hash1", "patch content"],
582 ["svn find-rev hash1", "123455\n"], 571 ["svn find-rev hash1", "123455\n"],
583 ]) 572 ])
584 573
585 self._state["prepare_commit_hash"] = "hash1" 574 self.MakeStep().Persist("prepare_commit_hash", "hash1")
586 self._state["date"] = "1999-11-11" 575 self.MakeStep().Persist("date", "1999-11-11")
587 576
588 self.MakeStep(SquashCommits).Run() 577 self.MakeStep(SquashCommits).Run()
589 self.assertEquals(FileToText(TEST_CONFIG[COMMITMSG_FILE]), expected_msg) 578 self.assertEquals(FileToText(TEST_CONFIG[COMMITMSG_FILE]), expected_msg)
590 579
591 patch = FileToText(TEST_CONFIG[ PATCH_FILE]) 580 patch = FileToText(TEST_CONFIG[ PATCH_FILE])
592 self.assertTrue(re.search(r"patch content", patch)) 581 self.assertTrue(re.search(r"patch content", patch))
593 582
594 def testSquashCommitsUnformatted(self): 583 def testSquashCommitsUnformatted(self):
595 change_log = """1999-11-11: Version 3.22.5 584 change_log = """1999-11-11: Version 3.22.5
596 585
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 review_suffix = "\n\nTBR=reviewer@chromium.org" if not manual else "" 656 review_suffix = "\n\nTBR=reviewer@chromium.org" if not manual else ""
668 self.ExpectGit([ 657 self.ExpectGit([
669 ["status -s -uno", ""], 658 ["status -s -uno", ""],
670 ["status -s -b -uno", "## some_branch\n"], 659 ["status -s -b -uno", "## some_branch\n"],
671 ["svn fetch", ""], 660 ["svn fetch", ""],
672 ["branch", " branch1\n* branch2\n"], 661 ["branch", " branch1\n* branch2\n"],
673 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], 662 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""],
674 ["branch", " branch1\n* branch2\n"], 663 ["branch", " branch1\n* branch2\n"],
675 ["branch", " branch1\n* branch2\n"], 664 ["branch", " branch1\n* branch2\n"],
676 ["checkout -b %s svn/bleeding_edge" % TEST_CONFIG[BRANCHNAME], ""], 665 ["checkout -b %s svn/bleeding_edge" % TEST_CONFIG[BRANCHNAME], ""],
677 [("log -1 --format=%H --grep=" 666 ["log -1 --format=%H ChangeLog", "1234\n"],
678 "\"^Version [[:digit:]]*\.[[:digit:]]*\.[[:digit:]]* (based\" " 667 ["log -1 1234", "Last push ouput\n"],
679 "svn/trunk"), "hash2\n"], 668 ["log 1234..HEAD --format=%H", "rev1\n"],
680 ["log -1 hash2", "Log message\n"], 669 ["log -1 rev1 --format=\"%s\"", "Log text 1.\n"],
681 ["log -1 --format=%s hash2", 670 ["log -1 rev1 --format=\"%B\"", "Text\nLOG=YES\nBUG=v8:321\nText\n"],
682 "Version 3.4.5 (based on bleeding_edge revision r1234)\n"], 671 ["log -1 rev1 --format=\"%an\"", "author1@chromium.org\n"],
683 ["svn find-rev r1234", "hash3\n"], 672 [("commit -a -m \"Prepare push to trunk. "
684 ["log --format=%H hash3..HEAD", "rev1\n"],
685 ["log -1 --format=%s rev1", "Log text 1.\n"],
686 ["log -1 --format=%B rev1", "Text\nLOG=YES\nBUG=v8:321\nText\n"],
687 ["log -1 --format=%an rev1", "author1@chromium.org\n"],
688 [("commit -am \"Prepare push to trunk. "
689 "Now working on version 3.22.6.%s\"" % review_suffix), 673 "Now working on version 3.22.6.%s\"" % review_suffix),
690 " 2 files changed\n", 674 " 2 files changed\n",
691 CheckPreparePush], 675 CheckPreparePush],
692 [("cl upload --send-mail --email \"author@chromium.org\" " 676 ["cl upload -r \"reviewer@chromium.org\" --send-mail%s" % force_flag,
693 "-r \"reviewer@chromium.org\"%s" % force_flag),
694 "done\n"], 677 "done\n"],
695 ["cl presubmit", "Presubmit successfull\n"], 678 ["cl presubmit", "Presubmit successfull\n"],
696 ["cl dcommit -f --bypass-hooks", "Closing issue\n"], 679 ["cl dcommit -f --bypass-hooks", "Closing issue\n"],
697 ["svn fetch", "fetch result\n"], 680 ["svn fetch", "fetch result\n"],
698 ["checkout -f svn/bleeding_edge", ""], 681 ["checkout svn/bleeding_edge", ""],
699 [("log -1 --format=%H --grep=\"Prepare push to trunk. " 682 [("log -1 --format=%H --grep=\"Prepare push to trunk. "
700 "Now working on version 3.22.6.\""), 683 "Now working on version 3.22.6.\""),
701 "hash1\n"], 684 "hash1\n"],
702 ["diff svn/trunk hash1", "patch content\n"], 685 ["diff svn/trunk hash1", "patch content\n"],
703 ["svn find-rev hash1", "123455\n"], 686 ["svn find-rev hash1", "123455\n"],
704 ["checkout -b %s svn/trunk" % TEST_CONFIG[TRUNKBRANCH], ""], 687 ["checkout -b %s svn/trunk" % TEST_CONFIG[TRUNKBRANCH], ""],
705 ["apply --index --reject \"%s\"" % TEST_CONFIG[PATCH_FILE], ""], 688 ["apply --index --reject \"%s\"" % TEST_CONFIG[PATCH_FILE], ""],
706 ["add \"%s\"" % TEST_CONFIG[VERSION_FILE], ""], 689 ["add \"%s\"" % TEST_CONFIG[VERSION_FILE], ""],
707 ["commit -aF \"%s\"" % TEST_CONFIG[COMMITMSG_FILE], "", CheckSVNCommit], 690 ["commit -F \"%s\"" % TEST_CONFIG[COMMITMSG_FILE], "", CheckSVNCommit],
708 ["svn dcommit 2>&1", "Some output\nCommitted r123456\nSome output\n"], 691 ["svn dcommit 2>&1", "Some output\nCommitted r123456\nSome output\n"],
709 ["svn tag 3.22.5 -m \"Tagging version 3.22.5\"", ""], 692 ["svn tag 3.22.5 -m \"Tagging version 3.22.5\"", ""],
710 ["status -s -uno", ""], 693 ["status -s -uno", ""],
711 ["checkout -f master", ""], 694 ["checkout master", ""],
712 ["pull", ""], 695 ["pull", ""],
713 ["checkout -b v8-roll-123456", ""], 696 ["checkout -b v8-roll-123456", ""],
714 [("commit -am \"Update V8 to version 3.22.5 " 697 [("commit -am \"Update V8 to version 3.22.5 "
715 "(based on bleeding_edge revision r123455).\n\n" 698 "(based on bleeding_edge revision r123455).\n\n"
716 "TBR=reviewer@chromium.org\""), 699 "TBR=reviewer@chromium.org\""),
717 ""], 700 ""],
718 ["cl upload --send-mail --email \"author@chromium.org\"%s" % force_flag, 701 ["cl upload --send-mail%s" % force_flag, ""],
719 ""],
720 ["checkout -f some_branch", ""], 702 ["checkout -f some_branch", ""],
721 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], 703 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""],
722 ["branch -D %s" % TEST_CONFIG[BRANCHNAME], ""], 704 ["branch -D %s" % TEST_CONFIG[BRANCHNAME], ""],
723 ["branch -D %s" % TEST_CONFIG[TRUNKBRANCH], ""], 705 ["branch -D %s" % TEST_CONFIG[TRUNKBRANCH], ""],
724 ]) 706 ])
725 707
726 # Expected keyboard input in manual mode: 708 # Expected keyboard input in manual mode:
727 if manual: 709 if manual:
728 self.ExpectReadline([ 710 self.ExpectReadline([
729 "Y", # Confirm last push. 711 "Y", # Confirm last push.
730 "", # Open editor. 712 "", # Open editor.
731 "Y", # Increment build number. 713 "Y", # Increment build number.
732 "reviewer@chromium.org", # V8 reviewer. 714 "reviewer@chromium.org", # V8 reviewer.
733 "LGTX", # Enter LGTM for V8 CL (wrong). 715 "LGTX", # Enter LGTM for V8 CL (wrong).
734 "LGTM", # Enter LGTM for V8 CL. 716 "LGTM", # Enter LGTM for V8 CL.
735 "Y", # Sanity check. 717 "Y", # Sanity check.
736 "reviewer@chromium.org", # Chromium reviewer. 718 "reviewer@chromium.org", # Chromium reviewer.
737 ]) 719 ])
738 720
739 # Expected keyboard input in semi-automatic mode: 721 # Expected keyboard input in semi-automatic mode:
740 if not manual and not force: 722 if not manual and not force:
741 self.ExpectReadline([ 723 self.ExpectReadline([
742 "LGTM", # Enter LGTM for V8 CL. 724 "LGTM", # Enter LGTM for V8 CL.
743 ]) 725 ])
744 726
745 # No keyboard input in forced mode: 727 # No keyboard input in forced mode:
746 if force: 728 if force:
747 self.ExpectReadline([]) 729 self.ExpectReadline([])
748 730
749 args = ["-a", "author@chromium.org", "-c", TEST_CONFIG[CHROMIUM]] 731 options = MakeOptions(f=force, m=manual,
750 if force: args.append("-f") 732 r="reviewer@chromium.org" if not manual else None,
751 if manual: args.append("-m") 733 c = TEST_CONFIG[CHROMIUM])
752 else: args += ["-r", "reviewer@chromium.org"]
753 options = push_to_trunk.BuildOptions().parse_args(args)
754 RunPushToTrunk(TEST_CONFIG, PushToTrunkOptions(options), self) 734 RunPushToTrunk(TEST_CONFIG, PushToTrunkOptions(options), self)
755 735
756 deps = FileToText(TEST_CONFIG[DEPS_FILE]) 736 deps = FileToText(TEST_CONFIG[DEPS_FILE])
757 self.assertTrue(re.search("\"v8_revision\": \"123456\"", deps)) 737 self.assertTrue(re.search("\"v8_revision\": \"123456\"", deps))
758 738
759 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE]) 739 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE])
760 self.assertTrue(re.search(r"^\d\d\d\d\-\d+\-\d+: Version 3\.22\.5", cl)) 740 self.assertTrue(re.search(r"^\d\d\d\d\-\d+\-\d+: Version 3\.22\.5", cl))
761 self.assertTrue(re.search(r" Log text 1 \(issue 321\).", cl)) 741 self.assertTrue(re.search(r" Log text 1 \(issue 321\).", cl))
762 self.assertTrue(re.search(r"1999\-04\-05: Version 3\.22\.4", cl)) 742 self.assertTrue(re.search(r"1999\-04\-05: Version 3\.22\.4", cl))
763 743
(...skipping 14 matching lines...) Expand all
778 self.ExpectGit([ 758 self.ExpectGit([
779 ["svn log -1 --oneline", "r101 | Text"], 759 ["svn log -1 --oneline", "r101 | Text"],
780 ["svn log -1 --oneline ChangeLog", "r99 | Prepare push to trunk..."], 760 ["svn log -1 --oneline ChangeLog", "r99 | Prepare push to trunk..."],
781 ]) 761 ])
782 762
783 state = {} 763 state = {}
784 self.MakeStep(FetchLatestRevision, state=state).Run() 764 self.MakeStep(FetchLatestRevision, state=state).Run()
785 self.assertRaises(Exception, self.MakeStep(CheckLastPush, state=state).Run) 765 self.assertRaises(Exception, self.MakeStep(CheckLastPush, state=state).Run)
786 766
787 def testAutoRoll(self): 767 def testAutoRoll(self):
788 password = self.MakeEmptyTempFile() 768 status_password = self.MakeEmptyTempFile()
789 TextToFile("PW", password) 769 TextToFile("PW", status_password)
790 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() 770 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile()
791 TEST_CONFIG[SETTINGS_LOCATION] = "~/.doesnotexist" 771 TEST_CONFIG[SETTINGS_LOCATION] = "~/.doesnotexist"
792 772
793 self.ExpectReadURL([ 773 self.ExpectReadURL([
794 ["https://v8-status.appspot.com/current?format=json", 774 ["https://v8-status.appspot.com/current?format=json",
795 "{\"message\": \"Tree is throttled\"}"], 775 "{\"message\": \"Tree is throttled\"}"],
796 ["https://v8-status.appspot.com/lkgr", Exception("Network problem")], 776 ["https://v8-status.appspot.com/lkgr", Exception("Network problem")],
797 ["https://v8-status.appspot.com/lkgr", "100"], 777 ["https://v8-status.appspot.com/lkgr", "100"],
798 ["https://v8-status.appspot.com/status", 778 ["https://v8-status.appspot.com/status",
799 ("username=v8-auto-roll%40chromium.org&" 779 ("username=v8-auto-roll%40chromium.org&"
800 "message=Tree+is+closed+%28preparing+to+push%29&password=PW"), 780 "message=Tree+is+closed+%28preparing+to+push%29&password=PW"),
801 ""], 781 ""],
802 ["https://v8-status.appspot.com/status", 782 ["https://v8-status.appspot.com/status",
803 ("username=v8-auto-roll%40chromium.org&" 783 ("username=v8-auto-roll%40chromium.org&"
804 "message=Tree+is+throttled&password=PW"), ""], 784 "message=Tree+is+throttled&password=PW"), ""],
805 ]) 785 ])
806 786
807 self.ExpectGit([ 787 self.ExpectGit([
808 ["status -s -uno", ""], 788 ["status -s -uno", ""],
809 ["status -s -b -uno", "## some_branch\n"], 789 ["status -s -b -uno", "## some_branch\n"],
810 ["svn fetch", ""], 790 ["svn fetch", ""],
811 ["svn log -1 --oneline", "r100 | Text"], 791 ["svn log -1 --oneline", "r100 | Text"],
812 [("log -1 --format=%H --grep=\"" 792 ["svn log -1 --oneline ChangeLog", "r65 | Prepare push to trunk..."],
813 "^Version [[:digit:]]*\.[[:digit:]]*\.[[:digit:]]* (based\""
814 " svn/trunk"), "push_hash\n"],
815 ["svn find-rev push_hash", "65"],
816 ]) 793 ])
817 794
818 options = auto_roll.BuildOptions().parse_args( 795 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(
819 AUTO_ROLL_ARGS + ["--status-password", password]) 796 MakeOptions(status_password=status_password)), self)
820 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(options), self)
821 797
822 state = json.loads(FileToText("%s-state.json" 798 self.assertEquals("100", self.MakeStep().Restore("lkgr"))
823 % TEST_CONFIG[PERSISTFILE_BASENAME])) 799 self.assertEquals("100", self.MakeStep().Restore("latest"))
824
825 self.assertEquals("100", state["lkgr"])
826 self.assertEquals("100", state["latest"])
827 800
828 def testAutoRollStoppedBySettings(self): 801 def testAutoRollStoppedBySettings(self):
829 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() 802 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile()
830 TEST_CONFIG[SETTINGS_LOCATION] = self.MakeEmptyTempFile() 803 TEST_CONFIG[SETTINGS_LOCATION] = self.MakeEmptyTempFile()
831 TextToFile("{\"enable_auto_roll\": false}", TEST_CONFIG[SETTINGS_LOCATION]) 804 TextToFile("{\"enable_auto_roll\": false}", TEST_CONFIG[SETTINGS_LOCATION])
832 805
833 self.ExpectReadURL([]) 806 self.ExpectReadURL([])
834 807
835 self.ExpectGit([ 808 self.ExpectGit([
836 ["status -s -uno", ""], 809 ["status -s -uno", ""],
837 ["status -s -b -uno", "## some_branch\n"], 810 ["status -s -b -uno", "## some_branch\n"],
838 ["svn fetch", ""], 811 ["svn fetch", ""],
839 ]) 812 ])
840 813
841 options = auto_roll.BuildOptions().parse_args(AUTO_ROLL_ARGS)
842 def RunAutoRoll(): 814 def RunAutoRoll():
843 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(options), self) 815 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(MakeOptions()), self)
844 self.assertRaises(Exception, RunAutoRoll) 816 self.assertRaises(Exception, RunAutoRoll)
845 817
846 def testAutoRollStoppedByTreeStatus(self): 818 def testAutoRollStoppedByTreeStatus(self):
847 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() 819 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile()
848 TEST_CONFIG[SETTINGS_LOCATION] = "~/.doesnotexist" 820 TEST_CONFIG[SETTINGS_LOCATION] = "~/.doesnotexist"
849 821
850 self.ExpectReadURL([ 822 self.ExpectReadURL([
851 ["https://v8-status.appspot.com/current?format=json", 823 ["https://v8-status.appspot.com/current?format=json",
852 "{\"message\": \"Tree is throttled (no push)\"}"], 824 "{\"message\": \"Tree is throttled (no push)\"}"],
853 ]) 825 ])
854 826
855 self.ExpectGit([ 827 self.ExpectGit([
856 ["status -s -uno", ""], 828 ["status -s -uno", ""],
857 ["status -s -b -uno", "## some_branch\n"], 829 ["status -s -b -uno", "## some_branch\n"],
858 ["svn fetch", ""], 830 ["svn fetch", ""],
859 ]) 831 ])
860 832
861 options = auto_roll.BuildOptions().parse_args(AUTO_ROLL_ARGS)
862 def RunAutoRoll(): 833 def RunAutoRoll():
863 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(options), self) 834 auto_roll.RunAutoRoll(TEST_CONFIG, AutoRollOptions(MakeOptions()), self)
864 self.assertRaises(Exception, RunAutoRoll) 835 self.assertRaises(Exception, RunAutoRoll)
865 836
866 def testMergeToBranch(self):
867 TEST_CONFIG[ALREADY_MERGING_SENTINEL_FILE] = self.MakeEmptyTempFile()
868 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile()
869 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile()
870 os.environ["EDITOR"] = "vi"
871 extra_patch = self.MakeEmptyTempFile()
872
873 def VerifyPatch(patch):
874 return lambda: self.assertEquals(patch,
875 FileToText(TEST_CONFIG[TEMPORARY_PATCH_FILE]))
876
877 msg = """Merged r12345, r23456, r34567, r45678, r56789 into trunk branch.
878
879 Title4
880
881 Title2
882
883 Title3
884
885 Title1
886
887 Title5
888
889 BUG=123,234,345,456,567,v8:123
890 LOG=N
891 """
892
893 def VerifySVNCommit():
894 commit = FileToText(TEST_CONFIG[COMMITMSG_FILE])
895 self.assertEquals(msg, commit)
896 version = FileToText(TEST_CONFIG[VERSION_FILE])
897 self.assertTrue(re.search(r"#define MINOR_VERSION\s+22", version))
898 self.assertTrue(re.search(r"#define BUILD_NUMBER\s+5", version))
899 self.assertTrue(re.search(r"#define PATCH_LEVEL\s+1", version))
900 self.assertTrue(re.search(r"#define IS_CANDIDATE_VERSION\s+0", version))
901
902 self.ExpectGit([
903 ["status -s -uno", ""],
904 ["status -s -b -uno", "## some_branch\n"],
905 ["svn fetch", ""],
906 ["branch", " branch1\n* branch2\n"],
907 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""],
908 ["branch", " branch1\n* branch2\n"],
909 ["checkout -b %s svn/trunk" % TEST_CONFIG[BRANCHNAME], ""],
910 ["log --format=%H --grep=\"Port r12345\" --reverse svn/bleeding_edge",
911 "hash1\nhash2"],
912 ["svn find-rev hash1 svn/bleeding_edge", "45678"],
913 ["log -1 --format=%s hash1", "Title1"],
914 ["svn find-rev hash2 svn/bleeding_edge", "23456"],
915 ["log -1 --format=%s hash2", "Title2"],
916 ["log --format=%H --grep=\"Port r23456\" --reverse svn/bleeding_edge",
917 ""],
918 ["log --format=%H --grep=\"Port r34567\" --reverse svn/bleeding_edge",
919 "hash3"],
920 ["svn find-rev hash3 svn/bleeding_edge", "56789"],
921 ["log -1 --format=%s hash3", "Title3"],
922 ["svn find-rev r12345 svn/bleeding_edge", "hash4"],
923 # Simulate svn being down which stops the script.
924 ["svn find-rev r23456 svn/bleeding_edge", None],
925 # Restart script in the failing step.
926 ["svn find-rev r12345 svn/bleeding_edge", "hash4"],
927 ["svn find-rev r23456 svn/bleeding_edge", "hash2"],
928 ["svn find-rev r34567 svn/bleeding_edge", "hash3"],
929 ["svn find-rev r45678 svn/bleeding_edge", "hash1"],
930 ["svn find-rev r56789 svn/bleeding_edge", "hash5"],
931 ["log -1 --format=%s hash4", "Title4"],
932 ["log -1 --format=%s hash2", "Title2"],
933 ["log -1 --format=%s hash3", "Title3"],
934 ["log -1 --format=%s hash1", "Title1"],
935 ["log -1 --format=%s hash5", "Title5"],
936 ["log -1 hash4", "Title4\nBUG=123\nBUG=234"],
937 ["log -1 hash2", "Title2\n BUG = v8:123,345"],
938 ["log -1 hash3", "Title3\nLOG=n\nBUG=567, 456"],
939 ["log -1 hash1", "Title1"],
940 ["log -1 hash5", "Title5"],
941 ["log -1 -p hash4", "patch4"],
942 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE],
943 "", VerifyPatch("patch4")],
944 ["log -1 -p hash2", "patch2"],
945 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE],
946 "", VerifyPatch("patch2")],
947 ["log -1 -p hash3", "patch3"],
948 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE],
949 "", VerifyPatch("patch3")],
950 ["log -1 -p hash1", "patch1"],
951 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE],
952 "", VerifyPatch("patch1")],
953 ["log -1 -p hash5", "patch5"],
954 ["apply --index --reject \"%s\"" % TEST_CONFIG[TEMPORARY_PATCH_FILE],
955 "", VerifyPatch("patch5")],
956 ["apply --index --reject \"%s\"" % extra_patch, ""],
957 ["commit -aF \"%s\"" % TEST_CONFIG[COMMITMSG_FILE], ""],
958 ["cl upload --send-mail -r \"reviewer@chromium.org\"", ""],
959 ["checkout -f %s" % TEST_CONFIG[BRANCHNAME], ""],
960 ["cl presubmit", "Presubmit successfull\n"],
961 ["cl dcommit -f --bypass-hooks", "Closing issue\n", VerifySVNCommit],
962 ["svn fetch", ""],
963 ["log -1 --format=%%H --grep=\"%s\" svn/trunk" % msg, "hash6"],
964 ["svn find-rev hash6", "1324"],
965 [("copy -r 1324 https://v8.googlecode.com/svn/trunk "
966 "https://v8.googlecode.com/svn/tags/3.22.5.1 -m "
967 "\"Tagging version 3.22.5.1\""), ""],
968 ["checkout -f some_branch", ""],
969 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""],
970 ["branch -D %s" % TEST_CONFIG[BRANCHNAME], ""],
971 ])
972
973 self.ExpectReadline([
974 "Y", # Automatically add corresponding ports (34567, 56789)?
975 "Y", # Automatically increment patch level?
976 "reviewer@chromium.org", # V8 reviewer.
977 "LGTM", # Enter LGTM for V8 CL.
978 ])
979
980 # r12345 and r34567 are patches. r23456 (included) and r45678 are the MIPS
981 # ports of r12345. r56789 is the MIPS port of r34567.
982 args = ["-f", "-p", extra_patch, "--branch", "trunk", "12345", "23456",
983 "34567"]
984 options = merge_to_branch.BuildOptions().parse_args(args)
985 self.assertTrue(merge_to_branch.ProcessOptions(options))
986
987 # The first run of the script stops because of the svn being down.
988 self.assertRaises(GitFailedException,
989 lambda: RunMergeToBranch(TEST_CONFIG,
990 MergeToBranchOptions(options),
991 self))
992
993 # Test that state recovery after restarting the script works.
994 options.s = 3
995 RunMergeToBranch(TEST_CONFIG, MergeToBranchOptions(options), self)
996
997
998 class SystemTest(unittest.TestCase): 837 class SystemTest(unittest.TestCase):
999 def testReload(self): 838 def testReload(self):
1000 step = MakeStep(step_class=PrepareChangeLog, number=0, state={}, config={}, 839 step = MakeStep(step_class=PrepareChangeLog, number=0, state={}, config={},
1001 options=CommonOptions(MakeOptions()), 840 options=CommonOptions(MakeOptions()),
1002 side_effect_handler=DEFAULT_SIDE_EFFECT_HANDLER) 841 side_effect_handler=DEFAULT_SIDE_EFFECT_HANDLER)
1003 body = step.Reload( 842 body = step.Reload(
1004 """------------------------------------------------------------------------ 843 """------------------------------------------------------------------------
1005 r17997 | machenbach@chromium.org | 2013-11-22 11:04:04 +0100 (...) | 6 lines 844 r17997 | machenbach@chromium.org | 2013-11-22 11:04:04 +0100 (...) | 6 lines
1006 845
1007 Prepare push to trunk. Now working on version 3.23.11. 846 Prepare push to trunk. Now working on version 3.23.11.
1008 847
1009 R=danno@chromium.org 848 R=danno@chromium.org
1010 849
1011 Review URL: https://codereview.chromium.org/83173002 850 Review URL: https://codereview.chromium.org/83173002
1012 851
1013 ------------------------------------------------------------------------""") 852 ------------------------------------------------------------------------""")
1014 self.assertEquals( 853 self.assertEquals(
1015 """Prepare push to trunk. Now working on version 3.23.11. 854 """Prepare push to trunk. Now working on version 3.23.11.
1016 855
1017 R=danno@chromium.org 856 R=danno@chromium.org
1018 857
1019 Committed: https://code.google.com/p/v8/source/detail?r=17997""", body) 858 Committed: https://code.google.com/p/v8/source/detail?r=17997""", body)
OLDNEW
« no previous file with comments | « tools/push-to-trunk/push_to_trunk.py ('k') | tools/run-tests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698