• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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