| # python3 |
| # Copyright 2021 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import re |
| import unittest |
| |
| from lib import compiler |
| |
| |
| class CompilerTestCase(unittest.TestCase): |
| def assertListSortedEqual(self, a, b, msg=None): |
| a.sort() |
| b.sort() |
| if msg: |
| self.assertListEqual(a, b, msg=msg) |
| else: |
| self.assertListEqual(a, b) |
| |
| def matching_archs(self, matching: str) -> set[str]: |
| return { |
| arch |
| for arch in compiler._RUSTC_ARCH_TO_BUILD_CONDITION |
| if re.search(matching, arch) |
| } |
| |
| def not_matching_archs(self, matching: str) -> set[str]: |
| """The inverse of matching_archs().""" |
| return { |
| arch |
| for arch in compiler._RUSTC_ARCH_TO_BUILD_CONDITION |
| if not re.search(matching, arch) |
| } |
| |
| |
| class TestGnConditions(CompilerTestCase): |
| def test_all_platforms(self): |
| s = compiler.BuildConditionSet(compiler.ArchSet.ALL()) |
| self.assertListSortedEqual([], s.get_gn_conditions()) |
| |
| def test_one_platform(self): |
| for a in compiler.ArchSet.ALL().as_strings(): |
| s = compiler.BuildConditionSet(compiler.ArchSet(initial={a})) |
| mode: compiler.BuildCondition = \ |
| compiler._RUSTC_ARCH_TO_BUILD_CONDITION[a] |
| self.assertListSortedEqual([mode.gn_condition()], |
| s.get_gn_conditions()) |
| |
| def test_os(self): |
| # One OS. |
| for (matching, mode) in [ |
| (compiler._RUSTC_ARCH_MATCH_ANDROID, |
| compiler.BuildCondition.ALL_ANDROID), |
| (compiler._RUSTC_ARCH_MATCH_FUCHSIA, |
| compiler.BuildCondition.ALL_FUCHSIA), |
| (compiler._RUSTC_ARCH_MATCH_IOS, compiler.BuildCondition.ALL_IOS), |
| (compiler._RUSTC_ARCH_MATCH_WINDOWS, |
| compiler.BuildCondition.ALL_WINDOWS), |
| (compiler._RUSTC_ARCH_MATCH_LINUX, |
| compiler.BuildCondition.ALL_LINUX), |
| (compiler._RUSTC_ARCH_MATCH_MAC, compiler.BuildCondition.ALL_MAC), |
| ]: |
| archs = self.matching_archs(matching) |
| s = compiler.BuildConditionSet(compiler.ArchSet(initial=archs)) |
| cond = mode.gn_condition() |
| self.assertListSortedEqual([cond], |
| s.get_gn_conditions(), |
| msg=repr(archs)) |
| |
| # Two OSs. |
| archs = self.matching_archs(compiler._RUSTC_ARCH_MATCH_WINDOWS + r"|" + |
| compiler._RUSTC_ARCH_MATCH_MAC) |
| s = compiler.BuildConditionSet(compiler.ArchSet(initial=archs)) |
| cond1 = compiler.BuildCondition.ALL_WINDOWS.gn_condition() |
| cond2 = compiler.BuildCondition.ALL_MAC.gn_condition() |
| self.assertListSortedEqual([cond1, cond2], s.get_gn_conditions()) |
| |
| # All but one OS. |
| for (matching_os, mode) in [ |
| (compiler._RUSTC_ARCH_MATCH_ANDROID, |
| compiler.BuildCondition.NOT_ANDROID), |
| (compiler._RUSTC_ARCH_MATCH_FUCHSIA, |
| compiler.BuildCondition.NOT_FUCHSIA), |
| (compiler._RUSTC_ARCH_MATCH_IOS, compiler.BuildCondition.NOT_IOS), |
| (compiler._RUSTC_ARCH_MATCH_WINDOWS, |
| compiler.BuildCondition.NOT_WINDOWS), |
| (compiler._RUSTC_ARCH_MATCH_LINUX, |
| compiler.BuildCondition.NOT_LINUX), |
| (compiler._RUSTC_ARCH_MATCH_MAC, compiler.BuildCondition.NOT_MAC), |
| ]: |
| s = compiler.BuildConditionSet( |
| compiler.ArchSet(initial=self.not_matching_archs(matching_os))) |
| cond = mode.gn_condition() |
| self.assertListSortedEqual([cond], s.get_gn_conditions()) |
| |
| def test_one_cpu(self): |
| for (matching, mode) in [ |
| (compiler._RUSTC_ARCH_MATCH_X86, compiler.BuildCondition.ALL_X86), |
| (compiler._RUSTC_ARCH_MATCH_X64, compiler.BuildCondition.ALL_X64), |
| (compiler._RUSTC_ARCH_MATCH_ARM32, |
| compiler.BuildCondition.ALL_ARM32), |
| (compiler._RUSTC_ARCH_MATCH_ARM64, |
| compiler.BuildCondition.ALL_ARM64) |
| ]: |
| s = compiler.BuildConditionSet( |
| compiler.ArchSet(initial=self.matching_archs(matching))) |
| cond = mode.gn_condition() |
| self.assertListSortedEqual([cond], s.get_gn_conditions()) |
| |
| def test_combining_os_and_cpu(self): |
| # One Cpu and one OS (with overlap). |
| archs = self.matching_archs(compiler._RUSTC_ARCH_MATCH_LINUX + r"|" + |
| compiler._RUSTC_ARCH_MATCH_X86) |
| s = compiler.BuildConditionSet(compiler.ArchSet(initial=archs)) |
| cond1 = compiler.BuildCondition.ALL_LINUX.gn_condition() |
| cond2 = compiler.BuildCondition.ALL_X86.gn_condition() |
| self.assertListSortedEqual([cond1, cond2], s.get_gn_conditions()) |
| |
| # One Cpu and one OS (without overlap). |
| archs = self.matching_archs(compiler._RUSTC_ARCH_MATCH_MAC + r"|" + |
| compiler._RUSTC_ARCH_MATCH_X86) |
| s = compiler.BuildConditionSet(compiler.ArchSet(initial=archs)) |
| cond1 = compiler.BuildCondition.ALL_MAC.gn_condition() |
| cond2 = compiler.BuildCondition.ALL_X86.gn_condition() |
| self.assertListSortedEqual([cond1, cond2], s.get_gn_conditions()) |
| |
| def test_invert(self): |
| all = compiler.BuildConditionSet.ALL() |
| none = compiler.BuildConditionSet.EMPTY() |
| self.assertEqual(none, all.inverted()) |
| self.assertEqual(all, none.inverted()) |
| |
| one = compiler.BuildConditionSet( |
| compiler.ArchSet( |
| initial=self.matching_archs(compiler._RUSTC_ARCH_MATCH_MAC))) |
| the_rest = compiler.BuildConditionSet( |
| compiler.ArchSet(initial=self.not_matching_archs( |
| compiler._RUSTC_ARCH_MATCH_MAC))) |
| self.assertListSortedEqual(one.inverted().get_gn_conditions(), |
| the_rest.get_gn_conditions()) |
| |
| |
| class TestCompiler(unittest.TestCase): |
| def test_all_and_one(self): |
| self.assertEqual(len(compiler.ArchSet.ALL().as_strings()), |
| len(compiler._RUSTC_ARCH_TO_BUILD_CONDITION)) |
| self.assertEqual(len(compiler.ArchSet.ONE()), 1) |
| |
| |
| class TestArchSet(CompilerTestCase): |
| def test_construct(self): |
| a = compiler.ArchSet( |
| initial=self.matching_archs(compiler._RUSTC_ARCH_MATCH_ARM32)) |
| self.assertSetEqual({ |
| "armv7-linux-androideabi", |
| "armv7-apple-ios", |
| }, a.as_strings()) |
| |
| a = compiler.ArchSet.EMPTY() |
| self.assertSetEqual(set(), a.as_strings()) |
| |
| a = compiler.ArchSet( |
| initial=self.matching_archs(compiler._RUSTC_ARCH_MATCH_ARM32)) |
| self.assertSetEqual({ |
| "armv7-linux-androideabi", |
| "armv7-apple-ios", |
| }, a.as_strings()) |
| |
| a = compiler.ArchSet( |
| initial=self.matching_archs(compiler._RUSTC_ARCH_MATCH_ARM32)) |
| self.assertTrue(a.has_arch("armv7-linux-androideabi")) |
| self.assertFalse(a.has_arch("i686-pc-windows-msvc")) |
| |
| def test_bool(self): |
| a = compiler.ArchSet.EMPTY() |
| self.assertFalse(bool(a)) |
| |
| a = compiler.ArchSet.ONE() |
| self.assertTrue(bool(a)) |
| |
| a = compiler.ArchSet.ALL() |
| self.assertTrue(bool(a)) |
| |
| def test_eq(self): |
| self.assertEqual(compiler.ArchSet.EMPTY(), compiler.ArchSet.EMPTY()) |
| self.assertEqual(compiler.ArchSet.ONE(), compiler.ArchSet.ONE()) |
| self.assertEqual(compiler.ArchSet.ALL(), compiler.ArchSet.ALL()) |
| |
| def test_len(self): |
| self.assertEqual(len(compiler.ArchSet.EMPTY()), 0) |
| self.assertEqual(len(compiler.ArchSet.ONE()), 1) |
| self.assertEqual(len(compiler.ArchSet.ALL()), |
| len(compiler._RUSTC_ARCH_TO_BUILD_CONDITION)) |
| |
| def test_add_archset(self): |
| a = compiler.ArchSet.EMPTY() |
| a.add_archset(compiler.ArchSet.ALL()) |
| self.assertEqual(a, compiler.ArchSet.ALL()) |
| |
| a = compiler.ArchSet.ONE() |
| a.add_archset(compiler.ArchSet.ALL()) |
| self.assertEqual(a, compiler.ArchSet.ALL()) |
| |
| a = compiler.ArchSet.ALL() |
| a.add_archset(compiler.ArchSet.ALL()) |
| self.assertEqual(a, compiler.ArchSet.ALL()) |
| |
| def test_and(self): |
| a = compiler.ArchSet.EMPTY() |
| a = a & compiler.ArchSet.ALL() |
| self.assertSetEqual(set(), a.as_strings()) |
| |
| a = compiler.ArchSet.EMPTY() |
| a &= compiler.ArchSet.ALL() |
| self.assertSetEqual(set(), a.as_strings()) |
| |
| a = compiler.ArchSet.EMPTY() |
| a = a & compiler.ArchSet.EMPTY() |
| self.assertSetEqual(set(), a.as_strings()) |
| |
| a = compiler.ArchSet.EMPTY() |
| a &= compiler.ArchSet.EMPTY() |
| self.assertSetEqual(set(), a.as_strings()) |
| |
| a = compiler.ArchSet.ALL() |
| a = a & compiler.ArchSet.ALL() |
| self.assertSetEqual(compiler.ArchSet.ALL().as_strings(), a.as_strings()) |
| |
| a = compiler.ArchSet.ALL() |
| a &= compiler.ArchSet.ALL() |
| self.assertSetEqual(compiler.ArchSet.ALL().as_strings(), a.as_strings()) |
| |
| a = compiler.ArchSet.ALL() |
| a = a & compiler.ArchSet.ONE() |
| self.assertSetEqual(compiler.ArchSet.ONE().as_strings(), a.as_strings()) |
| |
| a = compiler.ArchSet.ALL() |
| a &= compiler.ArchSet.ONE() |
| self.assertSetEqual(compiler.ArchSet.ONE().as_strings(), a.as_strings()) |
| |
| a = compiler.ArchSet.ALL() |
| a = a & compiler.ArchSet.EMPTY() |
| self.assertSetEqual(set(), a.as_strings()) |
| |
| a = compiler.ArchSet.ALL() |
| a &= compiler.ArchSet.EMPTY() |
| self.assertSetEqual(set(), a.as_strings()) |