1# This Source Code Form is subject to the terms of the Mozilla Public 2# License, v. 2.0. If a copy of the MPL was not distributed with this 3# file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5from __future__ import absolute_import, print_function, unicode_literals 6 7from mozunit import main 8from mozbuild.util import ( 9 exec_, 10 memoized_property, 11 ReadOnlyNamespace, 12) 13from common import BaseConfigureTest, ConfigureTestSandbox 14 15 16def sandbox_class(platform): 17 class ConfigureTestSandboxOverridingPlatform(ConfigureTestSandbox): 18 @memoized_property 19 def _wrapped_sys(self): 20 sys = {} 21 exec_("from sys import *", sys) 22 sys["platform"] = platform 23 return ReadOnlyNamespace(**sys) 24 25 return ConfigureTestSandboxOverridingPlatform 26 27 28class TargetTest(BaseConfigureTest): 29 def get_target(self, args, env={}): 30 if "linux" in self.HOST: 31 platform = "linux2" 32 elif "mingw" in self.HOST: 33 platform = "win32" 34 elif "openbsd6" in self.HOST: 35 platform = "openbsd6" 36 else: 37 raise Exception("Missing platform for HOST {}".format(self.HOST)) 38 sandbox = self.get_sandbox({}, {}, args, env, cls=sandbox_class(platform)) 39 return sandbox._value_for(sandbox["target"]).alias 40 41 42class TestTargetLinux(TargetTest): 43 def test_target(self): 44 self.assertEqual(self.get_target([]), self.HOST) 45 self.assertEqual(self.get_target(["--target=i686"]), "i686-pc-linux-gnu") 46 self.assertEqual( 47 self.get_target(["--target=i686-unknown-linux-gnu"]), 48 "i686-unknown-linux-gnu", 49 ) 50 self.assertEqual( 51 self.get_target(["--target=i686-pc-mingw32"]), "i686-pc-mingw32" 52 ) 53 54 55class TestTargetWindows(TargetTest): 56 # BaseConfigureTest uses this as the return value for config.guess 57 HOST = "i686-pc-mingw32" 58 59 def test_target(self): 60 self.assertEqual(self.get_target([]), self.HOST) 61 self.assertEqual( 62 self.get_target(["--target=x86_64-pc-mingw32"]), "x86_64-pc-mingw32" 63 ) 64 self.assertEqual(self.get_target(["--target=x86_64"]), "x86_64-pc-mingw32") 65 66 # The tests above are actually not realistic, because most Windows 67 # machines will have a few environment variables that make us not 68 # use config.guess. 69 70 # 32-bits process on x86_64 host. 71 env = { 72 "PROCESSOR_ARCHITECTURE": "x86", 73 "PROCESSOR_ARCHITEW6432": "AMD64", 74 } 75 self.assertEqual(self.get_target([], env), "x86_64-pc-mingw32") 76 self.assertEqual( 77 self.get_target(["--target=i686-pc-mingw32"]), "i686-pc-mingw32" 78 ) 79 self.assertEqual(self.get_target(["--target=i686"]), "i686-pc-mingw32") 80 81 # 64-bits process on x86_64 host. 82 env = { 83 "PROCESSOR_ARCHITECTURE": "AMD64", 84 } 85 self.assertEqual(self.get_target([], env), "x86_64-pc-mingw32") 86 self.assertEqual( 87 self.get_target(["--target=i686-pc-mingw32"]), "i686-pc-mingw32" 88 ) 89 self.assertEqual(self.get_target(["--target=i686"]), "i686-pc-mingw32") 90 91 # 32-bits process on x86 host. 92 env = { 93 "PROCESSOR_ARCHITECTURE": "x86", 94 } 95 self.assertEqual(self.get_target([], env), "i686-pc-mingw32") 96 self.assertEqual( 97 self.get_target(["--target=x86_64-pc-mingw32"]), "x86_64-pc-mingw32" 98 ) 99 self.assertEqual(self.get_target(["--target=x86_64"]), "x86_64-pc-mingw32") 100 101 102class TestTargetAndroid(TargetTest): 103 HOST = "x86_64-pc-linux-gnu" 104 105 def test_target(self): 106 self.assertEqual( 107 self.get_target(["--enable-project=mobile/android"]), 108 "arm-unknown-linux-androideabi", 109 ) 110 self.assertEqual( 111 self.get_target(["--enable-project=mobile/android", "--target=i686"]), 112 "i686-unknown-linux-android", 113 ) 114 self.assertEqual( 115 self.get_target(["--enable-project=mobile/android", "--target=x86_64"]), 116 "x86_64-unknown-linux-android", 117 ) 118 self.assertEqual( 119 self.get_target(["--enable-project=mobile/android", "--target=aarch64"]), 120 "aarch64-unknown-linux-android", 121 ) 122 self.assertEqual( 123 self.get_target(["--enable-project=mobile/android", "--target=arm"]), 124 "arm-unknown-linux-androideabi", 125 ) 126 127 128class TestTargetOpenBSD(TargetTest): 129 # config.guess returns amd64 on OpenBSD, which we need to pass through to 130 # config.sub so that it canonicalizes to x86_64. 131 HOST = "amd64-unknown-openbsd6.4" 132 133 def test_target(self): 134 self.assertEqual(self.get_target([]), "x86_64-unknown-openbsd6.4") 135 136 def config_sub(self, stdin, args): 137 if args[0] == "amd64-unknown-openbsd6.4": 138 return 0, "x86_64-unknown-openbsd6.4", "" 139 return super(TestTargetOpenBSD, self).config_sub(stdin, args) 140 141 142class TestMozConfigure(BaseConfigureTest): 143 def test_nsis_version(self): 144 this = self 145 146 class FakeNSIS(object): 147 def __init__(self, version): 148 self.version = version 149 150 def __call__(self, stdin, args): 151 this.assertEqual(args, ("-version",)) 152 return 0, self.version, "" 153 154 def check_nsis_version(version): 155 sandbox = self.get_sandbox( 156 {"/usr/bin/makensis": FakeNSIS(version)}, 157 {}, 158 ["--target=x86_64-pc-mingw32", "--disable-bootstrap"], 159 {"PATH": "/usr/bin", "MAKENSISU": "/usr/bin/makensis"}, 160 ) 161 return sandbox._value_for(sandbox["nsis_version"]) 162 163 with self.assertRaises(SystemExit): 164 check_nsis_version("v2.5") 165 166 with self.assertRaises(SystemExit): 167 check_nsis_version("v3.0a2") 168 169 self.assertEqual(check_nsis_version("v3.0b1"), "3.0b1") 170 self.assertEqual(check_nsis_version("v3.0b2"), "3.0b2") 171 self.assertEqual(check_nsis_version("v3.0rc1"), "3.0rc1") 172 self.assertEqual(check_nsis_version("v3.0"), "3.0") 173 self.assertEqual(check_nsis_version("v3.0-2"), "3.0") 174 self.assertEqual(check_nsis_version("v3.0.1"), "3.0") 175 self.assertEqual(check_nsis_version("v3.1"), "3.1") 176 177 178if __name__ == "__main__": 179 main() 180