summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/test/test_rewrite_mozbuild.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/test/test_rewrite_mozbuild.py')
-rw-r--r--python/mozbuild/mozbuild/test/test_rewrite_mozbuild.py515
1 files changed, 515 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/test/test_rewrite_mozbuild.py b/python/mozbuild/mozbuild/test/test_rewrite_mozbuild.py
new file mode 100644
index 0000000000..467295c9e9
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/test_rewrite_mozbuild.py
@@ -0,0 +1,515 @@
+# coding: utf-8
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import os
+import tempfile
+import unittest
+
+from mozunit import main
+
+import mozbuild.vendor.rewrite_mozbuild as mu
+
+SAMPLE_PIXMAN_MOZBUILD = """
+if CONFIG['OS_ARCH'] != 'Darwin' and CONFIG['CC_TYPE'] in ('clang', 'gcc'):
+ if CONFIG['HAVE_ARM_NEON']:
+ SOURCES += [
+ "pixman-arm-neon-asm-bilinear.S",
+ "pixman-arm-neon-asm.S",
+ ]
+ if CONFIG['HAVE_ARM_SIMD']:
+ SOURCES += [
+ 'pixman-arm-simd-asm-scaled.S',
+ 'pixman-arm-simd-asm.S']
+
+SOURCES += ['pixman-region32.c',
+ 'pixman-solid-fill.c',
+ 'pixman-trap.c',
+ 'pixman-utils.c',
+ 'pixman-x86.c',
+ 'pixman.c',
+]
+
+if use_sse2:
+ DEFINES['USE_SSE'] = True
+ DEFINES['USE_SSE2'] = True
+ SOURCES += ['pixman-sse2.c']
+ SOURCES['pixman-sse2.c'].flags += CONFIG['SSE_FLAGS'] + CONFIG['SSE2_FLAGS']
+ if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
+ SOURCES['pixman-sse2.c'].flags += ['-Winline']
+"""
+
+SAMPLE_DAV1D_MOZBUILD = """
+SOURCES += [
+ '../../third_party/dav1d/src/cdf.c',
+ '../../third_party/dav1d/src/cpu.c',
+ ]
+EXPORTS = [
+ '../../third_party/dav1d/src/header1.h',
+ '../../third_party/dav1d/src/header2.h',
+ ]
+"""
+
+
+SAMPLE_JPEGXL_MOZBUILD = """
+SOURCES += [
+ "/third_party/jpeg-xl/lib/jxl/ac_strategy.cc",
+ "/third_party/jpeg-xl/lib/jxl/alpha.cc",
+ "/third_party/jpeg-xl/lib/jxl/ans_common.cc",
+ "/third_party/jpeg-xl/lib/jxl/aux_out.cc",
+ ]
+EXPORTS.bob.carol = [
+ "/third_party/jpeg-xl/lib/jxl/header1.hpp",
+ "/third_party/jpeg-xl/lib/jxl/header2.h",
+]
+"""
+
+
+def _make_mozbuild_directory_structure(mozbuild_path, contents):
+ d = tempfile.TemporaryDirectory()
+ os.makedirs(os.path.join(d.name, os.path.split(mozbuild_path)[0]))
+
+ arcconfig = open(os.path.join(d.name, ".arcconfig"), mode="w")
+ arcconfig.close()
+
+ mozbuild = open(os.path.join(d.name, mozbuild_path), mode="w")
+ mozbuild.write(contents)
+ mozbuild.close()
+
+ return d
+
+
+class TestUtils(unittest.TestCase):
+ def test_normalize_filename(self):
+ self.assertEqual(mu.normalize_filename("foo/bar/moz.build", "/"), "/")
+ self.assertEqual(
+ mu.normalize_filename("foo/bar/moz.build", "a.c"), "foo/bar/a.c"
+ )
+ self.assertEqual(
+ mu.normalize_filename("foo/bar/moz.build", "baz/a.c"), "foo/bar/baz/a.c"
+ )
+ self.assertEqual(mu.normalize_filename("foo/bar/moz.build", "/a.c"), "/a.c")
+
+ def test_unnormalize_filename(self):
+ test_vectors = [
+ ("foo/bar/moz.build", "/"),
+ ("foo/bar/moz.build", "a.c"),
+ ("foo/bar/moz.build", "baz/a.c"),
+ ("foo/bar/moz.build", "/a.c"),
+ ]
+
+ for vector in test_vectors:
+ mozbuild, file = vector
+ self.assertEqual(
+ mu.unnormalize_filename(
+ mozbuild, mu.normalize_filename(mozbuild, file)
+ ),
+ file,
+ )
+
+ def test_find_all_posible_assignments_from_filename(self):
+ test_vectors = [
+ # (
+ # target_filename_normalized
+ # source_assignments
+ # expected
+ # )
+ (
+ "root/dir/asm/blah.S",
+ {
+ "> SOURCES": ["root/dir/main.c"],
+ "> if conditional > SOURCES": ["root/dir/asm/blah.S"],
+ },
+ {"> if conditional > SOURCES": ["root/dir/asm/blah.S"]},
+ ),
+ (
+ "root/dir/dostuff.c",
+ {
+ "> SOURCES": ["root/dir/main.c"],
+ "> if conditional > SOURCES": ["root/dir/asm/blah.S"],
+ },
+ {"> SOURCES": ["root/dir/main.c"]},
+ ),
+ ]
+
+ for vector in test_vectors:
+ target_filename_normalized, source_assignments, expected = vector
+ actual = mu.find_all_posible_assignments_from_filename(
+ source_assignments, target_filename_normalized
+ )
+ self.assertEqual(actual, expected)
+
+ def test_filenames_directory_is_in_filename_list(self):
+ test_vectors = [
+ # (
+ # normalized filename
+ # list of normalized_filenames
+ # expected
+ # )
+ ("foo/bar/a.c", ["foo/b.c"], False),
+ ("foo/bar/a.c", ["foo/b.c", "foo/bar/c.c"], True),
+ ("foo/bar/a.c", ["foo/b.c", "foo/bar/baz/d.c"], False),
+ ]
+ for vector in test_vectors:
+ normalized_filename, list_of_normalized_filesnames, expected = vector
+ actual = mu.filenames_directory_is_in_filename_list(
+ normalized_filename, list_of_normalized_filesnames
+ )
+ self.assertEqual(actual, expected)
+
+ def test_guess_best_assignment(self):
+ test_vectors = [
+ # (
+ # filename_normalized
+ # source_assignments
+ # expected
+ # )
+ (
+ "foo/asm_arm.c",
+ {
+ "> SOURCES": ["foo/main.c", "foo/all_utility.c"],
+ "> if ASM > SOURCES": ["foo/asm_x86.c"],
+ },
+ "> if ASM > SOURCES",
+ )
+ ]
+ for vector in test_vectors:
+ normalized_filename, source_assignments, expected = vector
+ actual, _ = mu.guess_best_assignment(
+ source_assignments, normalized_filename
+ )
+ self.assertEqual(actual, expected)
+
+ def test_mozbuild_removing(self):
+ test_vectors = [
+ (
+ "media/dav1d/moz.build",
+ SAMPLE_DAV1D_MOZBUILD,
+ "third_party/dav1d/src/cdf.c",
+ "media/dav1d/",
+ "third-party/dav1d/",
+ " '../../third_party/dav1d/src/cdf.c',\n",
+ ),
+ (
+ "media/dav1d/moz.build",
+ SAMPLE_DAV1D_MOZBUILD,
+ "third_party/dav1d/src/header1.h",
+ "media/dav1d/",
+ "third-party/dav1d/",
+ " '../../third_party/dav1d/src/header1.h',\n",
+ ),
+ (
+ "media/jxl/moz.build",
+ SAMPLE_JPEGXL_MOZBUILD,
+ "third_party/jpeg-xl/lib/jxl/alpha.cc",
+ "media/jxl/",
+ "third-party/jpeg-xl/",
+ ' "/third_party/jpeg-xl/lib/jxl/alpha.cc",\n',
+ ),
+ (
+ "media/jxl/moz.build",
+ SAMPLE_JPEGXL_MOZBUILD,
+ "third_party/jpeg-xl/lib/jxl/header1.hpp",
+ "media/jxl/",
+ "third-party/jpeg-xl/",
+ ' "/third_party/jpeg-xl/lib/jxl/header1.hpp",\n',
+ ),
+ ]
+
+ for vector in test_vectors:
+ (
+ mozbuild_path,
+ mozbuild_contents,
+ file_to_remove,
+ moz_yaml_dir,
+ vendoring_dir,
+ replace_str,
+ ) = vector
+
+ startdir = os.getcwd()
+ try:
+ mozbuild_dir = _make_mozbuild_directory_structure(
+ mozbuild_path, mozbuild_contents
+ )
+ os.chdir(mozbuild_dir.name)
+
+ mu.remove_file_from_moz_build_file(
+ file_to_remove,
+ moz_yaml_dir=moz_yaml_dir,
+ vendoring_dir=vendoring_dir,
+ )
+
+ with open(os.path.join(mozbuild_dir.name, mozbuild_path)) as file:
+ contents = file.read()
+
+ expected_output = mozbuild_contents.replace(replace_str, "")
+ if contents != expected_output:
+ print("File to remove:", file_to_remove)
+ print("Contents:")
+ print("-------------------")
+ print(contents)
+ print("-------------------")
+ print("Expected:")
+ print("-------------------")
+ print(expected_output)
+ print("-------------------")
+ self.assertEqual(contents, expected_output)
+ finally:
+ os.chdir(startdir)
+
+ def test_mozbuild_adding(self):
+ test_vectors = [
+ (
+ "media/dav1d/moz.build",
+ SAMPLE_DAV1D_MOZBUILD,
+ "third_party/dav1d/src/cdf2.c",
+ "media/dav1d/",
+ "third-party/dav1d/",
+ "cdf.c',\n",
+ "cdf.c',\n '../../third_party/dav1d/src/cdf2.c',\n",
+ ),
+ (
+ "media/dav1d/moz.build",
+ SAMPLE_DAV1D_MOZBUILD,
+ "third_party/dav1d/src/header3.h",
+ "media/dav1d/",
+ "third-party/dav1d/",
+ "header2.h',\n",
+ "header2.h',\n '../../third_party/dav1d/src/header3.h',\n",
+ ),
+ (
+ "media/jxl/moz.build",
+ SAMPLE_JPEGXL_MOZBUILD,
+ "third_party/jpeg-xl/lib/jxl/alpha2.cc",
+ "media/jxl/",
+ "third-party/jpeg-xl/",
+ 'alpha.cc",\n',
+ 'alpha.cc",\n "/third_party/jpeg-xl/lib/jxl/alpha2.cc",\n',
+ ),
+ (
+ "media/jxl/moz.build",
+ SAMPLE_JPEGXL_MOZBUILD,
+ "third_party/jpeg-xl/lib/jxl/header3.hpp",
+ "media/jxl/",
+ "third-party/jpeg-xl/",
+ 'header2.h",\n',
+ 'header2.h",\n "/third_party/jpeg-xl/lib/jxl/header3.hpp",\n',
+ ),
+ ]
+
+ for vector in test_vectors:
+ (
+ mozbuild_path,
+ mozbuild_contents,
+ file_to_add,
+ moz_yaml_dir,
+ vendoring_dir,
+ search_str,
+ replace_str,
+ ) = vector
+
+ startdir = os.getcwd()
+ try:
+ mozbuild_dir = _make_mozbuild_directory_structure(
+ mozbuild_path, mozbuild_contents
+ )
+ os.chdir(mozbuild_dir.name)
+
+ mu.add_file_to_moz_build_file(
+ file_to_add, moz_yaml_dir=moz_yaml_dir, vendoring_dir=vendoring_dir
+ )
+
+ with open(os.path.join(mozbuild_dir.name, mozbuild_path)) as file:
+ contents = file.read()
+
+ expected_output = mozbuild_contents.replace(search_str, replace_str)
+ if contents != expected_output:
+ print("File to add:", file_to_add)
+ print("Contents:")
+ print("-------------------")
+ print(contents)
+ print("-------------------")
+ print("Expected:")
+ print("-------------------")
+ print(expected_output)
+ print("-------------------")
+ self.assertEqual(contents, expected_output)
+ finally:
+ os.chdir(startdir)
+
+ # This test is legacy. I'm keeping it around, but new test vectors should be added to the
+ # non-internal test to exercise the public API.
+ def test_mozbuild_adding_internal(self):
+ test_vectors = [
+ # (
+ # mozbuild_contents
+ # unnormalized_filename_to_add,
+ # unnormalized_list_of_files
+ # expected_output
+ # )
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-sse2-more.c",
+ ["pixman-sse2.c"],
+ SAMPLE_PIXMAN_MOZBUILD.replace(
+ "SOURCES += ['pixman-sse2.c']",
+ "SOURCES += ['pixman-sse2-more.c','pixman-sse2.c']",
+ ),
+ ),
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-trap-more.c",
+ [
+ "pixman-region32.c",
+ "pixman-solid-fill.c",
+ "pixman-trap.c",
+ "pixman-utils.c",
+ "pixman-x86.c",
+ "pixman.c",
+ ],
+ SAMPLE_PIXMAN_MOZBUILD.replace(
+ "'pixman-trap.c',", "'pixman-trap-more.c',\n 'pixman-trap.c',"
+ ),
+ ),
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-arm-neon-asm-more.S",
+ ["pixman-arm-neon-asm-bilinear.S", "pixman-arm-neon-asm.S"],
+ SAMPLE_PIXMAN_MOZBUILD.replace(
+ '"pixman-arm-neon-asm.S"',
+ '"pixman-arm-neon-asm-more.S",\n "pixman-arm-neon-asm.S"',
+ ),
+ ),
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-arm-simd-asm-smore.S",
+ ["pixman-arm-simd-asm-scaled.S", "pixman-arm-simd-asm.S"],
+ SAMPLE_PIXMAN_MOZBUILD.replace(
+ "'pixman-arm-simd-asm.S'",
+ "'pixman-arm-simd-asm-smore.S',\n 'pixman-arm-simd-asm.S'",
+ ),
+ ),
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-arm-simd-asn.S",
+ ["pixman-arm-simd-asm-scaled.S", "pixman-arm-simd-asm.S"],
+ SAMPLE_PIXMAN_MOZBUILD.replace(
+ "'pixman-arm-simd-asm.S'",
+ "'pixman-arm-simd-asm.S',\n 'pixman-arm-simd-asn.S'",
+ ),
+ ),
+ ]
+
+ for vector in test_vectors:
+ (
+ mozbuild_contents,
+ unnormalized_filename_to_add,
+ unnormalized_list_of_files,
+ expected_output,
+ ) = vector
+
+ fd, filename = tempfile.mkstemp(text=True)
+ os.close(fd)
+ file = open(filename, mode="w")
+ file.write(mozbuild_contents)
+ file.close()
+
+ mu.edit_moz_build_file_to_add_file(
+ filename, unnormalized_filename_to_add, unnormalized_list_of_files
+ )
+
+ with open(filename) as file:
+ contents = file.read()
+ os.remove(filename)
+
+ if contents != expected_output:
+ print("File to add:", unnormalized_filename_to_add)
+ print("Contents:")
+ print("-------------------")
+ print(contents)
+ print("-------------------")
+ print("Expected:")
+ print("-------------------")
+ print(expected_output)
+ print("-------------------")
+ self.assertEqual(contents, expected_output)
+
+ # This test is legacy. I'm keeping it around, but new test vectors should be added to the
+ # non-internal test to exercise the public API.
+ def test_mozbuild_removing_internal(self):
+ test_vectors = [
+ # (
+ # mozbuild_contents
+ # unnormalized_filename_to_add
+ # expected_output
+ # )
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-sse2.c",
+ SAMPLE_PIXMAN_MOZBUILD.replace(
+ "SOURCES += ['pixman-sse2.c']", "SOURCES += []"
+ ),
+ ),
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-trap.c",
+ SAMPLE_PIXMAN_MOZBUILD.replace(" 'pixman-trap.c',\n", ""),
+ ),
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-arm-neon-asm.S",
+ SAMPLE_PIXMAN_MOZBUILD.replace(
+ ' "pixman-arm-neon-asm.S",\n', ""
+ ),
+ ),
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-arm-simd-asm.S",
+ SAMPLE_PIXMAN_MOZBUILD.replace(
+ " 'pixman-arm-simd-asm.S'", " "
+ ),
+ ),
+ (
+ SAMPLE_PIXMAN_MOZBUILD,
+ "pixman-region32.c",
+ SAMPLE_PIXMAN_MOZBUILD.replace("'pixman-region32.c',", ""),
+ ),
+ ]
+
+ for vector in test_vectors:
+ (
+ mozbuild_contents,
+ unnormalized_filename_to_remove,
+ expected_output,
+ ) = vector
+
+ fd, filename = tempfile.mkstemp(text=True)
+ os.close(fd)
+ file = open(filename, mode="w")
+ file.write(mozbuild_contents)
+ file.close()
+
+ mu.edit_moz_build_file_to_remove_file(
+ filename, unnormalized_filename_to_remove
+ )
+
+ with open(filename) as file:
+ contents = file.read()
+ os.remove(filename)
+
+ if contents != expected_output:
+ print("File to remove:", unnormalized_filename_to_remove)
+ print("Contents:")
+ print("-------------------")
+ print(contents)
+ print("-------------------")
+ print("Expected:")
+ print("-------------------")
+ print(expected_output)
+ print("-------------------")
+ self.assertEqual(contents, expected_output)
+
+
+if __name__ == "__main__":
+ main()