| ''' | |
| Tests for commands module | |
| Nick Mathewson | |
| ''' | |
| import unittest | |
| import os, tempfile, re | |
| from test.test_support import run_unittest, reap_children, import_module, \ | |
| check_warnings | |
| # Silence Py3k warning | |
| commands = import_module('commands', deprecated=True) | |
| # The module says: | |
| # "NB This only works (and is only relevant) for UNIX." | |
| # | |
| # Actually, getoutput should work on any platform with an os.popen, but | |
| # I'll take the comment as given, and skip this suite. | |
| if os.name != 'posix': | |
| raise unittest.SkipTest('Not posix; skipping test_commands') | |
| class CommandTests(unittest.TestCase): | |
| def test_getoutput(self): | |
| self.assertEqual(commands.getoutput('echo xyzzy'), 'xyzzy') | |
| self.assertEqual(commands.getstatusoutput('echo xyzzy'), (0, 'xyzzy')) | |
| # we use mkdtemp in the next line to create an empty directory | |
| # under our exclusive control; from that, we can invent a pathname | |
| # that we _know_ won't exist. This is guaranteed to fail. | |
| dir = None | |
| try: | |
| dir = tempfile.mkdtemp() | |
| name = os.path.join(dir, "foo") | |
| status, output = commands.getstatusoutput('cat ' + name) | |
| self.assertNotEqual(status, 0) | |
| finally: | |
| if dir is not None: | |
| os.rmdir(dir) | |
| def test_getstatus(self): | |
| # This pattern should match 'ls -ld /.' on any posix | |
| # system, however perversely configured. Even on systems | |
| # (e.g., Cygwin) where user and group names can have spaces: | |
| # drwxr-xr-x 15 Administ Domain U 4096 Aug 12 12:50 / | |
| # drwxr-xr-x 15 Joe User My Group 4096 Aug 12 12:50 / | |
| # Note that the first case above has a space in the group name | |
| # while the second one has a space in both names. | |
| # Special attributes supported: | |
| # + = has ACLs | |
| # @ = has Mac OS X extended attributes | |
| # . = has a SELinux security context | |
| pat = r'''d......... # It is a directory. | |
| [.+@]? # It may have special attributes. | |
| \s+\d+ # It has some number of links. | |
| [^/]* # Skip user, group, size, and date. | |
| /\. # and end with the name of the file. | |
| ''' | |
| with check_warnings((".*commands.getstatus.. is deprecated", | |
| DeprecationWarning)): | |
| self.assertTrue(re.match(pat, commands.getstatus("/."), re.VERBOSE)) | |
| def test_main(): | |
| run_unittest(CommandTests) | |
| reap_children() | |
| if __name__ == "__main__": | |
| test_main() |