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