Bug 1266343 - Change FindProgramSandbox to override which.which instead of replacing find_program. r=chmanchester

Also make it more generic so that it can be reused for other tests.
This commit is contained in:
Mike Hommey 2016-04-19 16:32:38 +09:00
Родитель a3cf230161
Коммит 23548b6211
1 изменённых файлов: 91 добавлений и 60 удалений

Просмотреть файл

@ -15,47 +15,66 @@ from mozbuild.configure import (
ConfigureError,
ConfigureSandbox,
)
from mozbuild.util import exec_
from mozbuild.util import (
exec_,
ReadOnlyNamespace,
)
from mozpack import path as mozpath
from buildconfig import topsrcdir
from which import WhichError
class FindProgramSandbox(ConfigureSandbox):
def __init__(self, *args, **kwargs):
super(FindProgramSandbox, self).__init__(*args, **kwargs)
class ConfigureTestVFS(object):
def __init__(self, paths):
self._paths = set(mozpath.abspath(p) for p in paths)
# We could define self.find_program_impl and have it automatically
# declared, but then it wouldn't be available in the tested templates.
# We also need to use super().__setitem__ because ours would do
# nothing.
super(FindProgramSandbox, self).__setitem__(
'find_program', lambda x: self.find_program(x))
def exists(self, path):
return mozpath.abspath(path) in self._paths
PROGRAMS = {
'known-a': '/usr/bin/known-a',
'known-b': '/usr/local/bin/known-b',
'known c': '/home/user/bin/known c',
}
def isfile(self, path):
return mozpath.abspath(path) in self._paths
for p in PROGRAMS.values():
PROGRAMS[p] = p
@staticmethod
def find_program(prog):
return FindProgramSandbox.PROGRAMS.get(prog)
class ConfigureTestSandbox(ConfigureSandbox):
def __init__(self, paths, config, environ, *args, **kwargs):
self._search_path = environ.get('PATH', '').split(os.pathsep)
def __setitem__(self, key, value):
# Avoid util.configure overwriting our mock find_program
if key == 'find_program':
return
vfs = ConfigureTestVFS(paths)
super(FindProgramSandbox, self).__setitem__(key, value)
self.OS = ReadOnlyNamespace(path=ReadOnlyNamespace(**{
k: v if k not in ('exists', 'isfile')
else getattr(vfs, k)
for k, v in ConfigureSandbox.OS.path.__dict__.iteritems()
}))
super(ConfigureTestSandbox, self).__init__(config, environ, *args,
**kwargs)
def _get_one_import(self, what):
if what == 'which.which':
return self.which
if what == 'which':
return ReadOnlyNamespace(
which=self.which,
WhichError=WhichError,
)
return super(ConfigureTestSandbox, self)._get_one_import(what)
def which(self, command):
for parent in self._search_path:
path = mozpath.join(parent, command)
if self.OS.path.exists(path):
return path
raise WhichError()
class TestChecksConfigure(unittest.TestCase):
def test_checking(self):
out = StringIO()
sandbox = FindProgramSandbox({}, stdout=out, stderr=out)
sandbox = ConfigureSandbox({}, stdout=out, stderr=out)
base_dir = os.path.join(topsrcdir, 'build', 'moz.configure')
sandbox.include_file(os.path.join(base_dir, 'checks.configure'))
@ -153,11 +172,23 @@ class TestChecksConfigure(unittest.TestCase):
foo(['foo', 'bar'])
self.assertEqual(out.getvalue(), 'checking for a thing... foo bar\n')
KNOWN_A = mozpath.abspath('/usr/bin/known-a')
KNOWN_B = mozpath.abspath('/usr/local/bin/known-b')
KNOWN_C = mozpath.abspath('/home/user/bin/known c')
def get_result(self, command='', args=[], environ={},
prog='/bin/configure'):
config = {}
out = StringIO()
sandbox = FindProgramSandbox(config, environ, [prog] + args, out, out)
paths = (
self.KNOWN_A,
self.KNOWN_B,
self.KNOWN_C,
)
environ = dict(environ)
environ['PATH'] = os.pathsep.join(os.path.dirname(p) for p in paths)
sandbox = ConfigureTestSandbox(paths, config, environ, [prog] + args,
out, out)
base_dir = os.path.join(topsrcdir, 'build', 'moz.configure')
sandbox.include_file(os.path.join(base_dir, 'util.configure'))
sandbox.include_file(os.path.join(base_dir, 'checks.configure'))
@ -175,20 +206,20 @@ class TestChecksConfigure(unittest.TestCase):
config, out, status = self.get_result(
'check_prog("FOO", ("known-a",))')
self.assertEqual(status, 0)
self.assertEqual(config, {'FOO': '/usr/bin/known-a'})
self.assertEqual(out, 'checking for foo... /usr/bin/known-a\n')
self.assertEqual(config, {'FOO': self.KNOWN_A})
self.assertEqual(out, 'checking for foo... %s\n' % self.KNOWN_A)
config, out, status = self.get_result(
'check_prog("FOO", ("unknown", "known-b", "known c"))')
self.assertEqual(status, 0)
self.assertEqual(config, {'FOO': '/usr/local/bin/known-b'})
self.assertEqual(out, 'checking for foo... /usr/local/bin/known-b\n')
self.assertEqual(config, {'FOO': self.KNOWN_B})
self.assertEqual(out, 'checking for foo... %s\n' % self.KNOWN_B)
config, out, status = self.get_result(
'check_prog("FOO", ("unknown", "unknown-2", "known c"))')
self.assertEqual(status, 0)
self.assertEqual(config, {'FOO': '/home/user/bin/known c'})
self.assertEqual(out, "checking for foo... '/home/user/bin/known c'\n")
self.assertEqual(config, {'FOO': self.KNOWN_C})
self.assertEqual(out, "checking for foo... '%s'\n" % self.KNOWN_C)
config, out, status = self.get_result(
'check_prog("FOO", ("unknown",))')
@ -224,33 +255,34 @@ class TestChecksConfigure(unittest.TestCase):
'check_prog("FOO", ("unknown", "known-b", "known c"))',
['FOO=known-a'])
self.assertEqual(status, 0)
self.assertEqual(config, {'FOO': '/usr/bin/known-a'})
self.assertEqual(out, 'checking for foo... /usr/bin/known-a\n')
self.assertEqual(config, {'FOO': self.KNOWN_A})
self.assertEqual(out, 'checking for foo... %s\n' % self.KNOWN_A)
config, out, status = self.get_result(
'check_prog("FOO", ("unknown", "known-b", "known c"))',
['FOO=/usr/bin/known-a'])
['FOO=%s' % self.KNOWN_A])
self.assertEqual(status, 0)
self.assertEqual(config, {'FOO': '/usr/bin/known-a'})
self.assertEqual(out, 'checking for foo... /usr/bin/known-a\n')
self.assertEqual(config, {'FOO': self.KNOWN_A})
self.assertEqual(out, 'checking for foo... %s\n' % self.KNOWN_A)
path = self.KNOWN_B.replace('known-b', 'known-a')
config, out, status = self.get_result(
'check_prog("FOO", ("unknown", "known-b", "known c"))',
['FOO=/usr/local/bin/known-a'])
['FOO=%s' % path])
self.assertEqual(status, 1)
self.assertEqual(config, {})
self.assertEqual(out, textwrap.dedent('''\
checking for foo... not found
DEBUG: foo: Trying /usr/local/bin/known-a
DEBUG: foo: Trying %s
ERROR: Cannot find foo
'''))
''') % path)
config, out, status = self.get_result(
'check_prog("FOO", ("unknown",))',
['FOO=known c'])
self.assertEqual(status, 0)
self.assertEqual(config, {'FOO': '/home/user/bin/known c'})
self.assertEqual(out, "checking for foo... '/home/user/bin/known c'\n")
self.assertEqual(config, {'FOO': self.KNOWN_C})
self.assertEqual(out, "checking for foo... '%s'\n" % self.KNOWN_C)
config, out, status = self.get_result(
'check_prog("FOO", ("unknown", "unknown-2", "unknown 3"), '
@ -267,9 +299,9 @@ class TestChecksConfigure(unittest.TestCase):
config, out, status = self.get_result(
'check_prog("CC", ("known-a",), what="the target C compiler")')
self.assertEqual(status, 0)
self.assertEqual(config, {'CC': '/usr/bin/known-a'})
self.assertEqual(config, {'CC': self.KNOWN_A})
self.assertEqual(
out, 'checking for the target C compiler... /usr/bin/known-a\n')
out, 'checking for the target C compiler... %s\n' % self.KNOWN_A)
config, out, status = self.get_result(
'check_prog("CC", ("unknown", "unknown-2", "unknown 3"),'
@ -290,9 +322,8 @@ class TestChecksConfigure(unittest.TestCase):
check_prog("CCACHE", ("known-a",), input="--with-ccache")
'''), ['--with-ccache=known-b'])
self.assertEqual(status, 0)
self.assertEqual(config, {'CCACHE': '/usr/local/bin/known-b'})
self.assertEqual(
out, 'checking for ccache... /usr/local/bin/known-b\n')
self.assertEqual(config, {'CCACHE': self.KNOWN_B})
self.assertEqual(out, 'checking for ccache... %s\n' % self.KNOWN_B)
script = textwrap.dedent('''
option(env="CC", nargs=1, help="compiler")
@ -303,18 +334,18 @@ class TestChecksConfigure(unittest.TestCase):
''')
config, out, status = self.get_result(script)
self.assertEqual(status, 0)
self.assertEqual(config, {'CC': '/usr/bin/known-a'})
self.assertEqual(out, 'checking for cc... /usr/bin/known-a\n')
self.assertEqual(config, {'CC': self.KNOWN_A})
self.assertEqual(out, 'checking for cc... %s\n' % self.KNOWN_A)
config, out, status = self.get_result(script, ['CC=known-b'])
self.assertEqual(status, 0)
self.assertEqual(config, {'CC': '/usr/local/bin/known-b'})
self.assertEqual(out, 'checking for cc... /usr/local/bin/known-b\n')
self.assertEqual(config, {'CC': self.KNOWN_B})
self.assertEqual(out, 'checking for cc... %s\n' % self.KNOWN_B)
config, out, status = self.get_result(script, ['CC=known-b -m32'])
self.assertEqual(status, 0)
self.assertEqual(config, {'CC': '/usr/local/bin/known-b'})
self.assertEqual(out, 'checking for cc... /usr/local/bin/known-b\n')
self.assertEqual(config, {'CC': self.KNOWN_B})
self.assertEqual(out, 'checking for cc... %s\n' % self.KNOWN_B)
def test_check_prog_progs(self):
config, out, status = self.get_result(
@ -326,8 +357,8 @@ class TestChecksConfigure(unittest.TestCase):
config, out, status = self.get_result(
'check_prog("FOO", ())', ['FOO=known-a'])
self.assertEqual(status, 0)
self.assertEqual(config, {'FOO': '/usr/bin/known-a'})
self.assertEqual(out, 'checking for foo... /usr/bin/known-a\n')
self.assertEqual(config, {'FOO': self.KNOWN_A})
self.assertEqual(out, 'checking for foo... %s\n' % self.KNOWN_A)
script = textwrap.dedent('''
option(env="TARGET", nargs=1, default="linux", help="target")
@ -378,14 +409,14 @@ class TestChecksConfigure(unittest.TestCase):
config, out, status = self.get_result(script, ['TARGET=winnt',
'CC=known-a'])
self.assertEqual(status, 0)
self.assertEqual(config, {'CC': '/usr/bin/known-a'})
self.assertEqual(out, 'checking for cc... /usr/bin/known-a\n')
self.assertEqual(config, {'CC': self.KNOWN_A})
self.assertEqual(out, 'checking for cc... %s\n' % self.KNOWN_A)
config, out, status = self.get_result(script, ['TARGET=none',
'CC=known-a'])
self.assertEqual(status, 0)
self.assertEqual(config, {'CC': '/usr/bin/known-a'})
self.assertEqual(out, 'checking for cc... /usr/bin/known-a\n')
self.assertEqual(config, {'CC': self.KNOWN_A})
self.assertEqual(out, 'checking for cc... %s\n' % self.KNOWN_A)
def test_check_prog_configure_error(self):
with self.assertRaises(ConfigureError) as e: