xref: /aosp_15_r20/external/cronet/build/clobber_unittest.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors
3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
5*6777b538SAndroid Build Coastguard Worker
6*6777b538SAndroid Build Coastguard Workerimport os
7*6777b538SAndroid Build Coastguard Workerimport pathlib
8*6777b538SAndroid Build Coastguard Workerimport shutil
9*6777b538SAndroid Build Coastguard Workerimport sys
10*6777b538SAndroid Build Coastguard Workerimport tempfile
11*6777b538SAndroid Build Coastguard Workerimport textwrap
12*6777b538SAndroid Build Coastguard Workerimport unittest
13*6777b538SAndroid Build Coastguard Workerfrom unittest import mock
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Workerimport clobber
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Workerclass TestExtractBuildCommand(unittest.TestCase):
19*6777b538SAndroid Build Coastguard Worker  def setUp(self):
20*6777b538SAndroid Build Coastguard Worker    self.build_ninja_file, self.build_ninja_path = tempfile.mkstemp(text=True)
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker  def tearDown(self):
23*6777b538SAndroid Build Coastguard Worker    os.close(self.build_ninja_file)
24*6777b538SAndroid Build Coastguard Worker    os.remove(self.build_ninja_path)
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker  def test_normal_extraction(self):
27*6777b538SAndroid Build Coastguard Worker    build_ninja_file_contents = textwrap.dedent("""
28*6777b538SAndroid Build Coastguard Worker        ninja_required_version = 1.7.2
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker        rule gn
31*6777b538SAndroid Build Coastguard Worker          command = ../../buildtools/gn --root=../.. -q --regeneration gen .
32*6777b538SAndroid Build Coastguard Worker          pool = console
33*6777b538SAndroid Build Coastguard Worker          description = Regenerating ninja files
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker        build build.ninja.stamp: gn
36*6777b538SAndroid Build Coastguard Worker          generator = 1
37*6777b538SAndroid Build Coastguard Worker          depfile = build.ninja.d
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker        build build.ninja: phony build.ninja.stamp
40*6777b538SAndroid Build Coastguard Worker          generator = 1
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker        pool build_toolchain_action_pool
43*6777b538SAndroid Build Coastguard Worker          depth = 72
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker        pool build_toolchain_link_pool
46*6777b538SAndroid Build Coastguard Worker          depth = 23
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker        subninja toolchain.ninja
49*6777b538SAndroid Build Coastguard Worker        subninja clang_newlib_x64/toolchain.ninja
50*6777b538SAndroid Build Coastguard Worker        subninja glibc_x64/toolchain.ninja
51*6777b538SAndroid Build Coastguard Worker        subninja irt_x64/toolchain.ninja
52*6777b538SAndroid Build Coastguard Worker        subninja nacl_bootstrap_x64/toolchain.ninja
53*6777b538SAndroid Build Coastguard Worker        subninja newlib_pnacl/toolchain.ninja
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker        build blink_python_tests: phony obj/blink_python_tests.stamp
56*6777b538SAndroid Build Coastguard Worker        build blink_tests: phony obj/blink_tests.stamp
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker        default all
59*6777b538SAndroid Build Coastguard Worker    """)  # Based off of a standard linux build dir.
60*6777b538SAndroid Build Coastguard Worker    with open(self.build_ninja_path, 'w') as f:
61*6777b538SAndroid Build Coastguard Worker      f.write(build_ninja_file_contents)
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker    expected_build_ninja_file_contents = textwrap.dedent("""
64*6777b538SAndroid Build Coastguard Worker        ninja_required_version = 1.7.2
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker        rule gn
67*6777b538SAndroid Build Coastguard Worker          command = ../../buildtools/gn --root=../.. -q --regeneration gen .
68*6777b538SAndroid Build Coastguard Worker          pool = console
69*6777b538SAndroid Build Coastguard Worker          description = Regenerating ninja files
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker        build build.ninja.stamp: gn
72*6777b538SAndroid Build Coastguard Worker          generator = 1
73*6777b538SAndroid Build Coastguard Worker          depfile = build.ninja.d
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker        build build.ninja: phony build.ninja.stamp
76*6777b538SAndroid Build Coastguard Worker          generator = 1
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker    """)
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker    self.assertEqual(clobber.extract_gn_build_commands(self.build_ninja_path),
81*6777b538SAndroid Build Coastguard Worker                     expected_build_ninja_file_contents)
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker  def test_unexpected_format(self):
84*6777b538SAndroid Build Coastguard Worker    # No "build build.ninja:" line should make it return an empty string.
85*6777b538SAndroid Build Coastguard Worker    build_ninja_file_contents = textwrap.dedent("""
86*6777b538SAndroid Build Coastguard Worker        ninja_required_version = 1.7.2
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker        rule gn
89*6777b538SAndroid Build Coastguard Worker          command = ../../buildtools/gn --root=../.. -q --regeneration gen .
90*6777b538SAndroid Build Coastguard Worker          pool = console
91*6777b538SAndroid Build Coastguard Worker          description = Regenerating ninja files
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker        subninja toolchain.ninja
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker        build blink_python_tests: phony obj/blink_python_tests.stamp
96*6777b538SAndroid Build Coastguard Worker        build blink_tests: phony obj/blink_tests.stamp
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker    """)
99*6777b538SAndroid Build Coastguard Worker    with open(self.build_ninja_path, 'w') as f:
100*6777b538SAndroid Build Coastguard Worker      f.write(build_ninja_file_contents)
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker    self.assertEqual(clobber.extract_gn_build_commands(self.build_ninja_path),
103*6777b538SAndroid Build Coastguard Worker                     '')
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker
106*6777b538SAndroid Build Coastguard Workerclass TestDelete(unittest.TestCase):
107*6777b538SAndroid Build Coastguard Worker  def setUp(self):
108*6777b538SAndroid Build Coastguard Worker    self.build_dir = tempfile.mkdtemp()
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker    pathlib.Path(os.path.join(self.build_dir, 'build.ninja')).touch()
111*6777b538SAndroid Build Coastguard Worker    pathlib.Path(os.path.join(self.build_dir, 'build.ninja.d')).touch()
112*6777b538SAndroid Build Coastguard Worker
113*6777b538SAndroid Build Coastguard Worker  def tearDown(self):
114*6777b538SAndroid Build Coastguard Worker    shutil.rmtree(self.build_dir)
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker  def test_delete_build_dir_full(self):
117*6777b538SAndroid Build Coastguard Worker    # Create a dummy file in the build dir and ensure it gets removed.
118*6777b538SAndroid Build Coastguard Worker    dummy_file = os.path.join(self.build_dir, 'dummy')
119*6777b538SAndroid Build Coastguard Worker    pathlib.Path(dummy_file).touch()
120*6777b538SAndroid Build Coastguard Worker
121*6777b538SAndroid Build Coastguard Worker    clobber.delete_build_dir(self.build_dir)
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker    self.assertFalse(os.path.exists(dummy_file))
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker  def test_delete_build_dir_fail(self):
126*6777b538SAndroid Build Coastguard Worker    # Make delete_dir() throw to ensure it's handled gracefully.
127*6777b538SAndroid Build Coastguard Worker
128*6777b538SAndroid Build Coastguard Worker    with mock.patch('clobber._clean_dir', side_effect=OSError):
129*6777b538SAndroid Build Coastguard Worker      with self.assertRaises(OSError):
130*6777b538SAndroid Build Coastguard Worker        clobber.delete_build_dir(self.build_dir)
131*6777b538SAndroid Build Coastguard Worker
132*6777b538SAndroid Build Coastguard Worker  @unittest.skipIf(sys.platform == 'win32', 'Symlinks are not allowed on Windows by default')
133*6777b538SAndroid Build Coastguard Worker  def test_delete_build_dir_link(self):
134*6777b538SAndroid Build Coastguard Worker    with tempfile.TemporaryDirectory() as tmpdir:
135*6777b538SAndroid Build Coastguard Worker      # create a symlink.
136*6777b538SAndroid Build Coastguard Worker      build_dir = os.path.join(tmpdir, 'link')
137*6777b538SAndroid Build Coastguard Worker      os.symlink(self.build_dir, build_dir)
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker      # create a dummy file.
140*6777b538SAndroid Build Coastguard Worker      dummy_file = os.path.join(build_dir, 'dummy')
141*6777b538SAndroid Build Coastguard Worker      pathlib.Path(dummy_file).touch()
142*6777b538SAndroid Build Coastguard Worker      clobber.delete_build_dir(build_dir)
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker      self.assertFalse(os.path.exists(dummy_file))
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
148*6777b538SAndroid Build Coastguard Worker  unittest.main()
149