diff options
Diffstat (limited to 'taskcluster/taskgraph/test/test_transforms_base.py')
-rw-r--r-- | taskcluster/taskgraph/test/test_transforms_base.py | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/taskcluster/taskgraph/test/test_transforms_base.py b/taskcluster/taskgraph/test/test_transforms_base.py new file mode 100644 index 000000000..0a0dfcaf2 --- /dev/null +++ b/taskcluster/taskgraph/test/test_transforms_base.py @@ -0,0 +1,143 @@ +# 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 absolute_import, print_function, unicode_literals + +import unittest +from mozunit import main +from taskgraph.transforms.base import ( + validate_schema, + get_keyed_by, + TransformSequence +) +from voluptuous import Schema + +schema = Schema({ + 'x': int, + 'y': basestring, +}) + +transforms = TransformSequence() + + +@transforms.add +def trans1(config, tests): + for test in tests: + test['one'] = 1 + yield test + + +@transforms.add +def trans2(config, tests): + for test in tests: + test['two'] = 2 + yield test + + +class TestTransformSequence(unittest.TestCase): + + def test_sequence(self): + tests = [{}, {'two': 1, 'second': True}] + res = list(transforms({}, tests)) + self.assertEqual(res, [ + {u'two': 2, u'one': 1}, + {u'second': True, u'two': 2, u'one': 1}, + ]) + + +class TestValidateSchema(unittest.TestCase): + + def test_valid(self): + validate_schema(schema, {'x': 10, 'y': 'foo'}, "pfx") + + def test_invalid(self): + try: + validate_schema(schema, {'x': 'not-int'}, "pfx") + self.fail("no exception raised") + except Exception, e: + self.failUnless(str(e).startswith("pfx\n")) + + +class TestKeyedBy(unittest.TestCase): + + def test_simple_value(self): + test = { + 'test-name': 'tname', + 'option': 10, + } + self.assertEqual(get_keyed_by(test, 'option', 'x'), 10) + + def test_by_value(self): + test = { + 'test-name': 'tname', + 'option': { + 'by-other-value': { + 'a': 10, + 'b': 20, + }, + }, + 'other-value': 'b', + } + self.assertEqual(get_keyed_by(test, 'option', 'x'), 20) + + def test_by_value_regex(self): + test = { + 'test-name': 'tname', + 'option': { + 'by-test-platform': { + 'macosx64/.*': 10, + 'linux64/debug': 20, + 'default': 5, + }, + }, + 'test-platform': 'macosx64/debug', + } + self.assertEqual(get_keyed_by(test, 'option', 'x'), 10) + + def test_by_value_default(self): + test = { + 'test-name': 'tname', + 'option': { + 'by-other-value': { + 'a': 10, + 'default': 30, + }, + }, + 'other-value': 'xxx', + } + self.assertEqual(get_keyed_by(test, 'option', 'x'), 30) + + def test_by_value_invalid_dict(self): + test = { + 'test-name': 'tname', + 'option': { + 'by-something-else': {}, + 'by-other-value': {}, + }, + } + self.assertRaises(Exception, get_keyed_by, test, 'option', 'x') + + def test_by_value_invalid_no_default(self): + test = { + 'test-name': 'tname', + 'option': { + 'by-other-value': { + 'a': 10, + }, + }, + 'other-value': 'b', + } + self.assertRaises(Exception, get_keyed_by, test, 'option', 'x') + + def test_by_value_invalid_no_by(self): + test = { + 'test-name': 'tname', + 'option': { + 'other-value': {}, + }, + } + self.assertRaises(Exception, get_keyed_by, test, 'option', 'x') + +if __name__ == '__main__': + main() |