| # setup_env.py -- Make sure bin subdir has sane env for testing |
| # Copyright 2007-2013 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| import tempfile |
| |
| from portage import os |
| from portage import shutil |
| from portage.const import PORTAGE_BIN_PATH |
| from portage.const import PORTAGE_PYM_PATH |
| from portage.tests import TestCase |
| from portage.process import spawn |
| |
| bindir = PORTAGE_BIN_PATH |
| basedir = None |
| env = None |
| |
| def binTestsCleanup(): |
| global basedir |
| if basedir is None: |
| return |
| if os.access(basedir, os.W_OK): |
| shutil.rmtree(basedir) |
| basedir = None |
| |
| def binTestsInit(): |
| binTestsCleanup() |
| global basedir, env |
| basedir = tempfile.mkdtemp() |
| env = {} |
| env['EAPI'] = '0' |
| env['D'] = os.path.join(basedir, 'image') |
| env['T'] = os.path.join(basedir, 'temp') |
| env['S'] = os.path.join(basedir, 'workdir') |
| env['PF'] = 'portage-tests-0.09-r1' |
| env['PATH'] = bindir + ':' + os.environ['PATH'] |
| env['PORTAGE_BIN_PATH'] = bindir |
| env['PORTAGE_PYM_PATH'] = PORTAGE_PYM_PATH |
| env['PORTAGE_INST_UID'] = str(os.getuid()) |
| env['PORTAGE_INST_GID'] = str(os.getgid()) |
| env['DESTTREE'] = '/usr' |
| os.mkdir(env['D']) |
| os.mkdir(env['T']) |
| os.mkdir(env['S']) |
| |
| class BinTestCase(TestCase): |
| def init(self): |
| binTestsInit() |
| def cleanup(self): |
| binTestsCleanup() |
| |
| def _exists_in_D(path): |
| # Note: do not use os.path.join() here, we assume D to end in / |
| return os.access(env['D'] + path, os.W_OK) |
| def exists_in_D(path): |
| if not _exists_in_D(path): |
| raise TestCase.failureException |
| def xexists_in_D(path): |
| if _exists_in_D(path): |
| raise TestCase.failureException |
| |
| def portage_func(func, args, exit_status=0): |
| # we don't care about the output of the programs, |
| # just their exit value and the state of $D |
| global env |
| f = open('/dev/null', 'wb') |
| fd_pipes = {0:0,1:f.fileno(),2:f.fileno()} |
| def pre_exec(): |
| os.chdir(env['S']) |
| spawn([func] + args.split(), env=env, |
| fd_pipes=fd_pipes, pre_exec=pre_exec) |
| f.close() |
| |
| def create_portage_wrapper(bin): |
| def derived_func(*args): |
| newargs = list(args) |
| newargs.insert(0, bin) |
| return portage_func(*newargs) |
| return derived_func |
| |
| for bin in os.listdir(os.path.join(bindir, 'ebuild-helpers')): |
| if bin.startswith('do') or \ |
| bin.startswith('new') or \ |
| bin.startswith('prep') or \ |
| bin in ('ecompress', 'ecompressdir', 'fowners', 'fperms'): |
| globals()[bin] = create_portage_wrapper( |
| os.path.join(bindir, 'ebuild-helpers', bin)) |