1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#!/usr/bin/env python
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Copyright 2013 the V8 project authors. All rights reserved.
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Redistribution and use in source and binary forms, with or without
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# modification, are permitted provided that the following conditions are
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# met:
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#     * Redistributions of source code must retain the above copyright
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       notice, this list of conditions and the following disclaimer.
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#     * Redistributions in binary form must reproduce the above
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       copyright notice, this list of conditions and the following
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       disclaimer in the documentation and/or other materials provided
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       with the distribution.
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#     * Neither the name of Google Inc. nor the names of its
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       contributors may be used to endorse or promote products derived
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       from this software without specific prior written permission.
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport os
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport shutil
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport tempfile
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport traceback
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport unittest
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport auto_push
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfrom auto_push import LastReleaseBailout
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport auto_roll
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport common_includes
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom common_includes import *
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport create_release
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfrom create_release import CreateRelease
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport merge_to_branch
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochfrom merge_to_branch import MergeToBranch
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport push_to_candidates
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfrom push_to_candidates import *
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport releases
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom releases import Releases
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom auto_tag import AutoTag
49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochimport roll_merge
50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochfrom roll_merge import RollMerge
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_CONFIG = {
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "DEFAULT_CWD": None,
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "BRANCHNAME": "test-prepare-push",
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "CANDIDATESBRANCH": "test-candidates-push",
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "PERSISTFILE_BASENAME": "/tmp/test-v8-push-to-candidates-tempfile",
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "CHANGELOG_ENTRY_FILE":
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      "/tmp/test-v8-push-to-candidates-tempfile-changelog-entry",
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "PATCH_FILE": "/tmp/test-v8-push-to-candidates-tempfile-patch",
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "COMMITMSG_FILE": "/tmp/test-v8-push-to-candidates-tempfile-commitmsg",
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "CHROMIUM": "/tmp/test-v8-push-to-candidates-tempfile-chromium",
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "SETTINGS_LOCATION": None,
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "ALREADY_MERGING_SENTINEL_FILE":
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      "/tmp/test-merge-to-branch-tempfile-already-merging",
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "TEMPORARY_PATCH_FILE": "/tmp/test-merge-to-branch-tempfile-temporary-patch",
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAUTO_PUSH_ARGS = [
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "-a", "author@chromium.org",
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "-r", "reviewer@chromium.org",
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch]
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ToplevelTest(unittest.TestCase):
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testSaniniziteVersionTags(self):
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertEquals("4.8.230", SanitizeVersionTag("4.8.230"))
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertEquals("4.8.230", SanitizeVersionTag("tags/4.8.230"))
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertEquals(None, SanitizeVersionTag("candidate"))
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testNormalizeVersionTags(self):
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    input = ["4.8.230",
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "tags/4.8.230",
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "tags/4.8.224.1",
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "4.8.224.1",
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "4.8.223.1",
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "tags/4.8.223",
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "tags/4.8.231",
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              "candidates"]
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    expected = ["4.8.230",
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                "4.8.230",
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                "4.8.224.1",
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                "4.8.224.1",
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                "4.8.223.1",
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                "4.8.223",
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                "4.8.231",
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                ]
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertEquals(expected, NormalizeVersionTags(input))
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testSortBranches(self):
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    S = releases.SortBranches
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals(["3.1", "2.25"], S(["2.25", "3.1"])[0:2])
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals(["3.0", "2.25"], S(["2.25", "3.0", "2.24"])[0:2])
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals(["3.11", "3.2"], S(["3.11", "3.2", "2.24"])[0:2])
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testFilterDuplicatesAndReverse(self):
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    F = releases.FilterDuplicatesAndReverse
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals([], F([]))
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals([["100", "10"]], F([["100", "10"]]))
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals([["99", "9"], ["100", "10"]],
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      F([["100", "10"], ["99", "9"]]))
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals([["98", "9"], ["100", "10"]],
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      F([["100", "10"], ["99", "9"], ["98", "9"]]))
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals([["98", "9"], ["99", "10"]],
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      F([["100", "10"], ["99", "10"], ["98", "9"]]))
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testBuildRevisionRanges(self):
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    B = releases.BuildRevisionRanges
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals({}, B([]))
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals({"10": "100"}, B([["100", "10"]]))
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals({"10": "100", "9": "99:99"},
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      B([["100", "10"], ["99", "9"]]))
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals({"10": "100", "9": "97:99"},
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      B([["100", "10"], ["98", "9"], ["97", "9"]]))
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals({"10": "100", "9": "99:99", "3": "91:98"},
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      B([["100", "10"], ["99", "9"], ["91", "3"]]))
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals({"13": "101", "12": "100:100", "9": "94:97",
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                       "3": "91:93, 98:99"},
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      B([["101", "13"], ["100", "12"], ["98", "3"],
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         ["94", "9"], ["91", "3"]]))
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeComment(self):
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("#   Line 1\n#   Line 2\n#",
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeComment("    Line 1\n    Line 2\n"))
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("#Line 1\n#Line 2",
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeComment("Line 1\n Line 2"))
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testStripComments(self):
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("    Line 1\n    Line 3\n",
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        StripComments("    Line 1\n#   Line 2\n    Line 3\n#\n"))
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("\nLine 2 ### Test\n #",
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        StripComments("###\n# \n\n#  Line 1\nLine 2 ### Test\n #"))
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeChangeLogBodySimple(self):
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    commits = [
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ["Title text 1",
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "Title text 1\n\nBUG=\n",
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "author1@chromium.org"],
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ["Title text 2.",
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "Title text 2\n\nBUG=1234\n",
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "author2@chromium.org"],
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ]
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("        Title text 1.\n"
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      "        (author1@chromium.org)\n\n"
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      "        Title text 2 (Chromium issue 1234).\n"
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      "        (author2@chromium.org)\n\n",
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBody(commits))
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeChangeLogBodyEmpty(self):
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("", MakeChangeLogBody([]))
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeChangeLogBodyAutoFormat(self):
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    commits = [
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ["Title text 1!",
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "Title text 1\nLOG=y\nBUG=\n",
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "author1@chromium.org"],
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ["Title text 2",
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "Title text 2\n\nBUG=1234\n",
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "author2@chromium.org"],
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ["Title text 3",
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "Title text 3\n\nBUG=1234\nLOG = Yes\n",
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "author3@chromium.org"],
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ["Title text 3",
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "Title text 4\n\nBUG=1234\nLOG=\n",
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "author4@chromium.org"],
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ]
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("        Title text 1.\n\n"
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      "        Title text 3 (Chromium issue 1234).\n\n",
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBody(commits, True))
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testRegressWrongLogEntryOnTrue(self):
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    body = """
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCheck elimination: Learn from if(CompareMap(x)) on true branch.
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBUG=
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochR=verwaest@chromium.org
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCommitted: https://code.google.com/p/v8/source/detail?r=18210
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("", MakeChangeLogBody([["title", body, "author"]], True))
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeChangeLogBugReferenceEmpty(self):
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("", MakeChangeLogBugReference(""))
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("", MakeChangeLogBugReference("LOG="))
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("", MakeChangeLogBugReference(" BUG ="))
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("", MakeChangeLogBugReference("BUG=none\t"))
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeChangeLogBugReferenceSimple(self):
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(issue 987654)",
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("BUG = v8:987654"))
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(Chromium issue 987654)",
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("BUG=987654 "))
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeChangeLogBugReferenceFromBody(self):
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(Chromium issue 1234567)",
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("Title\n\nTBR=\nBUG=\n"
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                " BUG=\tchromium:1234567\t\n"
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "R=somebody\n"))
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeChangeLogBugReferenceMultiple(self):
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # All issues should be sorted and grouped. Multiple references to the same
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # issue should be filtered.
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(issues 123, 234, Chromium issue 345)",
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("Title\n\n"
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=v8:234\n"
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "  BUG\t= 345, \tv8:234,\n"
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=v8:123\n"
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "R=somebody\n"))
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(Chromium issues 123, 234)",
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("Title\n\n"
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=234,,chromium:123 \n"
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "R=somebody\n"))
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(Chromium issues 123, 234)",
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("Title\n\n"
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=chromium:234, , 123\n"
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "R=somebody\n"))
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(issues 345, 456)",
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("Title\n\n"
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "\t\tBUG=v8:345,v8:456\n"
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "R=somebody\n"))
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(issue 123, Chromium issues 345, 456)",
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("Title\n\n"
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=chromium:456\n"
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG = none\n"
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "R=somebody\n"
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=456,v8:123, 345"))
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  # TODO(machenbach): These test don't make much sense when the formatting is
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  # done later.
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testMakeChangeLogBugReferenceLong(self):
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # -----------------00--------10--------20--------30--------
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(issues 234, 1234567890, 1234567"
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      "8901234567890, Chromium issues 12345678,"
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      " 123456789)",
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("BUG=v8:234\n"
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=v8:1234567890\n"
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=v8:12345678901234567890\n"
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=123456789\n"
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=12345678\n"))
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # -----------------00--------10--------20--------30--------
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(issues 234, 1234567890, 1234567"
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      "8901234567890, Chromium issues"
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      " 123456789, 1234567890)",
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("BUG=v8:234\n"
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=v8:12345678901234567890\n"
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=v8:1234567890\n"
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=123456789\n"
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=1234567890\n"))
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # -----------------00--------10--------20--------30--------
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("(Chromium issues 234, 1234567890"
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      ", 12345678901234567, "
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      "1234567890123456789)",
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      MakeChangeLogBugReference("BUG=234\n"
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=12345678901234567\n"
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=1234567890123456789\n"
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                "BUG=1234567890\n"))
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef Cmd(*args, **kwargs):
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """Convenience function returning a shell command test expectation."""
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return {
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "name": "command",
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "args": args,
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "ret": args[-1],
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "cb": kwargs.get("cb"),
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "cwd": kwargs.get("cwd", TEST_CONFIG["DEFAULT_CWD"]),
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef RL(text, cb=None):
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """Convenience function returning a readline test expectation."""
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return {
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "name": "readline",
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "args": [],
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "ret": text,
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "cb": cb,
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "cwd": None,
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef URL(*args, **kwargs):
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """Convenience function returning a readurl test expectation."""
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return {
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "name": "readurl",
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "args": args[:-1],
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "ret": args[-1],
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "cb": kwargs.get("cb"),
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "cwd": None,
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SimpleMock(object):
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def __init__(self):
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._recipe = []
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._index = -1
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def Expect(self, recipe):
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._recipe = recipe
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def Call(self, name, *args, **kwargs):  # pragma: no cover
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._index += 1
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    try:
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expected_call = self._recipe[self._index]
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    except IndexError:
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raise NoRetryException("Calling %s %s" % (name, " ".join(args)))
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not isinstance(expected_call, dict):
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raise NoRetryException("Found wrong expectation type for %s %s" %
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             (name, " ".join(args)))
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if expected_call["name"] != name:
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raise NoRetryException("Expected action: %s %s - Actual: %s" %
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (expected_call["name"], expected_call["args"], name))
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Check if the given working directory matches the expected one.
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if expected_call["cwd"] != kwargs.get("cwd"):
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raise NoRetryException("Expected cwd: %s in %s %s - Actual: %s" %
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (expected_call["cwd"],
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           expected_call["name"],
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           expected_call["args"],
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           kwargs.get("cwd")))
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # The number of arguments in the expectation must match the actual
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # arguments.
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if len(args) > len(expected_call['args']):
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raise NoRetryException("When calling %s with arguments, the "
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "expectations must consist of at least as many arguments." %
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          name)
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Compare expected and actual arguments.
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (expected_arg, actual_arg) in zip(expected_call['args'], args):
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if expected_arg != actual_arg:
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        raise NoRetryException("Expected: %s - Actual: %s" %
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               (expected_arg, actual_arg))
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # The expected call contains an optional callback for checking the context
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # at the time of the call.
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if expected_call['cb']:
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      try:
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        expected_call['cb']()
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      except:
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        tb = traceback.format_exc()
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        raise NoRetryException("Caught exception from callback: %s" % tb)
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # If the return value is an exception, raise it instead of returning.
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if isinstance(expected_call['ret'], Exception):
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raise expected_call['ret']
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return expected_call['ret']
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def AssertFinished(self):  # pragma: no cover
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if self._index < len(self._recipe) -1:
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      raise NoRetryException("Called mock too seldom: %d vs. %d" %
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                             (self._index, len(self._recipe)))
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ScriptTest(unittest.TestCase):
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def MakeEmptyTempFile(self):
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    handle, name = tempfile.mkstemp()
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.close(handle)
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._tmp_files.append(name)
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return name
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def MakeEmptyTempDirectory(self):
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    name = tempfile.mkdtemp()
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._tmp_files.append(name)
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return name
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def WriteFakeVersionFile(self, major=3, minor=22, build=4, patch=0):
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    version_file = os.path.join(TEST_CONFIG["DEFAULT_CWD"], VERSION_FILE)
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not os.path.exists(os.path.dirname(version_file)):
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      os.makedirs(os.path.dirname(version_file))
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    with open(version_file, "w") as f:
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      f.write("  // Some line...\n")
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      f.write("\n")
386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      f.write("#define V8_MAJOR_VERSION    %s\n" % major)
387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      f.write("#define V8_MINOR_VERSION    %s\n" % minor)
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      f.write("#define V8_BUILD_NUMBER     %s\n" % build)
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      f.write("#define V8_PATCH_LEVEL      %s\n" % patch)
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      f.write("  // Some line...\n")
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      f.write("#define V8_IS_CANDIDATE_VERSION 0\n")
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
393109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  def WriteFakeWatchlistsFile(self):
394109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    watchlists_file = os.path.join(TEST_CONFIG["DEFAULT_CWD"], WATCHLISTS_FILE)
395109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if not os.path.exists(os.path.dirname(watchlists_file)):
396109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      os.makedirs(os.path.dirname(watchlists_file))
397109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    with open(watchlists_file, "w") as f:
398109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
399109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      content = """
400109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    'merges': [
401109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      # Only enabled on branches created with tools/release/create_release.py
402109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      # 'v8-merges@googlegroups.com',
403109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    ],
404109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch"""
405109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      f.write(content)
406109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def MakeStep(self):
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    """Convenience wrapper."""
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    options = ScriptsBase(TEST_CONFIG, self, self._state).MakeOptions([])
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MakeStep(step_class=Step, state=self._state,
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    config=TEST_CONFIG, side_effect_handler=self,
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    options=options)
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def RunStep(self, script=PushToCandidates, step_class=Step, args=None):
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    """Convenience wrapper."""
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    args = args if args is not None else ["-m"]
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return script(TEST_CONFIG, self, self._state).RunSteps([step_class], args)
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def Call(self, fun, *args, **kwargs):
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    print "Calling %s with %s and %s" % (str(fun), str(args), str(kwargs))
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def Command(self, cmd, args="", prefix="", pipe=True, cwd=None):
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    print "%s %s" % (cmd, args)
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    print "in %s" % cwd
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return self._mock.Call("command", cmd + " " + args, cwd=cwd)
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def ReadLine(self):
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return self._mock.Call("readline")
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def ReadURL(self, url, params):
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if params is not None:
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return self._mock.Call("readurl", url, params)
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    else:
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return self._mock.Call("readurl", url)
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def Sleep(self, seconds):
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    pass
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def GetDate(self):
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return "1999-07-31"
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def GetUTCStamp(self):
443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return "1000000"
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def Expect(self, *args):
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    """Convenience wrapper."""
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._mock.Expect(*args)
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def setUp(self):
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._mock = SimpleMock()
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._tmp_files = []
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._state = {}
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_CONFIG["DEFAULT_CWD"] = self.MakeEmptyTempDirectory()
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def tearDown(self):
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if os.path.exists(TEST_CONFIG["PERSISTFILE_BASENAME"]):
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      shutil.rmtree(TEST_CONFIG["PERSISTFILE_BASENAME"])
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Clean up temps. Doesn't work automatically.
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for name in self._tmp_files:
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if os.path.isfile(name):
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        os.remove(name)
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if os.path.isdir(name):
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        shutil.rmtree(name)
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._mock.AssertFinished()
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testGitMock(self):
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([Cmd("git --version", "git version 1.2.3"),
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 Cmd("git dummy", "")])
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("git version 1.2.3", self.MakeStep().Git("--version"))
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("", self.MakeStep().Git("dummy"))
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testCommonPrepareDefault(self):
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git status -s -uno", ""),
477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch", "  branch1\n* %s" % TEST_CONFIG["BRANCHNAME"]),
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RL("Y"),
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["BRANCHNAME"], ""),
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.MakeStep().CommonPrepare()
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.MakeStep().PrepareBranch()
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testCommonPrepareNoConfirm(self):
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git status -s -uno", ""),
489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch", "  branch1\n* %s" % TEST_CONFIG["BRANCHNAME"]),
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RL("n"),
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.MakeStep().CommonPrepare()
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertRaises(Exception, self.MakeStep().PrepareBranch)
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testCommonPrepareDeleteBranchFailure(self):
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git status -s -uno", ""),
500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch", "  branch1\n* %s" % TEST_CONFIG["BRANCHNAME"]),
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RL("Y"),
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["BRANCHNAME"], None),
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.MakeStep().CommonPrepare()
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertRaises(Exception, self.MakeStep().PrepareBranch)
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testInitialEnvironmentChecks(self):
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TextToFile("", os.path.join(TEST_CONFIG["DEFAULT_CWD"], ".git"))
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.environ["EDITOR"] = "vi"
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("which vi", "/usr/bin/vi"),
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.MakeStep().InitialEnvironmentChecks(TEST_CONFIG["DEFAULT_CWD"])
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  def testTagTimeout(self):
518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    self.Expect([
519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%H --grep=\"Title\" origin/candidates", ""),
521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%H --grep=\"Title\" origin/candidates", ""),
523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%H --grep=\"Title\" origin/candidates", ""),
525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%H --grep=\"Title\" origin/candidates", ""),
527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ])
528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    args = ["--branch", "candidates", "ab12345"]
529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    self._state["version"] = "tag_name"
530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    self._state["commit_title"] = "Title"
531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    self.assertRaises(Exception,
532f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        lambda: self.RunStep(RollMerge, TagRevision, args))
533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testReadAndPersistVersion(self):
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.WriteFakeVersionFile(build=5)
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    step = self.MakeStep()
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    step.ReadAndPersistVersion()
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("3", step["major"])
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("22", step["minor"])
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("5", step["build"])
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("0", step["patch"])
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testRegex(self):
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEqual("(issue 321)",
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     re.sub(r"BUG=v8:(.*)$", r"(issue \1)", "BUG=v8:321"))
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEqual("(Chromium issue 321)",
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     re.sub(r"BUG=(.*)$", r"(Chromium issue \1)", "BUG=321"))
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cl = "  too little\n\ttab\ttab\n         too much\n        trailing  "
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cl = MSub(r"\t", r"        ", cl)
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cl = MSub(r"^ {1,7}([^ ])", r"        \1", cl)
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cl = MSub(r"^ {9,80}([^ ])", r"        \1", cl)
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cl = MSub(r" +$", r"", cl)
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEqual("        too little\n"
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     "        tab        tab\n"
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     "        too much\n"
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     "        trailing", cl)
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertEqual("//\n#define V8_BUILD_NUMBER  3\n",
560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     MSub(r"(?<=#define V8_BUILD_NUMBER)(?P<space>\s+)\d*$",
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          r"\g<space>3",
562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                          "//\n#define V8_BUILD_NUMBER  321\n"))
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testPreparePushRevision(self):
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Tests the default push hash used when the --revision option is not set.
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%H HEAD", "push_hash")
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.RunStep(PushToCandidates, PreparePushRevision)
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("push_hash", self._state["push_hash"])
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testPrepareChangeLog(self):
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.WriteFakeVersionFile()
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_CONFIG["CHANGELOG_ENTRY_FILE"] = self.MakeEmptyTempFile()
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log --format=%H 1234..push_hash", "rev1\nrev2\nrev3\nrev4"),
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%s rev1", "Title text 1"),
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%B rev1", "Title\n\nBUG=\nLOG=y\n"),
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%an rev1", "author1@chromium.org"),
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%s rev2", "Title text 2."),
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%B rev2", "Title\n\nBUG=123\nLOG= \n"),
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%an rev2", "author2@chromium.org"),
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%s rev3", "Title text 3"),
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%B rev3", "Title\n\nBUG=321\nLOG=true\n"),
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%an rev3", "author3@chromium.org"),
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%s rev4", "Title text 4"),
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%B rev4",
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       ("Title\n\nBUG=456\nLOG=Y\n\n"
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        "Review URL: https://codereview.chromium.org/9876543210\n")),
592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      URL("https://codereview.chromium.org/9876543210/description",
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "Title\n\nBUG=456\nLOG=N\n\n"),
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%an rev4", "author4@chromium.org"),
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self._state["last_push_master"] = "1234"
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._state["push_hash"] = "push_hash"
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._state["version"] = "3.22.5"
600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.RunStep(PushToCandidates, PrepareChangeLog)
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    actual_cl = FileToText(TEST_CONFIG["CHANGELOG_ENTRY_FILE"])
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expected_cl = """1999-07-31: Version 3.22.5
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Title text 1.
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Title text 3 (Chromium issue 321).
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Performance and stability improvements on all platforms.
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# The change log above is auto-generated. Please review if all relevant
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# commit messages from the list below are included.
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# All lines starting with # will be stripped.
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       Title text 1.
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       (author1@chromium.org)
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       Title text 2 (Chromium issue 123).
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       (author2@chromium.org)
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       Title text 3 (Chromium issue 321).
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       (author3@chromium.org)
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       Title text 4 (Chromium issue 456).
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#       (author4@chromium.org)
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#"""
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals(expected_cl, actual_cl)
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testEditChangeLog(self):
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_CONFIG["CHANGELOG_ENTRY_FILE"] = self.MakeEmptyTempFile()
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TextToFile("  New  \n\tLines  \n", TEST_CONFIG["CHANGELOG_ENTRY_FILE"])
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.environ["EDITOR"] = "vi"
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RL(""),  # Open editor.
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("vi %s" % TEST_CONFIG["CHANGELOG_ENTRY_FILE"], ""),
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.RunStep(PushToCandidates, EditChangeLog)
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("New\n        Lines",
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                      FileToText(TEST_CONFIG["CHANGELOG_ENTRY_FILE"]))
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TAGS = """
647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch4425.0
648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch0.0.0.0
649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch3.9.6
650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch3.22.4
651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtest_tag
652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch"""
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # Version as tag: 3.22.4.0. Version on master: 3.22.6.
655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # Make sure that the latest version is 3.22.6.0.
656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testIncrementVersion(self):
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git tag", self.TAGS),
660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master -- include/v8-version.h",
661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "", cb=lambda: self.WriteFakeVersionFile(3, 22, 6)),
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.RunStep(PushToCandidates, IncrementVersion)
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("3", self._state["new_major"])
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("22", self._state["new_minor"])
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("7", self._state["new_build"])
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals("0", self._state["new_patch"])
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def _TestSquashCommits(self, change_log, expected_msg):
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_CONFIG["CHANGELOG_ENTRY_FILE"] = self.MakeEmptyTempFile()
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    with open(TEST_CONFIG["CHANGELOG_ENTRY_FILE"], "w") as f:
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      f.write(change_log)
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git diff origin/candidates hash1", "patch content"),
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._state["push_hash"] = "hash1"
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._state["date"] = "1999-11-11"
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.RunStep(PushToCandidates, SquashCommits)
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals(FileToText(TEST_CONFIG["COMMITMSG_FILE"]), expected_msg)
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    patch = FileToText(TEST_CONFIG["PATCH_FILE"])
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertTrue(re.search(r"patch content", patch))
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testSquashCommitsUnformatted(self):
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    change_log = """1999-11-11: Version 3.22.5
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Log text 1.
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Chromium issue 12345
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Performance and stability improvements on all platforms.\n"""
696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    commit_msg = """Version 3.22.5 (based on hash1)
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLog text 1. Chromium issue 12345
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPerformance and stability improvements on all platforms."""
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._TestSquashCommits(change_log, commit_msg)
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testSquashCommitsFormatted(self):
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    change_log = """1999-11-11: Version 3.22.5
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Long commit message that fills more than 80 characters (Chromium issue
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        12345).
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Performance and stability improvements on all platforms.\n"""
710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    commit_msg = """Version 3.22.5 (based on hash1)
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLong commit message that fills more than 80 characters (Chromium issue 12345).
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPerformance and stability improvements on all platforms."""
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._TestSquashCommits(change_log, commit_msg)
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testSquashCommitsQuotationMarks(self):
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    change_log = """Line with "quotation marks".\n"""
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    commit_msg = """Line with "quotation marks"."""
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self._TestSquashCommits(change_log, commit_msg)
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  def testBootstrapper(self):
723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    work_dir = self.MakeEmptyTempDirectory()
724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    class FakeScript(ScriptsBase):
725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      def _Steps(self):
726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return []
727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    # Use the test configuration without the fake testing default work dir.
729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    fake_config = dict(TEST_CONFIG)
730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    del(fake_config["DEFAULT_CWD"])
731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    self.Expect([
733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("fetch v8", "", cwd=work_dir),
734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    ])
735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    FakeScript(fake_config, self).Run(["--work-dir", work_dir])
736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def _PushToCandidates(self, force=False, manual=False):
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TextToFile("", os.path.join(TEST_CONFIG["DEFAULT_CWD"], ".git"))
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # The version file on master has build level 5, while the version
741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # file from candidates has build level 4.
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.WriteFakeVersionFile(build=5)
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_CONFIG["CHANGELOG_ENTRY_FILE"] = self.MakeEmptyTempFile()
745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    master_change_log = "2014-03-17: Sentinel\n"
746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TextToFile(master_change_log,
747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               os.path.join(TEST_CONFIG["DEFAULT_CWD"], CHANGELOG_FILE))
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.environ["EDITOR"] = "vi"
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    commit_msg_squashed = """Version 3.22.5 (squashed - based on push_hash)
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLog text 1 (issue 321).
753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPerformance and stability improvements on all platforms."""
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    commit_msg = """Version 3.22.5 (based on push_hash)
757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLog text 1 (issue 321).
759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPerformance and stability improvements on all platforms."""
761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    def ResetChangeLog():
763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      """On 'git co -b new_branch origin/candidates',
764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      and 'git checkout -- ChangeLog',
765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      the ChangLog will be reset to its content on candidates."""
766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      candidates_change_log = """1999-04-05: Version 3.22.4
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Performance and stability improvements on all platforms.\n"""
769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TextToFile(candidates_change_log,
770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                 os.path.join(TEST_CONFIG["DEFAULT_CWD"], CHANGELOG_FILE))
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    def ResetToCandidates():
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ResetChangeLog()
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.WriteFakeVersionFile()
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    def CheckVersionCommit():
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      commit = FileToText(TEST_CONFIG["COMMITMSG_FILE"])
778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertEquals(commit_msg, commit)
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      version = FileToText(
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          os.path.join(TEST_CONFIG["DEFAULT_CWD"], VERSION_FILE))
781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_MINOR_VERSION\s+22", version))
782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_BUILD_NUMBER\s+5", version))
783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertFalse(re.search(r"#define V8_BUILD_NUMBER\s+6", version))
784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_PATCH_LEVEL\s+0", version))
785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(
786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          re.search(r"#define V8_IS_CANDIDATE_VERSION\s+0", version))
787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      # Check that the change log on the candidates branch got correctly
789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      # modified.
790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      change_log = FileToText(
791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          os.path.join(TEST_CONFIG["DEFAULT_CWD"], CHANGELOG_FILE))
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.assertEquals(
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""1999-07-31: Version 3.22.5
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Log text 1 (issue 321).
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Performance and stability improvements on all platforms.
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch1999-04-05: Version 3.22.4
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Performance and stability improvements on all platforms.\n""",
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          change_log)
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    force_flag = " -f" if not manual else ""
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expectations = []
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not force:
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expectations.append(Cmd("which vi", "/usr/bin/vi"))
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expectations += [
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git status -s -uno", ""),
811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch", "  branch1\n* branch2\n"),
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch", "  branch1\n* branch2\n"),
815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd(("git new-branch %s --upstream origin/master" %
816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           TEST_CONFIG["BRANCHNAME"]), ""),
817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git tag", self.TAGS),
819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master -- include/v8-version.h",
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "", cb=self.WriteFakeVersionFile),
821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%H 3.22.4", "release_hash\n"),
822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%s release_hash",
823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "Version 3.22.4 (based on abc3)\n"),
824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log --format=%H abc3..push_hash", "rev1\n"),
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%s rev1", "Log text 1.\n"),
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%B rev1", "Text\nLOG=YES\nBUG=v8:321\nText\n"),
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%an rev1", "author1@chromium.org\n"),
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ]
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if manual:
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expectations.append(RL(""))  # Open editor.
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if not force:
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expectations.append(
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          Cmd("vi %s" % TEST_CONFIG["CHANGELOG_ENTRY_FILE"], ""))
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expectations += [
835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git checkout -f origin/master", ""),
837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git diff origin/candidates push_hash", "patch content\n"),
838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd(("git new-branch %s --upstream origin/candidates" %
839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           TEST_CONFIG["CANDIDATESBRANCH"]), "", cb=ResetToCandidates),
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git apply --index --reject \"%s\"" % TEST_CONFIG["PATCH_FILE"], ""),
841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git checkout -f origin/candidates -- ChangeLog", "",
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          cb=ResetChangeLog),
843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/candidates -- include/v8-version.h", "",
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          cb=self.WriteFakeVersionFile),
845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git commit -am \"%s\"" % commit_msg_squashed, ""),
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ]
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if manual:
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      expectations.append(RL("Y"))  # Sanity check.
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expectations += [
850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git cl land -f --bypass-hooks", ""),
851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f master", ""),
852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch", ""),
853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["CANDIDATESBRANCH"], ""),
854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd(("git new-branch %s --upstream origin/candidates" %
855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           TEST_CONFIG["CANDIDATESBRANCH"]), "", cb=ResetToCandidates),
856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git commit -aF \"%s\"" % TEST_CONFIG["COMMITMSG_FILE"], "",
857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=CheckVersionCommit),
858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git cl land -f --bypass-hooks", ""),
859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%H --grep="
861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          "\"Version 3.22.5 (based on push_hash)\""
862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          " origin/candidates", "hsh_to_tag"),
863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git tag 3.22.5 hsh_to_tag", ""),
864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git push origin 3.22.5", ""),
865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["BRANCHNAME"], ""),
867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["CANDIDATESBRANCH"], ""),
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ]
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect(expectations)
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    args = ["-a", "author@chromium.org", "--revision", "push_hash"]
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if force: args.append("-f")
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if manual: args.append("-m")
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    else: args += ["-r", "reviewer@chromium.org"]
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PushToCandidates(TEST_CONFIG, self).Run(args)
876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    cl = FileToText(os.path.join(TEST_CONFIG["DEFAULT_CWD"], CHANGELOG_FILE))
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertTrue(re.search(r"^\d\d\d\d\-\d+\-\d+: Version 3\.22\.5", cl))
879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertTrue(re.search(r"        Log text 1 \(issue 321\).", cl))
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertTrue(re.search(r"1999\-04\-05: Version 3\.22\.4", cl))
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Note: The version file is on build number 5 again in the end of this test
883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # since the git command that merges to master is mocked out.
884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testPushToCandidatesManual(self):
886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self._PushToCandidates(manual=True)
887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testPushToCandidatesSemiAutomatic(self):
889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self._PushToCandidates()
890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testPushToCandidatesForced(self):
892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self._PushToCandidates(force=True)
893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testCreateRelease(self):
895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TextToFile("", os.path.join(TEST_CONFIG["DEFAULT_CWD"], ".git"))
896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # The version file on master has build level 5.
898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.WriteFakeVersionFile(build=5)
899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    master_change_log = "2014-03-17: Sentinel\n"
901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TextToFile(master_change_log,
902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               os.path.join(TEST_CONFIG["DEFAULT_CWD"], CHANGELOG_FILE))
903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    commit_msg = """Version 3.22.5
905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLog text 1 (issue 321).
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPerformance and stability improvements on all platforms."""
909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    def ResetChangeLog():
911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      last_change_log = """1999-04-05: Version 3.22.4
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Performance and stability improvements on all platforms.\n"""
914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      TextToFile(last_change_log,
915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 os.path.join(TEST_CONFIG["DEFAULT_CWD"], CHANGELOG_FILE))
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    def CheckVersionCommit():
919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      commit = FileToText(TEST_CONFIG["COMMITMSG_FILE"])
920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertEquals(commit_msg, commit)
921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      version = FileToText(
922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          os.path.join(TEST_CONFIG["DEFAULT_CWD"], VERSION_FILE))
923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_MINOR_VERSION\s+22", version))
924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_BUILD_NUMBER\s+5", version))
925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertFalse(re.search(r"#define V8_BUILD_NUMBER\s+6", version))
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_PATCH_LEVEL\s+0", version))
927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(
928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          re.search(r"#define V8_IS_CANDIDATE_VERSION\s+0", version))
929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      # Check that the change log on the candidates branch got correctly
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      # modified.
932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      change_log = FileToText(
933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          os.path.join(TEST_CONFIG["DEFAULT_CWD"], CHANGELOG_FILE))
934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertEquals(
935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch"""1999-07-31: Version 3.22.5
936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Log text 1 (issue 321).
938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Performance and stability improvements on all platforms.
940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch1999-04-05: Version 3.22.4
943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Performance and stability improvements on all platforms.\n""",
945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          change_log)
946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    expectations = [
948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin "
949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "+refs/heads/*:refs/heads/* "
950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "+refs/pending/*:refs/pending/* "
951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "+refs/pending-tags/*:refs/pending-tags/*", ""),
952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch", ""),
954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git tag", self.TAGS),
956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master -- include/v8-version.h",
957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "", cb=self.WriteFakeVersionFile),
958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%H 3.22.4", "release_hash\n"),
959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%s release_hash", "Version 3.22.4\n"),
960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%H release_hash^", "abc3\n"),
961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log --format=%H abc3..push_hash", "rev1\n"),
962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%s rev1", "Log text 1.\n"),
963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%B rev1", "Text\nLOG=YES\nBUG=v8:321\nText\n"),
964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%an rev1", "author1@chromium.org\n"),
965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git reset --hard origin/master", ""),
966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -b work-branch push_hash", ""),
967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f 3.22.4 -- ChangeLog", "", cb=ResetChangeLog),
968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f 3.22.4 -- include/v8-version.h", "",
969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=self.WriteFakeVersionFile),
970109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      Cmd("git checkout -f 3.22.4 -- WATCHLISTS", "",
971109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          cb=self.WriteFakeWatchlistsFile),
972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git commit -aF \"%s\"" % TEST_CONFIG["COMMITMSG_FILE"], "",
973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=CheckVersionCommit),
974bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      Cmd("git log -1 --format=%H --grep=\"Version 3.22.5\" origin/3.22.5",
975bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          ""),
976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git push origin "
977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "refs/heads/work-branch:refs/pending/heads/3.22.5 "
978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "push_hash:refs/pending-tags/heads/3.22.5 "
979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "push_hash:refs/heads/3.22.5", ""),
980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch", ""),
981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%H --grep="
982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "\"Version 3.22.5\" origin/3.22.5", "hsh_to_tag"),
983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git tag 3.22.5 hsh_to_tag", ""),
984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git push origin 3.22.5", ""),
985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch", "* master\n  work-branch\n"),
987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -D work-branch", ""),
988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git gc", ""),
989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ]
990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.Expect(expectations)
991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    args = ["-a", "author@chromium.org",
993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            "-r", "reviewer@chromium.org",
994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            "--revision", "push_hash"]
995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CreateRelease(TEST_CONFIG, self).Run(args)
996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    cl = FileToText(os.path.join(TEST_CONFIG["DEFAULT_CWD"], CHANGELOG_FILE))
998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertTrue(re.search(r"^\d\d\d\d\-\d+\-\d+: Version 3\.22\.5", cl))
999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertTrue(re.search(r"        Log text 1 \(issue 321\).", cl))
1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertTrue(re.search(r"1999\-04\-05: Version 3\.22\.4", cl))
1001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # Note: The version file is on build number 5 again in the end of this test
1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # since the git command that merges to master is mocked out.
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1005109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    # Check for correct content of the WATCHLISTS file
1006109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1007109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    watchlists_content = FileToText(os.path.join(TEST_CONFIG["DEFAULT_CWD"],
1008109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                          WATCHLISTS_FILE))
1009109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    expected_watchlists_content = """
1010109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    'merges': [
1011109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      # Only enabled on branches created with tools/release/create_release.py
1012109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      'v8-merges@googlegroups.com',
1013109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    ],
1014109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch"""
1015109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    self.assertEqual(watchlists_content, expected_watchlists_content)
1016109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  C_V8_22624_LOG = """V8 CL.
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgit-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22624 123
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  C_V8_123455_LOG = """V8 CL.
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgit-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@123455 123
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  C_V8_123456_LOG = """V8 CL.
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgit-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@123456 123
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ROLL_COMMIT_MSG = """Update V8 to version 3.22.4.
1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSummary of changes available at:
1038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochhttps://chromium.googlesource.com/v8/v8/+log/last_rol..roll_hsh
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPlease follow these instructions for assigning/CC'ing issues:
1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochhttps://github.com/v8/v8/wiki/Triaging%20issues
1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPlease close rolling in case of a roll revert:
1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochhttps://v8-roll.appspot.com/
1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochThis only works with a Google account.
1046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1047c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochCQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel
1048bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTBR=reviewer@chromium.org"""
1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # Snippet from the original DEPS file.
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FAKE_DEPS = """
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvars = {
1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "v8_revision": "last_roll_hsh",
1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdeps = {
1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  "src/v8":
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    (Var("googlecode_url") % "v8") + "/" + Var("v8_branch") + "@" +
1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Var("v8_revision"),
1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch"""
1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testChromiumRollUpToDate(self):
1064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TEST_CONFIG["CHROMIUM"] = self.MakeEmptyTempDirectory()
1065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    json_output_file = os.path.join(TEST_CONFIG["CHROMIUM"], "out.json")
1066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TextToFile(self.FAKE_DEPS, os.path.join(TEST_CONFIG["CHROMIUM"], "DEPS"))
1067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.Expect([
1068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin", ""),
1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
1070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags last_roll_hsh", "3.22.4"),
1071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
1072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git rev-list --max-age=395200 --tags",
1073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "bad_tag\nroll_hsh\nhash_123"),
1074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags bad_tag", ""),
1075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags roll_hsh", "3.22.4"),
1076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags hash_123", "3.22.3"),
1077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags roll_hsh", "3.22.4"),
1078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags hash_123", "3.22.3"),
1079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ])
1080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    result = auto_roll.AutoRoll(TEST_CONFIG, self).Run(
1082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        AUTO_PUSH_ARGS + [
1083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "-c", TEST_CONFIG["CHROMIUM"],
1084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "--json-output", json_output_file])
1085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertEquals(0, result)
1086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    json_output = json.loads(FileToText(json_output_file))
1087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertEquals("up_to_date", json_output["monitoring_state"])
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  def testChromiumRoll(self):
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Setup fake directory structures.
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_CONFIG["CHROMIUM"] = self.MakeEmptyTempDirectory()
1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    json_output_file = os.path.join(TEST_CONFIG["CHROMIUM"], "out.json")
1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    TextToFile(self.FAKE_DEPS, os.path.join(TEST_CONFIG["CHROMIUM"], "DEPS"))
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TextToFile("", os.path.join(TEST_CONFIG["CHROMIUM"], ".git"))
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    chrome_dir = TEST_CONFIG["CHROMIUM"]
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.makedirs(os.path.join(chrome_dir, "v8"))
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    def WriteDeps():
1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TextToFile("Some line\n   \"v8_revision\": \"22624\",\n  some line",
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 os.path.join(chrome_dir, "DEPS"))
1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    expectations = [
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git fetch origin", ""),
1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags last_roll_hsh", "3.22.3.1"),
1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
1108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git rev-list --max-age=395200 --tags",
1109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "bad_tag\nroll_hsh\nhash_123"),
1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags bad_tag", ""),
1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags roll_hsh", "3.22.4"),
1112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags hash_123", "3.22.3"),
1113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags roll_hsh", "3.22.4"),
1114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%s roll_hsh", "Version 3.22.4\n"),
1115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags roll_hsh", "3.22.4"),
1116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags last_roll_hsh", "3.22.2.1"),
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git status -s -uno", "", cwd=chrome_dir),
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git checkout -f master", "", cwd=chrome_dir),
1119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch", "", cwd=chrome_dir),
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git pull", "", cwd=chrome_dir),
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git fetch origin", ""),
1122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git new-branch work-branch", "", cwd=chrome_dir),
1123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("roll-dep-svn v8 roll_hsh", "rolled", cb=WriteDeps, cwd=chrome_dir),
1124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd(("git commit -am \"%s\" "
1125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           "--author \"author@chromium.org <author@chromium.org>\"" %
1126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           self.ROLL_COMMIT_MSG),
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "", cwd=chrome_dir),
1128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git cl upload --send-mail --email \"author@chromium.org\" -f "
11293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          "--use-commit-queue --bypass-hooks", "", cwd=chrome_dir),
1130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f master", "", cwd=chrome_dir),
1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -D work-branch", "", cwd=chrome_dir),
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ]
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect(expectations)
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    args = ["-a", "author@chromium.org", "-c", chrome_dir,
1136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            "-r", "reviewer@chromium.org", "--json-output", json_output_file]
1137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    auto_roll.AutoRoll(TEST_CONFIG, self).Run(args)
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    deps = FileToText(os.path.join(chrome_dir, "DEPS"))
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertTrue(re.search("\"v8_revision\": \"22624\"", deps))
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    json_output = json.loads(FileToText(json_output_file))
1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    self.assertEquals("success", json_output["monitoring_state"])
1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testCheckLastPushRecently(self):
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git tag", self.TAGS),
1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%H 3.22.4", "release_hash\n"),
1150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%s release_hash",
1151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "Version 3.22.4 (based on abc3)\n"),
1152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log --format=%H abc3..abc123", "\n"),
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    self._state["candidate"] = "abc123"
1156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    self.assertEquals(0, self.RunStep(
1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        auto_push.AutoPush, LastReleaseBailout, AUTO_PUSH_ARGS))
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testAutoPush(self):
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
1161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
1162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/heads/lkgr:refs/heads/lkgr", ""),
1163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git show-ref -s refs/heads/lkgr", "abc123\n"),
1164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
1165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git tag", self.TAGS),
1166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%H 3.22.4", "release_hash\n"),
1167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%s release_hash",
1168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "Version 3.22.4 (based on abc3)\n"),
1169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log --format=%H abc3..abc123", "some_stuff\n"),
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    auto_push.AutoPush(TEST_CONFIG, self).Run(AUTO_PUSH_ARGS + ["--push"])
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    state = json.loads(FileToText("%s-state.json"
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                  % TEST_CONFIG["PERSISTFILE_BASENAME"]))
1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    self.assertEquals("abc123", state["candidate"])
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  def testRollMerge(self):
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_CONFIG["ALREADY_MERGING_SENTINEL_FILE"] = self.MakeEmptyTempFile()
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TextToFile("", os.path.join(TEST_CONFIG["DEFAULT_CWD"], ".git"))
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.WriteFakeVersionFile(build=5)
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.environ["EDITOR"] = "vi"
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    extra_patch = self.MakeEmptyTempFile()
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    def VerifyPatch(patch):
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return lambda: self.assertEquals(patch,
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          FileToText(TEST_CONFIG["TEMPORARY_PATCH_FILE"]))
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    msg = """Version 3.22.5.1 (cherry-pick)
1191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMerged ab12345
1193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMerged ab23456
1194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMerged ab34567
1195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMerged ab45678
1196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMerged ab56789
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTitle4
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTitle2
1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTitle3
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTitle1
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochRevert "Something"
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBUG=123,234,345,456,567,v8:123
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochLOG=N
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    def VerifyLand():
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      commit = FileToText(TEST_CONFIG["COMMITMSG_FILE"])
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      self.assertEquals(msg, commit)
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      version = FileToText(
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          os.path.join(TEST_CONFIG["DEFAULT_CWD"], VERSION_FILE))
1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_MINOR_VERSION\s+22", version))
1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_BUILD_NUMBER\s+5", version))
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(re.search(r"#define V8_PATCH_LEVEL\s+1", version))
1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      self.assertTrue(
1221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          re.search(r"#define V8_IS_CANDIDATE_VERSION\s+0", version))
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git status -s -uno", ""),
1225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
1226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch", "  branch1\n* branch2\n"),
1228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git new-branch %s --upstream refs/remotes/origin/candidates" %
1229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          TEST_CONFIG["BRANCHNAME"], ""),
1230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd(("git log --format=%H --grep=\"Port ab12345\" "
1231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier           "--reverse origin/master"),
1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          "ab45678\nab23456"),
1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab45678", "Title1"),
1234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab23456", "Title2"),
1235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd(("git log --format=%H --grep=\"Port ab23456\" "
1236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier           "--reverse origin/master"),
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          ""),
1238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd(("git log --format=%H --grep=\"Port ab34567\" "
1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier           "--reverse origin/master"),
1240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          "ab56789"),
1241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab56789", "Title3"),
1242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      RL("Y"),  # Automatically add corresponding ports (ab34567, ab56789)?
1243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      # Simulate git being down which stops the script.
1244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab12345", None),
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      # Restart script in the failing step.
1246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab12345", "Title4"),
1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab23456", "Title2"),
1248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab34567", "Title3"),
1249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab45678", "Title1"),
1250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s ab56789", "Revert \"Something\""),
1251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 ab12345", "Title4\nBUG=123\nBUG=234"),
1252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 ab23456", "Title2\n BUG = v8:123,345"),
1253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 ab34567", "Title3\nLOG=n\nBUG=567, 456"),
1254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 ab45678", "Title1\nBUG="),
1255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 ab56789", "Revert \"Something\"\nBUG=none"),
1256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 -p ab12345", "patch4"),
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "", cb=VerifyPatch("patch4")),
1260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 -p ab23456", "patch2"),
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "", cb=VerifyPatch("patch2")),
1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 -p ab34567", "patch3"),
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "", cb=VerifyPatch("patch3")),
1268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 -p ab45678", "patch1"),
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "", cb=VerifyPatch("patch1")),
1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 -p ab56789", "patch5\n"),
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          "", cb=VerifyPatch("patch5\n")),
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git apply --index --reject \"%s\"" % extra_patch, ""),
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RL("Y"),  # Automatically increment patch level?
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git commit -aF \"%s\"" % TEST_CONFIG["COMMITMSG_FILE"], ""),
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RL("reviewer@chromium.org"),  # V8 reviewer.
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git cl upload --send-mail -r \"reviewer@chromium.org\" "
1281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          "--bypass-hooks --cc \"ulan@chromium.org\"", ""),
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git checkout -f %s" % TEST_CONFIG["BRANCHNAME"], ""),
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      RL("LGTM"),  # Enter LGTM for V8 CL.
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git cl presubmit", "Presubmit successfull\n"),
1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git cl land -f --bypass-hooks", "Closing issue\n",
1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=VerifyLand),
1287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
1288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%H --grep=\""
1289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          "Version 3.22.5.1 (cherry-pick)"
1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "\" refs/remotes/origin/candidates",
1291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          ""),
1292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
1293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%H --grep=\""
1294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          "Version 3.22.5.1 (cherry-pick)"
1295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "\" refs/remotes/origin/candidates",
1296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          "hsh_to_tag"),
1297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git tag 3.22.5.1 hsh_to_tag", ""),
1298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git push origin 3.22.5.1", ""),
1299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["BRANCHNAME"], ""),
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    # ab12345 and ab34567 are patches. ab23456 (included) and ab45678 are the
1304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    # MIPS ports of ab12345. ab56789 is the MIPS port of ab34567.
1305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    args = ["-f", "-p", extra_patch, "--branch", "candidates",
1306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            "ab12345", "ab23456", "ab34567"]
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    # The first run of the script stops because of git being down.
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertRaises(GitFailedException,
1310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        lambda: RollMerge(TEST_CONFIG, self).Run(args))
1311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1312f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    # Test that state recovery after restarting the script works.
1313f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    args += ["-s", "4"]
1314f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    RollMerge(TEST_CONFIG, self).Run(args)
1315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1316f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  def testReleases(self):
1317f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    c_hash1_commit_log = """Update V8 to Version 4.2.71.
1318f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1319f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochCr-Commit-Position: refs/heads/master@{#5678}
1320f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch"""
1321f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    c_hash2_commit_log = """Revert something.
1322f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1323f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochBUG=12345
1324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochReason:
1326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch> Some reason.
1327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch> Cr-Commit-Position: refs/heads/master@{#12345}
1328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch> git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12345 003-1c4
1329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochReview URL: https://codereview.chromium.org/12345
1331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochCr-Commit-Position: refs/heads/master@{#4567}
1333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochgit-svn-id: svn://svn.chromium.org/chrome/trunk/src@4567 0039-1c4b
1334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch"""
1336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    c_hash3_commit_log = """Simple.
1337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochgit-svn-id: svn://svn.chromium.org/chrome/trunk/src@3456 0039-1c4b
1339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch"""
1341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    c_hash_234_commit_log = """Version 3.3.1.1 (cherry-pick).
1342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMerged abc12.
1344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochReview URL: fake.com
1346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochCr-Commit-Position: refs/heads/candidates@{#234}
1348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch"""
1349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    c_hash_123_commit_log = """Version 3.3.1.0
1350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochgit-svn-id: googlecode@123 0039-1c4b
1352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch"""
1353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    c_hash_345_commit_log = """Version 3.4.0.
1354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochCr-Commit-Position: refs/heads/candidates@{#345}
1356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch"""
1357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    c_hash_456_commit_log = """Version 4.2.71.
1358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochCr-Commit-Position: refs/heads/4.2.71@{#1}
1360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch"""
1361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    c_deps = "Line\n   \"v8_revision\": \"%s\",\n  line\n"
1362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    json_output = self.MakeEmptyTempFile()
1364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    csv_output = self.MakeEmptyTempFile()
1365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    self.WriteFakeVersionFile()
1366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1367f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    TEST_CONFIG["CHROMIUM"] = self.MakeEmptyTempDirectory()
1368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    chrome_dir = TEST_CONFIG["CHROMIUM"]
1369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    chrome_v8_dir = os.path.join(chrome_dir, "v8")
1370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    os.makedirs(chrome_v8_dir)
1371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    def ResetVersion(major, minor, build, patch=0):
1373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return lambda: self.WriteFakeVersionFile(major=major,
1374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                               minor=minor,
1375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                               build=build,
1376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                               patch=patch)
1377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    self.Expect([
1379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git status -s -uno", ""),
1380f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f origin/master", ""),
1381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git fetch", ""),
1382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch", "  branch1\n* branch2\n"),
1383f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git new-branch %s" % TEST_CONFIG["BRANCHNAME"], ""),
1384f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
1385f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git rev-list --max-age=395200 --tags",
1386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "bad_tag\nhash_234\nhash_123\nhash_345\nhash_456\n"),
1387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git describe --tags bad_tag", "3.23.42-1-deadbeef"),
1388f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git describe --tags hash_234", "3.3.1.1"),
1389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git describe --tags hash_123", "3.21.2"),
1390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git describe --tags hash_345", "3.22.3"),
1391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git describe --tags hash_456", "4.2.71"),
1392f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git diff --name-only hash_234 hash_234^", VERSION_FILE),
1393f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f hash_234 -- %s" % VERSION_FILE, "",
1394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=ResetVersion(3, 3, 1, 1)),
1395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch -r --contains hash_234", "  branch-heads/3.3\n"),
1396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B hash_234", c_hash_234_commit_log),
1397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s hash_234", ""),
1398f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B hash_234", c_hash_234_commit_log),
1399f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%ci hash_234", "18:15"),
1400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f HEAD -- %s" % VERSION_FILE, "",
1401f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=ResetVersion(3, 22, 5)),
1402f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git diff --name-only hash_123 hash_123^", VERSION_FILE),
1403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f hash_123 -- %s" % VERSION_FILE, "",
1404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=ResetVersion(3, 21, 2)),
1405f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch -r --contains hash_123", "  branch-heads/3.21\n"),
1406f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B hash_123", c_hash_123_commit_log),
1407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s hash_123", ""),
1408f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B hash_123", c_hash_123_commit_log),
1409f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%ci hash_123", "03:15"),
1410f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f HEAD -- %s" % VERSION_FILE, "",
1411f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=ResetVersion(3, 22, 5)),
1412f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git diff --name-only hash_345 hash_345^", VERSION_FILE),
1413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f hash_345 -- %s" % VERSION_FILE, "",
1414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=ResetVersion(3, 22, 3)),
1415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch -r --contains hash_345", "  origin/candidates\n"),
1416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B hash_345", c_hash_345_commit_log),
1417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s hash_345", ""),
1418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B hash_345", c_hash_345_commit_log),
1419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%ci hash_345", ""),
1420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f HEAD -- %s" % VERSION_FILE, "",
1421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=ResetVersion(3, 22, 5)),
1422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git diff --name-only hash_456 hash_456^", VERSION_FILE),
1423f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f hash_456 -- %s" % VERSION_FILE, "",
1424f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=ResetVersion(4, 2, 71)),
1425f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch -r --contains hash_456", "  origin/4.2.71\n"),
1426f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B hash_456", c_hash_456_commit_log),
1427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%H 4.2.71", "hash_456"),
1428f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s hash_456", "Version 4.2.71"),
1429f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%H hash_456^", "master_456"),
1430f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B master_456",
1431f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "Cr-Commit-Position: refs/heads/master@{#456}"),
1432f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B hash_456", c_hash_456_commit_log),
1433f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%ci hash_456", "02:15"),
1434f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f HEAD -- %s" % VERSION_FILE, "",
1435f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=ResetVersion(3, 22, 5)),
1436f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git fetch origin +refs/heads/*:refs/remotes/origin/* "
1437f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "+refs/branch-heads/*:refs/remotes/branch-heads/*", "",
1438f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cwd=chrome_dir),
1439f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git fetch origin", "", cwd=chrome_v8_dir),
1440f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log --format=%H --grep=\"V8\" origin/master -- DEPS",
1441f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "c_hash1\nc_hash2\nc_hash3\n",
1442f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cwd=chrome_dir),
1443f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git show c_hash1:DEPS", c_deps % "hash_456", cwd=chrome_dir),
1444f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B c_hash1", c_hash1_commit_log,
1445f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cwd=chrome_dir),
1446f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git show c_hash2:DEPS", c_deps % "hash_345", cwd=chrome_dir),
1447f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B c_hash2", c_hash2_commit_log,
1448f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cwd=chrome_dir),
1449f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git show c_hash3:DEPS", c_deps % "deadbeef", cwd=chrome_dir),
1450f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%B c_hash3", c_hash3_commit_log,
1451f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cwd=chrome_dir),
1452f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch -r", " weird/123\n  branch-heads/7\n", cwd=chrome_dir),
1453f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git show refs/branch-heads/7:DEPS", c_deps % "hash_345",
1454f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cwd=chrome_dir),
1455f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      URL("http://omahaproxy.appspot.com/all.json", """[{
1456f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "os": "win",
1457f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "versions": [{
1458f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "version": "2.2.2.2",
1459f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "v8_version": "22.2.2.2",
1460f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "current_reldate": "04/09/15",
1461f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "os": "win",
1462f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "channel": "canary",
1463f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "previous_version": "1.1.1.0"
1464f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          }]
1465f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        }]"""),
1466f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      URL("http://omahaproxy.appspot.com/v8.json?version=1.1.1.0", """{
1467f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_version": "1.1.1.0",
1468f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "v8_version": "11.1.1.0"
1469f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        }"""),
1470f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git rev-list -1 11.1.1", "v8_previous_version_hash"),
1471f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git rev-list -1 22.2.2.2", "v8_version_hash"),
1472f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f origin/master", ""),
1473f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["BRANCHNAME"], "")
1474f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ])
1475f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1476f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    args = ["-c", TEST_CONFIG["CHROMIUM"],
1477f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            "--json", json_output,
1478f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            "--csv", csv_output,
1479f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            "--max-releases", "1"]
1480f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Releases(TEST_CONFIG, self).Run(args)
1481f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1482f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    # Check expected output.
1483f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    csv = ("4.2.71,4.2.71,1,5678,\r\n"
1484f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "3.22.3,candidates,345,4567:5677,\r\n"
1485f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "3.21.2,3.21,123,,\r\n"
1486f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "3.3.1.1,3.3,234,,abc12\r\n")
1487f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    self.assertEquals(csv, FileToText(csv_output))
1488f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1489f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    expected_json = {"chrome_releases":{
1490f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                        "canaries": [
1491f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                                     {
1492f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                           "chrome_version": "2.2.2.2",
1493f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                           "os": "win",
1494f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                           "release_date": "04/09/15",
1495f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                           "v8_version": "22.2.2.2",
1496f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                           "v8_version_hash": "v8_version_hash",
1497f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                           "v8_previous_version": "11.1.1.0",
1498f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                           "v8_previous_version_hash": "v8_previous_version_hash"
1499f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                           }]},
1500f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                     "releases":[
1501f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      {
1502f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision": "1",
1503f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision_git": "hash_456",
1504f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "master_position": "456",
1505f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "master_hash": "master_456",
1506f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "patches_merged": "",
1507f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "version": "4.2.71",
1508f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_revision": "5678",
1509f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "branch": "4.2.71",
1510f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "review_link": "",
1511f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "date": "02:15",
1512f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_branch": "",
1513f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        # FIXME(machenbach): Fix revisions link for git.
1514f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision_link": "https://code.google.com/p/v8/source/detail?r=1",
1515f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      },
1516f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      {
1517f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision": "345",
1518f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision_git": "hash_345",
1519f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "master_position": "",
1520f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "master_hash": "",
1521f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "patches_merged": "",
1522f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "version": "3.22.3",
1523f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_revision": "4567:5677",
1524f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "branch": "candidates",
1525f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "review_link": "",
1526f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "date": "",
1527f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_branch": "7",
1528f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision_link": "https://code.google.com/p/v8/source/detail?r=345",
1529f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      },
1530f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      {
1531f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision": "123",
1532f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision_git": "hash_123",
1533f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "patches_merged": "",
1534f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "master_position": "",
1535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "master_hash": "",
1536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "version": "3.21.2",
1537f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_revision": "",
1538f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "branch": "3.21",
1539f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "review_link": "",
1540f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "date": "03:15",
1541f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_branch": "",
1542f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision_link": "https://code.google.com/p/v8/source/detail?r=123",
1543f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      },
1544f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      {
1545f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision": "234",
1546f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision_git": "hash_234",
1547f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "patches_merged": "abc12",
1548f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "master_position": "",
1549f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "master_hash": "",
1550f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "version": "3.3.1.1",
1551f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_revision": "",
1552f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "branch": "3.3",
1553f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "review_link": "fake.com",
1554f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "date": "18:15",
1555f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "chromium_branch": "",
1556f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        "revision_link": "https://code.google.com/p/v8/source/detail?r=234",
1557f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      },],
1558f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
1559f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    self.assertEquals(expected_json, json.loads(FileToText(json_output)))
1560f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1561f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  def testMergeToBranch(self):
1562f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    TEST_CONFIG["ALREADY_MERGING_SENTINEL_FILE"] = self.MakeEmptyTempFile()
1563f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    TextToFile("", os.path.join(TEST_CONFIG["DEFAULT_CWD"], ".git"))
1564f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    self.WriteFakeVersionFile(build=5)
1565f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    os.environ["EDITOR"] = "vi"
1566f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    extra_patch = self.MakeEmptyTempFile()
1567f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1568f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1569f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    def VerifyPatch(patch):
1570f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return lambda: self.assertEquals(patch,
1571f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          FileToText(TEST_CONFIG["TEMPORARY_PATCH_FILE"]))
1572f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1573f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    info_msg = ("NOTE: This script will no longer automatically "
1574f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch     "update include/v8-version.h "
1575f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch     "and create a tag. This is done automatically by the autotag bot. "
1576f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch     "Please call the merge_to_branch.py with --help for more information.")
1577f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1578f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    msg = """Merged: Squashed multiple commits.
1579f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1580f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMerged: Title4
1581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochRevision: ab12345
1582f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1583f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMerged: Title2
1584f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochRevision: ab23456
1585f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1586f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMerged: Title3
1587f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochRevision: ab34567
1588f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1589f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMerged: Title1
1590f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochRevision: ab45678
1591f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1592f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMerged: Revert \"Something\"
1593f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochRevision: ab56789
1594f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1595f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochBUG=123,234,345,456,567,v8:123
1596f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochLOG=N
1597f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNOTRY=true
1598f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNOPRESUBMIT=true
1599f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochNOTREECHECKS=true
1600f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch"""
1601f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1602f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    def VerifyLand():
1603f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      commit = FileToText(TEST_CONFIG["COMMITMSG_FILE"])
1604f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      self.assertEquals(msg, commit)
1605f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1606f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    self.Expect([
1607f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git status -s -uno", ""),
1608f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f origin/master", ""),
1609f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git fetch", ""),
1610f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch", "  branch1\n* branch2\n"),
1611f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git new-branch %s --upstream refs/remotes/origin/candidates" %
1612f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          TEST_CONFIG["BRANCHNAME"], ""),
1613f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd(("git log --format=%H --grep=\"^[Pp]ort ab12345\" "
1614f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "--reverse origin/master"),
1615f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "ab45678\nab23456"),
1616f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab45678", "Title1"),
1617f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab23456", "Title2"),
1618f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd(("git log --format=%H --grep=\"^[Pp]ort ab23456\" "
1619f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "--reverse origin/master"),
1620f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          ""),
1621f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd(("git log --format=%H --grep=\"^[Pp]ort ab34567\" "
1622f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           "--reverse origin/master"),
1623f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "ab56789"),
1624f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab56789", "Title3"),
1625f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      RL("Y"),  # Automatically add corresponding ports (ab34567, ab56789)?
1626f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      # Simulate git being down which stops the script.
1627f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab12345", None),
1628f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      # Restart script in the failing step.
1629f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab12345", "Title4"),
1630f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab23456", "Title2"),
1631f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab34567", "Title3"),
1632f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab45678", "Title1"),
1633f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 --format=%s ab56789", "Revert \"Something\""),
1634f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 ab12345", "Title4\nBUG=123\nBUG=234"),
1635f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 ab23456", "Title2\n BUG = v8:123,345"),
1636f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 ab34567", "Title3\nLOG=n\nBUG=567, 456"),
1637f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 ab45678", "Title1\nBUG="),
1638f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 ab56789", "Revert \"Something\"\nBUG=none"),
1639f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 -p ab12345", "patch4"),
1640f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1641f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1642f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "", cb=VerifyPatch("patch4")),
1643f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 -p ab23456", "patch2"),
1644f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1645f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1646f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "", cb=VerifyPatch("patch2")),
1647f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 -p ab34567", "patch3"),
1648f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1649f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1650f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "", cb=VerifyPatch("patch3")),
1651f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 -p ab45678", "patch1"),
1652f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1653f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1654f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "", cb=VerifyPatch("patch1")),
1655f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git log -1 -p ab56789", "patch5\n"),
1656f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd(("git apply --index --reject \"%s\"" %
1657f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch           TEST_CONFIG["TEMPORARY_PATCH_FILE"]),
1658f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "", cb=VerifyPatch("patch5\n")),
1659f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git apply --index --reject \"%s\"" % extra_patch, ""),
1660f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git commit -aF \"%s\"" % TEST_CONFIG["COMMITMSG_FILE"], ""),
1661f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      RL("reviewer@chromium.org"),  # V8 reviewer.
1662f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git cl upload --send-mail -r \"reviewer@chromium.org\" "
1663f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          "--bypass-hooks --cc \"ulan@chromium.org\"", ""),
1664f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git cl comments -a \"%s\"" % info_msg, ""),
1665f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f %s" % TEST_CONFIG["BRANCHNAME"], ""),
1666f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      RL("LGTM"),  # Enter LGTM for V8 CL.
1667f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git cl presubmit", "Presubmit successfull\n"),
1668f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git cl land -f --bypass-hooks", "Closing issue\n",
1669f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          cb=VerifyLand),
1670f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git checkout -f origin/master", ""),
1671f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["BRANCHNAME"], ""),
1672f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ])
1673f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1674f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    # ab12345 and ab34567 are patches. ab23456 (included) and ab45678 are the
1675f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    # MIPS ports of ab12345. ab56789 is the MIPS port of ab34567.
1676f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    args = ["-f", "-p", extra_patch, "--branch", "candidates",
1677f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch            "ab12345", "ab23456", "ab34567"]
1678f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1679f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    # The first run of the script stops because of git being down.
1680f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    self.assertRaises(GitFailedException,
1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        lambda: MergeToBranch(TEST_CONFIG, self).Run(args))
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Test that state recovery after restarting the script works.
1684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    args += ["-s", "4"]
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    MergeToBranch(TEST_CONFIG, self).Run(args)
1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testReleases(self):
1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    c_hash1_commit_log = """Update V8 to Version 4.2.71.
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCr-Commit-Position: refs/heads/master@{#5678}
1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch"""
1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    c_hash2_commit_log = """Revert something.
1693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBUG=12345
1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReason:
1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch> Some reason.
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch> Cr-Commit-Position: refs/heads/master@{#12345}
1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch> git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12345 003-1c4
1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReview URL: https://codereview.chromium.org/12345
1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCr-Commit-Position: refs/heads/master@{#4567}
1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgit-svn-id: svn://svn.chromium.org/chrome/trunk/src@4567 0039-1c4b
1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""
1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    c_hash3_commit_log = """Simple.
1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochgit-svn-id: svn://svn.chromium.org/chrome/trunk/src@3456 0039-1c4b
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""
1712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    c_hash_234_commit_log = """Version 3.3.1.1 (cherry-pick).
1713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMerged abc12.
1715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierReview URL: fake.com
1717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierCr-Commit-Position: refs/heads/candidates@{#234}
1719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier"""
1720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    c_hash_123_commit_log = """Version 3.3.1.0
1721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniergit-svn-id: googlecode@123 0039-1c4b
1723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier"""
1724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    c_hash_345_commit_log = """Version 3.4.0.
1725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierCr-Commit-Position: refs/heads/candidates@{#345}
1727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier"""
1728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    c_hash_456_commit_log = """Version 4.2.71.
1729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCr-Commit-Position: refs/heads/4.2.71@{#1}
1731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch"""
1732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    c_deps = "Line\n   \"v8_revision\": \"%s\",\n  line\n"
1733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    json_output = self.MakeEmptyTempFile()
1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    csv_output = self.MakeEmptyTempFile()
1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.WriteFakeVersionFile()
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TEST_CONFIG["CHROMIUM"] = self.MakeEmptyTempDirectory()
1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    chrome_dir = TEST_CONFIG["CHROMIUM"]
1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    chrome_v8_dir = os.path.join(chrome_dir, "v8")
1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    os.makedirs(chrome_v8_dir)
1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    def ResetVersion(major, minor, build, patch=0):
1744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return lambda: self.WriteFakeVersionFile(major=major,
1745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               minor=minor,
1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               build=build,
1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               patch=patch)
1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.Expect([
1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git status -s -uno", ""),
1751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
1752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git fetch", ""),
1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch", "  branch1\n* branch2\n"),
1754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git new-branch %s" % TEST_CONFIG["BRANCHNAME"], ""),
1755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/tags/*:refs/tags/*", ""),
1756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git rev-list --max-age=395200 --tags",
1757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "bad_tag\nhash_234\nhash_123\nhash_345\nhash_456\n"),
1758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags bad_tag", "3.23.42-1-deadbeef"),
1759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags hash_234", "3.3.1.1"),
1760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags hash_123", "3.21.2"),
1761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags hash_345", "3.22.3"),
1762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git describe --tags hash_456", "4.2.71"),
1763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git diff --name-only hash_234 hash_234^", VERSION_FILE),
1764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git checkout -f hash_234 -- %s" % VERSION_FILE, "",
1765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=ResetVersion(3, 3, 1, 1)),
1766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -r --contains hash_234", "  branch-heads/3.3\n"),
1767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%B hash_234", c_hash_234_commit_log),
1768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s hash_234", ""),
1769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%B hash_234", c_hash_234_commit_log),
1770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%ci hash_234", "18:15"),
1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git checkout -f HEAD -- %s" % VERSION_FILE, "",
1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=ResetVersion(3, 22, 5)),
1773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git diff --name-only hash_123 hash_123^", VERSION_FILE),
1774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git checkout -f hash_123 -- %s" % VERSION_FILE, "",
1775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=ResetVersion(3, 21, 2)),
1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -r --contains hash_123", "  branch-heads/3.21\n"),
1777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%B hash_123", c_hash_123_commit_log),
1778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s hash_123", ""),
1779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%B hash_123", c_hash_123_commit_log),
1780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%ci hash_123", "03:15"),
1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git checkout -f HEAD -- %s" % VERSION_FILE, "",
1782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=ResetVersion(3, 22, 5)),
1783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git diff --name-only hash_345 hash_345^", VERSION_FILE),
1784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git checkout -f hash_345 -- %s" % VERSION_FILE, "",
1785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=ResetVersion(3, 22, 3)),
1786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -r --contains hash_345", "  origin/candidates\n"),
1787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%B hash_345", c_hash_345_commit_log),
1788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%s hash_345", ""),
1789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%B hash_345", c_hash_345_commit_log),
1790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Cmd("git log -1 --format=%ci hash_345", ""),
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git checkout -f HEAD -- %s" % VERSION_FILE, "",
1792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=ResetVersion(3, 22, 5)),
1793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git diff --name-only hash_456 hash_456^", VERSION_FILE),
1794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f hash_456 -- %s" % VERSION_FILE, "",
1795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=ResetVersion(4, 2, 71)),
1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -r --contains hash_456", "  origin/4.2.71\n"),
1797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%B hash_456", c_hash_456_commit_log),
1798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%H 4.2.71", "hash_456"),
1799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%s hash_456", "Version 4.2.71"),
1800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%H hash_456^", "master_456"),
1801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%B master_456",
1802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "Cr-Commit-Position: refs/heads/master@{#456}"),
1803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%B hash_456", c_hash_456_commit_log),
1804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%ci hash_456", "02:15"),
1805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f HEAD -- %s" % VERSION_FILE, "",
1806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          cb=ResetVersion(3, 22, 5)),
1807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git fetch origin +refs/heads/*:refs/remotes/origin/* "
1808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "+refs/branch-heads/*:refs/remotes/branch-heads/*", "",
1809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          cwd=chrome_dir),
1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git fetch origin", "", cwd=chrome_v8_dir),
1811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log --format=%H --grep=\"V8\" origin/master -- DEPS",
1812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "c_hash1\nc_hash2\nc_hash3\n",
1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          cwd=chrome_dir),
1814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git show c_hash1:DEPS", c_deps % "hash_456", cwd=chrome_dir),
1815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git log -1 --format=%B c_hash1", c_hash1_commit_log,
1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          cwd=chrome_dir),
1817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git show c_hash2:DEPS", c_deps % "hash_345", cwd=chrome_dir),
1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%B c_hash2", c_hash2_commit_log,
1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          cwd=chrome_dir),
1820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git show c_hash3:DEPS", c_deps % "deadbeef", cwd=chrome_dir),
1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git log -1 --format=%B c_hash3", c_hash3_commit_log,
1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          cwd=chrome_dir),
1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Cmd("git branch -r", " weird/123\n  branch-heads/7\n", cwd=chrome_dir),
1824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git show refs/branch-heads/7:DEPS", c_deps % "hash_345",
1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          cwd=chrome_dir),
1826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      URL("http://omahaproxy.appspot.com/all.json", """[{
1827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "os": "win",
1828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "versions": [{
1829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "version": "2.2.2.2",
1830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "v8_version": "22.2.2.2",
1831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "current_reldate": "04/09/15",
1832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "os": "win",
1833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "channel": "canary",
1834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          "previous_version": "1.1.1.0"
1835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          }]
1836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }]"""),
1837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      URL("http://omahaproxy.appspot.com/v8.json?version=1.1.1.0", """{
1838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "chromium_version": "1.1.1.0",
1839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "v8_version": "11.1.1.0"
1840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }"""),
1841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git rev-list -1 11.1.1", "v8_previous_version_hash"),
1842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git rev-list -1 22.2.2.2", "v8_version_hash"),
1843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git checkout -f origin/master", ""),
1844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Cmd("git branch -D %s" % TEST_CONFIG["BRANCHNAME"], "")
1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ])
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    args = ["-c", TEST_CONFIG["CHROMIUM"],
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            "--json", json_output,
1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            "--csv", csv_output,
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            "--max-releases", "1"]
1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Releases(TEST_CONFIG, self).Run(args)
1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # Check expected output.
1854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    csv = ("4.2.71,4.2.71,1,5678,\r\n"
1855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch           "3.22.3,candidates,345,4567:5677,\r\n"
1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           "3.21.2,3.21,123,,\r\n"
1857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier           "3.3.1.1,3.3,234,,abc12\r\n")
1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals(csv, FileToText(csv_output))
1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    expected_json = {"chrome_releases":{
1861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        "canaries": [
1862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                     {
1863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           "chrome_version": "2.2.2.2",
1864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           "os": "win",
1865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           "release_date": "04/09/15",
1866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           "v8_version": "22.2.2.2",
1867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           "v8_version_hash": "v8_version_hash",
1868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           "v8_previous_version": "11.1.1.0",
1869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           "v8_previous_version_hash": "v8_previous_version_hash"
1870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           }]},
1871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                     "releases":[
1872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      {
1873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "revision": "1",
1874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "revision_git": "hash_456",
1875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "master_position": "456",
1876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "master_hash": "master_456",
1877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "patches_merged": "",
1878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "version": "4.2.71",
1879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "chromium_revision": "5678",
1880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "branch": "4.2.71",
1881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "review_link": "",
1882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "date": "02:15",
1883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "chromium_branch": "",
1884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        # FIXME(machenbach): Fix revisions link for git.
1885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "revision_link": "https://code.google.com/p/v8/source/detail?r=1",
1886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      },
1887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      {
1888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision": "345",
1889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision_git": "hash_345",
1890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "master_position": "",
1891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "master_hash": "",
1892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "patches_merged": "",
1893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "version": "3.22.3",
1894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "chromium_revision": "4567:5677",
1895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "branch": "candidates",
1896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "review_link": "",
1897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "date": "",
1898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "chromium_branch": "7",
1899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision_link": "https://code.google.com/p/v8/source/detail?r=345",
1900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      },
1901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      {
1902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision": "123",
1903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision_git": "hash_123",
1904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "patches_merged": "",
1905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "master_position": "",
1906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "master_hash": "",
1907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "version": "3.21.2",
1908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "chromium_revision": "",
1909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "branch": "3.21",
1910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "review_link": "",
1911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "date": "03:15",
1912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "chromium_branch": "",
1913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision_link": "https://code.google.com/p/v8/source/detail?r=123",
1914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      },
1915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      {
1916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision": "234",
1917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision_git": "hash_234",
1918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "patches_merged": "abc12",
1919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "master_position": "",
1920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        "master_hash": "",
1921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "version": "3.3.1.1",
1922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "chromium_revision": "",
1923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "branch": "3.3",
1924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "review_link": "fake.com",
1925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "date": "18:15",
1926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "chromium_branch": "",
1927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        "revision_link": "https://code.google.com/p/v8/source/detail?r=234",
1928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      },],
1929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals(expected_json, json.loads(FileToText(json_output)))
1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1933f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1934f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SystemTest(unittest.TestCase):
1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def testReload(self):
1937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    options = ScriptsBase(
1938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        TEST_CONFIG, DEFAULT_SIDE_EFFECT_HANDLER, {}).MakeOptions([])
1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    step = MakeStep(step_class=PrepareChangeLog, number=0, state={}, config={},
1940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                    options=options,
1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                    side_effect_handler=DEFAULT_SIDE_EFFECT_HANDLER)
1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    body = step.Reload(
1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""------------------------------------------------------------------------
1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochr17997 | machenbach@chromium.org | 2013-11-22 11:04:04 +0100 (...) | 6 lines
1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPrepare push to trunk.  Now working on version 3.23.11.
1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochR=danno@chromium.org
1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochReview URL: https://codereview.chromium.org/83173002
1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch------------------------------------------------------------------------""")
1953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    self.assertEquals(
1954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch"""Prepare push to trunk.  Now working on version 3.23.11.
1955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochR=danno@chromium.org
1957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCommitted: https://code.google.com/p/v8/source/detail?r=17997""", body)
1959