46 lines
1.6 KiB
Python
46 lines
1.6 KiB
Python
from pathed import *
|
|
import os
|
|
import shutil
|
|
import sys
|
|
|
|
class Shell(Pathed):
|
|
"""Base class for command line tests"""
|
|
def execute(self,command,*p,**k):
|
|
"""Return the fd of a command; can get output (stdout/err) and exitcode"""
|
|
# We might be passed a file descriptor for some reason; if so, just return it
|
|
if type(command) is file:
|
|
return command
|
|
# Redirect stderr to stdout
|
|
# This is a bit of a hack, but I've not found a better way
|
|
py_path = os.environ.get('PYTHONPATH', '')
|
|
py_path_list = py_path.split(':')
|
|
py_path_list.append(os.path.abspath('.'))
|
|
os.environ['PYTHONPATH'] = ':'.join(py_path_list)
|
|
fd=os.popen(command+' 2>&1',*p,**k)
|
|
if py_path:
|
|
py_path = os.environ['PYTHONPATH'] = py_path
|
|
else:
|
|
del os.environ['PYTHONPATH']
|
|
return fd
|
|
def output_and_exitcode(self,*p,**k):
|
|
fd=self.execute(*p,**k)
|
|
output = fd.read().strip()
|
|
exitcode = fd.close()
|
|
if k.pop('emit',False):
|
|
print output
|
|
return (output,exitcode)
|
|
def exitcode(self,*p,**k):
|
|
"""Execute a command and return its exit code
|
|
...without printing its output/errors
|
|
"""
|
|
ret = self.output_and_exitcode(*p,**k)
|
|
return ret[1]
|
|
|
|
def assertFailure(self,*p,**k):
|
|
output,exitcode = self.output_and_exitcode(*p,**k)
|
|
assert (exitcode), output
|
|
def assertSuccess(self,*p,**k):
|
|
output,exitcode = self.output_and_exitcode(*p,**k)
|
|
#self.assert_(not exitcode, output)
|
|
assert (not exitcode), output
|