From 909fd7a5a5aad45a02f5ee59a59094021d918b2e Mon Sep 17 00:00:00 2001 From: renxiang Date: Fri, 3 Sep 2021 11:56:20 +0800 Subject: [PATCH] adapt js test framework Signed-off-by: renxiang --- examples/app_info/BUILD.gn | 27 ++ examples/app_info/test/BUILD.gn | 23 ++ .../unittest/common/get_app_info/BUILD.gn | 28 ++ .../common/get_app_info/ExampleJsunit.test.js | 69 +++++ .../unittest/common/get_app_info/config.json | 59 ++++ examples/ohos.build | 2 + libs/js_template/src/main/js/default/app.js | 24 ++ .../src/main/js/default/i18n/en-US.json | 6 + .../src/main/js/default/i18n/zh-CN.json | 6 + .../src/main/js/default/pages/index/index.css | 38 +++ .../src/main/js/default/pages/index/index.hml | 21 ++ .../src/main/js/default/pages/index/index.js | 45 +++ .../src/main/js/default/test/List.test.js | 14 + .../main/resources/base/element/string.json | 12 + .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes signature/openharmony_sx.p7b | Bin 0 -> 3437 bytes src/core/build/build_manager.py | 3 + src/core/build/pretreat_targets.py | 282 ++++++++++++++++++ src/core/constants.py | 48 +++ src/core/driver/drivers.py | 243 +++++++++++++++ src/core/testcase/testcase_manager.py | 3 +- 21 files changed, 952 insertions(+), 1 deletion(-) create mode 100644 examples/app_info/BUILD.gn create mode 100644 examples/app_info/test/BUILD.gn create mode 100644 examples/app_info/test/unittest/common/get_app_info/BUILD.gn create mode 100644 examples/app_info/test/unittest/common/get_app_info/ExampleJsunit.test.js create mode 100644 examples/app_info/test/unittest/common/get_app_info/config.json create mode 100644 libs/js_template/src/main/js/default/app.js create mode 100644 libs/js_template/src/main/js/default/i18n/en-US.json create mode 100644 libs/js_template/src/main/js/default/i18n/zh-CN.json create mode 100644 libs/js_template/src/main/js/default/pages/index/index.css create mode 100644 libs/js_template/src/main/js/default/pages/index/index.hml create mode 100644 libs/js_template/src/main/js/default/pages/index/index.js create mode 100644 libs/js_template/src/main/js/default/test/List.test.js create mode 100644 libs/js_template/src/main/resources/base/element/string.json create mode 100644 libs/js_template/src/main/resources/base/media/icon.png create mode 100644 signature/openharmony_sx.p7b create mode 100644 src/core/build/pretreat_targets.py diff --git a/examples/app_info/BUILD.gn b/examples/app_info/BUILD.gn new file mode 100644 index 0000000..f19459b --- /dev/null +++ b/examples/app_info/BUILD.gn @@ -0,0 +1,27 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/ohos.gni") + +############################################################################### +config("app_info_config") { + visibility = [ ":*" ] + include_dirs = [ "include" ] +} + +ohos_shared_library("app_info") { + sources = [] + public_configs = [ ":app_info_config" ] + subsystem_name = "subsystem_examples" +} +############################################################################### diff --git a/examples/app_info/test/BUILD.gn b/examples/app_info/test/BUILD.gn new file mode 100644 index 0000000..3f38132 --- /dev/null +++ b/examples/app_info/test/BUILD.gn @@ -0,0 +1,23 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/test.gni") + +#################################group######################################### +group("unittest") { + testonly = true + deps = [] + + deps += [ "unittest/common/get_app_info:unittest" ] +} +############################################################################### diff --git a/examples/app_info/test/unittest/common/get_app_info/BUILD.gn b/examples/app_info/test/unittest/common/get_app_info/BUILD.gn new file mode 100644 index 0000000..2b4c186 --- /dev/null +++ b/examples/app_info/test/unittest/common/get_app_info/BUILD.gn @@ -0,0 +1,28 @@ +# Copyright (C) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/test.gni") + +module_output_path = "subsystem_examples/app_info" + +ohos_js_unittest("GetAppInfoJsTest") { + module_out_path = module_output_path + + hap_profile = "./config.json" + certificate_profile = "//test/developertest/signature/openharmony_sx.p7b" +} + +group("unittest") { + testonly = true + deps = [ ":GetAppInfoJsTest" ] +} diff --git a/examples/app_info/test/unittest/common/get_app_info/ExampleJsunit.test.js b/examples/app_info/test/unittest/common/get_app_info/ExampleJsunit.test.js new file mode 100644 index 0000000..26e84e5 --- /dev/null +++ b/examples/app_info/test/unittest/common/get_app_info/ExampleJsunit.test.js @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import app from '@system.app' + +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + +describe("AppInfoTest", function () { + beforeAll(function() { + /* + * @tc.setup: setup invoked before all testcases + */ + console.info('beforeAll caled') + }) + + afterAll(function() { + /* + * @tc.teardown: teardown invoked after all testcases + */ + console.info('afterAll caled') + }) + + beforeEach(function() { + /* + * @tc.setup: setup invoked before each testcases + */ + console.info('beforeEach caled') + }) + + afterEach(function() { + /* + * @tc.teardown: teardown invoked after each testcases + */ + console.info('afterEach caled') + }) + + /* + * @tc.name:appInfoTest001 + * @tc.desc:verify app info is not null + * @tc.author:renxiang + */ + it("appInfoTest001", 0, function () { + var info = app.getInfo() + expect(info != null).assertEqual(true) + }) + + /* + * @tc.name:appInfoTest002 + * @tc.desc:verify app info name and code + * @tc.author:renxiang + */ + it("appInfoTest002", 0, function () { + var info = app.getInfo() + expect(info.versionName).assertEqual('') + expect(info.versionCode).assertEqual('0') + }) + +}) diff --git a/examples/app_info/test/unittest/common/get_app_info/config.json b/examples/app_info/test/unittest/common/get_app_info/config.json new file mode 100644 index 0000000..9889c14 --- /dev/null +++ b/examples/app_info/test/unittest/common/get_app_info/config.json @@ -0,0 +1,59 @@ +{ + "app": { + "bundleName": "com.example.myapplication", + "vendor": "example", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 4, + "target": 5 + } + }, + "deviceConfig": {}, + "module": { + "package": "com.example.myapplication", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "name": "com.example.myapplication.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "MyApplication", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } +} diff --git a/examples/ohos.build b/examples/ohos.build index ba3c3da..8bea016 100755 --- a/examples/ohos.build +++ b/examples/ohos.build @@ -3,11 +3,13 @@ "parts": { "subsystem_examples": { "module_list": [ + "//test/developertest/examples/app_info:app_info", "//test/developertest/examples/detector:detector", "//test/developertest/examples/calculator:calculator", "//test/developertest/examples/calculator:calculator_static" ], "test_list": [ + "//test/developertest/examples/app_info/test:unittest", "//test/developertest/examples/calculator/test:unittest", "//test/developertest/examples/calculator/test:fuzztest", "//test/developertest/examples/detector/test:unittest", diff --git a/libs/js_template/src/main/js/default/app.js b/libs/js_template/src/main/js/default/app.js new file mode 100644 index 0000000..83cc355 --- /dev/null +++ b/libs/js_template/src/main/js/default/app.js @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import device from '@system.device'; + +export default { + onCreate() { + console.info('AceApplication onCreate'); + }, + onDestroy() { + console.info('AceApplication onDestroy'); + } +}; diff --git a/libs/js_template/src/main/js/default/i18n/en-US.json b/libs/js_template/src/main/js/default/i18n/en-US.json new file mode 100644 index 0000000..e63c70d --- /dev/null +++ b/libs/js_template/src/main/js/default/i18n/en-US.json @@ -0,0 +1,6 @@ +{ + "strings": { + "hello": "Hello", + "world": "World" + } +} \ No newline at end of file diff --git a/libs/js_template/src/main/js/default/i18n/zh-CN.json b/libs/js_template/src/main/js/default/i18n/zh-CN.json new file mode 100644 index 0000000..de6ee57 --- /dev/null +++ b/libs/js_template/src/main/js/default/i18n/zh-CN.json @@ -0,0 +1,6 @@ +{ + "strings": { + "hello": "您好", + "world": "世界" + } +} \ No newline at end of file diff --git a/libs/js_template/src/main/js/default/pages/index/index.css b/libs/js_template/src/main/js/default/pages/index/index.css new file mode 100644 index 0000000..a6053c6 --- /dev/null +++ b/libs/js_template/src/main/js/default/pages/index/index.css @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + left: 0px; + top: 0px; + width: 100%; + height: 100%; +} + +.title { + font-size: 60px; + text-align: center; + width: 100%; + height: 40%; + margin: 10px; +} +.btn { + width: 50%; + height: 100px; + font-size: 40px; +} diff --git a/libs/js_template/src/main/js/default/pages/index/index.hml b/libs/js_template/src/main/js/default/pages/index/index.hml new file mode 100644 index 0000000..6069a04 --- /dev/null +++ b/libs/js_template/src/main/js/default/pages/index/index.hml @@ -0,0 +1,21 @@ + + +
+ + {{ $t('strings.hello') }} {{title}} + + +
diff --git a/libs/js_template/src/main/js/default/pages/index/index.js b/libs/js_template/src/main/js/default/pages/index/index.js new file mode 100644 index 0000000..37d3d82 --- /dev/null +++ b/libs/js_template/src/main/js/default/pages/index/index.js @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import app from '@system.app' + +import {Core, ExpectExtend} from 'deccjsunit/index' + +export default { + data: { + title: "" + }, + onInit() { + this.title = this.$t('strings.world'); + }, + onShow() { + console.info('onShow finish') + const core = Core.getInstance() + const expectExtend = new ExpectExtend({ + 'id': 'extend' + }) + + core.addService('expect', expectExtend) + core.init() + + const configService = core.getDefaultService('config') + configService.setConfig(this) + + require('../../test/List.test') + core.execute() + }, + onReady() { + }, +} diff --git a/libs/js_template/src/main/js/default/test/List.test.js b/libs/js_template/src/main/js/default/test/List.test.js new file mode 100644 index 0000000..b12d92d --- /dev/null +++ b/libs/js_template/src/main/js/default/test/List.test.js @@ -0,0 +1,14 @@ +/* + * Copyright (C) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/libs/js_template/src/main/resources/base/element/string.json b/libs/js_template/src/main/resources/base/element/string.json new file mode 100644 index 0000000..76e501f --- /dev/null +++ b/libs/js_template/src/main/resources/base/element/string.json @@ -0,0 +1,12 @@ +{ + "string": [ + { + "name": "app_name", + "value": "JsHelloWorld" + }, + { + "name": "mainability_description", + "value": "hap sample empty page" + } + ] +} \ No newline at end of file diff --git a/libs/js_template/src/main/resources/base/media/icon.png b/libs/js_template/src/main/resources/base/media/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 literal 0 HcmV?d00001 diff --git a/src/core/build/build_manager.py b/src/core/build/build_manager.py index 0419255..839da9a 100755 --- a/src/core/build/build_manager.py +++ b/src/core/build/build_manager.py @@ -21,6 +21,7 @@ from xdevice import platform_logger from core.utils import scan_support_product from core.config.config_manager import UserConfigManager from core.build.select_targets import SelectTargets +from core.build.pretreat_targets import PretreatTargets from core.build.build_testcases import BuildTestcases from core.command.gen import Gen @@ -95,6 +96,7 @@ class BuildManager(object): LOG.warning("No build target found.") return False + PretreatTargets(target_list).pretreat_targets_from_list() build_cfg_filepath = os.path.join(project_root_path, "test", "developertest", @@ -111,6 +113,7 @@ class BuildManager(object): para.productform, "make_temp_test") self._make_gn_file(build_cfg_filepath, []) + PretreatTargets(target_list).disassemble_targets_from_list() return build_result diff --git a/src/core/build/pretreat_targets.py b/src/core/build/pretreat_targets.py new file mode 100644 index 0000000..bc6e9dc --- /dev/null +++ b/src/core/build/pretreat_targets.py @@ -0,0 +1,282 @@ +#!/usr/bin/env python3 +# coding=utf-8 + +# +# Copyright (c) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os +import sys +import json +import shutil + +from core.constants import JsTestConst +from xdevice import platform_logger + +LOG = platform_logger("PretreatTargets") + + +############################################################################## +############################################################################## + +class PretreatTargets(object): + def __init__(self, target_list): + self.target_list = target_list + + def pretreat_targets_from_list(self): + path_list, name_list = self.parse_target_info() + self.pretreat_by_target_name(path_list, name_list) + + def disassemble_targets_from_list(self): + path_list, name_list = self.parse_target_info() + self.disassemble_by_target_name(path_list, name_list) + + def parse_target_info(self): + path_list = [] + name_list = [] + + for line in self.target_list: + path = line.split(':')[0][2:] + name = line.split(':')[1].split('(')[0] + path_list.append(path) + name_list.append(name) + + LOG.info("path_list: %s" % path_list) + LOG.info("name_list: %s" % name_list) + return path_list, name_list + + def pretreat_by_target_name(self, path_list, name_list): + for name, path in zip(name_list, path_list): + LOG.info("name: %s path: %s" % (name, path)) + if name.endswith("JsTest"): + self.pretreat_js_target(path, name) + LOG.info("js test pretreat success") + + def pretreat_js_target(self, path, name): + template_path = os.path.join(sys.framework_root_dir, "libs", + "js_template", "src") + target_path = os.path.join(sys.source_code_root_path, path) + config_path = os.path.join(target_path, "config.json") + gn_path = os.path.join(target_path, "BUILD.gn") + gn_bak_path = os.path.join(target_path, "BuildBak") + test_path = os.path.join(target_path, "src", "main", "js", + "default", "test") + if not os.path.exists(config_path): + LOG.error("js test needs config.json file") + return + if not os.path.exists(gn_path): + LOG.error("js test needs BUILD.gn file") + return + LOG.info("template_path: %s" % template_path) + LOG.info("target_path: %s" % target_path) + + #modify BUILD.gn file to compile hap + output_path = self.parse_output_path_in_gn(gn_path) + if output_path == "": + LOG.error(" BUILD.gn needs 'module_output_path'") + return + os.rename(gn_path, gn_bak_path) + template_args = {'output_path': output_path, 'suite_name': name} + with open(gn_path, 'w') as filehandle: + filehandle.write(JsTestConst.BUILD_GN_FILE_TEMPLATE % + template_args) + + #copy js hap template to target path + shutil.copytree(template_path, os.path.join(target_path, "src")) + shutil.copy(config_path, os.path.join(target_path, "src", "main")) + file_name = os.listdir(target_path) + for file in file_name: + LOG.info("file: %s" % file) + if file.endswith(".js"): + shutil.copy(os.path.join(target_path, file), test_path) + with open(os.path.join(test_path, "List.test.js"), 'a') \ + as list_data: + list_data.write("require('./%s')" % file) + + def parse_output_path_in_gn(self, gn_path): + output_path = "" + with open(gn_path, 'r') as gn_file: + for line in gn_file.readlines(): + if line.startswith("module_output_path"): + LOG.info("output path: %s" % line.split()[2].strip('"')) + output_path = line.split()[2].strip('"') + break + return output_path + + def disassemble_by_target_name(self, path_list, name_list): + for name, path in zip(name_list, path_list): + LOG.info("name: %s path: %s" % (name, path)) + if name.endswith("JsTest"): + self.disassemble_js_target(path, name) + LOG.info("js test disassemble success") + + def disassemble_js_target(self, path, name): + target_path = os.path.join(sys.source_code_root_path, path) + src_path = os.path.join(target_path, "src") + gn_path = os.path.join(target_path, "BUILD.gn") + gn_bak_path = os.path.join(target_path, "BuildBak") + + if os.path.exists(src_path): + shutil.rmtree(src_path) + if os.path.exists(gn_path) and os.path.exists(gn_bak_path): + os.remove(gn_path) + os.rename(gn_bak_path, gn_path) + + + @classmethod + def _get_mlf_data_from_file(cls, filepath): + data_list = [] + if os.path.exists(filepath): + with open(filepath, 'r') as mlf_file: + data_list = json.load(mlf_file) + if not data_list: + LOG.warning("The %s file load error." % filepath) + data_list = [] + return data_list + + @classmethod + def _get_part_path_data(cls, productform): + part_path_dic = {} + parser = ParsePartsConfig(productform) + + part_infos = parser.get_part_infos() + if part_infos is None: + LOG.error("part_infos is None.") + return part_path_dic + + for part_name in part_infos: + part_info = part_infos.get(part_name, None) + if part_info is None: + continue + + origin_part_name = part_info.get("origin_part_name") + build_out_dir = part_info.get("build_out_dir") + + part_path_list = [] + default_part_path = os.path.join( + get_build_output_path(productform), + "module_list_files", + origin_part_name) + if os.path.exists(default_part_path): + part_path_list.append(default_part_path) + + if build_out_dir != ".": + product_part_path = os.path.join( + get_build_output_path(productform), + build_out_dir, + "module_list_files", + origin_part_name) + if os.path.exists(product_part_path): + part_path_list.append(product_part_path) + part_path_dic[part_name] = part_path_list + return part_path_dic + + def _get_target_list_from_path(self, typelist, check_path): + target_list = [] + if os.path.exists(check_path): + mlf_file_list = get_file_list_by_postfix( + check_path, ".mlf") + for filepath in mlf_file_list: + mlf_info_list = self._get_mlf_data_from_file(filepath) + for data in mlf_info_list: + test_type = data.get("test_type") + target_path = data.get("label") + if "ALL" in typelist: + target_list.append(target_path) + continue + if test_type in typelist: + target_list.append(target_path) + return target_list + + def _get_target_list_by_type(self, productform, typelist): + target_list = [] + part_path_dic = self._get_part_path_data(productform) + for item in part_path_dic: + part_path_list = part_path_dic.get(item) + for part_path in part_path_list: + print("part_path = %s" % part_path) + temp_list = self._get_target_list_from_path(typelist, + part_path) + target_list.extend(temp_list) + return target_list + + def _get_target_list_by_part(self, productform, typelist, partlist): + target_list = [] + part_path_dic = self._get_part_path_data(productform) + for partname in partlist: + part_path_list = part_path_dic.get(partname, []) + for part_path in part_path_list: + temp_list = self._get_target_list_from_path(typelist, + part_path) + target_list.extend(temp_list) + return target_list + + def _get_target_list_by_module(self, productform, typelist, partlist, + testmodule): + target_list = [] + part_path_dic = self._get_part_path_data(productform) + for partname in partlist: + part_path_list = part_path_dic.get(partname, []) + for part_path in part_path_list: + module_path = os.path.join(part_path, testmodule) + LOG.info("module_path = %s." % module_path) + if os.path.exists(module_path): + temp_list = self._get_target_list_from_path(typelist, + module_path) + target_list.extend(temp_list) + return target_list + + def get_build_targets(self, productform, typelist, partlist, testmodule): + target_list = [] + + if productform == "" or len(typelist) == 0: + LOG.warning("Error: productform or typelist is empty.") + return [] + + if len(partlist) == 0 and testmodule != "": + LOG.warning( + "The part cannot be empty When the module is not empty.") + return [] + + if len(partlist) == 0 and testmodule == "": + target_list = self._get_target_list_by_type(productform, typelist) + return target_list + + if len(partlist) != 0 and testmodule == "": + target_list = self._get_target_list_by_part(productform, typelist, + partlist) + return target_list + + if len(partlist) != 0 and testmodule != "": + target_list = self._get_target_list_by_module(productform, + typelist, + partlist, + testmodule) + + return target_list + + def filter_build_targets(self, para): + productform = para.productform + typelist = para.testtype + partlist = para.partname_list + testmodule = para.testmodule + + print("partlist = %s" % str(partlist)) + target_list = self.get_build_targets(productform, typelist, + partlist, testmodule) + return target_list + + +############################################################################## +############################################################################## diff --git a/src/core/constants.py b/src/core/constants.py index 29dc0c4..a1a3187 100755 --- a/src/core/constants.py +++ b/src/core/constants.py @@ -75,3 +75,51 @@ class ConfigFileConst(object): def user_config_file(self): return ConfigFileConst.USERCONFIG_FILEPATH + +class JsTestConst(object): + BUILD_GN_FILE_TEMPLATE = """\ +# Copyright (C) 2021 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build/test.gni") + +module_output_path = "%(output_path)s" + +ohos_js_unittest("%(suite_name)s") { + module_out_path = module_output_path + hap_profile = "./src/main/config.json" + deps = [ + ":%(suite_name)s_js_assets", + ":%(suite_name)s_resources", + ] + + certificate_profile = "//test/developertest/signature/openharmony_sx.p7b" + hap_name = "%(suite_name)s" +} +ohos_js_assets("%(suite_name)s_js_assets") { + source_dir = "./src/main/js/default" +} +ohos_resources("%(suite_name)s_resources") { + sources = [ "./src/main/resources" ] + hap_profile = "./src/main/config.json" +} + +group("unittest") { + testonly = true + deps = [ ":%(suite_name)s" ] +} +""" + + @property + def build_gn_template(self): + return JsTestConst.BUILD_GN_FILE_TEMPLATE diff --git a/src/core/driver/drivers.py b/src/core/driver/drivers.py index 51e1cf6..4ea5342 100755 --- a/src/core/driver/drivers.py +++ b/src/core/driver/drivers.py @@ -16,20 +16,26 @@ # limitations under the License. # +import json import os import re +import shutil import time import platform +import zipfile from dataclasses import dataclass from xdevice import DeviceTestType from xdevice import DeviceLabelType from xdevice import ExecuteTerminate from xdevice import DeviceError +from xdevice import ShellHandler from xdevice import IDriver from xdevice import platform_logger from xdevice import Plugin +from xdevice import get_plugin +from xdevice_extension._core.constants import CommonParserType from core.utils import get_decode from core.utils import get_fuzzer_path from core.config.resource_manager import ResourceManager @@ -38,6 +44,7 @@ from core.config.config_manager import FuzzerConfigManager __all__ = [ "CppTestDriver", + "JSUnitTestDriver", "disable_keyguard", "GTestConst"] @@ -564,3 +571,239 @@ class CppTestDriver(IDriver): ############################################################################## ############################################################################## + +@Plugin(type=Plugin.DRIVER, id=DeviceTestType.jsunit_test) +class JSUnitTestDriver(IDriver): + """ + JSUnitTestDriver is a Test that runs a native test package on given device. + """ + + def __init__(self): + self.config = None + self.result = "" + self.start_time = None + self.ability_name = "" + self.package_name = "" + + def __check_environment__(self, device_options): + pass + + def __check_config__(self, config): + pass + + def __result__(self): + return self.result if os.path.exists(self.result) else "" + + def __execute__(self, request): + try: + LOG.info("developertest driver") + self.result = os.path.join(request.config.report_path, + "result", + '.'.join((request.get_module_name(), + "xml"))) + self.config = request.config + self.config.target_test_path = DEFAULT_TEST_PATH + self.config.device = request.config.environment.devices[0] + + suite_file = request.root.source.source_file + if not suite_file: + LOG.error("test source '%s' not exists" % + request.root.source.source_string) + return + + if not self.config.device: + result = ResultManager(suite_file, self.config) + result.set_is_coverage(False) + result.make_empty_result_file( + "No test device is found") + return + + package_name, ability_name = self._get_package_and_ability_name( + suite_file) + self.package_name = package_name + self.ability_name = ability_name + self.config.test_hap_out_path = \ + "/data/data/%s/files/" % self.package_name + + self._init_jsunit_test() + self._run_jsunit(suite_file) + self.generate_console_output(request) + + finally: + self.config.device.stop_catch_device_log() + + def _init_jsunit_test(self): + self.config.device.hdc_command("target mount") + self.config.device.execute_shell_command( + "rm -rf %s" % self.config.target_test_path) + self.config.device.execute_shell_command( + "mkdir -p %s" % self.config.target_test_path) + self.config.device.execute_shell_command( + "mount -o rw,remount,rw /%s" % "system") + self.config.device.hdc_command("shell hilog -r") + + + def _run_jsunit(self, suite_file): + filename = os.path.basename(suite_file) + + resource_manager = ResourceManager() + resource_data_dic, resource_dir = \ + resource_manager.get_resource_data_dic(suite_file) + resource_manager.process_preparer_data(resource_data_dic, resource_dir, + self.config.device) + + main_result = self._install_hap(suite_file) + result = ResultManager(suite_file, self.config) + + if main_result: + self._execute_hapfile_jsunittest() + self._uninstall_hap(self.package_name) + else: + self.result = result.get_test_results("Error: install hap failed") + LOG.error("Error: install hap failed") + + resource_manager.process_cleaner_data(resource_data_dic, resource_dir, + self.config.device) + + def generate_console_output(self, request): + report_name = request.get_module_name() + parsers = get_plugin( + Plugin.PARSER, CommonParserType.jsunit) + if parsers: + parsers = parsers[:1] + for listener in request.listeners: + listener.device_sn = self.config.device.device_sn + parser_instances = [] + + for parser in parsers: + parser_instance = parser.__class__() + parser_instance.suites_name = "{}_suites".format(report_name) + parser_instance.suites_name = request.listeners + parser_instance.listeners = request.listeners + parser_instances.append(parser_instance) + handler = ShellHandler(parser_instances) + + from xdevice_extension._core import utils + command = "hdc_std -t %s shell hilog -x " % self.config.device. \ + device_sn + + output = utils.start_standing_subprocess(command, return_result=True) + LOG.debug("start to parsing hilog") + handler.__read__(output) + handler.__done__() + + + def _execute_hapfile_jsunittest(self): + _unlock_screen(self.config.device) + _unlock_device(self.config.device) + + try: + return_message = self.start_hap_activity() + except (ExecuteTerminate, DeviceError) as exception: + return_message = str(exception.args) + + _lock_screen(self.config.device) + return return_message + + def _install_hap(self, suite_file): + message = self.config.device.hdc_command("install %s" % suite_file) + message = str(message).rstrip() + if message == "" or "success" in message: + return_code = True + if message != "": + LOG.info(message) + else: + return_code = False + if message != "": + LOG.warning(message) + + _sleep_according_to_result(return_code) + return return_code + + def start_hap_activity(self): + try: + command = "aa start -d 123 -a %s.MainAbility -b %s" \ + % (self.package_name, self.package_name) + self.start_time = time.time() + result_value = self.config.device.execute_shell_command( + command, timeout=TIME_OUT) + LOG.info("result_value [[[[[%s]]]]]" % result_value) + + if "success" in str(result_value).lower(): + LOG.info("execute %s's testcase success. result value=%s" + % (self.package_name, result_value)) + time.sleep(60) + else: + LOG.info("execute %s's testcase failed. result value=%s" + % (self.package_name, result_value)) + + _sleep_according_to_result(result_value) + return_message = result_value + except (ExecuteTerminate, DeviceError) as exception: + return_message = exception.args + + return return_message + + def _uninstall_hap(self, package_name): + return_message = self.config.device.execute_shell_command( + "bm uninstall -n %s" % package_name) + _sleep_according_to_result(return_message) + return return_message + + @staticmethod + def _get_package_and_ability_name(hap_filepath): + package_name = "" + ability_name = "" + + if os.path.exists(hap_filepath): + filename = os.path.basename(hap_filepath) + + #unzip the hap file + hap_bak_path = os.path.abspath(os.path.join( + os.path.dirname(hap_filepath), + "%s.bak" % filename)) + zf_desc = zipfile.ZipFile(hap_filepath) + try: + zf_desc.extractall(path=hap_bak_path) + except RuntimeError as error: + print(error) + zf_desc.close() + + #verify config.json file + app_profile_path = os.path.join(hap_bak_path, "config.json") + if not os.path.exists(app_profile_path): + print("file %s not exist" % app_profile_path) + return package_name, ability_name + + if os.path.isdir(app_profile_path): + print("%s is a folder, and not a file" % app_profile_path) + return package_name, ability_name + + #get package_name and ability_name value + load_dict = {} + with open(app_profile_path, 'r') as load_f: + load_dict = json.load(load_f) + profile_list = load_dict.values() + for profile in profile_list: + package_name = profile.get("package") + if not package_name: + continue + + abilities = profile.get("abilities") + for abilitie in abilities: + abilities_name = abilitie.get("name") + if abilities_name.startswith("."): + ability_name = package_name + abilities_name[ + abilities_name.find("."):] + else: + ability_name = abilities_name + break + break + + #delete hap_bak_path + if os.path.exists(hap_bak_path): + shutil.rmtree(hap_bak_path) + else: + print("file %s not exist" % hap_filepath) + + return package_name, ability_name diff --git a/src/core/testcase/testcase_manager.py b/src/core/testcase/testcase_manager.py index fcfa13e..d0ac52a 100755 --- a/src/core/testcase/testcase_manager.py +++ b/src/core/testcase/testcase_manager.py @@ -30,6 +30,7 @@ TESTFILE_TYPE_DATA_DIC = { "PYT": [], "CXX": [], "BIN": [], + "JST": [], } FILTER_SUFFIX_NAME_LIST = [".TOC", ".info", ".pyc"] @@ -109,7 +110,7 @@ class TestCaseManager(object): if suffix_name == ".dex": suite_file_dictionary["DEX"].append(suite_file) elif suffix_name == ".hap": - suite_file_dictionary["HAP"].append(suite_file) + suite_file_dictionary["JST"].append(suite_file) elif suffix_name == ".py": if not self.check_python_test_file(suite_file): continue -- Gitee