Merge changes Idb2b552b,I190bca35

* changes:
  When a stub is built for APEX, it is generated with --apex
  APEX-specific symbols can be tagged as # apex
This commit is contained in:
Treehugger Robot
2018-12-19 06:28:23 +00:00
committed by Gerrit Code Review
5 changed files with 192 additions and 56 deletions

View File

@@ -321,6 +321,9 @@ func TestApexWithStubs(t *testing.T) {
// Ensure that stubs libs are built without -include flags // Ensure that stubs libs are built without -include flags
mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"] mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"]
ensureNotContains(t, mylib2Cflags, "-include ") ensureNotContains(t, mylib2Cflags, "-include ")
// Ensure that genstub is invoked with --apex
ensureContains(t, "--apex", ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static_3_myapex").Rule("genStubSrc").Args["flags"])
} }
func TestApexWithExplicitStubsDependency(t *testing.T) { func TestApexWithExplicitStubsDependency(t *testing.T) {

View File

@@ -108,7 +108,7 @@ def version_is_private(version):
return version.endswith('_PRIVATE') or version.endswith('_PLATFORM') return version.endswith('_PRIVATE') or version.endswith('_PLATFORM')
def should_omit_version(version, arch, api, vndk): def should_omit_version(version, arch, api, vndk, apex):
"""Returns True if the version section should be ommitted. """Returns True if the version section should be ommitted.
We want to omit any sections that do not have any symbols we'll have in the We want to omit any sections that do not have any symbols we'll have in the
@@ -121,6 +121,8 @@ def should_omit_version(version, arch, api, vndk):
return True return True
if 'vndk' in version.tags and not vndk: if 'vndk' in version.tags and not vndk:
return True return True
if 'apex' in version.tags and not apex:
return True
if not symbol_in_arch(version.tags, arch): if not symbol_in_arch(version.tags, arch):
return True return True
if not symbol_in_api(version.tags, arch, api): if not symbol_in_api(version.tags, arch, api):
@@ -128,10 +130,12 @@ def should_omit_version(version, arch, api, vndk):
return False return False
def should_omit_symbol(symbol, arch, api, vndk): def should_omit_symbol(symbol, arch, api, vndk, apex):
"""Returns True if the symbol should be omitted.""" """Returns True if the symbol should be omitted."""
if not vndk and 'vndk' in symbol.tags: if not vndk and 'vndk' in symbol.tags:
return True return True
if not apex and 'apex' in symbol.tags:
return True
if not symbol_in_arch(symbol.tags, arch): if not symbol_in_arch(symbol.tags, arch):
return True return True
if not symbol_in_api(symbol.tags, arch, api): if not symbol_in_api(symbol.tags, arch, api):
@@ -239,15 +243,15 @@ class Symbol(object):
def __eq__(self, other): def __eq__(self, other):
return self.name == other.name and set(self.tags) == set(other.tags) return self.name == other.name and set(self.tags) == set(other.tags)
class SymbolFileParser(object): class SymbolFileParser(object):
"""Parses NDK symbol files.""" """Parses NDK symbol files."""
def __init__(self, input_file, api_map, arch, api, vndk): def __init__(self, input_file, api_map, arch, api, vndk, apex):
self.input_file = input_file self.input_file = input_file
self.api_map = api_map self.api_map = api_map
self.arch = arch self.arch = arch
self.api = api self.api = api
self.vndk = vndk self.vndk = vndk
self.apex = apex
self.current_line = None self.current_line = None
def parse(self): def parse(self):
@@ -275,11 +279,11 @@ class SymbolFileParser(object):
symbol_names = set() symbol_names = set()
multiply_defined_symbols = set() multiply_defined_symbols = set()
for version in versions: for version in versions:
if should_omit_version(version, self.arch, self.api, self.vndk): if should_omit_version(version, self.arch, self.api, self.vndk, self.apex):
continue continue
for symbol in version.symbols: for symbol in version.symbols:
if should_omit_symbol(symbol, self.arch, self.api, self.vndk): if should_omit_symbol(symbol, self.arch, self.api, self.vndk, self.apex):
continue continue
if symbol.name in symbol_names: if symbol.name in symbol_names:
@@ -363,12 +367,13 @@ class SymbolFileParser(object):
class Generator(object): class Generator(object):
"""Output generator that writes stub source files and version scripts.""" """Output generator that writes stub source files and version scripts."""
def __init__(self, src_file, version_script, arch, api, vndk): def __init__(self, src_file, version_script, arch, api, vndk, apex):
self.src_file = src_file self.src_file = src_file
self.version_script = version_script self.version_script = version_script
self.arch = arch self.arch = arch
self.api = api self.api = api
self.vndk = vndk self.vndk = vndk
self.apex = apex
def write(self, versions): def write(self, versions):
"""Writes all symbol data to the output files.""" """Writes all symbol data to the output files."""
@@ -377,14 +382,14 @@ class Generator(object):
def write_version(self, version): def write_version(self, version):
"""Writes a single version block's data to the output files.""" """Writes a single version block's data to the output files."""
if should_omit_version(version, self.arch, self.api, self.vndk): if should_omit_version(version, self.arch, self.api, self.vndk, self.apex):
return return
section_versioned = symbol_versioned_in_api(version.tags, self.api) section_versioned = symbol_versioned_in_api(version.tags, self.api)
version_empty = True version_empty = True
pruned_symbols = [] pruned_symbols = []
for symbol in version.symbols: for symbol in version.symbols:
if should_omit_symbol(symbol, self.arch, self.api, self.vndk): if should_omit_symbol(symbol, self.arch, self.api, self.vndk, self.apex):
continue continue
if symbol_versioned_in_api(symbol.tags, self.api): if symbol_versioned_in_api(symbol.tags, self.api):
@@ -447,6 +452,8 @@ def parse_args():
help='Architecture being targeted.') help='Architecture being targeted.')
parser.add_argument( parser.add_argument(
'--vndk', action='store_true', help='Use the VNDK variant.') '--vndk', action='store_true', help='Use the VNDK variant.')
parser.add_argument(
'--apex', action='store_true', help='Use the APEX variant.')
parser.add_argument( parser.add_argument(
'--api-map', type=os.path.realpath, required=True, '--api-map', type=os.path.realpath, required=True,
@@ -481,14 +488,14 @@ def main():
with open(args.symbol_file) as symbol_file: with open(args.symbol_file) as symbol_file:
try: try:
versions = SymbolFileParser(symbol_file, api_map, args.arch, api, versions = SymbolFileParser(symbol_file, api_map, args.arch, api,
args.vndk).parse() args.vndk, args.apex).parse()
except MultiplyDefinedSymbolError as ex: except MultiplyDefinedSymbolError as ex:
sys.exit('{}: error: {}'.format(args.symbol_file, ex)) sys.exit('{}: error: {}'.format(args.symbol_file, ex))
with open(args.stub_src, 'w') as src_file: with open(args.stub_src, 'w') as src_file:
with open(args.version_script, 'w') as version_file: with open(args.version_script, 'w') as version_file:
generator = Generator(src_file, version_file, args.arch, api, generator = Generator(src_file, version_file, args.arch, api,
args.vndk) args.vndk, args.apex)
generator.write(versions) generator.write(versions)

View File

@@ -395,7 +395,7 @@ func extractExportIncludesFromFlags(flags []string) []string {
func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects { func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects {
if library.buildStubs() { if library.buildStubs() {
objs, versionScript := compileStubLibrary(ctx, flags, String(library.Properties.Stubs.Symbol_file), library.MutatedProperties.StubsVersion, "") objs, versionScript := compileStubLibrary(ctx, flags, String(library.Properties.Stubs.Symbol_file), library.MutatedProperties.StubsVersion, "--apex")
library.versionScriptPath = versionScript library.versionScriptPath = versionScript
return objs return objs
} }

View File

@@ -31,9 +31,9 @@ var (
genStubSrc = pctx.AndroidStaticRule("genStubSrc", genStubSrc = pctx.AndroidStaticRule("genStubSrc",
blueprint.RuleParams{ blueprint.RuleParams{
Command: "$toolPath --arch $arch --api $apiLevel --api-map " + Command: "$toolPath --arch $arch --api $apiLevel --api-map " +
"$apiMap $vndk $in $out", "$apiMap $flags $in $out",
CommandDeps: []string{"$toolPath"}, CommandDeps: []string{"$toolPath"},
}, "arch", "apiLevel", "apiMap", "vndk") }, "arch", "apiLevel", "apiMap", "flags")
ndkLibrarySuffix = ".ndk" ndkLibrarySuffix = ".ndk"
@@ -271,7 +271,7 @@ func (stub *stubDecorator) compilerFlags(ctx ModuleContext, flags Flags, deps Pa
return addStubLibraryCompilerFlags(flags) return addStubLibraryCompilerFlags(flags)
} }
func compileStubLibrary(ctx ModuleContext, flags Flags, symbolFile, apiLevel, vndk string) (Objects, android.ModuleGenPath) { func compileStubLibrary(ctx ModuleContext, flags Flags, symbolFile, apiLevel, genstubFlags string) (Objects, android.ModuleGenPath) {
arch := ctx.Arch().ArchType.String() arch := ctx.Arch().ArchType.String()
stubSrcPath := android.PathForModuleGen(ctx, "stub.c") stubSrcPath := android.PathForModuleGen(ctx, "stub.c")
@@ -288,7 +288,7 @@ func compileStubLibrary(ctx ModuleContext, flags Flags, symbolFile, apiLevel, vn
"arch": arch, "arch": arch,
"apiLevel": apiLevel, "apiLevel": apiLevel,
"apiMap": apiLevelsJson.String(), "apiMap": apiLevelsJson.String(),
"vndk": vndk, "flags": genstubFlags,
}, },
}) })

View File

@@ -165,92 +165,115 @@ class OmitVersionTest(unittest.TestCase):
def test_omit_private(self): def test_omit_private(self):
self.assertFalse( self.assertFalse(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, [], []), 'arm', 9, False)) gsl.Version('foo', None, [], []), 'arm', 9, False, False))
self.assertTrue( self.assertTrue(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo_PRIVATE', None, [], []), 'arm', 9, False)) gsl.Version('foo_PRIVATE', None, [], []), 'arm', 9, False, False))
self.assertTrue( self.assertTrue(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo_PLATFORM', None, [], []), 'arm', 9, False)) gsl.Version('foo_PLATFORM', None, [], []), 'arm', 9, False, False))
self.assertTrue( self.assertTrue(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, ['platform-only'], []), 'arm', 9, gsl.Version('foo', None, ['platform-only'], []), 'arm', 9,
False)) False, False))
def test_omit_vndk(self): def test_omit_vndk(self):
self.assertTrue( self.assertTrue(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, ['vndk'], []), 'arm', 9, False)) gsl.Version('foo', None, ['vndk'], []), 'arm', 9, False, False))
self.assertFalse( self.assertFalse(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, [], []), 'arm', 9, True)) gsl.Version('foo', None, [], []), 'arm', 9, True, False))
self.assertFalse( self.assertFalse(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, ['vndk'], []), 'arm', 9, True)) gsl.Version('foo', None, ['vndk'], []), 'arm', 9, True, False))
def test_omit_apex(self):
self.assertTrue(
gsl.should_omit_version(
gsl.Version('foo', None, ['apex'], []), 'arm', 9, False, False))
self.assertFalse(
gsl.should_omit_version(
gsl.Version('foo', None, [], []), 'arm', 9, False, True))
self.assertFalse(
gsl.should_omit_version(
gsl.Version('foo', None, ['apex'], []), 'arm', 9, False, True))
def test_omit_arch(self): def test_omit_arch(self):
self.assertFalse( self.assertFalse(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, [], []), 'arm', 9, False)) gsl.Version('foo', None, [], []), 'arm', 9, False, False))
self.assertFalse( self.assertFalse(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, ['arm'], []), 'arm', 9, False)) gsl.Version('foo', None, ['arm'], []), 'arm', 9, False, False))
self.assertTrue( self.assertTrue(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, ['x86'], []), 'arm', 9, False)) gsl.Version('foo', None, ['x86'], []), 'arm', 9, False, False))
def test_omit_api(self): def test_omit_api(self):
self.assertFalse( self.assertFalse(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, [], []), 'arm', 9, False)) gsl.Version('foo', None, [], []), 'arm', 9, False, False))
self.assertFalse( self.assertFalse(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, ['introduced=9'], []), 'arm', 9, gsl.Version('foo', None, ['introduced=9'], []), 'arm', 9,
False)) False, False))
self.assertTrue( self.assertTrue(
gsl.should_omit_version( gsl.should_omit_version(
gsl.Version('foo', None, ['introduced=14'], []), 'arm', 9, gsl.Version('foo', None, ['introduced=14'], []), 'arm', 9,
False)) False, False))
class OmitSymbolTest(unittest.TestCase): class OmitSymbolTest(unittest.TestCase):
def test_omit_vndk(self): def test_omit_vndk(self):
self.assertTrue( self.assertTrue(
gsl.should_omit_symbol( gsl.should_omit_symbol(
gsl.Symbol('foo', ['vndk']), 'arm', 9, False)) gsl.Symbol('foo', ['vndk']), 'arm', 9, False, False))
self.assertFalse( self.assertFalse(
gsl.should_omit_symbol(gsl.Symbol('foo', []), 'arm', 9, True)) gsl.should_omit_symbol(gsl.Symbol('foo', []), 'arm', 9, True, False))
self.assertFalse( self.assertFalse(
gsl.should_omit_symbol( gsl.should_omit_symbol(
gsl.Symbol('foo', ['vndk']), 'arm', 9, True)) gsl.Symbol('foo', ['vndk']), 'arm', 9, True, False))
def test_omit_apex(self):
self.assertTrue(
gsl.should_omit_symbol(
gsl.Symbol('foo', ['apex']), 'arm', 9, False, False))
self.assertFalse(
gsl.should_omit_symbol(gsl.Symbol('foo', []), 'arm', 9, False, True))
self.assertFalse(
gsl.should_omit_symbol(
gsl.Symbol('foo', ['apex']), 'arm', 9, False, True))
def test_omit_arch(self): def test_omit_arch(self):
self.assertFalse( self.assertFalse(
gsl.should_omit_symbol(gsl.Symbol('foo', []), 'arm', 9, False)) gsl.should_omit_symbol(gsl.Symbol('foo', []), 'arm', 9, False, False))
self.assertFalse( self.assertFalse(
gsl.should_omit_symbol( gsl.should_omit_symbol(
gsl.Symbol('foo', ['arm']), 'arm', 9, False)) gsl.Symbol('foo', ['arm']), 'arm', 9, False, False))
self.assertTrue( self.assertTrue(
gsl.should_omit_symbol( gsl.should_omit_symbol(
gsl.Symbol('foo', ['x86']), 'arm', 9, False)) gsl.Symbol('foo', ['x86']), 'arm', 9, False, False))
def test_omit_api(self): def test_omit_api(self):
self.assertFalse( self.assertFalse(
gsl.should_omit_symbol(gsl.Symbol('foo', []), 'arm', 9, False)) gsl.should_omit_symbol(gsl.Symbol('foo', []), 'arm', 9, False, False))
self.assertFalse( self.assertFalse(
gsl.should_omit_symbol( gsl.should_omit_symbol(
gsl.Symbol('foo', ['introduced=9']), 'arm', 9, False)) gsl.Symbol('foo', ['introduced=9']), 'arm', 9, False, False))
self.assertTrue( self.assertTrue(
gsl.should_omit_symbol( gsl.should_omit_symbol(
gsl.Symbol('foo', ['introduced=14']), 'arm', 9, False)) gsl.Symbol('foo', ['introduced=14']), 'arm', 9, False, False))
class SymbolFileParseTest(unittest.TestCase): class SymbolFileParseTest(unittest.TestCase):
@@ -262,7 +285,7 @@ class SymbolFileParseTest(unittest.TestCase):
# baz # baz
qux qux
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
self.assertIsNone(parser.current_line) self.assertIsNone(parser.current_line)
self.assertEqual('foo', parser.next_line().strip()) self.assertEqual('foo', parser.next_line().strip())
@@ -287,7 +310,7 @@ class SymbolFileParseTest(unittest.TestCase):
VERSION_2 { VERSION_2 {
} VERSION_1; # asdf } VERSION_1; # asdf
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
parser.next_line() parser.next_line()
version = parser.parse_version() version = parser.parse_version()
@@ -311,7 +334,7 @@ class SymbolFileParseTest(unittest.TestCase):
input_file = io.StringIO(textwrap.dedent("""\ input_file = io.StringIO(textwrap.dedent("""\
VERSION_1 { VERSION_1 {
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
parser.next_line() parser.next_line()
with self.assertRaises(gsl.ParseError): with self.assertRaises(gsl.ParseError):
parser.parse_version() parser.parse_version()
@@ -322,7 +345,7 @@ class SymbolFileParseTest(unittest.TestCase):
foo: foo:
} }
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
parser.next_line() parser.next_line()
with self.assertRaises(gsl.ParseError): with self.assertRaises(gsl.ParseError):
parser.parse_version() parser.parse_version()
@@ -332,7 +355,7 @@ class SymbolFileParseTest(unittest.TestCase):
foo; foo;
bar; # baz qux bar; # baz qux
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
parser.next_line() parser.next_line()
symbol = parser.parse_symbol() symbol = parser.parse_symbol()
@@ -350,7 +373,7 @@ class SymbolFileParseTest(unittest.TestCase):
*; *;
}; };
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
parser.next_line() parser.next_line()
with self.assertRaises(gsl.ParseError): with self.assertRaises(gsl.ParseError):
parser.parse_version() parser.parse_version()
@@ -362,7 +385,7 @@ class SymbolFileParseTest(unittest.TestCase):
*; *;
}; };
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
parser.next_line() parser.next_line()
version = parser.parse_version() version = parser.parse_version()
self.assertEqual([], version.symbols) self.assertEqual([], version.symbols)
@@ -373,7 +396,7 @@ class SymbolFileParseTest(unittest.TestCase):
foo foo
}; };
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
parser.next_line() parser.next_line()
with self.assertRaises(gsl.ParseError): with self.assertRaises(gsl.ParseError):
parser.parse_version() parser.parse_version()
@@ -381,7 +404,7 @@ class SymbolFileParseTest(unittest.TestCase):
def test_parse_fails_invalid_input(self): def test_parse_fails_invalid_input(self):
with self.assertRaises(gsl.ParseError): with self.assertRaises(gsl.ParseError):
input_file = io.StringIO('foo') input_file = io.StringIO('foo')
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
parser.parse() parser.parse()
def test_parse(self): def test_parse(self):
@@ -402,7 +425,7 @@ class SymbolFileParseTest(unittest.TestCase):
qwerty; qwerty;
} VERSION_1; } VERSION_1;
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
versions = parser.parse() versions = parser.parse()
expected = [ expected = [
@@ -418,6 +441,30 @@ class SymbolFileParseTest(unittest.TestCase):
self.assertEqual(expected, versions) self.assertEqual(expected, versions)
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)
class GeneratorTest(unittest.TestCase): class GeneratorTest(unittest.TestCase):
def test_omit_version(self): def test_omit_version(self):
@@ -425,7 +472,7 @@ class GeneratorTest(unittest.TestCase):
# OmitVersionTest, PrivateVersionTest, and SymbolPresenceTest. # OmitVersionTest, PrivateVersionTest, and SymbolPresenceTest.
src_file = io.StringIO() src_file = io.StringIO()
version_file = io.StringIO() version_file = io.StringIO()
generator = gsl.Generator(src_file, version_file, 'arm', 9, False) generator = gsl.Generator(src_file, version_file, 'arm', 9, False, False)
version = gsl.Version('VERSION_PRIVATE', None, [], [ version = gsl.Version('VERSION_PRIVATE', None, [], [
gsl.Symbol('foo', []), gsl.Symbol('foo', []),
@@ -453,7 +500,7 @@ class GeneratorTest(unittest.TestCase):
# SymbolPresenceTest. # SymbolPresenceTest.
src_file = io.StringIO() src_file = io.StringIO()
version_file = io.StringIO() version_file = io.StringIO()
generator = gsl.Generator(src_file, version_file, 'arm', 9, False) generator = gsl.Generator(src_file, version_file, 'arm', 9, False, False)
version = gsl.Version('VERSION_1', None, [], [ version = gsl.Version('VERSION_1', None, [], [
gsl.Symbol('foo', ['x86']), gsl.Symbol('foo', ['x86']),
@@ -476,10 +523,17 @@ class GeneratorTest(unittest.TestCase):
self.assertEqual('', src_file.getvalue()) self.assertEqual('', src_file.getvalue())
self.assertEqual('', version_file.getvalue()) self.assertEqual('', version_file.getvalue())
version = gsl.Version('VERSION_1', None, [], [
gsl.Symbol('foo', ['apex']),
])
generator.write_version(version)
self.assertEqual('', src_file.getvalue())
self.assertEqual('', version_file.getvalue())
def test_write(self): def test_write(self):
src_file = io.StringIO() src_file = io.StringIO()
version_file = io.StringIO() version_file = io.StringIO()
generator = gsl.Generator(src_file, version_file, 'arm', 9, False) generator = gsl.Generator(src_file, version_file, 'arm', 9, False, False)
versions = [ versions = [
gsl.Version('VERSION_1', None, [], [ gsl.Version('VERSION_1', None, [], [
@@ -554,18 +608,19 @@ class IntegrationTest(unittest.TestCase):
VERSION_4 { # versioned=9 VERSION_4 { # versioned=9
wibble; wibble;
wizzes; # vndk wizzes; # vndk
waggle; # apex
} VERSION_2; } VERSION_2;
VERSION_5 { # versioned=14 VERSION_5 { # versioned=14
wobble; wobble;
} VERSION_4; } VERSION_4;
""")) """))
parser = gsl.SymbolFileParser(input_file, api_map, 'arm', 9, False) parser = gsl.SymbolFileParser(input_file, api_map, 'arm', 9, False, False)
versions = parser.parse() versions = parser.parse()
src_file = io.StringIO() src_file = io.StringIO()
version_file = io.StringIO() version_file = io.StringIO()
generator = gsl.Generator(src_file, version_file, 'arm', 9, False) generator = gsl.Generator(src_file, version_file, 'arm', 9, False, False)
generator.write(versions) generator.write(versions)
expected_src = textwrap.dedent("""\ expected_src = textwrap.dedent("""\
@@ -610,12 +665,12 @@ class IntegrationTest(unittest.TestCase):
*; *;
}; };
""")) """))
parser = gsl.SymbolFileParser(input_file, api_map, 'arm', 9001, False) parser = gsl.SymbolFileParser(input_file, api_map, 'arm', 9001, False, False)
versions = parser.parse() versions = parser.parse()
src_file = io.StringIO() src_file = io.StringIO()
version_file = io.StringIO() version_file = io.StringIO()
generator = gsl.Generator(src_file, version_file, 'arm', 9001, False) generator = gsl.Generator(src_file, version_file, 'arm', 9001, False, False)
generator.write(versions) generator.write(versions)
expected_src = textwrap.dedent("""\ expected_src = textwrap.dedent("""\
@@ -658,13 +713,84 @@ class IntegrationTest(unittest.TestCase):
} VERSION_2; } VERSION_2;
""")) """))
parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False) parser = gsl.SymbolFileParser(input_file, {}, 'arm', 16, False, False)
with self.assertRaises(gsl.MultiplyDefinedSymbolError) as cm: with self.assertRaises(gsl.MultiplyDefinedSymbolError) as cm:
parser.parse() parser.parse()
self.assertEquals(['bar', 'foo'], self.assertEquals(['bar', 'foo'],
cm.exception.multiply_defined_symbols) cm.exception.multiply_defined_symbols)
def test_integration_with_apex(self):
api_map = {
'O': 9000,
'P': 9001,
}
input_file = io.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
waggle; # apex
} VERSION_2;
VERSION_5 { # versioned=14
wobble;
} VERSION_4;
"""))
parser = gsl.SymbolFileParser(input_file, api_map, 'arm', 9, False, True)
versions = parser.parse()
src_file = io.StringIO()
version_file = io.StringIO()
generator = gsl.Generator(src_file, version_file, 'arm', 9, False, True)
generator.write(versions)
expected_src = textwrap.dedent("""\
int foo = 0;
void baz() {}
void qux() {}
void wibble() {}
void waggle() {}
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;
waggle;
} VERSION_2;
""")
self.assertEqual(expected_version, version_file.getvalue())
def main(): def main():
suite = unittest.TestLoader().loadTestsFromName(__name__) suite = unittest.TestLoader().loadTestsFromName(__name__)