|  | #!/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) |