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
6
7from mozunit import main
8import unittest
9
10from mozbuild.android_version_code import (
11    android_version_code_v0,
12    android_version_code_v1,
13)
14
15
16class TestAndroidVersionCode(unittest.TestCase):
17    def test_android_version_code_v0(self):
18        # From https://treeherder.mozilla.org/#/jobs?repo=mozilla-central&revision=e25de9972a77.
19        buildid = "20150708104620"
20        arm_api9 = 2015070819
21        arm_api11 = 2015070821
22        x86_api9 = 2015070822
23        self.assertEqual(
24            android_version_code_v0(
25                buildid, cpu_arch="armeabi", min_sdk=9, max_sdk=None
26            ),
27            arm_api9,
28        )
29        self.assertEqual(
30            android_version_code_v0(
31                buildid, cpu_arch="armeabi-v7a", min_sdk=11, max_sdk=None
32            ),
33            arm_api11,
34        )
35        self.assertEqual(
36            android_version_code_v0(buildid, cpu_arch="x86", min_sdk=9, max_sdk=None),
37            x86_api9,
38        )
39
40    def test_android_version_code_v1(self):
41        buildid = "20150825141628"
42        arm_api16 = 0b01111000001000000001001001110001
43        arm64_api21 = 0b01111000001000000001001001110100
44        x86_api9 = 0b01111000001000000001001001110100
45        self.assertEqual(
46            android_version_code_v1(
47                buildid, cpu_arch="armeabi-v7a", min_sdk=16, max_sdk=None
48            ),
49            arm_api16,
50        )
51        self.assertEqual(
52            android_version_code_v1(
53                buildid, cpu_arch="arm64-v8a", min_sdk=21, max_sdk=None
54            ),
55            arm64_api21,
56        )
57        self.assertEqual(
58            android_version_code_v1(buildid, cpu_arch="x86", min_sdk=9, max_sdk=None),
59            x86_api9,
60        )
61
62    def test_android_version_code_v1_underflow(self):
63        """Verify that it is an error to ask for v1 codes predating the cutoff."""
64        buildid = "201508010000"  # Earliest possible.
65        arm_api9 = 0b01111000001000000000000000000000
66        self.assertEqual(
67            android_version_code_v1(
68                buildid, cpu_arch="armeabi", min_sdk=9, max_sdk=None
69            ),
70            arm_api9,
71        )
72        with self.assertRaises(ValueError) as cm:
73            underflow = "201507310000"  # Latest possible (valid) underflowing date.
74            android_version_code_v1(
75                underflow, cpu_arch="armeabi", min_sdk=9, max_sdk=None
76            )
77        self.assertTrue("underflow" in cm.exception.message)
78
79    def test_android_version_code_v1_running_low(self):
80        """Verify there is an informative message if one asks for v1
81        codes that are close to overflow."""
82        with self.assertRaises(ValueError) as cm:
83            overflow = "20290801000000"
84            android_version_code_v1(
85                overflow, cpu_arch="armeabi", min_sdk=9, max_sdk=None
86            )
87        self.assertTrue("Running out of low order bits" in cm.exception.message)
88
89    def test_android_version_code_v1_overflow(self):
90        """Verify that it is an error to ask for v1 codes that actually does overflow."""
91        with self.assertRaises(ValueError) as cm:
92            overflow = "20310801000000"
93            android_version_code_v1(
94                overflow, cpu_arch="armeabi", min_sdk=9, max_sdk=None
95            )
96        self.assertTrue("overflow" in cm.exception.message)
97
98    def test_android_version_code_v0_relative_v1(self):
99        """Verify that the first v1 code is greater than the equivalent v0 code."""
100        buildid = "20150801000000"
101        self.assertGreater(
102            android_version_code_v1(
103                buildid, cpu_arch="armeabi", min_sdk=9, max_sdk=None
104            ),
105            android_version_code_v0(
106                buildid, cpu_arch="armeabi", min_sdk=9, max_sdk=None
107            ),
108        )
109
110
111if __name__ == "__main__":
112    main()
113