2 # Copyright 2023 The Chromium Authors
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
13 from unittest import mock
18 class TestExtractBuildCommand(unittest.TestCase):
20 self.build_ninja_file, self.build_ninja_path = tempfile.mkstemp(text=True)
23 os.close(self.build_ninja_file)
24 os.remove(self.build_ninja_path)
26 def test_normal_extraction(self):
27 build_ninja_file_contents = textwrap.dedent("""
28 ninja_required_version = 1.7.2
31 command = ../../buildtools/gn --root=../.. -q --regeneration gen .
33 description = Regenerating ninja files
35 build build.ninja.stamp: gn
37 depfile = build.ninja.d
39 build build.ninja: phony build.ninja.stamp
42 pool build_toolchain_action_pool
45 pool build_toolchain_link_pool
48 subninja toolchain.ninja
49 subninja clang_newlib_x64/toolchain.ninja
50 subninja glibc_x64/toolchain.ninja
51 subninja irt_x64/toolchain.ninja
52 subninja nacl_bootstrap_x64/toolchain.ninja
53 subninja newlib_pnacl/toolchain.ninja
55 build blink_python_tests: phony obj/blink_python_tests.stamp
56 build blink_tests: phony obj/blink_tests.stamp
59 """) # Based off of a standard linux build dir.
60 with open(self.build_ninja_path, 'w') as f:
61 f.write(build_ninja_file_contents)
63 expected_build_ninja_file_contents = textwrap.dedent("""
64 ninja_required_version = 1.7.2
67 command = ../../buildtools/gn --root=../.. -q --regeneration gen .
69 description = Regenerating ninja files
71 build build.ninja.stamp: gn
73 depfile = build.ninja.d
75 build build.ninja: phony build.ninja.stamp
80 self.assertEqual(clobber.extract_gn_build_commands(self.build_ninja_path),
81 expected_build_ninja_file_contents)
83 def test_unexpected_format(self):
84 # No "build build.ninja:" line should make it return an empty string.
85 build_ninja_file_contents = textwrap.dedent("""
86 ninja_required_version = 1.7.2
89 command = ../../buildtools/gn --root=../.. -q --regeneration gen .
91 description = Regenerating ninja files
93 subninja toolchain.ninja
95 build blink_python_tests: phony obj/blink_python_tests.stamp
96 build blink_tests: phony obj/blink_tests.stamp
99 with open(self.build_ninja_path, 'w') as f:
100 f.write(build_ninja_file_contents)
102 self.assertEqual(clobber.extract_gn_build_commands(self.build_ninja_path),
106 class TestDelete(unittest.TestCase):
108 self.build_dir = tempfile.mkdtemp()
110 pathlib.Path(os.path.join(self.build_dir, 'build.ninja')).touch()
111 pathlib.Path(os.path.join(self.build_dir, 'build.ninja.d')).touch()
114 shutil.rmtree(self.build_dir)
116 def test_delete_build_dir_full(self):
117 # Create a dummy file in the build dir and ensure it gets removed.
118 dummy_file = os.path.join(self.build_dir, 'dummy')
119 pathlib.Path(dummy_file).touch()
121 clobber.delete_build_dir(self.build_dir)
123 self.assertFalse(os.path.exists(dummy_file))
125 def test_delete_build_dir_fail(self):
126 # Make delete_dir() throw to ensure it's handled gracefully.
128 with mock.patch('clobber._clean_dir', side_effect=OSError):
129 with self.assertRaises(OSError):
130 clobber.delete_build_dir(self.build_dir)
132 @unittest.skipIf(sys.platform == 'win32', 'Symlinks are not allowed on Windows by default')
133 def test_delete_build_dir_link(self):
134 with tempfile.TemporaryDirectory() as tmpdir:
136 build_dir = os.path.join(tmpdir, 'link')
137 os.symlink(self.build_dir, build_dir)
139 # create a dummy file.
140 dummy_file = os.path.join(build_dir, 'dummy')
141 pathlib.Path(dummy_file).touch()
142 clobber.delete_build_dir(build_dir)
144 self.assertFalse(os.path.exists(dummy_file))
147 if __name__ == '__main__':