1''' 2 Tests for commands module 3 Nick Mathewson 4''' 5import unittest 6import os, tempfile, re 7 8from test.test_support import run_unittest, reap_children, import_module, \ 9 check_warnings 10 11# Silence Py3k warning 12commands = 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 20if os.name != 'posix': 21 raise unittest.SkipTest('Not posix; skipping test_commands') 22 23 24class 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 68def test_main(): 69 run_unittest(CommandTests) 70 reap_children() 71 72 73if __name__ == "__main__": 74 test_main() 75