Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #!/usr/bin/python | |
| 2 # | |
| 3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | |
| 4 # Use of this source code is governed by a BSD-style license that can be | |
| 5 # found in the LICENSE file. | |
| 6 | |
| 7 """Unit tests for chromite.py.""" | |
| 8 | |
| 9 import doctest | |
| 10 import os | |
| 11 import re | |
| 12 import unittest | |
| 13 | |
| 14 import chromite | |
| 15 from lib import text_menu | |
| 16 import mox | |
| 17 | |
| 18 | |
| 19 class _DeathException(Exception): | |
| 20 """A bogus exception used by the mock out of Die.""" | |
| 21 pass | |
| 22 | |
| 23 | |
| 24 class TestFindCommand(unittest.TestCase): | |
| 25 """Test chromite._FindCommand.""" | |
| 26 | |
| 27 def setUp(self): | |
| 28 """Test initialization.""" | |
| 29 # Create our mox and stub out function calls used by _FindCommand()... | |
| 30 self.mox = mox.Mox() | |
| 31 self.mox.StubOutWithMock(chromite, 'Die') | |
| 32 self.mox.StubOutWithMock(chromite, 'Info') | |
| 33 self.mox.StubOutWithMock(text_menu, 'TextMenu') | |
| 34 | |
| 35 def tearDown(self): | |
| 36 """Test cleanup.""" | |
| 37 # Unset stubs... | |
| 38 self.mox.UnsetStubs() | |
| 39 | |
| 40 def testInvalidCommand(self): | |
| 41 """Test that _FindCommand('implode') causes Die().""" | |
| 42 # Should be a call to Die. We'll have it fake a _DeathException... | |
| 43 chromite.Die(mox.IsA(basestring)).AndRaise(_DeathException) | |
| 44 | |
| 45 # Run the command and verify proper mocks were called... | |
| 46 self.mox.ReplayAll() | |
| 47 self.assertRaises(_DeathException, chromite._FindCommand, 'implode') | |
| 48 self.mox.VerifyAll() | |
| 49 | |
| 50 def testBlankCommandWithQuit(self): | |
| 51 """Test that _FindCommand('') shows menu, mocking quit. | |
| 52 | |
| 53 This tests the case that the user quit out of the menu without choosing | |
| 54 anything. | |
| 55 """ | |
| 56 # Should be one call to TextMenu, which will return None for quit. | |
| 57 text_menu.TextMenu(mox.IsA(list), | |
| 58 mox.IsA(basestring), | |
| 59 menu_width=0).AndReturn(None) | |
| 60 | |
| 61 # Run the command and verify proper mocks were called... | |
| 62 self.mox.ReplayAll() | |
| 63 cmd_str = chromite._FindCommand('') | |
| 64 self.mox.VerifyAll() | |
| 65 | |
| 66 self.assertEquals(cmd_str, None, | |
| 67 '_FindCommand should have returned None from TextMenu') | |
| 68 | |
| 69 def testBlankCommandWithChoice0(self): | |
| 70 """Test that _FindCommand('') shows menu, mocking choice 0. | |
| 71 | |
| 72 This tests the case that the user chose choice 0 for the menu. | |
| 73 """ | |
| 74 # Should be one call to TextMenu, which will return item 0. | |
| 75 text_menu.TextMenu(mox.IsA(list), | |
| 76 mox.IsA(basestring), | |
| 77 menu_width=0).AndReturn(0) | |
| 78 | |
| 79 # Run the command and verify proper mocks were called... | |
| 80 self.mox.ReplayAll() | |
| 81 cmd_str = chromite._FindCommand('') | |
| 82 self.mox.VerifyAll() | |
| 83 | |
| 84 self.assertTrue(isinstance(cmd_str, basestring), | |
| 85 '_FindCommand should return a string') | |
| 86 self.assertTrue(bool(cmd_str), | |
| 87 '_FindCommand should not return a blank string') | |
| 88 | |
| 89 def _TestExactCommand(self, cmd_to_find): | |
| 90 """Helper for tests that try to find an exact match. | |
| 91 | |
| 92 Args: | |
| 93 cmd_to_find: The name of the command to find, like 'Build', ... | |
| 94 """ | |
| 95 # Expect no mocks to be called... | |
| 96 | |
| 97 # Run the command and verify proper mocks were called... | |
| 98 self.mox.ReplayAll() | |
| 99 cmd_str = chromite._FindCommand(cmd_to_find) | |
| 100 self.mox.VerifyAll() | |
| 101 | |
| 102 self.assertEqual(cmd_str, cmd_to_find.lower(), | |
| 103 '_FindCommand("%s") should return "%s" back.' % | |
| 104 (cmd_to_find, cmd_to_find.lower())) | |
| 105 | |
| 106 def testCaseSensitiveBuild(self): | |
| 107 """Test that _FindCommand('build') returns 'build'. | |
| 108 | |
| 109 The command matching should be case sensitive. | |
| 110 """ | |
| 111 self._TestExactCommand('build') | |
| 112 | |
| 113 def testCaseInsensitiveBuild(self): | |
|
sosa
2011/01/11 04:44:22
Up to you but you may want to mock out the "known"
diandersAtChromium
2011/01/12 00:04:45
Added TODO for this.
On 2011/01/11 04:44:22, sosa
| |
| 114 """Test that _FindCommand('BUiLD') returns 'build'. | |
| 115 | |
| 116 The command matching should be case insensitive. | |
| 117 """ | |
| 118 self._TestExactCommand('BUiLD') | |
| 119 | |
| 120 def testShCommand(self): | |
| 121 """Test that _FindCommand('sh') returns 'shell'. | |
| 122 | |
| 123 This serves two purposes: | |
| 124 1. Test the 'prefix' feature of _FindCommand | |
| 125 2. Validate that nobody has introduced another command that starts with | |
| 126 'sh', since it's expected that many people will use this to invoke the | |
| 127 shell. | |
| 128 """ | |
| 129 # _FindCommand should give us a message that it has interpreted sh as shell. | |
| 130 chromite.Info(mox.IsA(basestring)) | |
| 131 | |
| 132 # Run the command and verify proper mocks were called... | |
| 133 self.mox.ReplayAll() | |
| 134 cmd_str = chromite._FindCommand('sh') | |
| 135 self.mox.VerifyAll() | |
| 136 | |
| 137 self.assertEqual(cmd_str, 'shell', | |
| 138 '_FindCommand("sh") should return "shell" back.') | |
| 139 | |
| 140 | |
| 141 class TestFindSpec(unittest.TestCase): | |
| 142 """Test chromite._FindSpec.""" | |
| 143 | |
| 144 def setUp(self): | |
| 145 """Test initialization.""" | |
| 146 # Create our mox and stub out function calls used by _FindSpec()... | |
|
sosa
2011/01/11 04:44:22
It almost seems for the setup and teardown's you s
diandersAtChromium
2011/01/12 00:04:45
Not going to in this case, though I can see your p
| |
| 147 self.mox = mox.Mox() | |
| 148 self.mox.StubOutWithMock(os, 'listdir') | |
| 149 self.mox.StubOutWithMock(os.path, 'isfile') | |
| 150 self.mox.StubOutWithMock(chromite, 'Die') | |
| 151 self.mox.StubOutWithMock(chromite, 'Info') | |
| 152 self.mox.StubOutWithMock(text_menu, 'TextMenu') | |
| 153 | |
| 154 def tearDown(self): | |
| 155 """Test cleanup.""" | |
| 156 # Unset stubs... | |
| 157 self.mox.UnsetStubs() | |
| 158 | |
| 159 def testInvalidSpec(self): | |
| 160 """Test that _FindSpec('bogusSpec') causes Die().""" | |
| 161 # Pass this spec name... | |
| 162 spec_name = 'bogusSpec' | |
| 163 | |
| 164 # We'll tell mox to say that these specs exist... | |
| 165 dir_list = ['x87-toadstool.spec', 'x87-luigi.SPeC', 'x88-princess.spec', | |
| 166 '_default'] | |
| 167 | |
| 168 # This spec doesn't represent any full path. | |
| 169 os.path.isfile(spec_name).AndReturn(False) | |
| 170 | |
| 171 # This spec isn't found in our search path. | |
| 172 os.path.isfile(mox.Regex('^/.*%s.spec$' % spec_name)).MultipleTimes( | |
| 173 ).AndReturn(False) | |
| 174 | |
| 175 # Give the fake directory listing... | |
| 176 os.listdir(mox.IsA(basestring)).MultipleTimes().AndReturn(dir_list) | |
| 177 | |
| 178 # Should be a call to Die. We'll have it fake a _DeathException... | |
| 179 chromite.Die(mox.IsA(basestring)).AndRaise(_DeathException) | |
| 180 | |
| 181 # Run the command and verify proper mocks were called... | |
| 182 self.mox.ReplayAll() | |
| 183 self.assertRaises(_DeathException, chromite._FindSpec, 'bogusSpec') | |
| 184 self.mox.VerifyAll() | |
| 185 | |
| 186 def testFullPath(self): | |
| 187 """Test that _FindSpec(full_path) returns full_path. | |
| 188 | |
| 189 _FindSpec is defined so that if you pass a full file path to it, it | |
| 190 should just return that. It doesn't need to have any special suffix or | |
| 191 live in a spec folder. | |
| 192 """ | |
| 193 # Pass this spec name... | |
| 194 spec_name = __file__ | |
| 195 | |
| 196 # Just say that this is a full path... | |
| 197 os.path.isfile(spec_name).AndReturn(True) | |
| 198 | |
| 199 # Run the command and verify proper mocks were called... | |
| 200 self.mox.ReplayAll() | |
| 201 path = chromite._FindSpec(spec_name) | |
| 202 self.mox.VerifyAll() | |
| 203 | |
| 204 self.assertEqual(path, spec_name, | |
| 205 '_FindSpec() should just return param if full path.') | |
| 206 | |
| 207 def testExactSpecName(self): | |
| 208 """Test that _FindSpec(exact_spec_name) returns the path for the spec.""" | |
| 209 # We'll search for this bogus spec; we'll use mox to pretend it exists in | |
| 210 # the search path. | |
| 211 spec_name = 'y87-luigi' | |
| 212 | |
| 213 # This spec doesn't represent any full path | |
| 214 os.path.isfile(spec_name).AndReturn(False) | |
| 215 | |
| 216 # When we look through the search path for this spec (with .spec at | |
| 217 # the end), we will consider the spec to be found. | |
| 218 os.path.isfile(mox.Regex('^/.*%s.spec$' % spec_name)).AndReturn(True) | |
| 219 | |
| 220 # Run the command and verify proper mocks were called... | |
| 221 self.mox.ReplayAll() | |
| 222 spec_path = chromite._FindSpec(spec_name) | |
| 223 self.mox.VerifyAll() | |
| 224 | |
| 225 self.assertTrue(re.search('^/.*%s.spec$' % spec_name, spec_path), | |
| 226 '_FindSpec() should have returned absolute path for spec.') | |
| 227 | |
| 228 def testUniqueSpecName(self): | |
| 229 """Test that _FindSpec(unique_part_name) returns the path for the spec.""" | |
| 230 # We'll search for this spec. Weird capitalization on purpose to test | |
| 231 # case sensitiveness. | |
| 232 spec_name = 'ToaDSTooL' | |
| 233 | |
| 234 # We'll tell mox to say that these specs exist in the first directory... | |
| 235 dir_list = ['_default', | |
| 236 'x87-luigi.spec', 'x87-toadstool.SPeC', 'x88-princess.spec'] | |
| 237 | |
| 238 # We expect it to find this spec. | |
| 239 expected_result = 'x87-toadstool.SPeC' | |
| 240 | |
| 241 # Self-checks for test code... | |
| 242 assert dir_list == sorted(dir_list) | |
| 243 | |
| 244 # This spec doesn't represent any full path. | |
| 245 os.path.isfile(spec_name).AndReturn(False) | |
| 246 | |
| 247 # This spec isn't found in our search path. | |
| 248 os.path.isfile(mox.Regex('^/.*%s.spec$' % spec_name)).MultipleTimes( | |
| 249 ).AndReturn(False) | |
| 250 | |
| 251 # Return our directory listing. | |
| 252 # TODO(dianders): How to make first mocked call return dir_list and | |
| 253 # subsequent return [] | |
| 254 os.listdir(mox.IsA(basestring)).AndReturn(dir_list) | |
| 255 | |
| 256 # Run the command and verify proper mocks were called... | |
| 257 self.mox.ReplayAll() | |
| 258 spec_path = chromite._FindSpec(spec_name) | |
| 259 self.mox.VerifyAll() | |
| 260 | |
| 261 self.assertTrue(re.search('^/.*%s$' % expected_result, spec_path), | |
| 262 '_FindSpec("%s") incorrectly returned "%s".' % | |
| 263 (spec_name, spec_path)) | |
| 264 | |
| 265 def _TestBlankSpecName(self, menu_return): | |
| 266 """Helper for tests passing a blank spec name. | |
| 267 | |
| 268 Args: | |
| 269 menu_return: This value is returned by TextMenu. Could be none or an | |
| 270 integer index into the dir_list of this function. | |
| 271 """ | |
| 272 # We'll search for this spec. | |
| 273 spec_name = '' | |
| 274 | |
| 275 # We'll tell mox to say that these specs exist in the first directory... | |
| 276 # ...only valid specs to make it easier to compare things. | |
| 277 dir_list = ['x87-luigi.spec', 'x87-toadstool.SPeC', 'x88-princess.spec'] | |
| 278 num_specs = len(dir_list) | |
| 279 | |
| 280 # Self-checks for test code... | |
| 281 assert menu_return < len(dir_list) | |
| 282 assert dir_list == sorted(dir_list) | |
| 283 | |
| 284 # This spec doesn't represent any full path. | |
| 285 os.path.isfile(spec_name).AndReturn(False) | |
| 286 | |
| 287 # Return our directory listing. | |
| 288 # TODO(dianders): How to make first mocked call return dir_list and | |
| 289 # subsequent return [] | |
| 290 os.listdir(mox.IsA(basestring)).AndReturn(dir_list) | |
| 291 | |
| 292 # We expect there to be 1 more item than we passed in, since we account | |
| 293 # for 'HOST'. | |
| 294 check_num_items_fn = lambda items: len(items) == (num_specs + 1) | |
| 295 | |
| 296 # Add 1 to menu_return, since 'HOST' is first... | |
| 297 if menu_return is None: | |
| 298 adjusted_menu_return = menu_return | |
| 299 else: | |
| 300 adjusted_menu_return = menu_return + 1 | |
| 301 | |
| 302 # Should be one call to TextMenu, which will return menu_return. | |
| 303 text_menu.TextMenu(mox.And(mox.IsA(list), mox.Func(check_num_items_fn)), | |
| 304 mox.IsA(basestring)).AndReturn(adjusted_menu_return) | |
| 305 | |
| 306 # Run the command and verify proper mocks were called... | |
| 307 self.mox.ReplayAll() | |
| 308 spec_path = chromite._FindSpec(spec_name) | |
| 309 self.mox.VerifyAll() | |
| 310 | |
| 311 if menu_return is None: | |
| 312 self.assertEquals(spec_path, None, | |
| 313 '_FindSpec should have returned None from TextMenu') | |
| 314 else: | |
| 315 expected_result = dir_list[menu_return] | |
| 316 self.assertTrue(re.search('^/.*%s$' % expected_result, spec_path), | |
| 317 '_FindSpec("%s") incorrectly returned "%s".' % | |
| 318 (spec_name, spec_path)) | |
| 319 | |
| 320 def testBlankSpecNameWithQuit(self): | |
| 321 """Test that _FindSpec('') shows menu, mocking quit.""" | |
| 322 self._TestBlankSpecName(None) | |
| 323 | |
| 324 def testBlankSpecNameWithChoice0(self): | |
| 325 """Test that _FindSpec('') shows menu, mocking choice 0.""" | |
| 326 self._TestBlankSpecName(0) | |
| 327 | |
| 328 def testPartialSpecNameWithChoice0(self): | |
| 329 """Test that _FindSpec(non_unique_str) shows menu, mocking choice 0.""" | |
| 330 # We'll search for this spec. | |
| 331 spec_name = 'x87' | |
| 332 | |
| 333 # We'll tell mox to say that these specs exist in the first directory... | |
| 334 dir_list = ['_default', | |
| 335 'x87-luigi.spec', 'x87-toadstool.SPeC', 'x88-princess.spec'] | |
| 336 | |
| 337 # We expect 2 matches and should get back luigi as choice 0. | |
| 338 num_match = 2 | |
| 339 expected_result = 'x87-luigi.spec' | |
| 340 | |
| 341 # Self-checks for test code... | |
| 342 assert dir_list == sorted(dir_list) | |
| 343 | |
| 344 # This spec doesn't represent any full path. | |
| 345 os.path.isfile(spec_name).AndReturn(False) | |
| 346 | |
| 347 # This spec isn't found in our search path. | |
| 348 os.path.isfile(mox.Regex('^/.*%s.spec$' % spec_name)).MultipleTimes( | |
| 349 ).AndReturn(False) | |
| 350 | |
| 351 # Return our directory listing. | |
| 352 # TODO(dianders): How to make first mocked call return dir_list and | |
| 353 # subsequent return [] | |
| 354 os.listdir(mox.IsA(basestring)).AndReturn(dir_list) | |
| 355 | |
| 356 # Should be one call to TextMenu, which will return 0. | |
| 357 text_menu.TextMenu(mox.And(mox.IsA(list), | |
| 358 mox.Func(lambda items: len(items) == num_match)), | |
| 359 mox.IsA(basestring)).AndReturn(0) | |
| 360 | |
| 361 # Run the command and verify proper mocks were called... | |
| 362 self.mox.ReplayAll() | |
| 363 spec_path = chromite._FindSpec(spec_name) | |
| 364 self.mox.VerifyAll() | |
| 365 | |
| 366 self.assertTrue(re.search('^/.*%s$' % expected_result, spec_path), | |
| 367 '_FindSpec("%s") incorrectly returned "%s".' % | |
| 368 (spec_name, spec_path)) | |
| 369 | |
| 370 | |
| 371 if __name__ == '__main__': | |
| 372 doctest.testmod(chromite) | |
| 373 unittest.main() | |
| 374 | |
| OLD | NEW |