#!/usr/bin/env python # # Copyright (C) 2020 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # """Unit tests for construct_context.py.""" import sys import unittest import construct_context as cc sys.dont_write_bytecode = True CONTEXT_JSON = { '28': [ { 'Name': 'z', 'Optional': False, 'Host': 'out/zdir/z.jar', 'Device': '/system/z.jar', 'Subcontexts': [], }, ], '29': [ { 'Name': 'x', 'Optional': False, 'Host': 'out/xdir/x.jar', 'Device': '/system/x.jar', 'Subcontexts': [], }, { 'Name': 'y', 'Optional': False, 'Host': 'out/ydir/y.jar', 'Device': '/product/y.jar', 'Subcontexts': [], }, ], 'any': [ { 'Name': 'a', 'Optional': False, 'Host': 'out/adir/a.jar', 'Device': '/system/a.jar', 'Subcontexts': [ { # Not installed optional, being the only child. 'Name': 'a1', 'Optional': True, 'Host': 'out/a1dir/a1.jar', 'Device': '/product/a1.jar', 'Subcontexts': [], }, ], }, { 'Name': 'b', 'Optional': True, 'Host': 'out/bdir/b.jar', 'Device': '/product/b.jar', 'Subcontexts': [ { # Not installed but required. 'Name': 'b1', 'Optional': False, 'Host': 'out/b1dir/b1.jar', 'Device': '/product/b1.jar', 'Subcontexts': [], }, { # Installed optional. 'Name': 'b2', 'Optional': True, 'Host': 'out/b2dir/b2.jar', 'Device': '/product/b2.jar', 'Subcontexts': [], }, { # Not installed optional. 'Name': 'b3', 'Optional': True, 'Host': 'out/b3dir/b3.jar', 'Device': '/product/b3.jar', 'Subcontexts': [], }, { # Installed optional with one more level of nested deps. 'Name': 'b4', 'Optional': True, 'Host': 'out/b4dir/b4.jar', 'Device': '/product/b4.jar', 'Subcontexts': [ { 'Name': 'b41', 'Optional': True, 'Host': 'out/b41dir/b41.jar', 'Device': '/product/b41.jar', 'Subcontexts': [], }, { 'Name': 'b42', 'Optional': True, 'Host': 'out/b42dir/b42.jar', 'Device': '/product/b42.jar', 'Subcontexts': [], }, ], }, ], }, { # Not installed optional, at the top-level. 'Name': 'c', 'Optional': True, 'Host': 'out/cdir/c.jar', 'Device': '/product/c.jar', 'Subcontexts': [], }, ], } PRODUCT_PACKAGES = ['a', 'b', 'b2', 'b4', 'b41', 'b42', 'x', 'y', 'z'] def construct_context_args(target_sdk): return cc.construct_context_args(target_sdk, CONTEXT_JSON, PRODUCT_PACKAGES) class ConstructContextTest(unittest.TestCase): def test_construct_context_27(self): actual = construct_context_args('27') # The order matters. expected = ( 'class_loader_context_arg=' '--class-loader-context=PCL[]{' 'PCL[out/xdir/x.jar]#' 'PCL[out/ydir/y.jar]#' 'PCL[out/zdir/z.jar]#' 'PCL[out/adir/a.jar]#' 'PCL[out/bdir/b.jar]{' 'PCL[out/b1dir/b1.jar]#' 'PCL[out/b2dir/b2.jar]#' 'PCL[out/b4dir/b4.jar]{' 'PCL[out/b41dir/b41.jar]#' 'PCL[out/b42dir/b42.jar]' '}' '}' '}' ' ; ' 'stored_class_loader_context_arg=' '--stored-class-loader-context=PCL[]{' 'PCL[/system/x.jar]#' 'PCL[/product/y.jar]#' 'PCL[/system/z.jar]#' 'PCL[/system/a.jar]#' 'PCL[/product/b.jar]{' 'PCL[/product/b1.jar]#' 'PCL[/product/b2.jar]#' 'PCL[/product/b4.jar]{' 'PCL[/product/b41.jar]#' 'PCL[/product/b42.jar]' '}' '}' '}') self.assertEqual(actual, expected) def test_construct_context_28(self): actual = construct_context_args('28') expected = ( 'class_loader_context_arg=' '--class-loader-context=PCL[]{' 'PCL[out/xdir/x.jar]#' 'PCL[out/ydir/y.jar]#' 'PCL[out/adir/a.jar]#' 'PCL[out/bdir/b.jar]{' 'PCL[out/b1dir/b1.jar]#' 'PCL[out/b2dir/b2.jar]#' 'PCL[out/b4dir/b4.jar]{' 'PCL[out/b41dir/b41.jar]#' 'PCL[out/b42dir/b42.jar]' '}' '}' '}' ' ; ' 'stored_class_loader_context_arg=' '--stored-class-loader-context=PCL[]{' 'PCL[/system/x.jar]#' 'PCL[/product/y.jar]#' 'PCL[/system/a.jar]#' 'PCL[/product/b.jar]{' 'PCL[/product/b1.jar]#' 'PCL[/product/b2.jar]#' 'PCL[/product/b4.jar]{' 'PCL[/product/b41.jar]#' 'PCL[/product/b42.jar]' '}' '}' '}') self.assertEqual(actual, expected) def test_construct_context_29(self): actual = construct_context_args('29') expected = ( 'class_loader_context_arg=' '--class-loader-context=PCL[]{' 'PCL[out/adir/a.jar]#' 'PCL[out/bdir/b.jar]{' 'PCL[out/b1dir/b1.jar]#' 'PCL[out/b2dir/b2.jar]#' 'PCL[out/b4dir/b4.jar]{' 'PCL[out/b41dir/b41.jar]#' 'PCL[out/b42dir/b42.jar]' '}' '}' '}' ' ; ' 'stored_class_loader_context_arg=' '--stored-class-loader-context=PCL[]{' 'PCL[/system/a.jar]#' 'PCL[/product/b.jar]{' 'PCL[/product/b1.jar]#' 'PCL[/product/b2.jar]#' 'PCL[/product/b4.jar]{' 'PCL[/product/b41.jar]#' 'PCL[/product/b42.jar]' '}' '}' '}') self.assertEqual(actual, expected) def test_construct_context_S(self): actual = construct_context_args('S') expected = ( 'class_loader_context_arg=' '--class-loader-context=PCL[]{' 'PCL[out/adir/a.jar]#' 'PCL[out/bdir/b.jar]{' 'PCL[out/b1dir/b1.jar]#' 'PCL[out/b2dir/b2.jar]#' 'PCL[out/b4dir/b4.jar]{' 'PCL[out/b41dir/b41.jar]#' 'PCL[out/b42dir/b42.jar]' '}' '}' '}' ' ; ' 'stored_class_loader_context_arg=' '--stored-class-loader-context=PCL[]{' 'PCL[/system/a.jar]#' 'PCL[/product/b.jar]{' 'PCL[/product/b1.jar]#' 'PCL[/product/b2.jar]#' 'PCL[/product/b4.jar]{' 'PCL[/product/b41.jar]#' 'PCL[/product/b42.jar]' '}' '}' '}') self.assertEqual(actual, expected) if __name__ == '__main__': unittest.main(verbosity=2)