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

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

Issue 110573004: Merge bleeding_edge 17696:18016. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/parser
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« include/v8-platform.h ('K') | « tools/push-to-trunk/push_to_trunk.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2013 the V8 project authors. All rights reserved. 2 # Copyright 2013 the V8 project authors. All rights reserved.
3 # Redistribution and use in source and binary forms, with or without 3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are 4 # modification, are permitted provided that the following conditions are
5 # met: 5 # met:
6 # 6 #
7 # * Redistributions of source code must retain the above copyright 7 # * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer. 8 # notice, this list of conditions and the following disclaimer.
9 # * Redistributions in binary form must reproduce the above 9 # * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following 10 # copyright notice, this list of conditions and the following
(...skipping 16 matching lines...) Expand all
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 28
29 import os 29 import os
30 import tempfile 30 import tempfile
31 import unittest 31 import unittest
32 32
33 import common_includes 33 import common_includes
34 from common_includes import * 34 from common_includes import *
35 import push_to_trunk 35 import push_to_trunk
36 from push_to_trunk import * 36 from push_to_trunk import *
37 import auto_roll
37 38
38 39
39 TEST_CONFIG = { 40 TEST_CONFIG = {
40 BRANCHNAME: "test-prepare-push", 41 BRANCHNAME: "test-prepare-push",
41 TRUNKBRANCH: "test-trunk-push", 42 TRUNKBRANCH: "test-trunk-push",
42 PERSISTFILE_BASENAME: "/tmp/test-v8-push-to-trunk-tempfile", 43 PERSISTFILE_BASENAME: "/tmp/test-v8-push-to-trunk-tempfile",
43 TEMP_BRANCH: "test-prepare-push-temporary-branch-created-by-script", 44 TEMP_BRANCH: "test-prepare-push-temporary-branch-created-by-script",
44 DOT_GIT_LOCATION: None, 45 DOT_GIT_LOCATION: None,
45 VERSION_FILE: None, 46 VERSION_FILE: None,
46 CHANGELOG_FILE: None, 47 CHANGELOG_FILE: None,
47 CHANGELOG_ENTRY_FILE: "/tmp/test-v8-push-to-trunk-tempfile-changelog-entry", 48 CHANGELOG_ENTRY_FILE: "/tmp/test-v8-push-to-trunk-tempfile-changelog-entry",
48 PATCH_FILE: "/tmp/test-v8-push-to-trunk-tempfile-patch", 49 PATCH_FILE: "/tmp/test-v8-push-to-trunk-tempfile-patch",
49 COMMITMSG_FILE: "/tmp/test-v8-push-to-trunk-tempfile-commitmsg", 50 COMMITMSG_FILE: "/tmp/test-v8-push-to-trunk-tempfile-commitmsg",
50 CHROMIUM: "/tmp/test-v8-push-to-trunk-tempfile-chromium", 51 CHROMIUM: "/tmp/test-v8-push-to-trunk-tempfile-chromium",
51 DEPS_FILE: "/tmp/test-v8-push-to-trunk-tempfile-chromium/DEPS", 52 DEPS_FILE: "/tmp/test-v8-push-to-trunk-tempfile-chromium/DEPS",
52 } 53 }
53 54
54 55
56 class ToplevelTest(unittest.TestCase):
57 def testMakeComment(self):
58 self.assertEquals("# Line 1\n# Line 2\n#",
59 MakeComment(" Line 1\n Line 2\n"))
60 self.assertEquals("#Line 1\n#Line 2",
61 MakeComment("Line 1\n Line 2"))
62
63 def testStripComments(self):
64 self.assertEquals(" Line 1\n Line 3\n",
65 StripComments(" Line 1\n# Line 2\n Line 3\n#\n"))
66 self.assertEquals("\nLine 2 ### Test\n #",
67 StripComments("###\n# \n\n# Line 1\nLine 2 ### Test\n #"))
68
69 def testMakeChangeLogBodySimple(self):
70 commits = [
71 ["Title text 1",
72 "Title text 1\n\nBUG=\n",
73 "author1@chromium.org"],
74 ["Title text 2",
75 "Title text 2\n\nBUG=1234\n",
76 "author2@chromium.org"],
77 ]
78 self.assertEquals(" Title text 1\n"
79 " (author1@chromium.org)\n\n"
80 " Title text 2\n"
81 " (Chromium issue 1234)\n"
82 " (author2@chromium.org)\n\n",
83 MakeChangeLogBody(commits))
84
85 def testMakeChangeLogBodyEmpty(self):
86 self.assertEquals("", MakeChangeLogBody([]))
87
88 def testMakeChangeLogBodyAutoFormat(self):
89 commits = [
90 ["Title text 1",
91 "Title text 1\nLOG=y\nBUG=\n",
92 "author1@chromium.org"],
93 ["Title text 2",
94 "Title text 2\n\nBUG=1234\n",
95 "author2@chromium.org"],
96 ["Title text 3",
97 "Title text 3\n\nBUG=1234\nLOG = Yes\n",
98 "author3@chromium.org"],
99 ["Title text 3",
100 "Title text 4\n\nBUG=1234\nLOG=\n",
101 "author4@chromium.org"],
102 ]
103 self.assertEquals(" Title text 1\n\n"
104 " Title text 3\n"
105 " (Chromium issue 1234)\n\n",
106 MakeChangeLogBody(commits, True))
107
108 def testMakeChangeLogBugReferenceEmpty(self):
109 self.assertEquals("", MakeChangeLogBugReference(""))
110 self.assertEquals("", MakeChangeLogBugReference("LOG="))
111 self.assertEquals("", MakeChangeLogBugReference(" BUG ="))
112 self.assertEquals("", MakeChangeLogBugReference("BUG=none\t"))
113
114 def testMakeChangeLogBugReferenceSimple(self):
115 self.assertEquals(" (issue 987654)\n",
116 MakeChangeLogBugReference("BUG = v8:987654"))
117 self.assertEquals(" (Chromium issue 987654)\n",
118 MakeChangeLogBugReference("BUG=987654 "))
119
120 def testMakeChangeLogBugReferenceFromBody(self):
121 self.assertEquals(" (Chromium issue 1234567)\n",
122 MakeChangeLogBugReference("Title\n\nTBR=\nBUG=\n"
123 " BUG=\tchromium:1234567\t\n"
124 "R=somebody\n"))
125
126 def testMakeChangeLogBugReferenceMultiple(self):
127 # All issues should be sorted and grouped. Multiple references to the same
128 # issue should be filtered.
129 self.assertEquals(" (issues 123, 234, Chromium issue 345)\n",
130 MakeChangeLogBugReference("Title\n\n"
131 "BUG=v8:234\n"
132 " BUG\t= 345, \tv8:234,\n"
133 "BUG=v8:123\n"
134 "R=somebody\n"))
135 self.assertEquals(" (Chromium issues 123, 234)\n",
136 MakeChangeLogBugReference("Title\n\n"
137 "BUG=234,,chromium:123 \n"
138 "R=somebody\n"))
139 self.assertEquals(" (Chromium issues 123, 234)\n",
140 MakeChangeLogBugReference("Title\n\n"
141 "BUG=chromium:234, , 123\n"
142 "R=somebody\n"))
143 self.assertEquals(" (issues 345, 456)\n",
144 MakeChangeLogBugReference("Title\n\n"
145 "\t\tBUG=v8:345,v8:456\n"
146 "R=somebody\n"))
147 self.assertEquals(" (issue 123, Chromium issues 345, 456)\n",
148 MakeChangeLogBugReference("Title\n\n"
149 "BUG=chromium:456\n"
150 "BUG = none\n"
151 "R=somebody\n"
152 "BUG=456,v8:123, 345"))
153
154 def testMakeChangeLogBugReferenceLong(self):
155 # -----------------00--------10--------20--------30--------
156 self.assertEquals(" (issues 234, 1234567890, 1234567"
157 "8901234567890, Chromium issues 12345678,\n"
158 " 123456789)\n",
159 MakeChangeLogBugReference("BUG=v8:234\n"
160 "BUG=v8:1234567890\n"
161 "BUG=v8:12345678901234567890\n"
162 "BUG=123456789\n"
163 "BUG=12345678\n"))
164 # -----------------00--------10--------20--------30--------
165 self.assertEquals(" (issues 234, 1234567890, 1234567"
166 "8901234567890, Chromium issues\n"
167 " 123456789, 1234567890)\n",
168 MakeChangeLogBugReference("BUG=v8:234\n"
169 "BUG=v8:12345678901234567890\n"
170 "BUG=v8:1234567890\n"
171 "BUG=123456789\n"
172 "BUG=1234567890\n"))
173 # -----------------00--------10--------20--------30--------
174 self.assertEquals(" (Chromium issues 234, 1234567890"
175 ", 12345678901234567,\n"
176 " 1234567890123456789)\n",
177 MakeChangeLogBugReference("BUG=234\n"
178 "BUG=12345678901234567\n"
179 "BUG=1234567890123456789\n"
180 "BUG=1234567890\n"))
181
182
183 class SimpleMock(object):
184 def __init__(self, name):
185 self._name = name
186 self._recipe = []
187 self._index = -1
188
189 def Expect(self, recipe):
190 self._recipe = recipe
191
192 def Call(self, *args):
193 self._index += 1
194 try:
195 expected_call = self._recipe[self._index]
196 except IndexError:
197 raise Exception("Calling %s %s" % (name, " ".join(args)))
198
199 # Pack expectations without arguments into a list.
200 if not isinstance(expected_call, list):
201 expected_call = [expected_call]
202
203 # The number of arguments in the expectation must match the actual
204 # arguments.
205 if len(args) > len(expected_call):
206 raise Exception("When calling %s with arguments, the expectations "
207 "must consist of at least as many arguments.")
208
209 # Compare expected and actual arguments.
210 for (expected_arg, actual_arg) in zip(expected_call, args):
211 if expected_arg != actual_arg:
212 raise Exception("Expected: %s - Actual: %s"
213 % (expected_arg, actual_arg))
214
215 # The expectation list contains a mandatory return value and an optional
216 # callback for checking the context at the time of the call.
217 if len(expected_call) == len(args) + 2:
218 expected_call[len(args) + 1]()
219 return expected_call[len(args)]
220
221 def AssertFinished(self):
222 if self._index < len(self._recipe) -1:
223 raise Exception("Called %s too seldom: %d vs. %d"
224 % (self._name, self._index, len(self._recipe)))
225
226
55 class ScriptTest(unittest.TestCase): 227 class ScriptTest(unittest.TestCase):
56 def MakeEmptyTempFile(self): 228 def MakeEmptyTempFile(self):
57 handle, name = tempfile.mkstemp() 229 handle, name = tempfile.mkstemp()
58 os.close(handle) 230 os.close(handle)
59 self._tmp_files.append(name) 231 self._tmp_files.append(name)
60 return name 232 return name
61 233
62 def MakeTempVersionFile(self): 234 def MakeTempVersionFile(self):
63 name = self.MakeEmptyTempFile() 235 name = self.MakeEmptyTempFile()
64 with open(name, "w") as f: 236 with open(name, "w") as f:
65 f.write(" // Some line...\n") 237 f.write(" // Some line...\n")
66 f.write("\n") 238 f.write("\n")
67 f.write("#define MAJOR_VERSION 3\n") 239 f.write("#define MAJOR_VERSION 3\n")
68 f.write("#define MINOR_VERSION 22\n") 240 f.write("#define MINOR_VERSION 22\n")
69 f.write("#define BUILD_NUMBER 5\n") 241 f.write("#define BUILD_NUMBER 5\n")
70 f.write("#define PATCH_LEVEL 0\n") 242 f.write("#define PATCH_LEVEL 0\n")
71 f.write(" // Some line...\n") 243 f.write(" // Some line...\n")
72 f.write("#define IS_CANDIDATE_VERSION 0\n") 244 f.write("#define IS_CANDIDATE_VERSION 0\n")
73 return name 245 return name
74 246
75 def MakeStep(self, step_class=Step, state=None): 247 def MakeStep(self, step_class=Step, state=None):
76 state = state or {} 248 """Convenience wrapper."""
77 step = step_class() 249 return MakeStep(step_class=step_class, number=0, state=state,
78 step.SetConfig(TEST_CONFIG) 250 config=TEST_CONFIG, options=None, side_effect_handler=self)
79 step.SetState(state)
80 step.SetNumber(0)
81 step.SetSideEffectHandler(self)
82 return step
83 251
84 def GitMock(self, cmd, args="", pipe=True): 252 def GitMock(self, cmd, args="", pipe=True):
85 self._git_index += 1 253 return self._git_mock.Call(args)
86 try:
87 git_invocation = self._git_recipe[self._git_index]
88 except IndexError:
89 raise Exception("Calling git %s" % args)
90 if git_invocation[0] != args:
91 raise Exception("Expected: %s - Actual: %s" % (git_invocation[0], args))
92 if len(git_invocation) == 3:
93 # Run optional function checking the context during this git command.
94 git_invocation[2]()
95 return git_invocation[1]
96 254
97 def LogMock(self, cmd, args=""): 255 def LogMock(self, cmd, args=""):
98 print "Log: %s %s" % (cmd, args) 256 print "Log: %s %s" % (cmd, args)
99 257
100 MOCKS = { 258 MOCKS = {
101 "git": GitMock, 259 "git": GitMock,
102 "vi": LogMock, 260 "vi": LogMock,
103 } 261 }
104 262
105 def Command(self, cmd, args="", prefix="", pipe=True): 263 def Command(self, cmd, args="", prefix="", pipe=True):
106 return ScriptTest.MOCKS[cmd](self, cmd, args) 264 return ScriptTest.MOCKS[cmd](self, cmd, args)
107 265
108 def ReadLine(self): 266 def ReadLine(self):
109 self._rl_index += 1 267 return self._rl_mock.Call()
110 try: 268
111 return self._rl_recipe[self._rl_index] 269 def ReadURL(self, url):
112 except IndexError: 270 return self._url_mock.Call(url)
113 raise Exception("Calling readline too often") 271
272 def ExpectGit(self, *args):
273 """Convenience wrapper."""
274 self._git_mock.Expect(*args)
275
276 def ExpectReadline(self, *args):
277 """Convenience wrapper."""
278 self._rl_mock.Expect(*args)
279
280 def ExpectReadURL(self, *args):
281 """Convenience wrapper."""
282 self._url_mock.Expect(*args)
114 283
115 def setUp(self): 284 def setUp(self):
116 self._git_recipe = [] 285 self._git_mock = SimpleMock("git")
117 self._git_index = -1 286 self._rl_mock = SimpleMock("readline")
118 self._rl_recipe = [] 287 self._url_mock = SimpleMock("readurl")
119 self._rl_index = -1
120 self._tmp_files = [] 288 self._tmp_files = []
121 289
122 def tearDown(self): 290 def tearDown(self):
123 Command("rm", "-rf %s*" % TEST_CONFIG[PERSISTFILE_BASENAME]) 291 Command("rm", "-rf %s*" % TEST_CONFIG[PERSISTFILE_BASENAME])
124 292
125 # Clean up temps. Doesn't work automatically. 293 # Clean up temps. Doesn't work automatically.
126 for name in self._tmp_files: 294 for name in self._tmp_files:
127 if os.path.exists(name): 295 if os.path.exists(name):
128 os.remove(name) 296 os.remove(name)
129 297
130 if self._git_index < len(self._git_recipe) -1: 298 self._git_mock.AssertFinished()
131 raise Exception("Called git too seldom: %d vs. %d" % 299 self._rl_mock.AssertFinished()
132 (self._git_index, len(self._git_recipe))) 300 self._url_mock.AssertFinished()
133 if self._rl_index < len(self._rl_recipe) -1:
134 raise Exception("Too little input: %d vs. %d" %
135 (self._rl_index, len(self._rl_recipe)))
136 301
137 def testPersistRestore(self): 302 def testPersistRestore(self):
138 self.MakeStep().Persist("test1", "") 303 self.MakeStep().Persist("test1", "")
139 self.assertEquals("", self.MakeStep().Restore("test1")) 304 self.assertEquals("", self.MakeStep().Restore("test1"))
140 self.MakeStep().Persist("test2", "AB123") 305 self.MakeStep().Persist("test2", "AB123")
141 self.assertEquals("AB123", self.MakeStep().Restore("test2")) 306 self.assertEquals("AB123", self.MakeStep().Restore("test2"))
142 307
143 def testGitOrig(self): 308 def testGitOrig(self):
144 self.assertTrue(Command("git", "--version").startswith("git version")) 309 self.assertTrue(Command("git", "--version").startswith("git version"))
145 310
146 def testGitMock(self): 311 def testGitMock(self):
147 self._git_recipe = [["--version", "git version 1.2.3"], ["dummy", ""]] 312 self.ExpectGit([["--version", "git version 1.2.3"], ["dummy", ""]])
148 self.assertEquals("git version 1.2.3", self.MakeStep().Git("--version")) 313 self.assertEquals("git version 1.2.3", self.MakeStep().Git("--version"))
149 self.assertEquals("", self.MakeStep().Git("dummy")) 314 self.assertEquals("", self.MakeStep().Git("dummy"))
150 315
151 def testCommonPrepareDefault(self): 316 def testCommonPrepareDefault(self):
152 self._git_recipe = [ 317 self.ExpectGit([
153 ["status -s -uno", ""], 318 ["status -s -uno", ""],
154 ["status -s -b -uno", "## some_branch"], 319 ["status -s -b -uno", "## some_branch"],
155 ["svn fetch", ""], 320 ["svn fetch", ""],
156 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], 321 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]],
157 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], 322 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""],
158 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], 323 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""],
159 ["branch", ""], 324 ["branch", ""],
160 ] 325 ])
161 self._rl_recipe = ["Y"] 326 self.ExpectReadline(["Y"])
162 self.MakeStep().CommonPrepare() 327 self.MakeStep().CommonPrepare()
328 self.MakeStep().PrepareBranch()
163 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch")) 329 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch"))
164 330
165 def testCommonPrepareNoConfirm(self): 331 def testCommonPrepareNoConfirm(self):
166 self._git_recipe = [ 332 self.ExpectGit([
167 ["status -s -uno", ""], 333 ["status -s -uno", ""],
168 ["status -s -b -uno", "## some_branch"], 334 ["status -s -b -uno", "## some_branch"],
169 ["svn fetch", ""], 335 ["svn fetch", ""],
170 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], 336 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]],
171 ] 337 ])
172 self._rl_recipe = ["n"] 338 self.ExpectReadline(["n"])
173 self.assertRaises(Exception, self.MakeStep().CommonPrepare) 339 self.MakeStep().CommonPrepare()
340 self.assertRaises(Exception, self.MakeStep().PrepareBranch)
174 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch")) 341 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch"))
175 342
176 def testCommonPrepareDeleteBranchFailure(self): 343 def testCommonPrepareDeleteBranchFailure(self):
177 self._git_recipe = [ 344 self.ExpectGit([
178 ["status -s -uno", ""], 345 ["status -s -uno", ""],
179 ["status -s -b -uno", "## some_branch"], 346 ["status -s -b -uno", "## some_branch"],
180 ["svn fetch", ""], 347 ["svn fetch", ""],
181 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]], 348 ["branch", " branch1\n* %s" % TEST_CONFIG[TEMP_BRANCH]],
182 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], None], 349 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], None],
183 ] 350 ])
184 self._rl_recipe = ["Y"] 351 self.ExpectReadline(["Y"])
185 self.assertRaises(Exception, self.MakeStep().CommonPrepare) 352 self.MakeStep().CommonPrepare()
353 self.assertRaises(Exception, self.MakeStep().PrepareBranch)
186 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch")) 354 self.assertEquals("some_branch", self.MakeStep().Restore("current_branch"))
187 355
188 def testInitialEnvironmentChecks(self): 356 def testInitialEnvironmentChecks(self):
189 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() 357 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile()
190 os.environ["EDITOR"] = "vi" 358 os.environ["EDITOR"] = "vi"
191 self.MakeStep().InitialEnvironmentChecks() 359 self.MakeStep().InitialEnvironmentChecks()
192 360
193 def testReadAndPersistVersion(self): 361 def testReadAndPersistVersion(self):
194 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() 362 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile()
195 step = self.MakeStep() 363 step = self.MakeStep()
(...skipping 25 matching lines...) Expand all
221 389
222 self.assertEqual("//\n#define BUILD_NUMBER 3\n", 390 self.assertEqual("//\n#define BUILD_NUMBER 3\n",
223 MSub(r"(?<=#define BUILD_NUMBER)(?P<space>\s+)\d*$", 391 MSub(r"(?<=#define BUILD_NUMBER)(?P<space>\s+)\d*$",
224 r"\g<space>3", 392 r"\g<space>3",
225 "//\n#define BUILD_NUMBER 321\n")) 393 "//\n#define BUILD_NUMBER 321\n"))
226 394
227 def testPrepareChangeLog(self): 395 def testPrepareChangeLog(self):
228 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() 396 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile()
229 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() 397 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile()
230 398
231 self._git_recipe = [ 399 self.ExpectGit([
232 ["log 1234..HEAD --format=%H", "rev1\nrev2"], 400 ["log 1234..HEAD --format=%H", "rev1\nrev2\nrev3"],
233 ["log -1 rev1 --format=\"%w(80,8,8)%s\"", " Title text 1"], 401 ["log -1 rev1 --format=\"%s\"", "Title text 1"],
234 ["log -1 rev1 --format=\"%B\"", "Title\n\nBUG=\n"], 402 ["log -1 rev1 --format=\"%B\"", "Title\n\nBUG=\nLOG=y\n"],
235 ["log -1 rev1 --format=\"%w(80,8,8)(%an)\"", 403 ["log -1 rev1 --format=\"%an\"", "author1@chromium.org"],
236 " author1@chromium.org"], 404 ["log -1 rev2 --format=\"%s\"", "Title text 2"],
237 ["log -1 rev2 --format=\"%w(80,8,8)%s\"", " Title text 2"], 405 ["log -1 rev2 --format=\"%B\"", "Title\n\nBUG=123\nLOG= \n"],
238 ["log -1 rev2 --format=\"%B\"", "Title\n\nBUG=321\n"], 406 ["log -1 rev2 --format=\"%an\"", "author2@chromium.org"],
239 ["log -1 rev2 --format=\"%w(80,8,8)(%an)\"", 407 ["log -1 rev3 --format=\"%s\"", "Title text 3"],
240 " author2@chromium.org"], 408 ["log -1 rev3 --format=\"%B\"", "Title\n\nBUG=321\nLOG=true\n"],
241 ] 409 ["log -1 rev3 --format=\"%an\"", "author3@chromium.org"],
410 ])
242 411
243 self.MakeStep().Persist("last_push", "1234") 412 self.MakeStep().Persist("last_push", "1234")
244 self.MakeStep(PrepareChangeLog).Run() 413 self.MakeStep(PrepareChangeLog).Run()
245 414
246 cl = FileToText(TEST_CONFIG[CHANGELOG_ENTRY_FILE]) 415 actual_cl = FileToText(TEST_CONFIG[CHANGELOG_ENTRY_FILE])
247 self.assertTrue(re.search(r"\d+\-\d+\-\d+: Version 3\.22\.5", cl)) 416
248 self.assertTrue(re.search(r" Title text 1", cl)) 417 # TODO(machenbach): Mock out call to date() in order to make a fixed
249 self.assertTrue(re.search(r" Title text 2", cl)) 418 # comparison here instead of a regexp match.
250 self.assertTrue(re.search(r" author1@chromium.org", cl)) 419 expected_cl = """\\d+\\-\\d+\\-\\d+: Version 3\\.22\\.5
251 self.assertTrue(re.search(r" author2@chromium.org", cl)) 420
252 self.assertTrue(re.search(r" \(Chromium issue 321\)", cl)) 421 Title text 1
253 self.assertFalse(re.search(r"BUG=", cl)) 422
423 Title text 3
424 \\(Chromium issue 321\\)
425
426 Performance and stability improvements on all platforms\\.
427 #
428 # The change log above is auto-generated\\. Please review if all relevant
429 # commit messages from the list below are included\\.
430 # All lines starting with # will be stripped\\.
431 #
432 # Title text 1
433 # \\(author1@chromium\\.org\\)
434 #
435 # Title text 2
436 # \\(Chromium issue 123\\)
437 # \\(author2@chromium\\.org\\)
438 #
439 # Title text 3
440 # \\(Chromium issue 321\\)
441 # \\(author3@chromium\\.org\\)
442 #
443 #"""
444
445 self.assertTrue(re.match(expected_cl, actual_cl))
254 self.assertEquals("3", self.MakeStep().Restore("major")) 446 self.assertEquals("3", self.MakeStep().Restore("major"))
255 self.assertEquals("22", self.MakeStep().Restore("minor")) 447 self.assertEquals("22", self.MakeStep().Restore("minor"))
256 self.assertEquals("5", self.MakeStep().Restore("build")) 448 self.assertEquals("5", self.MakeStep().Restore("build"))
257 self.assertEquals("0", self.MakeStep().Restore("patch")) 449 self.assertEquals("0", self.MakeStep().Restore("patch"))
258 450
259 def testEditChangeLog(self): 451 def testEditChangeLog(self):
260 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() 452 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile()
261 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() 453 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile()
262 TextToFile(" Original CL", TEST_CONFIG[CHANGELOG_FILE]) 454 TextToFile(" Original CL", TEST_CONFIG[CHANGELOG_FILE])
263 TextToFile(" New \n\tLines \n", TEST_CONFIG[CHANGELOG_ENTRY_FILE]) 455 TextToFile(" New \n\tLines \n", TEST_CONFIG[CHANGELOG_ENTRY_FILE])
264 os.environ["EDITOR"] = "vi" 456 os.environ["EDITOR"] = "vi"
265 457
266 self._rl_recipe = [ 458 self.ExpectReadline([
267 "", # Open editor. 459 "", # Open editor.
268 ] 460 ])
269 461
270 self.MakeStep(EditChangeLog).Run() 462 self.MakeStep(EditChangeLog).Run()
271 463
272 self.assertEquals(" New\n Lines\n\n\n Original CL", 464 self.assertEquals(" New\n Lines\n\n\n Original CL",
273 FileToText(TEST_CONFIG[CHANGELOG_FILE])) 465 FileToText(TEST_CONFIG[CHANGELOG_FILE]))
274 466
275 def testIncrementVersion(self): 467 def testIncrementVersion(self):
276 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() 468 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile()
277 self.MakeStep().Persist("build", "5") 469 self.MakeStep().Persist("build", "5")
278 470
279 self._rl_recipe = [ 471 self.ExpectReadline([
280 "Y", # Increment build number. 472 "Y", # Increment build number.
281 ] 473 ])
282 474
283 self.MakeStep(IncrementVersion).Run() 475 self.MakeStep(IncrementVersion).Run()
284 476
285 self.assertEquals("3", self.MakeStep().Restore("new_major")) 477 self.assertEquals("3", self.MakeStep().Restore("new_major"))
286 self.assertEquals("22", self.MakeStep().Restore("new_minor")) 478 self.assertEquals("22", self.MakeStep().Restore("new_minor"))
287 self.assertEquals("6", self.MakeStep().Restore("new_build")) 479 self.assertEquals("6", self.MakeStep().Restore("new_build"))
288 self.assertEquals("0", self.MakeStep().Restore("new_patch")) 480 self.assertEquals("0", self.MakeStep().Restore("new_patch"))
289 481
290 def testLastChangeLogEntries(self): 482 def testLastChangeLogEntries(self):
291 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() 483 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile()
(...skipping 15 matching lines...) Expand all
307 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() 499 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile()
308 with open(TEST_CONFIG[CHANGELOG_ENTRY_FILE], "w") as f: 500 with open(TEST_CONFIG[CHANGELOG_ENTRY_FILE], "w") as f:
309 f.write("1999-11-11: Version 3.22.5\n") 501 f.write("1999-11-11: Version 3.22.5\n")
310 f.write("\n") 502 f.write("\n")
311 f.write(" Log text 1.\n") 503 f.write(" Log text 1.\n")
312 f.write(" Chromium issue 12345\n") 504 f.write(" Chromium issue 12345\n")
313 f.write("\n") 505 f.write("\n")
314 f.write(" Performance and stability improvements on all " 506 f.write(" Performance and stability improvements on all "
315 "platforms.\n") 507 "platforms.\n")
316 508
317 self._git_recipe = [ 509 self.ExpectGit([
318 ["diff svn/trunk hash1", "patch content"], 510 ["diff svn/trunk hash1", "patch content"],
319 ] 511 ])
320 512
321 self.MakeStep().Persist("prepare_commit_hash", "hash1") 513 self.MakeStep().Persist("prepare_commit_hash", "hash1")
322 self.MakeStep().Persist("date", "1999-11-11") 514 self.MakeStep().Persist("date", "1999-11-11")
323 515
324 self.MakeStep(SquashCommits).Run() 516 self.MakeStep(SquashCommits).Run()
325 517
326 msg = FileToText(TEST_CONFIG[COMMITMSG_FILE]) 518 msg = FileToText(TEST_CONFIG[COMMITMSG_FILE])
327 self.assertTrue(re.search(r"Version 3\.22\.5", msg)) 519 self.assertTrue(re.search(r"Version 3\.22\.5", msg))
328 self.assertTrue(re.search(r"Performance and stability", msg)) 520 self.assertTrue(re.search(r"Performance and stability", msg))
329 self.assertTrue(re.search(r"Log text 1\. Chromium issue 12345", msg)) 521 self.assertTrue(re.search(r"Log text 1\. Chromium issue 12345", msg))
330 self.assertFalse(re.search(r"\d+\-\d+\-\d+", msg)) 522 self.assertFalse(re.search(r"\d+\-\d+\-\d+", msg))
331 523
332 patch = FileToText(TEST_CONFIG[ PATCH_FILE]) 524 patch = FileToText(TEST_CONFIG[ PATCH_FILE])
333 self.assertTrue(re.search(r"patch content", patch)) 525 self.assertTrue(re.search(r"patch content", patch))
334 526
335 def testPushToTrunk(self): 527 def _PushToTrunk(self, force=False):
336 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile() 528 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile()
337 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile() 529 TEST_CONFIG[VERSION_FILE] = self.MakeTempVersionFile()
338 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile() 530 TEST_CONFIG[CHANGELOG_ENTRY_FILE] = self.MakeEmptyTempFile()
339 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile() 531 TEST_CONFIG[CHANGELOG_FILE] = self.MakeEmptyTempFile()
340 if not os.path.exists(TEST_CONFIG[CHROMIUM]): 532 if not os.path.exists(TEST_CONFIG[CHROMIUM]):
341 os.makedirs(TEST_CONFIG[CHROMIUM]) 533 os.makedirs(TEST_CONFIG[CHROMIUM])
342 TextToFile("1999-04-05: Version 3.22.4", TEST_CONFIG[CHANGELOG_FILE]) 534 TextToFile("1999-04-05: Version 3.22.4", TEST_CONFIG[CHANGELOG_FILE])
343 TextToFile("Some line\n \"v8_revision\": \"123444\",\n some line", 535 TextToFile("Some line\n \"v8_revision\": \"123444\",\n some line",
344 TEST_CONFIG[DEPS_FILE]) 536 TEST_CONFIG[DEPS_FILE])
345 os.environ["EDITOR"] = "vi" 537 os.environ["EDITOR"] = "vi"
346 538
347 def CheckPreparePush(): 539 def CheckPreparePush():
348 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE]) 540 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE])
349 self.assertTrue(re.search(r"Version 3.22.5", cl)) 541 self.assertTrue(re.search(r"Version 3.22.5", cl))
350 self.assertTrue(re.search(r" Log text 1", cl)) 542 self.assertTrue(re.search(r" Log text 1", cl))
351 self.assertTrue(re.search(r" \(issue 321\)", cl)) 543 self.assertTrue(re.search(r" \(issue 321\)", cl))
544 self.assertFalse(re.search(r" \(author1@chromium\.org\)", cl))
545
546 # Make sure all comments got stripped.
547 self.assertFalse(re.search(r"^#", cl, flags=re.M))
548
352 version = FileToText(TEST_CONFIG[VERSION_FILE]) 549 version = FileToText(TEST_CONFIG[VERSION_FILE])
353 self.assertTrue(re.search(r"#define BUILD_NUMBER\s+6", version)) 550 self.assertTrue(re.search(r"#define BUILD_NUMBER\s+6", version))
354 551
552 def CheckUpload():
553 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE])
554
355 def CheckSVNCommit(): 555 def CheckSVNCommit():
356 commit = FileToText(TEST_CONFIG[COMMITMSG_FILE]) 556 commit = FileToText(TEST_CONFIG[COMMITMSG_FILE])
357 self.assertTrue(re.search(r"Version 3.22.5", commit)) 557 self.assertTrue(re.search(r"Version 3.22.5", commit))
358 self.assertTrue(re.search(r"Log text 1. \(issue 321\)", commit)) 558 self.assertTrue(re.search(r"Log text 1. \(issue 321\)", commit))
359 version = FileToText(TEST_CONFIG[VERSION_FILE]) 559 version = FileToText(TEST_CONFIG[VERSION_FILE])
360 self.assertTrue(re.search(r"#define MINOR_VERSION\s+22", version)) 560 self.assertTrue(re.search(r"#define MINOR_VERSION\s+22", version))
361 self.assertTrue(re.search(r"#define BUILD_NUMBER\s+5", version)) 561 self.assertTrue(re.search(r"#define BUILD_NUMBER\s+5", version))
362 self.assertFalse(re.search(r"#define BUILD_NUMBER\s+6", version)) 562 self.assertFalse(re.search(r"#define BUILD_NUMBER\s+6", version))
363 self.assertTrue(re.search(r"#define PATCH_LEVEL\s+0", version)) 563 self.assertTrue(re.search(r"#define PATCH_LEVEL\s+0", version))
364 self.assertTrue(re.search(r"#define IS_CANDIDATE_VERSION\s+0", version)) 564 self.assertTrue(re.search(r"#define IS_CANDIDATE_VERSION\s+0", version))
365 565
366 self._git_recipe = [ 566 force_flag = " -f" if force else ""
567 self.ExpectGit([
367 ["status -s -uno", ""], 568 ["status -s -uno", ""],
368 ["status -s -b -uno", "## some_branch\n"], 569 ["status -s -b -uno", "## some_branch\n"],
369 ["svn fetch", ""], 570 ["svn fetch", ""],
370 ["branch", " branch1\n* branch2\n"], 571 ["branch", " branch1\n* branch2\n"],
371 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""], 572 ["checkout -b %s" % TEST_CONFIG[TEMP_BRANCH], ""],
372 ["branch", " branch1\n* branch2\n"], 573 ["branch", " branch1\n* branch2\n"],
373 ["branch", " branch1\n* branch2\n"], 574 ["branch", " branch1\n* branch2\n"],
374 ["checkout -b %s svn/bleeding_edge" % TEST_CONFIG[BRANCHNAME], ""], 575 ["checkout -b %s svn/bleeding_edge" % TEST_CONFIG[BRANCHNAME], ""],
375 ["log -1 --format=%H ChangeLog", "1234\n"], 576 ["log -1 --format=%H ChangeLog", "1234\n"],
376 ["log -1 1234", "Last push ouput\n"], 577 ["log -1 1234", "Last push ouput\n"],
377 ["log 1234..HEAD --format=%H", "rev1\n"], 578 ["log 1234..HEAD --format=%H", "rev1\n"],
378 ["log -1 rev1 --format=\"%w(80,8,8)%s\"", " Log text 1.\n"], 579 ["log -1 rev1 --format=\"%s\"", "Log text 1.\n"],
379 ["log -1 rev1 --format=\"%B\"", "Text\nBUG=v8:321\nText\n"], 580 ["log -1 rev1 --format=\"%B\"", "Text\nLOG=YES\nBUG=v8:321\nText\n"],
380 ["log -1 rev1 --format=\"%w(80,8,8)(%an)\"", 581 ["log -1 rev1 --format=\"%an\"", "author1@chromium.org\n"],
381 " author1@chromium.org\n"],
382 [("commit -a -m \"Prepare push to trunk. " 582 [("commit -a -m \"Prepare push to trunk. "
383 "Now working on version 3.22.6.\""), 583 "Now working on version 3.22.6.\""),
384 " 2 files changed\n", 584 " 2 files changed\n",
385 CheckPreparePush], 585 CheckPreparePush],
386 ["cl upload -r \"reviewer@chromium.org\" --send-mail", "done\n"], 586 ["cl upload -r \"reviewer@chromium.org\" --send-mail%s" % force_flag,
387 ["cl dcommit -v", "Closing issue\n"], 587 "done\n"],
588 ["cl dcommit -f", "Closing issue\n"],
388 ["svn fetch", "fetch result\n"], 589 ["svn fetch", "fetch result\n"],
389 ["checkout svn/bleeding_edge", ""], 590 ["checkout svn/bleeding_edge", ""],
390 [("log -1 --format=%H --grep=\"Prepare push to trunk. " 591 [("log -1 --format=%H --grep=\"Prepare push to trunk. "
391 "Now working on version 3.22.6.\""), 592 "Now working on version 3.22.6.\""),
392 "hash1\n"], 593 "hash1\n"],
393 ["diff svn/trunk hash1", "patch content\n"], 594 ["diff svn/trunk hash1", "patch content\n"],
394 ["checkout -b %s svn/trunk" % TEST_CONFIG[TRUNKBRANCH], ""], 595 ["checkout -b %s svn/trunk" % TEST_CONFIG[TRUNKBRANCH], ""],
395 ["apply --index --reject \"%s\"" % TEST_CONFIG[PATCH_FILE], ""], 596 ["apply --index --reject \"%s\"" % TEST_CONFIG[PATCH_FILE], ""],
396 ["add \"%s\"" % TEST_CONFIG[VERSION_FILE], ""], 597 ["add \"%s\"" % TEST_CONFIG[VERSION_FILE], ""],
397 ["commit -F \"%s\"" % TEST_CONFIG[COMMITMSG_FILE], "", CheckSVNCommit], 598 ["commit -F \"%s\"" % TEST_CONFIG[COMMITMSG_FILE], "", CheckSVNCommit],
398 ["svn dcommit 2>&1", "Some output\nCommitted r123456\nSome output\n"], 599 ["svn dcommit 2>&1", "Some output\nCommitted r123456\nSome output\n"],
399 ["svn tag 3.22.5 -m \"Tagging version 3.22.5\"", ""], 600 ["svn tag 3.22.5 -m \"Tagging version 3.22.5\"", ""],
400 ["status -s -uno", ""], 601 ["status -s -uno", ""],
401 ["checkout master", ""], 602 ["checkout master", ""],
402 ["pull", ""], 603 ["pull", ""],
403 ["checkout -b v8-roll-123456", ""], 604 ["checkout -b v8-roll-123456", ""],
404 [("commit -am \"Update V8 to version 3.22.5.\n\n" 605 [("commit -am \"Update V8 to version 3.22.5.\n\n"
405 "TBR=reviewer@chromium.org\""), 606 "TBR=reviewer@chromium.org\""),
406 ""], 607 ""],
407 ["cl upload --send-mail", ""], 608 ["cl upload --send-mail%s" % force_flag, ""],
408 ["checkout -f some_branch", ""], 609 ["checkout -f some_branch", ""],
409 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""], 610 ["branch -D %s" % TEST_CONFIG[TEMP_BRANCH], ""],
410 ["branch -D %s" % TEST_CONFIG[BRANCHNAME], ""], 611 ["branch -D %s" % TEST_CONFIG[BRANCHNAME], ""],
411 ["branch -D %s" % TEST_CONFIG[TRUNKBRANCH], ""], 612 ["branch -D %s" % TEST_CONFIG[TRUNKBRANCH], ""],
412 ] 613 ])
413 self._rl_recipe = [ 614 self.ExpectReadline([
414 "Y", # Confirm last push. 615 "Y", # Confirm last push.
415 "", # Open editor. 616 "", # Open editor.
416 "Y", # Increment build number. 617 "Y", # Increment build number.
417 "reviewer@chromium.org", # V8 reviewer. 618 "reviewer@chromium.org", # V8 reviewer.
418 "LGTX", # Enter LGTM for V8 CL (wrong). 619 "LGTX", # Enter LGTM for V8 CL (wrong).
419 "LGTM", # Enter LGTM for V8 CL. 620 "LGTM", # Enter LGTM for V8 CL.
420 "Y", # Sanity check. 621 "Y", # Sanity check.
421 "reviewer@chromium.org", # Chromium reviewer. 622 "reviewer@chromium.org", # Chromium reviewer.
422 ] 623 ])
624 if force:
625 # TODO(machenbach): The lgtm for the prepare push is just temporary.
626 # There should be no user input in "force" mode.
627 self.ExpectReadline([
628 "LGTM", # Enter LGTM for V8 CL.
629 ])
423 630
424 class Options( object ): 631 class Options( object ):
425 pass 632 pass
426 633
427 options = Options() 634 options = Options()
428 options.s = 0 635 options.s = 0
429 options.l = None 636 options.l = None
637 options.f = force
638 options.r = "reviewer@chromium.org" if force else None
430 options.c = TEST_CONFIG[CHROMIUM] 639 options.c = TEST_CONFIG[CHROMIUM]
431 RunScript(TEST_CONFIG, options, self) 640 RunPushToTrunk(TEST_CONFIG, options, self)
432 641
433 deps = FileToText(TEST_CONFIG[DEPS_FILE]) 642 deps = FileToText(TEST_CONFIG[DEPS_FILE])
434 self.assertTrue(re.search("\"v8_revision\": \"123456\"", deps)) 643 self.assertTrue(re.search("\"v8_revision\": \"123456\"", deps))
435 644
436 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE]) 645 cl = FileToText(TEST_CONFIG[CHANGELOG_FILE])
437 self.assertTrue(re.search(r"\d\d\d\d\-\d+\-\d+: Version 3\.22\.5", cl)) 646 self.assertTrue(re.search(r"\d\d\d\d\-\d+\-\d+: Version 3\.22\.5", cl))
438 self.assertTrue(re.search(r" Log text 1", cl)) 647 self.assertTrue(re.search(r" Log text 1", cl))
439 self.assertTrue(re.search(r" \(issue 321\)", cl)) 648 self.assertTrue(re.search(r" \(issue 321\)", cl))
440 self.assertTrue(re.search(r"1999\-04\-05: Version 3\.22\.4", cl)) 649 self.assertTrue(re.search(r"1999\-04\-05: Version 3\.22\.4", cl))
441 650
442 # Note: The version file is on build number 5 again in the end of this test 651 # Note: The version file is on build number 5 again in the end of this test
443 # since the git command that merges to the bleeding edge branch is mocked 652 # since the git command that merges to the bleeding edge branch is mocked
444 # out. 653 # out.
654
655 def testPushToTrunk(self):
656 self._PushToTrunk()
657
658 def testPushToTrunkForced(self):
659 self._PushToTrunk(force=True)
660
661 def testAutoRoll(self):
662 TEST_CONFIG[DOT_GIT_LOCATION] = self.MakeEmptyTempFile()
663
664 # TODO(machenbach): Get rid of the editor check in automatic mode.
665 os.environ["EDITOR"] = "vi"
666
667 self.ExpectReadURL([
668 ["https://v8-status.appspot.com/lkgr", "100"],
669 ])
670
671 self.ExpectGit([
672 ["status -s -uno", ""],
673 ["status -s -b -uno", "## some_branch\n"],
674 ["svn fetch", ""],
675 ["svn log -1 --oneline", "r101 | Text"],
676 ])
677
678 # TODO(machenbach): Make a convenience wrapper for this.
679 class Options( object ):
680 pass
681
682 options = Options()
683 options.s = 0
684
685 auto_roll.RunAutoRoll(TEST_CONFIG, options, self)
686
687 self.assertEquals("100", self.MakeStep().Restore("lkgr"))
688 self.assertEquals("101", self.MakeStep().Restore("latest"))
OLDNEW
« include/v8-platform.h ('K') | « tools/push-to-trunk/push_to_trunk.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698