| Index: headless/lib/browser/client_api_generator_unittest.py
|
| diff --git a/headless/lib/browser/client_api_generator_unittest.py b/headless/lib/browser/client_api_generator_unittest.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f3609d490f297a13364f6c8b00271b459f712c69
|
| --- /dev/null
|
| +++ b/headless/lib/browser/client_api_generator_unittest.py
|
| @@ -0,0 +1,386 @@
|
| +# Copyright 2016 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import argparse
|
| +import client_api_generator
|
| +import shutil
|
| +import sys
|
| +import tempfile
|
| +import unittest
|
| +
|
| +
|
| +class ClientApiGeneratorTest(unittest.TestCase):
|
| +
|
| + def test_ArgumentParsing(self):
|
| + with tempfile.NamedTemporaryFile() as f:
|
| + f.write('{"foo": true}')
|
| + f.flush()
|
| + json_api, output_dir = client_api_generator.ParseArguments([
|
| + '--protocol', f.name, '--output_dir', 'out'])
|
| + self.assertEqual({'foo': True}, json_api)
|
| + self.assertEqual('out', output_dir)
|
| +
|
| + def test_ToTitleCase(self):
|
| + self.assertEqual(client_api_generator.ToTitleCase('fooBar'), 'FooBar')
|
| +
|
| + def test_DashToCamelCase(self):
|
| + self.assertEqual(client_api_generator.DashToCamelCase('foo-bar'), 'FooBar')
|
| + self.assertEqual(client_api_generator.DashToCamelCase('foo-'), 'Foo')
|
| + self.assertEqual(client_api_generator.DashToCamelCase('-bar'), 'Bar')
|
| +
|
| + def test_CamelCaseToHackerStyle(self):
|
| + self.assertEqual(client_api_generator.CamelCaseToHackerStyle('FooBar'),
|
| + 'foo_bar')
|
| + self.assertEqual(client_api_generator.CamelCaseToHackerStyle('LoLoLoL'),
|
| + 'lo_lo_lol')
|
| +
|
| + def test_MangleEnum(self):
|
| + self.assertEqual(client_api_generator.MangleEnum('FOO'), 'FOO')
|
| + self.assertEqual(client_api_generator.MangleEnum('NULL'), 'NONE')
|
| +
|
| + def test_PatchFullQualifiedRefs(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain0',
|
| + '$ref': 'reference',
|
| + },
|
| + {
|
| + 'domain': 'domain1',
|
| + '$ref': 'reference',
|
| + 'more': [{'$ref': 'domain0.thing'}],
|
| + }
|
| + ]
|
| + }
|
| + expected_json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain0',
|
| + '$ref': 'domain0.reference',
|
| + },
|
| + {
|
| + 'domain': 'domain1',
|
| + '$ref': 'domain1.reference',
|
| + 'more': [{'$ref': 'domain0.thing'}],
|
| + }
|
| + ]
|
| + }
|
| + client_api_generator.PatchFullQualifiedRefs(json_api)
|
| + self.assertDictEqual(json_api, expected_json_api)
|
| +
|
| + def test_NumberType(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'number',
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + client_api_generator.CreateTypeDefinitions(json_api)
|
| + type = json_api['domains'][0]['types'][0]
|
| + resolved = client_api_generator.ResolveType(type)
|
| + self.assertEqual('double', resolved['raw_type'])
|
| +
|
| + def test_IntegerType(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'integer',
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + client_api_generator.CreateTypeDefinitions(json_api)
|
| + type = json_api['domains'][0]['types'][0]
|
| + resolved = client_api_generator.ResolveType(type)
|
| + self.assertEqual('int', resolved['raw_type'])
|
| +
|
| + def test_BooleanType(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'boolean',
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + client_api_generator.CreateTypeDefinitions(json_api)
|
| + type = json_api['domains'][0]['types'][0]
|
| + resolved = client_api_generator.ResolveType(type)
|
| + self.assertEqual('bool', resolved['raw_type'])
|
| +
|
| + def test_StringType(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'string',
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + client_api_generator.CreateTypeDefinitions(json_api)
|
| + type = json_api['domains'][0]['types'][0]
|
| + resolved = client_api_generator.ResolveType(type)
|
| + self.assertEqual('std::string', resolved['raw_type'])
|
| +
|
| + def test_ObjectType(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'object',
|
| + 'properties': [
|
| + {'name': 'p1', 'type': 'number'},
|
| + {'name': 'p2', 'type': 'integer'},
|
| + {'name': 'p3', 'type': 'boolean'},
|
| + {'name': 'p4', 'type': 'string'},
|
| + {'name': 'p5', 'type': 'any'},
|
| + {'name': 'p6', 'type': 'object', '$ref': 'TestType'},
|
| + ],
|
| + 'returns': [
|
| + {'name': 'r1', 'type': 'number'},
|
| + {'name': 'r2', 'type': 'integer'},
|
| + {'name': 'r3', 'type': 'boolean'},
|
| + {'name': 'r4', 'type': 'string'},
|
| + {'name': 'r5', 'type': 'any'},
|
| + {'name': 'r6', 'type': 'object', '$ref': 'TestType'},
|
| + ],
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + client_api_generator.CreateTypeDefinitions(json_api)
|
| + type = json_api['domains'][0]['types'][0]
|
| + resolved = client_api_generator.ResolveType(type)
|
| + self.assertEqual('TestType', resolved['raw_type'])
|
| +
|
| + def test_AnyType(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'any',
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + client_api_generator.CreateTypeDefinitions(json_api)
|
| + type = json_api['domains'][0]['types'][0]
|
| + resolved = client_api_generator.ResolveType(type)
|
| + self.assertEqual('base::Value', resolved['raw_type'])
|
| +
|
| + def test_ArrayType(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'array',
|
| + 'items': {'type': 'integer'}
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + client_api_generator.CreateTypeDefinitions(json_api)
|
| + type = json_api['domains'][0]['types'][0]
|
| + resolved = client_api_generator.ResolveType(type)
|
| + self.assertEqual('std::vector<int>', resolved['raw_type'])
|
| +
|
| + def test_EnumType(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'string',
|
| + 'enum': ['a', 'b', 'c']
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + client_api_generator.CreateTypeDefinitions(json_api)
|
| + type = json_api['domains'][0]['types'][0]
|
| + resolved = client_api_generator.ResolveType(type)
|
| + self.assertEqual('headless::domain::TestType', resolved['raw_type'])
|
| +
|
| + def test_SynthesizeCommandTypes(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'commands': [
|
| + {
|
| + 'name': 'TestCommand',
|
| + 'parameters': [
|
| + {'name': 'p1', 'type': 'number'},
|
| + {'name': 'p2', 'type': 'integer'},
|
| + {'name': 'p3', 'type': 'boolean'},
|
| + {'name': 'p4', 'type': 'string'},
|
| + {'name': 'p5', 'type': 'any'},
|
| + {'name': 'p6', 'type': 'object', '$ref': 'TestType'},
|
| + ],
|
| + 'returns': [
|
| + {'name': 'r1', 'type': 'number'},
|
| + {'name': 'r2', 'type': 'integer'},
|
| + {'name': 'r3', 'type': 'boolean'},
|
| + {'name': 'r4', 'type': 'string'},
|
| + {'name': 'r5', 'type': 'any'},
|
| + {'name': 'r6', 'type': 'object', '$ref': 'TestType'},
|
| + ],
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + expected_types = [
|
| + {
|
| + 'type': 'object',
|
| + 'id': 'TestCommandParams',
|
| + 'description': 'Parameters for the TestCommand command.',
|
| + 'properties': [
|
| + {'type': 'number', 'name': 'p1'},
|
| + {'type': 'integer', 'name': 'p2'},
|
| + {'type': 'boolean', 'name': 'p3'},
|
| + {'type': 'string', 'name': 'p4'},
|
| + {'type': 'any', 'name': 'p5'},
|
| + {'type': 'object', 'name': 'p6', '$ref': 'TestType'}
|
| + ],
|
| + },
|
| + {
|
| + 'type': 'object',
|
| + 'id': 'TestCommandResult',
|
| + 'description': 'Result for the TestCommand command.',
|
| + 'properties': [
|
| + {'type': 'number', 'name': 'r1'},
|
| + {'type': 'integer', 'name': 'r2'},
|
| + {'type': 'boolean', 'name': 'r3'},
|
| + {'type': 'string', 'name': 'r4'},
|
| + {'type': 'any', 'name': 'r5'},
|
| + {'type': 'object', 'name': 'r6', '$ref': 'TestType'}
|
| + ],
|
| + }
|
| + ]
|
| + client_api_generator.SynthesizeCommandTypes(json_api)
|
| + types = json_api['domains'][0]['types']
|
| + self.assertListEqual(types, expected_types)
|
| +
|
| + def test_Generate(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'object',
|
| + 'properties': [
|
| + {'name': 'p1', 'type': 'number'},
|
| + {'name': 'p2', 'type': 'integer'},
|
| + {'name': 'p3', 'type': 'boolean'},
|
| + {'name': 'p4', 'type': 'string'},
|
| + {'name': 'p5', 'type': 'any'},
|
| + {'name': 'p6', 'type': 'object', '$ref': 'domain.TestType'},
|
| + ],
|
| + 'returns': [
|
| + {'name': 'r1', 'type': 'number'},
|
| + {'name': 'r2', 'type': 'integer'},
|
| + {'name': 'r3', 'type': 'boolean'},
|
| + {'name': 'r4', 'type': 'string'},
|
| + {'name': 'r5', 'type': 'any'},
|
| + {'name': 'r6', 'type': 'object', '$ref': 'domain.TestType'},
|
| + ],
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + try:
|
| + dirname = tempfile.mkdtemp()
|
| + jinja_env = client_api_generator.InitializeJinjaEnv(dirname)
|
| + client_api_generator.Generate(jinja_env, dirname, json_api, 'types',
|
| + ['cc'])
|
| + client_api_generator.Generate(jinja_env, dirname, json_api, 'types',
|
| + ['h'])
|
| + # This is just a smoke test; we don't actually verify the generated output
|
| + # here.
|
| + finally:
|
| + shutil.rmtree(dirname)
|
| +
|
| + def test_GenerateDomains(self):
|
| + json_api = {
|
| + 'domains': [
|
| + {
|
| + 'domain': 'domain0',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'object',
|
| + },
|
| + ]
|
| + },
|
| + {
|
| + 'domain': 'domain1',
|
| + 'types': [
|
| + {
|
| + 'id': 'TestType',
|
| + 'type': 'object',
|
| + },
|
| + ]
|
| + },
|
| + ]
|
| + }
|
| + try:
|
| + dirname = tempfile.mkdtemp()
|
| + jinja_env = client_api_generator.InitializeJinjaEnv(dirname)
|
| + client_api_generator.GenerateDomains(jinja_env, dirname, json_api,
|
| + 'domain', ['cc', 'h'])
|
| + # This is just a smoke test; we don't actually verify the generated output
|
| + # here.
|
| + finally:
|
| + shutil.rmtree(dirname)
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + cmdline_parser = argparse.ArgumentParser()
|
| + cmdline_parser.add_argument('--stamp')
|
| + args = cmdline_parser.parse_args()
|
| + unittest.main(verbosity=2, exit=False, argv=sys.argv[:1])
|
| + if args.stamp:
|
| + with open(args.stamp, 'a') as f:
|
| + pass
|
|
|