1*c2e18aaaSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*c2e18aaaSAndroid Build Coastguard Worker# 3*c2e18aaaSAndroid Build Coastguard Worker# Copyright 2020, The Android Open Source Project 4*c2e18aaaSAndroid Build Coastguard Worker# 5*c2e18aaaSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*c2e18aaaSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*c2e18aaaSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*c2e18aaaSAndroid Build Coastguard Worker# 9*c2e18aaaSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*c2e18aaaSAndroid Build Coastguard Worker# 11*c2e18aaaSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*c2e18aaaSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*c2e18aaaSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*c2e18aaaSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*c2e18aaaSAndroid Build Coastguard Worker# limitations under the License. 16*c2e18aaaSAndroid Build Coastguard Worker 17*c2e18aaaSAndroid Build Coastguard Worker"""Unittests for AndroidSDK class.""" 18*c2e18aaaSAndroid Build Coastguard Worker 19*c2e18aaaSAndroid Build Coastguard Workerimport unittest 20*c2e18aaaSAndroid Build Coastguard Workerfrom unittest import mock 21*c2e18aaaSAndroid Build Coastguard Worker 22*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import common_util 23*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.sdk import android_sdk 24*c2e18aaaSAndroid Build Coastguard Worker 25*c2e18aaaSAndroid Build Coastguard Worker 26*c2e18aaaSAndroid Build Coastguard Worker# pylint: disable=protected-access 27*c2e18aaaSAndroid Build Coastguard Workerclass AndroidSDKUnittests(unittest.TestCase): 28*c2e18aaaSAndroid Build Coastguard Worker """Unit tests for AndroidSDK class.""" 29*c2e18aaaSAndroid Build Coastguard Worker 30*c2e18aaaSAndroid Build Coastguard Worker def setUp(self): 31*c2e18aaaSAndroid Build Coastguard Worker """Prepare the testdata related path.""" 32*c2e18aaaSAndroid Build Coastguard Worker self.sdk = android_sdk.AndroidSDK() 33*c2e18aaaSAndroid Build Coastguard Worker 34*c2e18aaaSAndroid Build Coastguard Worker def tearDown(self): 35*c2e18aaaSAndroid Build Coastguard Worker """Clear the testdata related path.""" 36*c2e18aaaSAndroid Build Coastguard Worker self.sdk = None 37*c2e18aaaSAndroid Build Coastguard Worker 38*c2e18aaaSAndroid Build Coastguard Worker def test_init(self): 39*c2e18aaaSAndroid Build Coastguard Worker """Test initialize the attributes.""" 40*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.max_api_level, 0) 41*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.max_code_name, None) 42*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.max_folder_name, None) 43*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.platform_mapping, {}) 44*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.android_sdk_path, None) 45*c2e18aaaSAndroid Build Coastguard Worker 46*c2e18aaaSAndroid Build Coastguard Worker def test_parse_max_api_level(self): 47*c2e18aaaSAndroid Build Coastguard Worker """Test _parse_max_api_level.""" 48*c2e18aaaSAndroid Build Coastguard Worker self.sdk._platform_mapping = { 49*c2e18aaaSAndroid Build Coastguard Worker 'android-29': { 50*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 51*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '29', 52*c2e18aaaSAndroid Build Coastguard Worker }, 53*c2e18aaaSAndroid Build Coastguard Worker 'android-28': { 54*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 28, 55*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '28', 56*c2e18aaaSAndroid Build Coastguard Worker }, 57*c2e18aaaSAndroid Build Coastguard Worker } 58*c2e18aaaSAndroid Build Coastguard Worker api_level = self.sdk._parse_max_api_level() 59*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(api_level, 29) 60*c2e18aaaSAndroid Build Coastguard Worker 61*c2e18aaaSAndroid Build Coastguard Worker self.sdk._platform_mapping = { 62*c2e18aaaSAndroid Build Coastguard Worker 'android-28': { 63*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 28, 64*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '28', 65*c2e18aaaSAndroid Build Coastguard Worker }, 66*c2e18aaaSAndroid Build Coastguard Worker 'android-Q': { 67*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 68*c2e18aaaSAndroid Build Coastguard Worker 'code_name': 'Q', 69*c2e18aaaSAndroid Build Coastguard Worker }, 70*c2e18aaaSAndroid Build Coastguard Worker } 71*c2e18aaaSAndroid Build Coastguard Worker api_level = self.sdk._parse_max_api_level() 72*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(api_level, 29) 73*c2e18aaaSAndroid Build Coastguard Worker 74*c2e18aaaSAndroid Build Coastguard Worker def test_parse_max_code_name(self): 75*c2e18aaaSAndroid Build Coastguard Worker """Test _parse_max_code_name.""" 76*c2e18aaaSAndroid Build Coastguard Worker self.sdk._max_api_level = 29 77*c2e18aaaSAndroid Build Coastguard Worker self.sdk._platform_mapping = { 78*c2e18aaaSAndroid Build Coastguard Worker 'android-29': { 79*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 80*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '29', 81*c2e18aaaSAndroid Build Coastguard Worker }, 82*c2e18aaaSAndroid Build Coastguard Worker 'android-28': { 83*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 28, 84*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '28', 85*c2e18aaaSAndroid Build Coastguard Worker }, 86*c2e18aaaSAndroid Build Coastguard Worker } 87*c2e18aaaSAndroid Build Coastguard Worker code_name = self.sdk._parse_max_code_name() 88*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(code_name, '29') 89*c2e18aaaSAndroid Build Coastguard Worker 90*c2e18aaaSAndroid Build Coastguard Worker self.sdk._platform_mapping = { 91*c2e18aaaSAndroid Build Coastguard Worker 'android-29': { 92*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 93*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '29', 94*c2e18aaaSAndroid Build Coastguard Worker }, 95*c2e18aaaSAndroid Build Coastguard Worker 'android-Q': { 96*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 97*c2e18aaaSAndroid Build Coastguard Worker 'code_name': 'Q', 98*c2e18aaaSAndroid Build Coastguard Worker }, 99*c2e18aaaSAndroid Build Coastguard Worker } 100*c2e18aaaSAndroid Build Coastguard Worker code_name = self.sdk._parse_max_code_name() 101*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(code_name, 'Q') 102*c2e18aaaSAndroid Build Coastguard Worker 103*c2e18aaaSAndroid Build Coastguard Worker def test_get_max_folder_name(self): 104*c2e18aaaSAndroid Build Coastguard Worker """Test _get_max_folder_name.""" 105*c2e18aaaSAndroid Build Coastguard Worker self.sdk._max_api_level = 29 106*c2e18aaaSAndroid Build Coastguard Worker self.sdk._max_code_name = '29' 107*c2e18aaaSAndroid Build Coastguard Worker self.sdk._platform_mapping = { 108*c2e18aaaSAndroid Build Coastguard Worker 'android-29': { 109*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 110*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '29', 111*c2e18aaaSAndroid Build Coastguard Worker }, 112*c2e18aaaSAndroid Build Coastguard Worker 'android-28': { 113*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 28, 114*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '28', 115*c2e18aaaSAndroid Build Coastguard Worker }, 116*c2e18aaaSAndroid Build Coastguard Worker } 117*c2e18aaaSAndroid Build Coastguard Worker max_folder_name = self.sdk._get_max_folder_name() 118*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(max_folder_name, 'android-29') 119*c2e18aaaSAndroid Build Coastguard Worker 120*c2e18aaaSAndroid Build Coastguard Worker self.sdk._max_code_name = 'Q' 121*c2e18aaaSAndroid Build Coastguard Worker self.sdk._platform_mapping = { 122*c2e18aaaSAndroid Build Coastguard Worker 'android-29': { 123*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 124*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '29', 125*c2e18aaaSAndroid Build Coastguard Worker }, 126*c2e18aaaSAndroid Build Coastguard Worker 'android-Q': { 127*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 128*c2e18aaaSAndroid Build Coastguard Worker 'code_name': 'Q', 129*c2e18aaaSAndroid Build Coastguard Worker }, 130*c2e18aaaSAndroid Build Coastguard Worker } 131*c2e18aaaSAndroid Build Coastguard Worker max_folder_name = self.sdk._get_max_folder_name() 132*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(max_folder_name, 'android-Q') 133*c2e18aaaSAndroid Build Coastguard Worker 134*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'read_file_content') 135*c2e18aaaSAndroid Build Coastguard Worker def test_parse_api_info(self, mock_read_file): 136*c2e18aaaSAndroid Build Coastguard Worker """Test _parse_api_info.""" 137*c2e18aaaSAndroid Build Coastguard Worker mock_read_file.return_value = '\nAndroidVersion.ApiLevel=29\n' 138*c2e18aaaSAndroid Build Coastguard Worker expected_result = '29', '29' 139*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk._parse_api_info(''), expected_result) 140*c2e18aaaSAndroid Build Coastguard Worker 141*c2e18aaaSAndroid Build Coastguard Worker mock_read_file.return_value = ('\nAndroidVersion.ApiLevel=29\n' 142*c2e18aaaSAndroid Build Coastguard Worker 'AndroidVersion.CodeName=Q\n') 143*c2e18aaaSAndroid Build Coastguard Worker expected_result = '29', 'Q' 144*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk._parse_api_info(''), expected_result) 145*c2e18aaaSAndroid Build Coastguard Worker 146*c2e18aaaSAndroid Build Coastguard Worker mock_read_file.return_value = '' 147*c2e18aaaSAndroid Build Coastguard Worker expected_result = 0, 0 148*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk._parse_api_info(''), expected_result) 149*c2e18aaaSAndroid Build Coastguard Worker 150*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(android_sdk.AndroidSDK, '_parse_api_info') 151*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('glob.glob') 152*c2e18aaaSAndroid Build Coastguard Worker def test_gen_platform_mapping(self, mock_glob, mock_parse_api_info): 153*c2e18aaaSAndroid Build Coastguard Worker """Test _gen_platform_mapping.""" 154*c2e18aaaSAndroid Build Coastguard Worker mock_glob.return_value = ['/sdk/platforms/android-29/source.properties'] 155*c2e18aaaSAndroid Build Coastguard Worker mock_parse_api_info.return_value = 0, 0 156*c2e18aaaSAndroid Build Coastguard Worker test_result = self.sdk._gen_platform_mapping('') 157*c2e18aaaSAndroid Build Coastguard Worker expected_result = {} 158*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(test_result, False) 159*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk._platform_mapping, expected_result) 160*c2e18aaaSAndroid Build Coastguard Worker 161*c2e18aaaSAndroid Build Coastguard Worker mock_parse_api_info.return_value = '29', '29' 162*c2e18aaaSAndroid Build Coastguard Worker test_result = self.sdk._gen_platform_mapping('') 163*c2e18aaaSAndroid Build Coastguard Worker expected_result = { 164*c2e18aaaSAndroid Build Coastguard Worker 'android-29': { 165*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 166*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '29', 167*c2e18aaaSAndroid Build Coastguard Worker } 168*c2e18aaaSAndroid Build Coastguard Worker } 169*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(test_result, True) 170*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk._platform_mapping, expected_result) 171*c2e18aaaSAndroid Build Coastguard Worker 172*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(android_sdk.AndroidSDK, '_gen_platform_mapping') 173*c2e18aaaSAndroid Build Coastguard Worker def test_is_android_sdk_path(self, mock_gen_platform_mapping): 174*c2e18aaaSAndroid Build Coastguard Worker """Test is_android_sdk_path.""" 175*c2e18aaaSAndroid Build Coastguard Worker self.sdk._platform_mapping = { 176*c2e18aaaSAndroid Build Coastguard Worker 'android-29': { 177*c2e18aaaSAndroid Build Coastguard Worker 'api_level': 29, 178*c2e18aaaSAndroid Build Coastguard Worker 'code_name': '29', 179*c2e18aaaSAndroid Build Coastguard Worker }, 180*c2e18aaaSAndroid Build Coastguard Worker } 181*c2e18aaaSAndroid Build Coastguard Worker mock_gen_platform_mapping.return_value = True 182*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.is_android_sdk_path('a/b'), True) 183*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.android_sdk_path, 'a/b') 184*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.max_api_level, 29) 185*c2e18aaaSAndroid Build Coastguard Worker 186*c2e18aaaSAndroid Build Coastguard Worker mock_gen_platform_mapping.return_value = False 187*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.is_android_sdk_path('a/b'), False) 188*c2e18aaaSAndroid Build Coastguard Worker 189*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('builtins.input') 190*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(android_sdk.AndroidSDK, 'is_android_sdk_path') 191*c2e18aaaSAndroid Build Coastguard Worker def test_path_analysis(self, mock_is_sdk_path, mock_input): 192*c2e18aaaSAndroid Build Coastguard Worker """Test path_analysis.""" 193*c2e18aaaSAndroid Build Coastguard Worker mock_is_sdk_path.return_value = True 194*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.path_analysis('a/b'), True) 195*c2e18aaaSAndroid Build Coastguard Worker 196*c2e18aaaSAndroid Build Coastguard Worker mock_is_sdk_path.return_value = False 197*c2e18aaaSAndroid Build Coastguard Worker mock_input.return_value = '' 198*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.path_analysis('a/b'), False) 199*c2e18aaaSAndroid Build Coastguard Worker 200*c2e18aaaSAndroid Build Coastguard Worker mock_is_sdk_path.return_value = False 201*c2e18aaaSAndroid Build Coastguard Worker mock_input.return_value = 'a/b' 202*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.path_analysis('a/b'), False) 203*c2e18aaaSAndroid Build Coastguard Worker 204*c2e18aaaSAndroid Build Coastguard Worker self.sdk._INPUT_QUERY_TIMES = 0 205*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.sdk.path_analysis('a/b'), False) 206*c2e18aaaSAndroid Build Coastguard Worker 207*c2e18aaaSAndroid Build Coastguard Worker 208*c2e18aaaSAndroid Build Coastguard Workerif __name__ == '__main__': 209*c2e18aaaSAndroid Build Coastguard Worker unittest.main() 210