diff options
author | jquast <contact@jeffquast.com> | 2014-06-07 20:35:05 -0700 |
---|---|---|
committer | jquast <contact@jeffquast.com> | 2014-06-07 20:35:05 -0700 |
commit | cb7cbd21186e67815fb487277b6f0ac479f74d44 (patch) | |
tree | 9eb12ce9f8eba3fdb9e1299463b135eb7214dd12 | |
parent | 0ea3c658cd1ca16a08e8e07d685f5b10c4002366 (diff) | |
download | pexpect-cb7cbd21186e67815fb487277b6f0ac479f74d44.tar.gz |
Expand on tests/test_which.py
Mainly, regarding os.defpath, os.environ['PATH'],
absolute, relative, and symlinks.
-rw-r--r-- | tests/test_which.py | 174 |
1 files changed, 141 insertions, 33 deletions
diff --git a/tests/test_which.py b/tests/test_which.py index 959816e..83575fb 100644 --- a/tests/test_which.py +++ b/tests/test_which.py @@ -5,30 +5,57 @@ import pexpect from . import PexpectTestCase -class TestCaseMisc(PexpectTestCase.PexpectTestCase): +class TestCaseWhich(PexpectTestCase.PexpectTestCase): + " Tests for pexpect.which(). " - def test_basic_which(self): - # should find at least 'ls' program, and it should begin with '/' + def test_which_finds_ls(self): + " which() can find ls(1). " exercise = pexpect.which("ls") - assert exercise is not None and exercise.startswith('/') - - def test_which(self): - p = os.defpath - ep = os.environ['PATH'] - os.defpath = ":/tmp" - os.environ['PATH'] = ":/tmp" - wp = pexpect.which("ticker.py") - assert wp == 'ticker.py' - os.defpath = "/tmp" - os.environ['PATH'] = "/tmp" - wp = pexpect.which("ticker.py") - assert wp is None - os.defpath = p - os.environ['PATH'] = ep - - def test_absolute_which(self): - # make up a path and insert first a non-executable, - # then, make it executable, and assert we may which() find it. + assert exercise is not None + assert exercise.startswith('/') + + def test_os_defpath_which(self): + " which() finds an executable in $PATH and returns its abspath. " + fname = 'cc' + bin_dir = tempfile.mkdtemp() + bin_path = os.path.join(bin_dir, fname) + save_path = os.environ['PATH'] + save_defpath = os.defpath + + try: + # setup + os.environ['PATH'] = '' + os.defpath = bin_dir + with open(bin_path, 'w') as fp: + pass + + # given non-executable, + os.chmod(bin_path, 0o400) + + # exercise absolute and relative, + assert pexpect.which(bin_path) is None + assert pexpect.which(fname) is None + + # given executable, + os.chmod(bin_path, 0o700) + + # exercise absolute and relative, + assert pexpect.which(bin_path) == bin_path + assert pexpect.which(fname) == bin_path + + finally: + # restore, + os.environ['PATH'] = save_path + os.defpath = save_defpath + + # destroy scratch files and folders, + if os.path.exists(bin_path): + os.unlink(bin_path) + if os.path.exists(bin_dir): + os.rmdir(bin_dir) + + def test_path_search_which(self): + " which() finds an executable in $PATH and returns its abspath. " fname = 'gcc' bin_dir = tempfile.mkdtemp() bin_path = os.path.join(bin_dir, fname) @@ -37,29 +64,72 @@ class TestCaseMisc(PexpectTestCase.PexpectTestCase): # setup os.environ['PATH'] = bin_dir with open(bin_path, 'w') as fp: - fp.write('#!/bin/sh\necho hello, world\n') + pass + + # given non-executable, os.chmod(bin_path, 0o400) - # it should not be found because it is not executable - assert pexpect.which(fname) is None, fname + # exercise absolute and relative, + assert pexpect.which(bin_path) is None + assert pexpect.which(fname) is None - # but now it should -- because it is executable + # given executable, os.chmod(bin_path, 0o700) - assert pexpect.which(fname) == bin_path, (fname, bin_path) + + # exercise absolute and relative, + assert pexpect.which(bin_path) == bin_path + assert pexpect.which(fname) == bin_path finally: # restore, os.environ['PATH'] = save_path + # destroy scratch files and folders, if os.path.exists(bin_path): os.unlink(bin_path) if os.path.exists(bin_dir): os.rmdir(bin_dir) + def test_which_follows_symlink(self): + " which() follows symlinks and returns its path. " + fname = 'original' + symname = 'extra-crispy' + bin_dir = tempfile.mkdtemp() + bin_path = os.path.join(bin_dir, fname) + sym_path = os.path.join(bin_dir, symname) + save_path = os.environ['PATH'] + try: + # setup + os.environ['PATH'] = bin_dir + with open(bin_path, 'w') as fp: + pass + os.chmod(bin_path, 0o400) + os.symlink(bin_path, sym_path) + + # should not be found because symlink points to non-executable + assert pexpect.which(symname) is None + + # but now it should -- because it is executable + os.chmod(bin_path, 0o700) + assert pexpect.which(symname) == sym_path + + finally: + # restore, + os.environ['PATH'] = save_path + + # destroy scratch files, symlinks, and folders, + if os.path.exists(sym_path): + os.unlink(sym_path) + if os.path.exists(bin_path): + os.unlink(bin_path) + if os.path.exists(bin_dir): + os.rmdir(bin_dir) + def test_which_should_not_match_folders(self): - # make up a path and insert a folder, which is 'executable', which - # a naive implementation might match (previously pexpect versions - # 3.2 and sh versions 1.0.8, reported by @lcm337.) + " Which does not match folders, even though they are executable. " + # make up a path and insert a folder that is 'executable', a naive + # implementation might match (previously pexpect versions 3.2 and + # sh versions 1.0.8, reported by @lcm337.) fname = 'g++' bin_dir = tempfile.mkdtemp() bin_dir2 = os.path.join(bin_dir, fname) @@ -67,11 +137,11 @@ class TestCaseMisc(PexpectTestCase.PexpectTestCase): try: os.environ['PATH'] = bin_dir os.mkdir(bin_dir2, 0o755) - # it should not be found because it is not executable *file*, + # should not be found because it is not executable *file*, # but rather, has the executable bit set, as a good folder - # should -- it shouldn't be returned because it fails isdir() + # should -- it should not be returned because it fails isdir() exercise = pexpect.which(fname) - assert exercise is None, exercise + assert exercise is None finally: # restore, @@ -80,3 +150,41 @@ class TestCaseMisc(PexpectTestCase.PexpectTestCase): for _dir in (bin_dir2, bin_dir,): if os.path.exists(_dir): os.rmdir(_dir) + + def test_which_should_match_other_group_user(self): + " which() returns executables by other, group, and user ownership. " + # create an executable and test that it is found using which() for + # each of the 'other', 'group', and 'user' permission bits. + fname = 'g77' + bin_dir = tempfile.mkdtemp() + bin_path = os.path.join(bin_dir, fname) + save_path = os.environ['PATH'] + try: + # setup + os.environ['PATH'] = bin_dir + with open(bin_path, 'w') as fp: + fp.write('#!/bin/sh\necho hello, world\n') + for should_match, mode in ((False, 0o000), + (True, 0o005), + (True, 0o050), + (True, 0o500), + (False, 0o004), + (False, 0o040), + (False, 0o400)): + os.chmod(bin_path, mode) + + if not should_match: + # should not be found because it is not executable + assert pexpect.which(fname) is None + else: + # should match full path + assert pexpect.which(fname) == bin_path + + finally: + # restore, + os.environ['PATH'] = save_path + # destroy scratch files and folders, + if os.path.exists(bin_path): + os.unlink(bin_path) + if os.path.exists(bin_dir): + os.rmdir(bin_dir) |