| | 202 | class GetAllScriptsTest(TestCase): |
| | 203 | """ |
| | 204 | Tests for L{dist.getAllScripts} which lists all the scripts that should be |
| | 205 | included in a complete distribution of Twisted, with its subprojects. |
| | 206 | """ |
| | 207 | |
| | 208 | # getAllScripts relies on a list in twisted.python.dist.twisted_subprojects |
| | 209 | # to tell it what subprojects might have scripts it needs to get. It |
| | 210 | # searches recursively in bin/, at the root of the Twisted distribution. |
| | 211 | # Thus testing it relies on manipulating the contents of that list and |
| | 212 | # directory. |
| | 213 | |
| | 214 | def setUp(self): |
| | 215 | # A mock up of Twisted's root directory. |
| | 216 | basedir = self.mktemp() |
| | 217 | os.mkdir(basedir) |
| | 218 | os.mkdir(os.path.join(basedir, 'bin')) |
| | 219 | # The temporary directories will be deleted by Trial. |
| | 220 | |
| | 221 | # getAllScripts uses a hardcoded relative path. |
| | 222 | oldCWD = os.getcwd() |
| | 223 | os.chdir(basedir) |
| | 224 | self.addCleanup(os.chdir, oldCWD) |
| | 225 | |
| | 226 | def test_getsCorrectScripts(self): |
| | 227 | """ |
| | 228 | L{getAllScripts} lists exactly the scripts in Twisted and its |
| | 229 | subprojects that should be included in a distribution. It may encounter |
| | 230 | additional scripts, files, or directories, but it will not list them |
| | 231 | unless unless they are part of a Twisted subproject (see |
| | 232 | twisted.dist.twisted_subprojects). |
| | 233 | """ |
| | 234 | import os |
| | 235 | from twisted.python import dist |
| | 236 | |
| | 237 | # Mock up getScripts to record its interactions with getAllScripts. The |
| | 238 | # real getScripts is tested separately. |
| | 239 | directoriesQueried = list() |
| | 240 | scriptsGiven = list() |
| | 241 | def mock_getScripts(projname, basedir=''): |
| | 242 | directoriesQueried.append(projname) |
| | 243 | scripts = ["dummyScript", "dummyScript2"] |
| | 244 | scriptsGiven.extend(scripts) |
| | 245 | return scripts |
| | 246 | self.patch(dist, "getScripts", mock_getScripts) |
| | 247 | |
| | 248 | # Create some dummy subprojects for getAllScripts to look at. |
| | 249 | dummySubprojects = ["random", "subproject", "names", "kitty_kat"] |
| | 250 | # Also create some more directories that look like subprojects but |
| | 251 | # aren't listed as subprojects. getAllScripts should ignore them. |
| | 252 | redHerringDirectories = ["some", "directories", "meow"] |
| | 253 | # Also create some files that match the names of subprojects. |
| | 254 | # getAllScripts should ignore these as well. |
| | 255 | redHerringFiles = ["a", "few", "files"] |
| | 256 | # Just for kicks: files that do NOT match the name of a subproject. |
| | 257 | completelyUnrelatedFiles = ["unrelated", "file"] |
| | 258 | |
| | 259 | self.patch(dist, |
| | 260 | "twisted_subprojects", |
| | 261 | dummySubprojects + redHerringFiles) |
| | 262 | |
| | 263 | for name in dummySubprojects + redHerringDirectories: |
| | 264 | os.mkdir(os.path.join("bin", name)) |
| | 265 | for name in redHerringFiles + completelyUnrelatedFiles: |
| | 266 | open(name, "w").close() |
| | 267 | # These are in Trial's temp directory, so we don't have to worry about |
| | 268 | # deleting them. |
| | 269 | |
| | 270 | scriptsReturned = dist.getAllScripts() |
| | 271 | |
| | 272 | # Check that getAllScripts called getScripts on the right directories. |
| | 273 | self.assertEqual(Counter(directoriesQueried), |
| | 274 | Counter(dummySubprojects + [''])) |
| | 275 | # Check that getAllScripts aggregated the scripts correctly. |
| | 276 | self.assertEqual(Counter(scriptsReturned), |
| | 277 | Counter(scriptsGiven)) |
| | 278 | # For both lists: order doesn't matter, but multiplicity does. |
| | 279 | |