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 mozunit import main
6import unittest
7
8from mozbuild.android_version_code import (
9    android_version_code_v0,
10    android_version_code_v1,
11)
12
13class TestAndroidVersionCode(unittest.TestCase):
14    def test_android_version_code_v0(self):
15        # From https://treeherder.mozilla.org/#/jobs?repo=mozilla-central&revision=e25de9972a77.
16        buildid = '20150708104620'
17        arm_api9  = 2015070819
18        arm_api11 = 2015070821
19        x86_api9  = 2015070822
20        self.assertEqual(android_version_code_v0(buildid, cpu_arch='armeabi', min_sdk=9, max_sdk=None), arm_api9)
21        self.assertEqual(android_version_code_v0(buildid, cpu_arch='armeabi-v7a', min_sdk=11, max_sdk=None), arm_api11)
22        self.assertEqual(android_version_code_v0(buildid, cpu_arch='x86', min_sdk=9, max_sdk=None), x86_api9)
23
24    def test_android_version_code_v1(self):
25        buildid = '20150825141628'
26        arm_api16 =   0b01111000001000000001001001110001
27        arm64_api21 = 0b01111000001000000001001001110100
28        x86_api9  =   0b01111000001000000001001001110100
29        self.assertEqual(android_version_code_v1(buildid, cpu_arch='armeabi-v7a', min_sdk=16, max_sdk=None), arm_api16)
30        self.assertEqual(android_version_code_v1(buildid, cpu_arch='arm64-v8a', min_sdk=21, max_sdk=None), arm64_api21)
31        self.assertEqual(android_version_code_v1(buildid, cpu_arch='x86', min_sdk=9, max_sdk=None), x86_api9)
32
33    def test_android_version_code_v1_underflow(self):
34        '''Verify that it is an error to ask for v1 codes predating the cutoff.'''
35        buildid = '201508010000' # Earliest possible.
36        arm_api9 = 0b01111000001000000000000000000000
37        self.assertEqual(android_version_code_v1(buildid, cpu_arch='armeabi', min_sdk=9, max_sdk=None), arm_api9)
38        with self.assertRaises(ValueError) as cm:
39            underflow = '201507310000' # Latest possible (valid) underflowing date.
40            android_version_code_v1(underflow, cpu_arch='armeabi', min_sdk=9, max_sdk=None)
41        self.assertTrue('underflow' in cm.exception.message)
42
43    def test_android_version_code_v1_running_low(self):
44        '''Verify there is an informative message if one asks for v1 codes that are close to overflow.'''
45        with self.assertRaises(ValueError) as cm:
46            overflow = '20290801000000'
47            android_version_code_v1(overflow, cpu_arch='armeabi', min_sdk=9, max_sdk=None)
48        self.assertTrue('Running out of low order bits' in cm.exception.message)
49
50    def test_android_version_code_v1_overflow(self):
51        '''Verify that it is an error to ask for v1 codes that actually does overflow.'''
52        with self.assertRaises(ValueError) as cm:
53            overflow = '20310801000000'
54            android_version_code_v1(overflow, cpu_arch='armeabi', min_sdk=9, max_sdk=None)
55        self.assertTrue('overflow' in cm.exception.message)
56
57    def test_android_version_code_v0_relative_v1(self):
58        '''Verify that the first v1 code is greater than the equivalent v0 code.'''
59        buildid = '20150801000000'
60        self.assertGreater(android_version_code_v1(buildid, cpu_arch='armeabi', min_sdk=9, max_sdk=None),
61                           android_version_code_v0(buildid, cpu_arch='armeabi', min_sdk=9, max_sdk=None))
62
63
64if __name__ == '__main__':
65    main()
66