OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2009 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2009 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 import StringIO | |
9 import os | |
10 import sys | |
11 import unittest | 8 import unittest |
12 | 9 |
13 # Local imports | 10 # Local imports |
14 import __init__ | 11 import __init__ |
15 import gcl | 12 import gcl |
16 mox = __init__.mox | 13 mox = __init__.mox |
17 | 14 |
18 | 15 |
19 class GclTestsBase(unittest.TestCase): | 16 class GclTestsBase(mox.MoxTestBase): |
20 """Setups and tear downs the mocks but doesn't test anything as-is.""" | 17 """Setups and tear downs the mocks but doesn't test anything as-is.""" |
21 def setUp(self): | 18 def setUp(self): |
22 self.mox = mox.Mox() | 19 mox.MoxTestBase.setUp(self) |
23 def RunShellMock(filename): | 20 self.mox.StubOutWithMock(gcl, 'RunShell') |
24 return filename | 21 self.mox.StubOutWithMock(gcl.gclient, 'CaptureSVNInfo') |
25 self._RunShell = gcl.RunShell | 22 self.mox.StubOutWithMock(gcl, 'os') |
26 gcl.RunShell = RunShellMock | 23 self.mox.StubOutWithMock(gcl.os, 'getcwd') |
27 self._gcl_gclient_CaptureSVNInfo = gcl.gclient.CaptureSVNInfo | |
28 gcl.gclient.CaptureSVNInfo = self.mox.CreateMockAnything() | |
29 self._gcl_os_getcwd = gcl.os.getcwd | |
30 gcl.os.getcwd = self.mox.CreateMockAnything() | |
31 | |
32 def tearDown(self): | |
33 gcl.RunShell = self._RunShell | |
34 gcl.gclient.CaptureSVNInfo = self._gcl_gclient_CaptureSVNInfo | |
35 gcl.os.getcwd = self._gcl_os_getcwd | |
36 | 24 |
37 def compareMembers(self, object, members): | 25 def compareMembers(self, object, members): |
38 """If you add a member, be sure to add the relevant test!""" | 26 """If you add a member, be sure to add the relevant test!""" |
39 # Skip over members starting with '_' since they are usually not meant to | 27 # Skip over members starting with '_' since they are usually not meant to |
40 # be for public use. | 28 # be for public use. |
41 actual_members = [x for x in sorted(dir(object)) | 29 actual_members = [x for x in sorted(dir(object)) |
42 if not x.startswith('_')] | 30 if not x.startswith('_')] |
43 expected_members = sorted(members) | 31 expected_members = sorted(members) |
44 if actual_members != expected_members: | 32 if actual_members != expected_members: |
45 diff = ([i for i in actual_members if i not in expected_members] + | 33 diff = ([i for i in actual_members if i not in expected_members] + |
(...skipping 21 matching lines...) Expand all Loading... |
67 'UnknownFiles', 'UploadCL', 'Warn', 'WriteFile', | 55 'UnknownFiles', 'UploadCL', 'Warn', 'WriteFile', |
68 'gclient', 'getpass', 'main', 'os', 'random', 're', | 56 'gclient', 'getpass', 'main', 'os', 'random', 're', |
69 'shutil', 'string', 'subprocess', 'sys', 'tempfile', | 57 'shutil', 'string', 'subprocess', 'sys', 'tempfile', |
70 'upload', 'urllib2', 'xml', | 58 'upload', 'urllib2', 'xml', |
71 ] | 59 ] |
72 # If this test fails, you should add the relevant test. | 60 # If this test fails, you should add the relevant test. |
73 self.compareMembers(gcl, members) | 61 self.compareMembers(gcl, members) |
74 | 62 |
75 | 63 |
76 def testHelp(self): | 64 def testHelp(self): |
77 old_stdout = sys.stdout | 65 self.mox.StubOutWithMock(gcl.sys, 'stdout') |
78 try: | 66 gcl.sys.stdout.write(mox.StrContains('GCL is a wrapper for Subversion')) |
79 dummy = StringIO.StringIO() | 67 gcl.sys.stdout.write('\n') |
80 gcl.sys.stdout = dummy | 68 self.mox.ReplayAll() |
81 gcl.Help() | 69 gcl.Help() |
82 self.assertEquals(len(dummy.getvalue()), 1832) | |
83 finally: | |
84 gcl.sys.stdout = old_stdout | |
85 | 70 |
86 def testGetRepositoryRootNone(self): | 71 def testGetRepositoryRootNone(self): |
87 gcl.REPOSITORY_ROOT = None | 72 gcl.REPOSITORY_ROOT = None |
88 gcl.os.getcwd().AndReturn("/bleh/prout") | 73 gcl.os.getcwd().AndReturn("/bleh/prout") |
89 result = { | 74 result = { |
90 "Repository Root": "" | 75 "Repository Root": "" |
91 } | 76 } |
92 gcl.gclient.CaptureSVNInfo("/bleh/prout", print_error=False).AndReturn( | 77 gcl.gclient.CaptureSVNInfo("/bleh/prout", print_error=False).AndReturn( |
93 result) | 78 result) |
94 self.mox.ReplayAll() | 79 self.mox.ReplayAll() |
95 self.assertRaises(Exception, gcl.GetRepositoryRoot) | 80 self.assertRaises(Exception, gcl.GetRepositoryRoot) |
96 self.mox.VerifyAll() | |
97 | 81 |
98 def testGetRepositoryRootGood(self): | 82 def testGetRepositoryRootGood(self): |
99 gcl.REPOSITORY_ROOT = None | 83 gcl.REPOSITORY_ROOT = None |
100 root_path = os.path.join('bleh', 'prout', 'pouet') | 84 root_path = gcl.os.path.join('bleh', 'prout', 'pouet') |
101 gcl.os.getcwd().AndReturn(root_path) | 85 gcl.os.getcwd().AndReturn(root_path) |
102 result1 = { "Repository Root": "Some root" } | 86 result1 = { "Repository Root": "Some root" } |
103 gcl.gclient.CaptureSVNInfo(root_path, print_error=False).AndReturn(result1) | 87 gcl.gclient.CaptureSVNInfo(root_path, print_error=False).AndReturn(result1) |
104 gcl.os.getcwd().AndReturn(root_path) | 88 gcl.os.getcwd().AndReturn(root_path) |
105 results2 = { "Repository Root": "A different root" } | 89 results2 = { "Repository Root": "A different root" } |
106 gcl.gclient.CaptureSVNInfo( | 90 gcl.gclient.CaptureSVNInfo( |
107 os.path.dirname(root_path), | 91 gcl.os.path.dirname(root_path), |
108 print_error=False).AndReturn(results2) | 92 print_error=False).AndReturn(results2) |
109 self.mox.ReplayAll() | 93 self.mox.ReplayAll() |
110 self.assertEquals(gcl.GetRepositoryRoot(), root_path) | 94 self.assertEquals(gcl.GetRepositoryRoot(), root_path) |
111 self.mox.VerifyAll() | |
112 | 95 |
113 | 96 |
114 class ChangeInfoUnittest(GclTestsBase): | 97 class ChangeInfoUnittest(GclTestsBase): |
115 def testChangeInfoMembers(self): | 98 def testChangeInfoMembers(self): |
116 members = [ | 99 members = [ |
117 'CloseIssue', 'Delete', 'FileList', 'MissingTests', 'Save', | 100 'CloseIssue', 'Delete', 'FileList', 'MissingTests', 'Save', |
118 'UpdateRietveldDescription', 'description', 'files', 'issue', 'name', | 101 'UpdateRietveldDescription', 'description', 'files', 'issue', 'name', |
119 'patch' | 102 'patch' |
120 ] | 103 ] |
121 # If this test fails, you should add the relevant test. | 104 # If this test fails, you should add the relevant test. |
122 self.compareMembers(gcl.ChangeInfo(), members) | 105 self.compareMembers(gcl.ChangeInfo(), members) |
123 | 106 |
124 def testChangeInfoBase(self): | 107 def testChangeInfoBase(self): |
125 files = [('M', 'foo'), ('A', 'bar')] | 108 files = [('M', 'foo'), ('A', 'bar')] |
126 o = gcl.ChangeInfo('name2', 'issue2', 'description2', files) | 109 o = gcl.ChangeInfo('name2', 'issue2', 'description2', files) |
127 self.assertEquals(o.name, 'name2') | 110 self.assertEquals(o.name, 'name2') |
128 self.assertEquals(o.issue, 'issue2') | 111 self.assertEquals(o.issue, 'issue2') |
129 self.assertEquals(o.description, 'description2') | 112 self.assertEquals(o.description, 'description2') |
130 self.assertEquals(o.files, files) | 113 self.assertEquals(o.files, files) |
131 self.assertEquals(o.patch, None) | 114 self.assertEquals(o.patch, None) |
132 self.assertEquals(o.FileList(), ['foo', 'bar']) | 115 self.assertEquals(o.FileList(), ['foo', 'bar']) |
133 | 116 |
134 | 117 |
135 class UploadCLUnittest(GclTestsBase): | 118 class UploadCLUnittest(GclTestsBase): |
136 def setUp(self): | 119 def setUp(self): |
137 GclTestsBase.setUp(self) | 120 GclTestsBase.setUp(self) |
138 self._os_chdir = gcl.os.chdir | 121 self.mox.StubOutWithMock(gcl.os, 'chdir') |
139 gcl.os.chdir = self.mox.CreateMockAnything() | 122 self.mox.StubOutWithMock(gcl.os, 'close') |
140 self._os_close = gcl.os.close | 123 self.mox.StubOutWithMock(gcl.os, 'remove') |
141 gcl.os.close = self.mox.CreateMockAnything() | 124 self.mox.StubOutWithMock(gcl.os, 'write') |
142 self._os_remove = gcl.os.remove | 125 self.mox.StubOutWithMock(gcl, 'tempfile') |
143 gcl.os.remove = self.mox.CreateMockAnything() | 126 self.mox.StubOutWithMock(gcl.upload, 'RealMain') |
144 self._os_write = gcl.os.write | 127 self.mox.StubOutWithMock(gcl, 'DoPresubmitChecks') |
145 gcl.os.write = self.mox.CreateMockAnything() | 128 self.mox.StubOutWithMock(gcl, 'GenerateDiff') |
146 self._tempfile = gcl.tempfile | 129 self.mox.StubOutWithMock(gcl, 'GetCodeReviewSetting') |
147 gcl.tempfile = self.mox.CreateMockAnything() | 130 self.mox.StubOutWithMock(gcl, 'GetRepositoryRoot') |
148 self._upload_RealMain = gcl.upload.RealMain | 131 self.mox.StubOutWithMock(gcl, 'SendToRietveld') |
149 gcl.upload.RealMain = self.mox.CreateMockAnything() | 132 self.mox.StubOutWithMock(gcl, 'TryChange') |
150 self._DoPresubmitChecks = gcl.DoPresubmitChecks | |
151 gcl.DoPresubmitChecks = self.mox.CreateMockAnything() | |
152 self._GenerateDiff = gcl.GenerateDiff | |
153 gcl.GenerateDiff = self.mox.CreateMockAnything() | |
154 self._GetCodeReviewSetting = gcl.GetCodeReviewSetting | |
155 gcl.GetCodeReviewSetting = self.mox.CreateMockAnything() | |
156 self._GetRepositoryRoot = gcl.GetRepositoryRoot | |
157 gcl.GetRepositoryRoot = self.mox.CreateMockAnything() | |
158 self._SendToRietveld = gcl.SendToRietveld | |
159 gcl.SendToRietveld = self.mox.CreateMockAnything() | |
160 self._TryChange = gcl.TryChange | |
161 gcl.TryChange = self.mox.CreateMockAnything() | |
162 | |
163 def tearDown(self): | |
164 GclTestsBase.tearDown(self) | |
165 gcl.os.chdir = self._os_chdir | |
166 gcl.os.close = self._os_close | |
167 gcl.os.remove = self._os_remove | |
168 gcl.os.write = self._os_write | |
169 gcl.tempfile = self._tempfile | |
170 gcl.upload.RealMain = self._upload_RealMain | |
171 gcl.DoPresubmitChecks = self._DoPresubmitChecks | |
172 gcl.GenerateDiff = self._GenerateDiff | |
173 gcl.GetCodeReviewSetting = self._GetCodeReviewSetting | |
174 gcl.GetRepositoryRoot = self._GetRepositoryRoot | |
175 gcl.SendToRietveld = self._SendToRietveld | |
176 gcl.TryChange = self._TryChange | |
177 | 133 |
178 def testNew(self): | 134 def testNew(self): |
179 change_info = gcl.ChangeInfo('naame', 'iissue', 'deescription', | 135 change_info = gcl.ChangeInfo('naame', 'iissue', 'deescription', |
180 ['aa', 'bb']) | 136 ['aa', 'bb']) |
181 change_info.Save = self.mox.CreateMockAnything() | 137 change_info.Save = self.mox.CreateMockAnything() |
182 args = ['--foo=bar'] | 138 args = ['--foo=bar'] |
183 change_info.Save() | 139 change_info.Save() |
184 gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True) | 140 gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True) |
185 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') | 141 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') |
186 gcl.os.getcwd().AndReturn('somewhere') | 142 gcl.os.getcwd().AndReturn('somewhere') |
187 gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None)) | 143 gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None)) |
188 gcl.GenerateDiff(change_info.FileList()) | 144 gcl.GenerateDiff(change_info.FileList()) |
189 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--foo=bar', | 145 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--foo=bar', |
190 "--message=''", '--issue=iissue'], change_info.patch).AndReturn(("1", | 146 "--message=''", '--issue=iissue'], change_info.patch).AndReturn(("1", |
191 "2")) | 147 "2")) |
192 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) | 148 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) |
193 gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') | 149 gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') |
194 gcl.TryChange(change_info, | 150 gcl.TryChange(change_info, |
195 ['--issue', '1', '--patchset', '2'], | 151 ['--issue', '1', '--patchset', '2'], |
196 swallow_exception=True) | 152 swallow_exception=True) |
197 gcl.os.chdir('somewhere') | 153 gcl.os.chdir('somewhere') |
198 self.mox.ReplayAll() | 154 self.mox.ReplayAll() |
199 gcl.UploadCL(change_info, args) | 155 gcl.UploadCL(change_info, args) |
200 self.mox.VerifyAll() | |
201 | 156 |
202 def testServerOverride(self): | 157 def testServerOverride(self): |
203 change_info = gcl.ChangeInfo('naame', '', 'deescription', | 158 change_info = gcl.ChangeInfo('naame', '', 'deescription', |
204 ['aa', 'bb']) | 159 ['aa', 'bb']) |
205 change_info.Save = self.mox.CreateMockAnything() | 160 change_info.Save = self.mox.CreateMockAnything() |
206 args = ['--server=a'] | 161 args = ['--server=a'] |
207 change_info.Save() | 162 change_info.Save() |
208 gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True) | 163 gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True) |
209 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') | 164 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') |
210 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) | 165 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) |
211 gcl.os.write(42, change_info.description) | 166 gcl.os.write(42, change_info.description) |
212 gcl.os.close(42) | 167 gcl.os.close(42) |
213 gcl.GetCodeReviewSetting('CC_LIST') | 168 gcl.GetCodeReviewSetting('CC_LIST') |
214 gcl.os.getcwd().AndReturn('somewhere') | 169 gcl.os.getcwd().AndReturn('somewhere') |
215 gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None)) | 170 gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None)) |
216 gcl.GenerateDiff(change_info.FileList()) | 171 gcl.GenerateDiff(change_info.FileList()) |
217 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--server=a', | 172 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--server=a', |
218 "--description_file=descfile", | 173 "--description_file=descfile", |
219 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) | 174 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) |
220 gcl.os.remove('descfile') | 175 gcl.os.remove('descfile') |
221 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) | 176 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) |
222 #gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') | |
223 #gcl.TryChange(change_info, | |
224 # ['--issue', '1', '--patchset', '2'], | |
225 # swallow_exception=True) | |
226 gcl.os.chdir('somewhere') | 177 gcl.os.chdir('somewhere') |
227 self.mox.ReplayAll() | 178 self.mox.ReplayAll() |
228 gcl.UploadCL(change_info, args) | 179 gcl.UploadCL(change_info, args) |
229 self.mox.VerifyAll() | |
230 | 180 |
231 def testNoTry(self): | 181 def testNoTry(self): |
232 change_info = gcl.ChangeInfo('naame', '', 'deescription', | 182 change_info = gcl.ChangeInfo('naame', '', 'deescription', |
233 ['aa', 'bb']) | 183 ['aa', 'bb']) |
234 change_info.Save = self.mox.CreateMockAnything() | 184 change_info.Save = self.mox.CreateMockAnything() |
235 args = ['--no-try'] | 185 args = ['--no-try'] |
236 change_info.Save() | 186 change_info.Save() |
237 gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True) | 187 gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True) |
238 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') | 188 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') |
239 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) | 189 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) |
240 gcl.os.write(42, change_info.description) | 190 gcl.os.write(42, change_info.description) |
241 gcl.os.close(42) | 191 gcl.os.close(42) |
242 gcl.GetCodeReviewSetting('CC_LIST') | 192 gcl.GetCodeReviewSetting('CC_LIST') |
243 gcl.os.getcwd().AndReturn('somewhere') | 193 gcl.os.getcwd().AndReturn('somewhere') |
244 gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None)) | 194 gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None)) |
245 gcl.GenerateDiff(change_info.FileList()) | 195 gcl.GenerateDiff(change_info.FileList()) |
246 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', | 196 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', |
247 "--description_file=descfile", | 197 "--description_file=descfile", |
248 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) | 198 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) |
249 gcl.os.remove('descfile') | 199 gcl.os.remove('descfile') |
250 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) | 200 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) |
251 gcl.os.chdir('somewhere') | 201 gcl.os.chdir('somewhere') |
252 self.mox.ReplayAll() | 202 self.mox.ReplayAll() |
253 gcl.UploadCL(change_info, args) | 203 gcl.UploadCL(change_info, args) |
254 self.mox.VerifyAll() | |
255 | 204 |
256 def testNormal(self): | 205 def testNormal(self): |
257 change_info = gcl.ChangeInfo('naame', '', 'deescription', | 206 change_info = gcl.ChangeInfo('naame', '', 'deescription', |
258 ['aa', 'bb']) | 207 ['aa', 'bb']) |
259 change_info.Save = self.mox.CreateMockAnything() | 208 self.mox.StubOutWithMock(change_info, 'Save') |
260 args = [] | 209 args = [] |
261 change_info.Save() | 210 change_info.Save() |
262 gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True) | 211 gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True) |
263 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') | 212 gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server') |
264 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) | 213 gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile')) |
265 gcl.os.write(42, change_info.description) | 214 gcl.os.write(42, change_info.description) |
266 gcl.os.close(42) | 215 gcl.os.close(42) |
267 gcl.GetCodeReviewSetting('CC_LIST') | 216 gcl.GetCodeReviewSetting('CC_LIST') |
268 gcl.os.getcwd().AndReturn('somewhere') | 217 gcl.os.getcwd().AndReturn('somewhere') |
269 gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None)) | 218 gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None)) |
270 gcl.GenerateDiff(change_info.FileList()) | 219 gcl.GenerateDiff(change_info.FileList()) |
271 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', | 220 gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', |
272 "--description_file=descfile", | 221 "--description_file=descfile", |
273 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) | 222 "--message=deescription"], change_info.patch).AndReturn(("1", "2")) |
274 gcl.os.remove('descfile') | 223 gcl.os.remove('descfile') |
275 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) | 224 gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5) |
276 gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') | 225 gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True') |
277 gcl.TryChange(change_info, | 226 gcl.TryChange(change_info, |
278 ['--issue', '1', '--patchset', '2'], | 227 ['--issue', '1', '--patchset', '2'], |
279 swallow_exception=True) | 228 swallow_exception=True) |
280 gcl.os.chdir('somewhere') | 229 gcl.os.chdir('somewhere') |
281 self.mox.ReplayAll() | 230 self.mox.ReplayAll() |
282 gcl.UploadCL(change_info, args) | 231 gcl.UploadCL(change_info, args) |
283 self.mox.VerifyAll() | |
284 | 232 |
285 | 233 |
286 if __name__ == '__main__': | 234 if __name__ == '__main__': |
287 unittest.main() | 235 unittest.main() |
OLD | NEW |