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