summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjquast <contact@jeffquast.com>2014-06-07 20:35:05 -0700
committerjquast <contact@jeffquast.com>2014-06-07 20:35:05 -0700
commitcb7cbd21186e67815fb487277b6f0ac479f74d44 (patch)
tree9eb12ce9f8eba3fdb9e1299463b135eb7214dd12
parent0ea3c658cd1ca16a08e8e07d685f5b10c4002366 (diff)
downloadpexpect-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.py174
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)