1*105f6285SAndroid Build Coastguard Worker# Copyright 2020 Google LLC 2*105f6285SAndroid Build Coastguard Worker# 3*105f6285SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*105f6285SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*105f6285SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*105f6285SAndroid Build Coastguard Worker# 7*105f6285SAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 8*105f6285SAndroid Build Coastguard Worker# 9*105f6285SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*105f6285SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*105f6285SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*105f6285SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*105f6285SAndroid Build Coastguard Worker# limitations under the License. 14*105f6285SAndroid Build Coastguard Worker 15*105f6285SAndroid Build Coastguard Worker"""Test overlay.""" 16*105f6285SAndroid Build Coastguard Worker 17*105f6285SAndroid Build Coastguard Workerfrom __future__ import absolute_import 18*105f6285SAndroid Build Coastguard Workerfrom __future__ import division 19*105f6285SAndroid Build Coastguard Workerfrom __future__ import print_function 20*105f6285SAndroid Build Coastguard Worker 21*105f6285SAndroid Build Coastguard Workerimport os 22*105f6285SAndroid Build Coastguard Workerimport shutil 23*105f6285SAndroid Build Coastguard Workerimport subprocess 24*105f6285SAndroid Build Coastguard Workerimport tempfile 25*105f6285SAndroid Build Coastguard Workerimport unittest 26*105f6285SAndroid Build Coastguard Workerfrom . import config 27*105f6285SAndroid Build Coastguard Workerfrom . import overlay 28*105f6285SAndroid Build Coastguard Workerimport re 29*105f6285SAndroid Build Coastguard Worker 30*105f6285SAndroid Build Coastguard Worker 31*105f6285SAndroid Build Coastguard Workerclass BindOverlayTest(unittest.TestCase): 32*105f6285SAndroid Build Coastguard Worker 33*105f6285SAndroid Build Coastguard Worker def setUp(self): 34*105f6285SAndroid Build Coastguard Worker self.source_dir = tempfile.mkdtemp() 35*105f6285SAndroid Build Coastguard Worker self.destination_dir = tempfile.mkdtemp() 36*105f6285SAndroid Build Coastguard Worker # 37*105f6285SAndroid Build Coastguard Worker # base_dir/ 38*105f6285SAndroid Build Coastguard Worker # base_project/ 39*105f6285SAndroid Build Coastguard Worker # .git 40*105f6285SAndroid Build Coastguard Worker # no_git_dir/ 41*105f6285SAndroid Build Coastguard Worker # no_git_subdir1/ 42*105f6285SAndroid Build Coastguard Worker # no_git_file1 43*105f6285SAndroid Build Coastguard Worker # no_git_subdir2/ 44*105f6285SAndroid Build Coastguard Worker # no_git_file2 45*105f6285SAndroid Build Coastguard Worker # overlays/ 46*105f6285SAndroid Build Coastguard Worker # unittest1/ 47*105f6285SAndroid Build Coastguard Worker # from_dir/ 48*105f6285SAndroid Build Coastguard Worker # .git/ 49*105f6285SAndroid Build Coastguard Worker # upper_subdir/ 50*105f6285SAndroid Build Coastguard Worker # lower_subdir/ 51*105f6285SAndroid Build Coastguard Worker # from_unittest1/ 52*105f6285SAndroid Build Coastguard Worker # .git/ 53*105f6285SAndroid Build Coastguard Worker # from_file 54*105f6285SAndroid Build Coastguard Worker # unittest2/ 55*105f6285SAndroid Build Coastguard Worker # upper_subdir/ 56*105f6285SAndroid Build Coastguard Worker # lower_subdir/ 57*105f6285SAndroid Build Coastguard Worker # from_unittest2/ 58*105f6285SAndroid Build Coastguard Worker # .git/ 59*105f6285SAndroid Build Coastguard Worker # no_git_dir2/ 60*105f6285SAndroid Build Coastguard Worker # no_git_subdir1/ 61*105f6285SAndroid Build Coastguard Worker # no_git_subdir2/ 62*105f6285SAndroid Build Coastguard Worker # .bindmount 63*105f6285SAndroid Build Coastguard Worker # 64*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 'base_dir')) 65*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 'base_dir', 'base_project')) 66*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 'base_dir', 'base_project', '.git')) 67*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 'no_git_dir')) 68*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 'no_git_dir', 'no_git_subdir1')) 69*105f6285SAndroid Build Coastguard Worker open(os.path.join(self.source_dir, 70*105f6285SAndroid Build Coastguard Worker 'no_git_dir', 'no_git_subdir1', 'no_git_file1'), 'a').close() 71*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 'no_git_dir', 'no_git_subdir2')) 72*105f6285SAndroid Build Coastguard Worker open(os.path.join(self.source_dir, 73*105f6285SAndroid Build Coastguard Worker 'no_git_dir', 'no_git_subdir2', 'no_git_file2'), 'a').close() 74*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 'overlays')) 75*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 76*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest1')) 77*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 78*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest1', 'from_dir')) 79*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 80*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest1', 'from_dir', '.git')) 81*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 82*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest1', 'upper_subdir')) 83*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 84*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest1', 'upper_subdir', 85*105f6285SAndroid Build Coastguard Worker 'lower_subdir')) 86*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 87*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest1', 'upper_subdir', 88*105f6285SAndroid Build Coastguard Worker 'lower_subdir', 'from_unittest1')) 89*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 90*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest1', 'upper_subdir', 91*105f6285SAndroid Build Coastguard Worker 'lower_subdir', 'from_unittest1', '.git')) 92*105f6285SAndroid Build Coastguard Worker os.symlink( 93*105f6285SAndroid Build Coastguard Worker os.path.join(self.source_dir, 'overlays', 'unittest1', 94*105f6285SAndroid Build Coastguard Worker 'upper_subdir', 'lower_subdir'), 95*105f6285SAndroid Build Coastguard Worker os.path.join(self.source_dir, 'overlays', 'unittest1', 96*105f6285SAndroid Build Coastguard Worker 'upper_subdir', 'subdir_symlink') 97*105f6285SAndroid Build Coastguard Worker ) 98*105f6285SAndroid Build Coastguard Worker open(os.path.join(self.source_dir, 99*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest1', 'from_file'), 'a').close() 100*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 101*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest2')) 102*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 103*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest2', 'upper_subdir')) 104*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 105*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest2', 'upper_subdir', 106*105f6285SAndroid Build Coastguard Worker 'lower_subdir')) 107*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 108*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest2', 'upper_subdir', 109*105f6285SAndroid Build Coastguard Worker 'lower_subdir', 'from_unittest2')) 110*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 111*105f6285SAndroid Build Coastguard Worker 'overlays', 'unittest2', 'upper_subdir', 112*105f6285SAndroid Build Coastguard Worker 'lower_subdir', 'from_unittest2', '.git')) 113*105f6285SAndroid Build Coastguard Worker 114*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 'overlays', 'no_git_dir2')) 115*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 116*105f6285SAndroid Build Coastguard Worker 'overlays', 'no_git_dir2', 'no_git_subdir1')) 117*105f6285SAndroid Build Coastguard Worker os.mkdir(os.path.join(self.source_dir, 118*105f6285SAndroid Build Coastguard Worker 'overlays', 'no_git_dir2', 'no_git_subdir2')) 119*105f6285SAndroid Build Coastguard Worker open(os.path.join(self.source_dir, 120*105f6285SAndroid Build Coastguard Worker 'overlays', 'no_git_dir2', 'no_git_subdir2', '.bindmount'), 121*105f6285SAndroid Build Coastguard Worker 'a').close() 122*105f6285SAndroid Build Coastguard Worker 123*105f6285SAndroid Build Coastguard Worker def tearDown(self): 124*105f6285SAndroid Build Coastguard Worker shutil.rmtree(self.source_dir) 125*105f6285SAndroid Build Coastguard Worker 126*105f6285SAndroid Build Coastguard Worker def testValidTargetOverlayBinds(self): 127*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 128*105f6285SAndroid Build Coastguard Worker test_config.write( 129*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 130*105f6285SAndroid Build Coastguard Worker '<config>' 131*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 132*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest1"/>' 133*105f6285SAndroid Build Coastguard Worker ' <build_config>' 134*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 135*105f6285SAndroid Build Coastguard Worker ' </build_config>' 136*105f6285SAndroid Build Coastguard Worker ' </target>' 137*105f6285SAndroid Build Coastguard Worker '</config>' 138*105f6285SAndroid Build Coastguard Worker ) 139*105f6285SAndroid Build Coastguard Worker test_config.flush() 140*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 141*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 142*105f6285SAndroid Build Coastguard Worker build_target='unittest', 143*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 144*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 145*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 146*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 'overlays/unittest1/from_dir') 147*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'from_dir') 148*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 149*105f6285SAndroid Build Coastguard Worker self.assertIn(os.path.join(self.source_dir, 'base_dir', 'base_project'), bind_mounts) 150*105f6285SAndroid Build Coastguard Worker 151*105f6285SAndroid Build Coastguard Worker def testValidTargetOverlayBindsAllowedProjects(self): 152*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config, \ 153*105f6285SAndroid Build Coastguard Worker tempfile.NamedTemporaryFile('w+t') as test_allowed_projects: 154*105f6285SAndroid Build Coastguard Worker test_config.write( 155*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 156*105f6285SAndroid Build Coastguard Worker '<config>' 157*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 158*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest1"/>' 159*105f6285SAndroid Build Coastguard Worker ' <build_config allowed_projects_file="%s">' 160*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 161*105f6285SAndroid Build Coastguard Worker ' </build_config>' 162*105f6285SAndroid Build Coastguard Worker ' </target>' 163*105f6285SAndroid Build Coastguard Worker '</config>' % test_allowed_projects.name 164*105f6285SAndroid Build Coastguard Worker ) 165*105f6285SAndroid Build Coastguard Worker test_config.flush() 166*105f6285SAndroid Build Coastguard Worker test_allowed_projects.write( 167*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 168*105f6285SAndroid Build Coastguard Worker '<manifest>' 169*105f6285SAndroid Build Coastguard Worker ' <project name="from_dir" path="overlays/unittest1/from_dir"/>' 170*105f6285SAndroid Build Coastguard Worker '</manifest>' 171*105f6285SAndroid Build Coastguard Worker ) 172*105f6285SAndroid Build Coastguard Worker test_allowed_projects.flush() 173*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 174*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 175*105f6285SAndroid Build Coastguard Worker build_target='unittest', 176*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 177*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 178*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 179*105f6285SAndroid Build Coastguard Worker self.assertIn(os.path.join(self.source_dir, 'from_dir'), bind_mounts) 180*105f6285SAndroid Build Coastguard Worker self.assertNotIn(os.path.join(self.source_dir, 'base_dir', 'base_project'), bind_mounts) 181*105f6285SAndroid Build Coastguard Worker 182*105f6285SAndroid Build Coastguard Worker def testMultipleOverlays(self): 183*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 184*105f6285SAndroid Build Coastguard Worker test_config.write( 185*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 186*105f6285SAndroid Build Coastguard Worker '<config>' 187*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 188*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest1"/>' 189*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest2"/>' 190*105f6285SAndroid Build Coastguard Worker ' <build_config>' 191*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 192*105f6285SAndroid Build Coastguard Worker ' </build_config>' 193*105f6285SAndroid Build Coastguard Worker ' </target>' 194*105f6285SAndroid Build Coastguard Worker '</config>' 195*105f6285SAndroid Build Coastguard Worker ) 196*105f6285SAndroid Build Coastguard Worker test_config.flush() 197*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 198*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 199*105f6285SAndroid Build Coastguard Worker build_target='unittest', 200*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 201*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 202*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 203*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 204*105f6285SAndroid Build Coastguard Worker 'overlays/unittest1/upper_subdir/lower_subdir/from_unittest1') 205*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'upper_subdir/lower_subdir/from_unittest1') 206*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 207*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 208*105f6285SAndroid Build Coastguard Worker 'overlays/unittest2/upper_subdir/lower_subdir/from_unittest2') 209*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 210*105f6285SAndroid Build Coastguard Worker 'upper_subdir/lower_subdir/from_unittest2') 211*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 212*105f6285SAndroid Build Coastguard Worker 213*105f6285SAndroid Build Coastguard Worker def testMultipleOverlaysWithAllowlist(self): 214*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 215*105f6285SAndroid Build Coastguard Worker test_config.write( 216*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 217*105f6285SAndroid Build Coastguard Worker '<config>' 218*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 219*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest1"/>' 220*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest2"/>' 221*105f6285SAndroid Build Coastguard Worker ' <allow_readwrite path="overlays/unittest1/upper_subdir/lower_subdir/from_unittest1"/>' 222*105f6285SAndroid Build Coastguard Worker ' <build_config>' 223*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 224*105f6285SAndroid Build Coastguard Worker ' </build_config>' 225*105f6285SAndroid Build Coastguard Worker ' </target>' 226*105f6285SAndroid Build Coastguard Worker '</config>' 227*105f6285SAndroid Build Coastguard Worker ) 228*105f6285SAndroid Build Coastguard Worker test_config.flush() 229*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 230*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 231*105f6285SAndroid Build Coastguard Worker build_target='unittest', 232*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 233*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 234*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 235*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 236*105f6285SAndroid Build Coastguard Worker 'overlays/unittest1/upper_subdir/lower_subdir/from_unittest1') 237*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'upper_subdir/lower_subdir/from_unittest1') 238*105f6285SAndroid Build Coastguard Worker self.assertEqual( 239*105f6285SAndroid Build Coastguard Worker bind_mounts[bind_destination], 240*105f6285SAndroid Build Coastguard Worker overlay.BindMount(source_dir=bind_source, readonly=False, allows_replacement=False)) 241*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 242*105f6285SAndroid Build Coastguard Worker 'overlays/unittest2/upper_subdir/lower_subdir/from_unittest2') 243*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 244*105f6285SAndroid Build Coastguard Worker 'upper_subdir/lower_subdir/from_unittest2') 245*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 246*105f6285SAndroid Build Coastguard Worker 247*105f6285SAndroid Build Coastguard Worker def testAllowReadWriteNoGitDir(self): 248*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 249*105f6285SAndroid Build Coastguard Worker test_config.write( 250*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 251*105f6285SAndroid Build Coastguard Worker '<config>' 252*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 253*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest1"/>' 254*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest2"/>' 255*105f6285SAndroid Build Coastguard Worker ' <allow_readwrite path="no_git_dir/no_git_subdir1"/>' 256*105f6285SAndroid Build Coastguard Worker ' <build_config>' 257*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 258*105f6285SAndroid Build Coastguard Worker ' </build_config>' 259*105f6285SAndroid Build Coastguard Worker ' </target>' 260*105f6285SAndroid Build Coastguard Worker '</config>' 261*105f6285SAndroid Build Coastguard Worker ) 262*105f6285SAndroid Build Coastguard Worker test_config.flush() 263*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 264*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 265*105f6285SAndroid Build Coastguard Worker build_target='unittest', 266*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 267*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 268*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 269*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 270*105f6285SAndroid Build Coastguard Worker 'no_git_dir/no_git_subdir1') 271*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'no_git_dir/no_git_subdir1') 272*105f6285SAndroid Build Coastguard Worker self.assertIn(bind_destination, bind_mounts) 273*105f6285SAndroid Build Coastguard Worker self.assertEqual( 274*105f6285SAndroid Build Coastguard Worker bind_mounts[bind_destination], 275*105f6285SAndroid Build Coastguard Worker overlay.BindMount(source_dir=bind_source, readonly=False, allows_replacement=False)) 276*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 277*105f6285SAndroid Build Coastguard Worker 'no_git_dir/no_git_subdir2') 278*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 279*105f6285SAndroid Build Coastguard Worker 'no_git_dir/no_git_subdir2') 280*105f6285SAndroid Build Coastguard Worker self.assertIn(bind_destination, bind_mounts) 281*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 282*105f6285SAndroid Build Coastguard Worker 283*105f6285SAndroid Build Coastguard Worker def testValidOverlaidDir(self): 284*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 285*105f6285SAndroid Build Coastguard Worker test_config.write( 286*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 287*105f6285SAndroid Build Coastguard Worker '<config>' 288*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 289*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest1"/>' 290*105f6285SAndroid Build Coastguard Worker ' <build_config>' 291*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 292*105f6285SAndroid Build Coastguard Worker ' </build_config>' 293*105f6285SAndroid Build Coastguard Worker ' </target>' 294*105f6285SAndroid Build Coastguard Worker '</config>' 295*105f6285SAndroid Build Coastguard Worker ) 296*105f6285SAndroid Build Coastguard Worker test_config.flush() 297*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 298*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 299*105f6285SAndroid Build Coastguard Worker build_target='unittest', 300*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir, 301*105f6285SAndroid Build Coastguard Worker destination_dir=self.destination_dir) 302*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 303*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 304*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 'overlays/unittest1/from_dir') 305*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.destination_dir, 'from_dir') 306*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 307*105f6285SAndroid Build Coastguard Worker 308*105f6285SAndroid Build Coastguard Worker def testValidFilesystemViewDirectoryBind(self): 309*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 310*105f6285SAndroid Build Coastguard Worker test_config.write( 311*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 312*105f6285SAndroid Build Coastguard Worker '<config>' 313*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 314*105f6285SAndroid Build Coastguard Worker ' <view name="unittestview"/>' 315*105f6285SAndroid Build Coastguard Worker ' <build_config>' 316*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 317*105f6285SAndroid Build Coastguard Worker ' </build_config>' 318*105f6285SAndroid Build Coastguard Worker ' </target>' 319*105f6285SAndroid Build Coastguard Worker ' <view name="unittestview">' 320*105f6285SAndroid Build Coastguard Worker ' <path source="overlays/unittest1/from_dir" ' 321*105f6285SAndroid Build Coastguard Worker ' destination="to_dir"/>' 322*105f6285SAndroid Build Coastguard Worker ' </view>' 323*105f6285SAndroid Build Coastguard Worker '</config>' 324*105f6285SAndroid Build Coastguard Worker ) 325*105f6285SAndroid Build Coastguard Worker test_config.flush() 326*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 327*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 328*105f6285SAndroid Build Coastguard Worker build_target='unittest', 329*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 330*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 331*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 332*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 'overlays/unittest1/from_dir') 333*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'to_dir') 334*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 335*105f6285SAndroid Build Coastguard Worker 336*105f6285SAndroid Build Coastguard Worker def testValidFilesystemViewFileBind(self): 337*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 338*105f6285SAndroid Build Coastguard Worker test_config.write( 339*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 340*105f6285SAndroid Build Coastguard Worker '<config>' 341*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 342*105f6285SAndroid Build Coastguard Worker ' <view name="unittestview"/>' 343*105f6285SAndroid Build Coastguard Worker ' <build_config>' 344*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 345*105f6285SAndroid Build Coastguard Worker ' </build_config>' 346*105f6285SAndroid Build Coastguard Worker ' </target>' 347*105f6285SAndroid Build Coastguard Worker ' <view name="unittestview">' 348*105f6285SAndroid Build Coastguard Worker ' <path source="overlays/unittest1/from_file" ' 349*105f6285SAndroid Build Coastguard Worker ' destination="to_file"/>' 350*105f6285SAndroid Build Coastguard Worker ' </view>' 351*105f6285SAndroid Build Coastguard Worker '</config>' 352*105f6285SAndroid Build Coastguard Worker ) 353*105f6285SAndroid Build Coastguard Worker test_config.flush() 354*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 355*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 356*105f6285SAndroid Build Coastguard Worker build_target='unittest', 357*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 358*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 359*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 360*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 'overlays/unittest1/from_file') 361*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'to_file') 362*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 363*105f6285SAndroid Build Coastguard Worker 364*105f6285SAndroid Build Coastguard Worker def testInvalidTarget(self): 365*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 366*105f6285SAndroid Build Coastguard Worker test_config.write( 367*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 368*105f6285SAndroid Build Coastguard Worker '<config>' 369*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 370*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest1"/>' 371*105f6285SAndroid Build Coastguard Worker ' <build_config>' 372*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 373*105f6285SAndroid Build Coastguard Worker ' </build_config>' 374*105f6285SAndroid Build Coastguard Worker ' </target>' 375*105f6285SAndroid Build Coastguard Worker '</config>' 376*105f6285SAndroid Build Coastguard Worker ) 377*105f6285SAndroid Build Coastguard Worker test_config.flush() 378*105f6285SAndroid Build Coastguard Worker with self.assertRaises(KeyError): 379*105f6285SAndroid Build Coastguard Worker overlay.BindOverlay( 380*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 381*105f6285SAndroid Build Coastguard Worker build_target='unknown', 382*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 383*105f6285SAndroid Build Coastguard Worker 384*105f6285SAndroid Build Coastguard Worker def testExplicitBindMount(self): 385*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 386*105f6285SAndroid Build Coastguard Worker test_config.write( 387*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 388*105f6285SAndroid Build Coastguard Worker '<config>' 389*105f6285SAndroid Build Coastguard Worker ' <target name="target_name">' 390*105f6285SAndroid Build Coastguard Worker ' <overlay name="no_git_dir2"/>' 391*105f6285SAndroid Build Coastguard Worker ' <build_config>' 392*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 393*105f6285SAndroid Build Coastguard Worker ' </build_config>' 394*105f6285SAndroid Build Coastguard Worker ' </target>' 395*105f6285SAndroid Build Coastguard Worker '</config>' 396*105f6285SAndroid Build Coastguard Worker ) 397*105f6285SAndroid Build Coastguard Worker test_config.flush() 398*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 399*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 400*105f6285SAndroid Build Coastguard Worker build_target='target_name', 401*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 402*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 403*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 404*105f6285SAndroid Build Coastguard Worker 405*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 'overlays/no_git_dir2/no_git_subdir1') 406*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'no_git_subdir1') 407*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 408*105f6285SAndroid Build Coastguard Worker 409*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 'overlays/no_git_dir2/no_git_subdir2') 410*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'no_git_subdir2') 411*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], overlay.BindMount(bind_source, True, False)) 412*105f6285SAndroid Build Coastguard Worker 413*105f6285SAndroid Build Coastguard Worker def testReplacementPath(self): 414*105f6285SAndroid Build Coastguard Worker with tempfile.NamedTemporaryFile('w+t') as test_config: 415*105f6285SAndroid Build Coastguard Worker test_config.write( 416*105f6285SAndroid Build Coastguard Worker '<?xml version="1.0" encoding="UTF-8" ?>' 417*105f6285SAndroid Build Coastguard Worker '<config>' 418*105f6285SAndroid Build Coastguard Worker ' <target name="unittest">' 419*105f6285SAndroid Build Coastguard Worker ' <overlay name="unittest1">' 420*105f6285SAndroid Build Coastguard Worker ' <replacement_path path="from_dir"/>' 421*105f6285SAndroid Build Coastguard Worker ' </overlay>' 422*105f6285SAndroid Build Coastguard Worker ' <build_config>' 423*105f6285SAndroid Build Coastguard Worker ' <goal name="goal_name"/>' 424*105f6285SAndroid Build Coastguard Worker ' </build_config>' 425*105f6285SAndroid Build Coastguard Worker ' </target>' 426*105f6285SAndroid Build Coastguard Worker '</config>' 427*105f6285SAndroid Build Coastguard Worker ) 428*105f6285SAndroid Build Coastguard Worker test_config.flush() 429*105f6285SAndroid Build Coastguard Worker o = overlay.BindOverlay( 430*105f6285SAndroid Build Coastguard Worker cfg=config.factory(test_config.name), 431*105f6285SAndroid Build Coastguard Worker build_target='unittest', 432*105f6285SAndroid Build Coastguard Worker source_dir=self.source_dir) 433*105f6285SAndroid Build Coastguard Worker self.assertIsNotNone(o) 434*105f6285SAndroid Build Coastguard Worker bind_mounts = o.GetBindMounts() 435*105f6285SAndroid Build Coastguard Worker bind_source = os.path.join(self.source_dir, 'overlays/unittest1/from_dir') 436*105f6285SAndroid Build Coastguard Worker bind_destination = os.path.join(self.source_dir, 'from_dir') 437*105f6285SAndroid Build Coastguard Worker self.assertEqual(bind_mounts[bind_destination], 438*105f6285SAndroid Build Coastguard Worker overlay.BindMount(bind_source, True, True)) 439*105f6285SAndroid Build Coastguard Worker 440*105f6285SAndroid Build Coastguard Workerif __name__ == '__main__': 441*105f6285SAndroid Build Coastguard Worker unittest.main() 442