xref: /aosp_15_r20/tools/treble/build/sandbox/overlay_test.py (revision 105f628577ac4ba0e277a494fbb614ed8c12a994)
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