blob: a04fb71a45fb9963544b9390b33bacb110330508 [file] [log] [blame]
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import unicode_literals
import unittest
from mozunit import main
from mozbuild.frontend.sandbox import (
GlobalNamespace,
LocalNamespace,
)
from mozbuild.frontend.sandbox_symbols import VARIABLES
class TestGlobalNamespace(unittest.TestCase):
def test_builtins(self):
ns = GlobalNamespace()
self.assertIn('__builtins__', ns)
self.assertEqual(ns['__builtins__']['True'], True)
def test_key_rejection(self):
# Lowercase keys should be rejected during normal operation.
ns = GlobalNamespace(allowed_variables=VARIABLES)
with self.assertRaises(KeyError) as ke:
ns['foo'] = True
e = ke.exception.args
self.assertEqual(e[0], 'global_ns')
self.assertEqual(e[1], 'set_unknown')
self.assertEqual(e[2], 'foo')
self.assertTrue(e[3])
# Unknown uppercase keys should be rejected.
with self.assertRaises(KeyError) as ke:
ns['FOO'] = True
e = ke.exception.args
self.assertEqual(e[0], 'global_ns')
self.assertEqual(e[1], 'set_unknown')
self.assertEqual(e[2], 'FOO')
self.assertTrue(e[3])
def test_allowed_set(self):
self.assertIn('DIRS', VARIABLES)
ns = GlobalNamespace(allowed_variables=VARIABLES)
ns['DIRS'] = ['foo']
self.assertEqual(ns['DIRS'], ['foo'])
def test_value_checking(self):
ns = GlobalNamespace(allowed_variables=VARIABLES)
# Setting to a non-allowed type should not work.
with self.assertRaises(ValueError) as ve:
ns['DIRS'] = True
e = ve.exception.args
self.assertEqual(e[0], 'global_ns')
self.assertEqual(e[1], 'set_type')
self.assertEqual(e[2], 'DIRS')
self.assertTrue(e[3])
self.assertEqual(e[4], list)
def test_allow_all_writes(self):
ns = GlobalNamespace(allowed_variables=VARIABLES)
with ns.allow_all_writes() as d:
d['foo'] = True
self.assertTrue(d['foo'])
with self.assertRaises(KeyError) as ke:
ns['foo'] = False
self.assertEqual(ke.exception.args[1], 'set_unknown')
self.assertTrue(d['foo'])
def test_key_checking(self):
# Checking for existence of a key should not populate the key if it
# doesn't exist.
g = GlobalNamespace(allowed_variables=VARIABLES)
self.assertFalse('DIRS' in g)
self.assertFalse('DIRS' in g)
class TestLocalNamespace(unittest.TestCase):
def test_locals(self):
g = GlobalNamespace(allowed_variables=VARIABLES)
l = LocalNamespace(g)
l['foo'] = ['foo']
self.assertEqual(l['foo'], ['foo'])
l['foo'] += ['bar']
self.assertEqual(l['foo'], ['foo', 'bar'])
def test_global_proxy_reads(self):
g = GlobalNamespace(allowed_variables=VARIABLES)
g['DIRS'] = ['foo']
l = LocalNamespace(g)
self.assertEqual(l['DIRS'], g['DIRS'])
# Reads to missing UPPERCASE vars should result in KeyError.
with self.assertRaises(KeyError) as ke:
v = l['FOO']
e = ke.exception
self.assertEqual(e.args[0], 'global_ns')
self.assertEqual(e.args[1], 'get_unknown')
def test_global_proxy_writes(self):
g = GlobalNamespace(allowed_variables=VARIABLES)
l = LocalNamespace(g)
l['DIRS'] = ['foo']
self.assertEqual(l['DIRS'], ['foo'])
self.assertEqual(g['DIRS'], ['foo'])
if __name__ == '__main__':
main()