1 | '''
|
---|
2 | Tests for commands module
|
---|
3 | Nick Mathewson
|
---|
4 | '''
|
---|
5 | import unittest
|
---|
6 | import os, tempfile, re
|
---|
7 |
|
---|
8 | from test.test_support import run_unittest, reap_children, import_module, \
|
---|
9 | check_warnings
|
---|
10 |
|
---|
11 | # Silence Py3k warning
|
---|
12 | commands = import_module('commands', deprecated=True)
|
---|
13 |
|
---|
14 | # The module says:
|
---|
15 | # "NB This only works (and is only relevant) for UNIX."
|
---|
16 | #
|
---|
17 | # Actually, getoutput should work on any platform with an os.popen, but
|
---|
18 | # I'll take the comment as given, and skip this suite.
|
---|
19 |
|
---|
20 | if os.name != 'posix':
|
---|
21 | raise unittest.SkipTest('Not posix; skipping test_commands')
|
---|
22 |
|
---|
23 |
|
---|
24 | class CommandTests(unittest.TestCase):
|
---|
25 |
|
---|
26 | def test_getoutput(self):
|
---|
27 | self.assertEqual(commands.getoutput('echo xyzzy'), 'xyzzy')
|
---|
28 | self.assertEqual(commands.getstatusoutput('echo xyzzy'), (0, 'xyzzy'))
|
---|
29 |
|
---|
30 | # we use mkdtemp in the next line to create an empty directory
|
---|
31 | # under our exclusive control; from that, we can invent a pathname
|
---|
32 | # that we _know_ won't exist. This is guaranteed to fail.
|
---|
33 | dir = None
|
---|
34 | try:
|
---|
35 | dir = tempfile.mkdtemp()
|
---|
36 | name = os.path.join(dir, "foo")
|
---|
37 |
|
---|
38 | status, output = commands.getstatusoutput('cat ' + name)
|
---|
39 | self.assertNotEqual(status, 0)
|
---|
40 | finally:
|
---|
41 | if dir is not None:
|
---|
42 | os.rmdir(dir)
|
---|
43 |
|
---|
44 | def test_getstatus(self):
|
---|
45 | # This pattern should match 'ls -ld /.' on any posix
|
---|
46 | # system, however perversely configured. Even on systems
|
---|
47 | # (e.g., Cygwin) where user and group names can have spaces:
|
---|
48 | # drwxr-xr-x 15 Administ Domain U 4096 Aug 12 12:50 /
|
---|
49 | # drwxr-xr-x 15 Joe User My Group 4096 Aug 12 12:50 /
|
---|
50 | # Note that the first case above has a space in the group name
|
---|
51 | # while the second one has a space in both names.
|
---|
52 | # Special attributes supported:
|
---|
53 | # + = has ACLs
|
---|
54 | # @ = has Mac OS X extended attributes
|
---|
55 | # . = has a SELinux security context
|
---|
56 | pat = r'''d......... # It is a directory.
|
---|
57 | [.+@]? # It may have special attributes.
|
---|
58 | \s+\d+ # It has some number of links.
|
---|
59 | [^/]* # Skip user, group, size, and date.
|
---|
60 | /\. # and end with the name of the file.
|
---|
61 | '''
|
---|
62 |
|
---|
63 | with check_warnings((".*commands.getstatus.. is deprecated",
|
---|
64 | DeprecationWarning)):
|
---|
65 | self.assertTrue(re.match(pat, commands.getstatus("/."), re.VERBOSE))
|
---|
66 |
|
---|
67 |
|
---|
68 | def test_main():
|
---|
69 | run_unittest(CommandTests)
|
---|
70 | reap_children()
|
---|
71 |
|
---|
72 |
|
---|
73 | if __name__ == "__main__":
|
---|
74 | test_main()
|
---|