blob: 9cc26df088f13840635498c61ffaaa63760517a2 [file] [log] [blame]
# 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))