| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Unit tests for gcl.py.""" | 6 """Unit tests for gcl.py.""" |
| 7 | 7 |
| 8 # Fixes include path. | 8 # Fixes include path. |
| 9 from super_mox import mox, SuperMoxTestBase | 9 from super_mox import mox, SuperMoxTestBase |
| 10 | 10 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 self.mox.StubOutWithMock(gcl.gclient_utils, 'FileRead') | 24 self.mox.StubOutWithMock(gcl.gclient_utils, 'FileRead') |
| 25 self.mox.StubOutWithMock(gcl.gclient_utils, 'FileWrite') | 25 self.mox.StubOutWithMock(gcl.gclient_utils, 'FileWrite') |
| 26 gcl.REPOSITORY_ROOT = None | 26 gcl.REPOSITORY_ROOT = None |
| 27 | 27 |
| 28 | 28 |
| 29 class GclUnittest(GclTestsBase): | 29 class GclUnittest(GclTestsBase): |
| 30 """General gcl.py tests.""" | 30 """General gcl.py tests.""" |
| 31 def testMembersChanged(self): | 31 def testMembersChanged(self): |
| 32 self.mox.ReplayAll() | 32 self.mox.ReplayAll() |
| 33 members = [ | 33 members = [ |
| 34 'CODEREVIEW_SETTINGS', 'CODEREVIEW_SETTINGS_FILE', 'Change', | 34 'CODEREVIEW_SETTINGS', 'CODEREVIEW_SETTINGS_FILE', |
| 35 'ChangeInfo', 'Changes', 'Commit', 'DEFAULT_LINT_IGNORE_REGEX', | 35 'CMDchange', 'CMDchanges', 'CMDcommit', 'CMDdelete', 'CMDdeleteempties', |
| 36 'DEFAULT_LINT_REGEX', 'CheckHomeForFile', 'DeleteEmptyChangeLists', | 36 'CMDdescription', 'CMDdiff', 'CMDhelp', 'CMDlint', 'CMDnothave', |
| 37 'CMDopened', 'CMDpresubmit', 'CMDrename', 'CMDsettings', 'CMDstatus', |
| 38 'CMDtry', 'CMDupload', |
| 39 'ChangeInfo', 'DEFAULT_LINT_IGNORE_REGEX', |
| 40 'DEFAULT_LINT_REGEX', 'CheckHomeForFile', |
| 37 'DoPresubmitChecks', 'ErrorExit', 'FILES_CACHE', 'FilterFlag', | 41 'DoPresubmitChecks', 'ErrorExit', 'FILES_CACHE', 'FilterFlag', |
| 38 'GenerateChangeName', 'GenerateDiff', 'GetCLs', 'GetCacheDir', | 42 'GenerateChangeName', 'GenerateDiff', 'GetCLs', 'GetCacheDir', |
| 39 'GetCachedFile', 'GetChangelistInfoFile', 'GetChangesDir', | 43 'GetCachedFile', 'GetChangelistInfoFile', 'GetChangesDir', |
| 40 'GetCodeReviewSetting', 'GetEditor', 'GetFilesNotInCL', 'GetInfoDir', | 44 'GetCodeReviewSetting', 'GetEditor', 'GetFilesNotInCL', 'GetInfoDir', |
| 41 'GetIssueDescription', 'GetModifiedFiles', 'GetRepositoryRoot', 'Help', | 45 'GetIssueDescription', 'GetModifiedFiles', 'GetRepositoryRoot', |
| 42 'Lint', 'LoadChangelistInfoForMultiple', 'MISSING_TEST_MSG', 'Opened', | 46 'ListFiles', |
| 43 'OptionallyDoPresubmitChecks', 'PresubmitCL', 'REPOSITORY_ROOT', | 47 'LoadChangelistInfoForMultiple', 'MISSING_TEST_MSG', |
| 48 'OptionallyDoPresubmitChecks', 'REPOSITORY_ROOT', |
| 44 'RunShell', 'RunShellWithReturnCode', 'SVN', | 49 'RunShell', 'RunShellWithReturnCode', 'SVN', |
| 45 'SendToRietveld', 'TryChange', 'UnknownFiles', 'UploadCL', 'Warn', | 50 'SendToRietveld', 'TryChange', 'UnknownFiles', 'Warn', |
| 46 'breakpad', 'gclient_utils', 'getpass', 'main', 'os', 'random', 're', | 51 'breakpad', 'gclient_utils', 'getpass', 'main', 'os', 'random', 're', |
| 47 'shutil', 'string', 'subprocess', 'sys', 'tempfile', 'upload', | 52 'shutil', 'string', 'subprocess', 'sys', 'tempfile', 'time', 'upload', |
| 48 'urllib2', | 53 'urllib2', |
| 49 ] | 54 ] |
| 50 # If this test fails, you should add the relevant test. | 55 # If this test fails, you should add the relevant test. |
| 51 self.compareMembers(gcl, members) | 56 self.compareMembers(gcl, members) |
| 52 | 57 |
| 53 def testIsSVNMoved(self): | 58 def testIsSVNMoved(self): |
| 54 # TODO(maruel): TEST ME | 59 # TODO(maruel): TEST ME |
| 55 pass | 60 pass |
| 56 | 61 |
| 57 def testGetSVNFileProperty(self): | 62 def testGetSVNFileProperty(self): |
| (...skipping 14 matching lines...) Expand all Loading... |
| 72 self.mox.ReplayAll() | 77 self.mox.ReplayAll() |
| 73 self.assertRaises(gcl.gclient_utils.Error, gcl.GetRepositoryRoot) | 78 self.assertRaises(gcl.gclient_utils.Error, gcl.GetRepositoryRoot) |
| 74 | 79 |
| 75 def testGetRepositoryRootGood(self): | 80 def testGetRepositoryRootGood(self): |
| 76 root_path = gcl.os.path.join('bleh', 'prout', 'pouet') | 81 root_path = gcl.os.path.join('bleh', 'prout', 'pouet') |
| 77 gcl.os.getcwd().AndReturn(root_path) | 82 gcl.os.getcwd().AndReturn(root_path) |
| 78 gcl.SVN.GetCheckoutRoot(root_path).AndReturn(root_path + '.~') | 83 gcl.SVN.GetCheckoutRoot(root_path).AndReturn(root_path + '.~') |
| 79 self.mox.ReplayAll() | 84 self.mox.ReplayAll() |
| 80 self.assertEquals(gcl.GetRepositoryRoot(), root_path + '.~') | 85 self.assertEquals(gcl.GetRepositoryRoot(), root_path + '.~') |
| 81 | 86 |
| 82 def testGetCachedFile(self): | |
| 83 # TODO(maruel): TEST ME | |
| 84 pass | |
| 85 | |
| 86 def testGetCodeReviewSetting(self): | |
| 87 # TODO(maruel): TEST ME | |
| 88 pass | |
| 89 | |
| 90 def testGetChangelistInfoFile(self): | |
| 91 # TODO(maruel): TEST ME | |
| 92 pass | |
| 93 | |
| 94 def testLoadChangelistInfoForMultiple(self): | |
| 95 # TODO(maruel): TEST ME | |
| 96 pass | |
| 97 | |
| 98 def testGetModifiedFiles(self): | |
| 99 # TODO(maruel): TEST ME | |
| 100 pass | |
| 101 | |
| 102 def testGetFilesNotInCL(self): | |
| 103 # TODO(maruel): TEST ME | |
| 104 pass | |
| 105 | |
| 106 def testSendToRietveld(self): | |
| 107 # TODO(maruel): TEST ME | |
| 108 pass | |
| 109 | |
| 110 def testOpened(self): | |
| 111 # TODO(maruel): TEST ME | |
| 112 pass | |
| 113 | |
| 114 def testHelp(self): | 87 def testHelp(self): |
| 115 gcl.sys.stdout.write(mox.StrContains('GCL is a wrapper for Subversion')) | 88 gcl.sys.stdout.write(mox.StrContains('GCL is a wrapper for Subversion')) |
| 116 gcl.sys.stdout.write('\n') | 89 gcl.sys.stdout.write('\n') |
| 117 self.mox.ReplayAll() | 90 self.mox.ReplayAll() |
| 118 gcl.Help() | 91 gcl.CMDhelp() |
| 119 | |
| 120 def testGenerateDiff(self): | |
| 121 # TODO(maruel): TEST ME | |
| 122 pass | |
| 123 | |
| 124 def testPresubmitCL(self): | |
| 125 # TODO(maruel): TEST ME | |
| 126 pass | |
| 127 | |
| 128 def testTryChange(self): | |
| 129 # TODO(maruel): TEST ME | |
| 130 pass | |
| 131 | |
| 132 def testCommit(self): | |
| 133 # TODO(maruel): TEST ME | |
| 134 pass | |
| 135 | |
| 136 def testChange(self): | |
| 137 # TODO(maruel): TEST ME | |
| 138 pass | |
| 139 | |
| 140 def testLint(self): | |
| 141 # TODO(maruel): TEST ME | |
| 142 pass | |
| 143 | |
| 144 def testDoPresubmitChecks(self): | |
| 145 # TODO(maruel): TEST ME | |
| 146 pass | |
| 147 | 92 |
| 148 | 93 |
| 149 class ChangeInfoUnittest(GclTestsBase): | 94 class ChangeInfoUnittest(GclTestsBase): |
| 150 def setUp(self): | 95 def setUp(self): |
| 151 GclTestsBase.setUp(self) | 96 GclTestsBase.setUp(self) |
| 152 self.mox.StubOutWithMock(gcl, 'GetChangelistInfoFile') | 97 self.mox.StubOutWithMock(gcl, 'GetChangelistInfoFile') |
| 153 self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot') | 98 self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot') |
| 154 | 99 |
| 155 def testChangeInfoMembers(self): | 100 def testChangeInfoMembers(self): |
| 156 self.mox.ReplayAll() | 101 self.mox.ReplayAll() |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 gcl.gclient_utils.FileWrite( | 168 gcl.gclient_utils.FileWrite( |
| 224 'foo', | 169 'foo', |
| 225 gcl.ChangeInfo._SEPARATOR.join(['0, 0, dirty', '', ''])) | 170 gcl.ChangeInfo._SEPARATOR.join(['0, 0, dirty', '', ''])) |
| 226 self.mox.ReplayAll() | 171 self.mox.ReplayAll() |
| 227 | 172 |
| 228 change_info = gcl.ChangeInfo('', 0, 0, '', None, self.fake_root_dir, | 173 change_info = gcl.ChangeInfo('', 0, 0, '', None, self.fake_root_dir, |
| 229 needs_upload=True) | 174 needs_upload=True) |
| 230 change_info.Save() | 175 change_info.Save() |
| 231 | 176 |
| 232 | 177 |
| 233 class UploadCLUnittest(GclTestsBase): | 178 class CMDuploadUnittest(GclTestsBase): |
| 234 def setUp(self): | 179 def setUp(self): |
| 235 GclTestsBase.setUp(self) | 180 GclTestsBase.setUp(self) |
| 236 self.mox.StubOutWithMock(gcl, 'CheckHomeForFile') | 181 self.mox.StubOutWithMock(gcl, 'CheckHomeForFile') |
| 237 self.mox.StubOutWithMock(gcl, 'DoPresubmitChecks') | 182 self.mox.StubOutWithMock(gcl, 'DoPresubmitChecks') |
| 238 self.mox.StubOutWithMock(gcl, 'GenerateDiff') | 183 self.mox.StubOutWithMock(gcl, 'GenerateDiff') |
| 239 self.mox.StubOutWithMock(gcl, 'GetCodeReviewSetting') | 184 self.mox.StubOutWithMock(gcl, 'GetCodeReviewSetting') |
| 240 self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot') | 185 self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot') |
| 241 self.mox.StubOutWithMock(gcl, 'SendToRietveld') | 186 self.mox.StubOutWithMock(gcl, 'SendToRietveld') |
| 242 self.mox.StubOutWithMock(gcl, 'TryChange') | 187 self.mox.StubOutWithMock(gcl, 'TryChange') |
| 243 | 188 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 263 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--foo=bar', | 208 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--foo=bar', |
| 264 "--message=''", '--issue=1'], change_info.patch).AndReturn(("1", | 209 "--message=''", '--issue=1'], change_info.patch).AndReturn(("1", |
| 265 "2")) | 210 "2")) |
| 266 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) | 211 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) |
| 267 gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') | 212 gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') |
| 268 gcl.TryChange(change_info, [], swallow_exception=True) | 213 gcl.TryChange(change_info, [], swallow_exception=True) |
| 269 gcl.os.chdir('somewhere') | 214 gcl.os.chdir('somewhere') |
| 270 change_info.Save() | 215 change_info.Save() |
| 271 self.mox.ReplayAll() | 216 self.mox.ReplayAll() |
| 272 | 217 |
| 273 gcl.UploadCL(change_info, args) | 218 gcl.CMDupload(change_info, args) |
| 274 | 219 |
| 275 def testServerOverride(self): | 220 def testServerOverride(self): |
| 276 change_info = gcl.ChangeInfo('naame', 0, 0, 'deescription', | 221 change_info = gcl.ChangeInfo('naame', 0, 0, 'deescription', |
| 277 [('A', 'aa'), ('M', 'bb')], | 222 [('A', 'aa'), ('M', 'bb')], |
| 278 self.fake_root_dir) | 223 self.fake_root_dir) |
| 279 self.mox.StubOutWithMock(change_info, 'Save') | 224 self.mox.StubOutWithMock(change_info, 'Save') |
| 280 args = ['--server=a', '--no_watchlists'] | 225 args = ['--server=a', '--no_watchlists'] |
| 281 change_info.Save() | 226 change_info.Save() |
| 282 gcl.CheckHomeForFile('.gcl_upload_no_try').AndReturn(None) | 227 gcl.CheckHomeForFile('.gcl_upload_no_try').AndReturn(None) |
| 283 gcl.DoPresubmitChecks(change_info, False, True).AndReturn(True) | 228 gcl.DoPresubmitChecks(change_info, False, True).AndReturn(True) |
| 284 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') | 229 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') |
| 285 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) | 230 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) |
| 286 gcl.os.write(42, change_info.description) | 231 gcl.os.write(42, change_info.description) |
| 287 gcl.os.close(42) | 232 gcl.os.close(42) |
| 288 gcl.GetCodeReviewSetting('CC_LIST') | 233 gcl.GetCodeReviewSetting('CC_LIST') |
| 289 gcl.GetCodeReviewSetting('PRIVATE') | 234 gcl.GetCodeReviewSetting('PRIVATE') |
| 290 gcl.os.getcwd().AndReturn('somewhere') | 235 gcl.os.getcwd().AndReturn('somewhere') |
| 291 gcl.os.chdir(change_info.GetLocalRoot()) | 236 gcl.os.chdir(change_info.GetLocalRoot()) |
| 292 gcl.GenerateDiff(change_info.GetFileNames()) | 237 gcl.GenerateDiff(change_info.GetFileNames()) |
| 293 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--server=a', | 238 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--server=a', |
| 294 "--description_file=descfile", | 239 "--description_file=descfile", |
| 295 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) | 240 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) |
| 296 gcl.os.remove('descfile') | 241 gcl.os.remove('descfile') |
| 297 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) | 242 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) |
| 298 gcl.os.chdir('somewhere') | 243 gcl.os.chdir('somewhere') |
| 299 self.mox.ReplayAll() | 244 self.mox.ReplayAll() |
| 300 | 245 |
| 301 gcl.UploadCL(change_info, args) | 246 gcl.CMDupload(change_info, args) |
| 302 | 247 |
| 303 def testNoTry(self): | 248 def testNoTry(self): |
| 304 change_info = gcl.ChangeInfo('naame', 0, 0, 'deescription', | 249 change_info = gcl.ChangeInfo('naame', 0, 0, 'deescription', |
| 305 [('A', 'aa'), ('M', 'bb')], | 250 [('A', 'aa'), ('M', 'bb')], |
| 306 self.fake_root_dir) | 251 self.fake_root_dir) |
| 307 change_info.Save = self.mox.CreateMockAnything() | 252 change_info.Save = self.mox.CreateMockAnything() |
| 308 args = ['--no-try', '--no_watchlists'] | 253 args = ['--no-try', '--no_watchlists'] |
| 309 change_info.Save() | 254 change_info.Save() |
| 310 gcl.DoPresubmitChecks(change_info, False, True).AndReturn(True) | 255 gcl.DoPresubmitChecks(change_info, False, True).AndReturn(True) |
| 311 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') | 256 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') |
| 312 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) | 257 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) |
| 313 gcl.os.write(42, change_info.description) | 258 gcl.os.write(42, change_info.description) |
| 314 gcl.os.close(42) | 259 gcl.os.close(42) |
| 315 gcl.GetCodeReviewSetting('CC_LIST') | 260 gcl.GetCodeReviewSetting('CC_LIST') |
| 316 gcl.GetCodeReviewSetting('PRIVATE') | 261 gcl.GetCodeReviewSetting('PRIVATE') |
| 317 gcl.os.getcwd().AndReturn('somewhere') | 262 gcl.os.getcwd().AndReturn('somewhere') |
| 318 gcl.os.chdir(change_info.GetLocalRoot()) | 263 gcl.os.chdir(change_info.GetLocalRoot()) |
| 319 gcl.GenerateDiff(change_info.GetFileNames()) | 264 gcl.GenerateDiff(change_info.GetFileNames()) |
| 320 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', | 265 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', |
| 321 "--description_file=descfile", | 266 "--description_file=descfile", |
| 322 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) | 267 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) |
| 323 gcl.os.remove('descfile') | 268 gcl.os.remove('descfile') |
| 324 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) | 269 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) |
| 325 gcl.os.chdir('somewhere') | 270 gcl.os.chdir('somewhere') |
| 326 self.mox.ReplayAll() | 271 self.mox.ReplayAll() |
| 327 | 272 |
| 328 gcl.UploadCL(change_info, args) | 273 gcl.CMDupload(change_info, args) |
| 329 | 274 |
| 330 def testNormal(self): | 275 def testNormal(self): |
| 331 change_info = gcl.ChangeInfo('naame', 0, 0, 'deescription', | 276 change_info = gcl.ChangeInfo('naame', 0, 0, 'deescription', |
| 332 [('A', 'aa'), ('M', 'bb')], | 277 [('A', 'aa'), ('M', 'bb')], |
| 333 self.fake_root_dir) | 278 self.fake_root_dir) |
| 334 self.mox.StubOutWithMock(change_info, 'Save') | 279 self.mox.StubOutWithMock(change_info, 'Save') |
| 335 args = ['--no_watchlists'] | 280 args = ['--no_watchlists'] |
| 336 change_info.Save() | 281 change_info.Save() |
| 337 gcl.CheckHomeForFile('.gcl_upload_no_try').AndReturn(None) | 282 gcl.CheckHomeForFile('.gcl_upload_no_try').AndReturn(None) |
| 338 gcl.DoPresubmitChecks(change_info, False, True).AndReturn(True) | 283 gcl.DoPresubmitChecks(change_info, False, True).AndReturn(True) |
| 339 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') | 284 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') |
| 340 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) | 285 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) |
| 341 gcl.os.write(42, change_info.description) | 286 gcl.os.write(42, change_info.description) |
| 342 gcl.os.close(42) | 287 gcl.os.close(42) |
| 343 gcl.GetCodeReviewSetting('CC_LIST') | 288 gcl.GetCodeReviewSetting('CC_LIST') |
| 344 gcl.GetCodeReviewSetting('PRIVATE') | 289 gcl.GetCodeReviewSetting('PRIVATE') |
| 345 gcl.os.getcwd().AndReturn('somewhere') | 290 gcl.os.getcwd().AndReturn('somewhere') |
| 346 gcl.os.chdir(change_info.GetLocalRoot()) | 291 gcl.os.chdir(change_info.GetLocalRoot()) |
| 347 gcl.GenerateDiff(change_info.GetFileNames()) | 292 gcl.GenerateDiff(change_info.GetFileNames()) |
| 348 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', | 293 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', |
| 349 "--description_file=descfile", | 294 "--description_file=descfile", |
| 350 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) | 295 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) |
| 351 gcl.os.remove('descfile') | 296 gcl.os.remove('descfile') |
| 352 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) | 297 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) |
| 353 gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') | 298 gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') |
| 354 gcl.TryChange(change_info, [], swallow_exception=True) | 299 gcl.TryChange(change_info, [], swallow_exception=True) |
| 355 gcl.os.chdir('somewhere') | 300 gcl.os.chdir('somewhere') |
| 356 self.mox.ReplayAll() | 301 self.mox.ReplayAll() |
| 357 | 302 |
| 358 gcl.UploadCL(change_info, args) | 303 gcl.CMDupload(change_info, args) |
| 359 self.assertEquals(change_info.issue, 1) | 304 self.assertEquals(change_info.issue, 1) |
| 360 self.assertEquals(change_info.patchset, 2) | 305 self.assertEquals(change_info.patchset, 2) |
| 361 | 306 |
| 362 | 307 |
| 363 if __name__ == '__main__': | 308 if __name__ == '__main__': |
| 364 import unittest | 309 import unittest |
| 365 unittest.main() | 310 unittest.main() |
| OLD | NEW |