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