def test_parse(self): input_file = cStringIO.StringIO( textwrap.dedent("""\ VERSION_1 { local: hidden1; global: foo; bar; # baz }; VERSION_2 { # wasd # Implicit global scope. woodly; doodly; # asdf local: qwerty; } VERSION_1; """)) parser = gsl.SymbolFileParser(input_file, {}) versions = parser.parse() expected = [ gsl.Version('VERSION_1', None, [], [ gsl.Symbol('foo', []), gsl.Symbol('bar', ['baz']), ]), gsl.Version('VERSION_2', 'VERSION_1', ['wasd'], [ gsl.Symbol('woodly', []), gsl.Symbol('doodly', ['asdf']), ]), ] self.assertEqual(expected, versions)
def test_parse_version(self): input_file = cStringIO.StringIO( textwrap.dedent("""\ VERSION_1 { # foo bar baz; qux; # woodly doodly }; VERSION_2 { } VERSION_1; # asdf """)) parser = gsl.SymbolFileParser(input_file, {}) parser.next_line() version = parser.parse_version() self.assertEqual('VERSION_1', version.name) self.assertIsNone(version.base) self.assertEqual(['foo', 'bar'], version.tags) expected_symbols = [ gsl.Symbol('baz', []), gsl.Symbol('qux', ['woodly', 'doodly']), ] self.assertEqual(expected_symbols, version.symbols) parser.next_line() version = parser.parse_version() self.assertEqual('VERSION_2', version.name) self.assertEqual('VERSION_1', version.base) self.assertEqual([], version.tags)
def test_multiple_definition(self): input_file = io.StringIO( textwrap.dedent("""\ VERSION_1 { global: foo; foo; bar; baz; qux; # arm local: *; }; VERSION_2 { global: bar; qux; # arm64 } VERSION_1; VERSION_PRIVATE { global: baz; } VERSION_2; """)) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) with self.assertRaises(gsl.MultiplyDefinedSymbolError) as cm: parser.parse() self.assertEquals(['bar', 'foo'], cm.exception.multiply_defined_symbols)
def test_parse_version_eof(self): input_file = cStringIO.StringIO(textwrap.dedent("""\ VERSION_1 { """)) parser = gsl.SymbolFileParser(input_file, {}) parser.next_line() with self.assertRaises(gsl.ParseError): parser.parse_version()
def test_wildcard_symbol_local(self): input_file = cStringIO.StringIO(textwrap.dedent("""\ VERSION_1 { local: *; }; """)) parser = gsl.SymbolFileParser(input_file, {}) parser.next_line() version = parser.parse_version() self.assertEqual([], version.symbols)
def test_missing_semicolon(self): input_file = cStringIO.StringIO( textwrap.dedent("""\ VERSION_1 { foo }; """)) parser = gsl.SymbolFileParser(input_file) parser.next_line() with self.assertRaises(gsl.ParseError): parser.parse_version()
def test_wildcard_symbol_global(self): input_file = cStringIO.StringIO( textwrap.dedent("""\ VERSION_1 { *; }; """)) parser = gsl.SymbolFileParser(input_file) parser.next_line() with self.assertRaises(gsl.ParseError): parser.parse_version()
def test_unknown_scope_label(self): input_file = cStringIO.StringIO( textwrap.dedent("""\ VERSION_1 { foo: } """)) parser = gsl.SymbolFileParser(input_file) parser.next_line() with self.assertRaises(gsl.ParseError): parser.parse_version()
def test_parse_symbol(self): input_file = cStringIO.StringIO(textwrap.dedent("""\ foo; bar; # baz qux """)) parser = gsl.SymbolFileParser(input_file, {}) parser.next_line() symbol = parser.parse_symbol() self.assertEqual('foo', symbol.name) self.assertEqual([], symbol.tags) parser.next_line() symbol = parser.parse_symbol() self.assertEqual('bar', symbol.name) self.assertEqual(['baz', 'qux'], symbol.tags)
def test_integration(self): input_file = cStringIO.StringIO( textwrap.dedent("""\ VERSION_1 { global: foo; # var bar; # x86 local: *; }; VERSION_2 { # arm baz; # introduced=9 qux; # versioned=14 } VERSION_1; VERSION_3 { # introduced=14 woodly; doodly; # var } VERSION_2; """)) parser = gsl.SymbolFileParser(input_file) versions = parser.parse() src_file = cStringIO.StringIO() version_file = cStringIO.StringIO() generator = gsl.Generator(src_file, version_file, 'arm', 9) generator.write(versions) expected_src = textwrap.dedent("""\ int foo = 0; void baz() {} void qux() {} """) self.assertEqual(expected_src, src_file.getvalue()) expected_version = textwrap.dedent("""\ VERSION_1 { global: foo; }; VERSION_2 { global: baz; } VERSION_1; """) self.assertEqual(expected_version, version_file.getvalue())
def test_integration_future_api(self): api_map = { 'O': 9000, 'P': 9001, 'Q': 9002, } input_file = io.StringIO( textwrap.dedent("""\ VERSION_1 { global: foo; # introduced=O bar; # introduced=P baz; # introduced=Q local: *; }; """)) parser = gsl.SymbolFileParser(input_file, api_map, 'arm', 9001, False, False) versions = parser.parse() src_file = io.StringIO() version_file = io.StringIO() generator = gsl.Generator(src_file, version_file, 'arm', 9001, False, False) generator.write(versions) expected_src = textwrap.dedent("""\ void foo() {} void bar() {} """) self.assertEqual(expected_src, src_file.getvalue()) expected_version = textwrap.dedent("""\ VERSION_1 { global: foo; bar; }; """) self.assertEqual(expected_version, version_file.getvalue())
def test_next_line(self): input_file = cStringIO.StringIO(textwrap.dedent("""\ foo bar # baz qux """)) parser = gsl.SymbolFileParser(input_file, {}) self.assertIsNone(parser.current_line) self.assertEqual('foo', parser.next_line().strip()) self.assertEqual('foo', parser.current_line.strip()) self.assertEqual('bar', parser.next_line().strip()) self.assertEqual('bar', parser.current_line.strip()) self.assertEqual('qux', parser.next_line().strip()) self.assertEqual('qux', parser.current_line.strip()) self.assertEqual('', parser.next_line()) self.assertEqual('', parser.current_line)
def test_parse_vndk_apex_symbol(self): input_file = io.StringIO( textwrap.dedent("""\ VERSION_1 { foo; bar; # vndk baz; # vndk apex qux; # apex }; """)) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, True) parser.next_line() version = parser.parse_version() self.assertEqual('VERSION_1', version.name) self.assertIsNone(version.base) expected_symbols = [ gsl.Symbol('foo', []), gsl.Symbol('bar', ['vndk']), gsl.Symbol('baz', ['vndk', 'apex']), gsl.Symbol('qux', ['apex']), ] self.assertEqual(expected_symbols, version.symbols)
def test_integration(self): api_map = { 'O': 9000, 'P': 9001, } input_file = cStringIO.StringIO( textwrap.dedent("""\ VERSION_1 { global: foo; # var bar; # x86 fizz; # introduced=O buzz; # introduced=P local: *; }; VERSION_2 { # arm baz; # introduced=9 qux; # versioned=14 } VERSION_1; VERSION_3 { # introduced=14 woodly; doodly; # var } VERSION_2; VERSION_4 { # versioned=9 wibble; wizzes; # vndk } VERSION_2; VERSION_5 { # versioned=14 wobble; } VERSION_4; """)) parser = gsl.SymbolFileParser(input_file, api_map) versions = parser.parse() src_file = cStringIO.StringIO() version_file = cStringIO.StringIO() generator = gsl.Generator(src_file, version_file, 'arm', 9, False) generator.write(versions) expected_src = textwrap.dedent("""\ int foo = 0; void baz() {} void qux() {} void wibble() {} void wobble() {} """) self.assertEqual(expected_src, src_file.getvalue()) expected_version = textwrap.dedent("""\ VERSION_1 { global: foo; }; VERSION_2 { global: baz; } VERSION_1; VERSION_4 { global: wibble; } VERSION_2; """) self.assertEqual(expected_version, version_file.getvalue())
def test_parse_fails_invalid_input(self): with self.assertRaises(gsl.ParseError): input_file = cStringIO.StringIO('foo') parser = gsl.SymbolFileParser(input_file, {}) parser.parse()