1#!/usr/bin/env python3 2# coding: utf-8 3 4""" 5Copyright (c) 2023 Huawei Device Co., Ltd. 6Licensed under the Apache License, Version 2.0 (the "License"); 7you may not use this file except in compliance with the License. 8You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12Unless required by applicable law or agreed to in writing, software 13distributed under the License is distributed on an "AS IS" BASIS, 14WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15See the License for the specific language governing permissions and 16limitations under the License. 17 18Description: prepare environment for test 19""" 20 21import logging 22import os 23import shutil 24import tarfile 25import zipfile 26 27import validators 28 29import options 30from utils import is_linux, is_mac, get_time_string, add_executable_permission 31from utils import get_api_version, check_gzip_file, download, get_remote_sdk_name 32 33 34def setup_env(): 35 old_env = os.environ.copy() 36 old_env_path = old_env['PATH'] 37 38 java_home = os.path.join(options.configs.get('deveco_path'), 'jbr') 39 node_js_path = options.configs.get('node_js_path') 40 if is_mac(): 41 node_js_path = os.path.join(node_js_path, 'bin') 42 java_path = os.path.join(java_home, 'bin') 43 44 os.environ['PATH'] = os.pathsep.join( 45 [java_path, node_js_path]) + os.pathsep + old_env_path 46 os.environ['JAVA_HOME'] = java_home 47 48 49def check_deveco_env(): 50 if is_linux(): 51 return False 52 53 java_path = os.path.join(options.configs.get('deveco_path'), 'jbr') 54 if not os.path.exists(java_path): 55 logging.error("Java not found!") 56 return False 57 58 if not os.path.exists(options.configs.get('node_js_path')): 59 logging.error("Node js not found!") 60 return False 61 62 return True 63 64 65def get_sdk_from_remote(sdk_url): 66 deveco_sdk_path = options.configs.get('deveco_sdk_path') 67 temp_floder = deveco_sdk_path + '_temp' 68 sdk_name = get_remote_sdk_name() 69 sdk_zip_path_list = [temp_floder, 'ohos-sdk', 'windows'] 70 if is_mac(): 71 sdk_zip_path_list = [temp_floder, 'sdk', 72 'packages', 'ohos-sdk', 'darwin'] 73 sdk_temp_file = os.path.join(temp_floder, sdk_name) 74 75 if os.path.exists(temp_floder): 76 shutil.rmtree(temp_floder) 77 os.mkdir(temp_floder) 78 download(sdk_url, sdk_temp_file, sdk_name) 79 if not check_gzip_file(sdk_temp_file): 80 logging.error('The downloaded file is not a valid gzip file.') 81 return '', '' 82 with tarfile.open(sdk_temp_file, 'r:gz') as tar: 83 tar.extractall(temp_floder) 84 85 sdk_floder = os.path.join(temp_floder, 'SDK_TEMP') 86 sdk_zip_path = os.path.join(*sdk_zip_path_list) 87 for item in os.listdir(sdk_zip_path): 88 if item != '.DS_Store': 89 logging.info(f'Unpacking {item}') 90 with zipfile.ZipFile(os.path.join(sdk_zip_path, item)) as zip_file: 91 zip_file.extractall(os.path.join(sdk_floder)) 92 logging.info(f'Decompression {item} completed') 93 94 api_version = get_api_version(os.path.join( 95 *[sdk_floder, 'ets', 'oh-uni-package.json'])) 96 return sdk_floder, api_version 97 98 99def update_sdk_to_deveco(sdk_path, api_version): 100 deveco_sdk_path = options.configs.get('deveco_sdk_path') 101 deveco_sdk_version_path = os.path.join(deveco_sdk_path, api_version) 102 for sdk_item in os.listdir(deveco_sdk_path): 103 if sdk_item.startswith(f'{api_version}-'): 104 shutil.rmtree(os.path.join(deveco_sdk_path, sdk_item)) 105 if os.path.exists(deveco_sdk_version_path): 106 shutil.move(deveco_sdk_version_path, 107 deveco_sdk_version_path + '-' + get_time_string()) 108 for item in os.listdir(sdk_path): 109 if item != '.DS_Store': 110 if is_mac(): 111 if item == 'toolchains': 112 add_executable_permission( 113 os.path.join(sdk_path, item, 'restool')) 114 add_executable_permission( 115 os.path.join(sdk_path, item, 'ark_disasm')) 116 elif item == 'ets': 117 add_executable_permission(os.path.join(sdk_path, item, 'build-tools', 118 'ets-loader', 'bin', 'ark', 'build-mac', 'bin', 'es2abc')) 119 add_executable_permission(os.path.join(sdk_path, item, 'build-tools', 120 'ets-loader', 'bin', 'ark', 'build-mac', 'legacy_api8', 'bin', 'js2abc')) 121 elif item == 'js': 122 add_executable_permission(os.path.join(sdk_path, item, 'build-tools', 123 'ace-loader', 'bin', 'ark', 'build-mac', 'bin', 'es2abc')) 124 add_executable_permission(os.path.join(sdk_path, item, 'build-tools', 125 'ace-loader', 'bin', 'ark', 'build-mac', 'legacy_api8', 'bin', 'js2abc')) 126 shutil.move(os.path.join(sdk_path, item), 127 os.path.join(deveco_sdk_version_path, item)) 128 129 130def prepare_sdk(): 131 sdk_arg = options.arguments.sdk_path 132 if sdk_arg == '': 133 return True # use the sdk specified in config.yaml 134 135 api_version = '9' 136 sdk_path = sdk_arg 137 if validators.url(sdk_arg): 138 sdk_path, api_version = get_sdk_from_remote(sdk_arg) 139 140 if not sdk_path or not os.path.exists(sdk_path): 141 return False 142 143 update_sdk_to_deveco(sdk_path, api_version) 144 return True 145 146 147def prepare_image(): 148 if options.arguments.run_haps: 149 return True 150 151 # TODO: 1)download image, 2)flash image 152 153 return True 154 155 156def clean_log(): 157 output_log_file = options.configs.get('log_file') 158 daily_report_file = options.configs.get('output_html_file') 159 if os.path.exists(output_log_file): 160 os.remove(output_log_file) 161 if os.path.exists(daily_report_file): 162 os.remove(daily_report_file) 163 164 165def prepare_test_env(): 166 clean_log() 167 prepared = check_deveco_env() 168 setup_env() 169 prepared = prepared and prepare_sdk() and prepare_image() 170 return prepared 171