From e6f65641550bc185737d637b3f0cfcd98b8afa40 Mon Sep 17 00:00:00 2001 From: lin-yuye99 Date: Mon, 17 Mar 2025 19:11:26 +0800 Subject: [PATCH 1/6] add ace_engine_tdd.py Signed-off-by: lin-yuye99 --- scripts/ace_engine.json | 254 ++++++++++++++++++++++++++++++++++++++ scripts/ace_engine_tdd.py | 221 +++++++++++++++++++++++++++++++++ 2 files changed, 475 insertions(+) create mode 100644 scripts/ace_engine.json create mode 100644 scripts/ace_engine_tdd.py diff --git a/scripts/ace_engine.json b/scripts/ace_engine.json new file mode 100644 index 0000000..be92636 --- /dev/null +++ b/scripts/ace_engine.json @@ -0,0 +1,254 @@ +{ + "adapted_test_targets": [ + "foundation/arkui/ace_engine/test/unittest/adapter/ohos/entrance:container_test", + "foundation/arkui/ace_engine/test/unittest/adapter/ohos/capability:html_convert_test", + "foundation/arkui/ace_engine/test/unittest/frameworks/core/common:container_scope_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:viewport_config_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:ui_content_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_group_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_delegate_proxy_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_delegate_stub_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_dispatcher_stub_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_delegate_impl_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_dispatcher_impl_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:drawable_descriptor_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:ui_event_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:extension_custom_node_test_ng", + "foundation/arkui/ace_engine/test/unittest/interfaces:ace_forward_compatibility_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:navigation_controller_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:native_node_napi_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:native_key_event_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:ui_input_event_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:drag_and_drop_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:node_transition_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:animate_impl_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:dialog_model_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:node_extened_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:node_animate_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:js_drawable_descriptor_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:xcomponent_controller_test", + "foundation/arkui/ace_engine/test/unittest/core/common:common_test", + "foundation/arkui/ace_engine/test/unittest/core/common/form:form_manager_test", + "foundation/arkui/ace_engine/test/unittest/core/common/plugin:plugin_manager_test", + "foundation/arkui/ace_engine/test/unittest/core/layout:box_layout_algorithm_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/layout:layout_property_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/layout:layout_wrapper_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/layout:layout_wrapper_build_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/layout:layout_wrapper_node_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/layout/safe_area:safeArea_test_expandSafeArea_ng", + "foundation/arkui/ace_engine/test/unittest/core/render:painter_test", + "foundation/arkui/ace_engine/test/unittest/core/render:drawing_prop_convertor_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/render:render_context_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/render:render_property_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:drag_animation_helper_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_func_wrapper_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_report_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_proxy_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:full_screen_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:post_event_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:select_overlay_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:select_overlay_proxy_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:shared_overlay_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:display_sync_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:frame_rate_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:focus_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:focus_view_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:safe_area_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:navigation_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_behavior_reporter_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/accessibility:accessibility_linux_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/accessibility:accessibility_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/accessibility:accessibility_adapter_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/accessibility:js_inspector_test", + "foundation/arkui/ace_engine/test/unittest/core/rosen:arkui_rosen_render_context_test", + "foundation/arkui/ace_engine/test/unittest/core/rosen:gradient_style_modifier_test", + "foundation/arkui/ace_engine/test/unittest/core/syntax:lazy_for_each_syntax_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/syntax:lazy_for_each_builder_syntax_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/syntax:for_each_syntax_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/syntax:if_else_syntax_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/syntax:content_slot_syntax_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/syntax:repeat_node_cache_syntax_test", + "foundation/arkui/ace_engine/test/unittest/core/image:image_provider_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/image:image_file_cache_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:view_stack_processor_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:distributed_ui_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:frame_node_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:frame_node_drop_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:geometry_node_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:inspector_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:ui_node_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:view_abstract_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:view_full_update_model_ng_test", + "foundation/arkui/ace_engine/test/unittest/core/base:view_partial_update_model_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:observer_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:view_abstract_model_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:short_cuts_little_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/base:short_cuts_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/gestures:gestures_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/waterflow:water_flow_test_original", + "foundation/arkui/ace_engine/test/unittest/core/pattern/waterflow:water_flow_test_segmented", + "foundation/arkui/ace_engine/test/unittest/core/pattern/waterflow:water_flow_test_sw", + "foundation/arkui/ace_engine/test/unittest/core/pattern/toggle:toggle_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/security_component:security_component_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/checkbox:checkbox_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/stage:stage_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/stepper:stepper_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/xcomponent:xcomponent_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/indexer:indexer_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/bubble:bubble_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/form_link:form_link_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/custom_frame_node:custom_frame_node_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/animator:animator_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/container_modal:container_modal_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/form:form_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/form:form_node_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/form:form_pattern_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/checkboxgroup:checkboxgroup_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/common_view:common_view_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/text_drag:text_drag_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/qrcode:qrcode_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/dialog:dialog_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/picker:date_picker_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/refresh:refresh_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/navrouter:navrouter_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/data_panel:data_panel_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/node_container:node_container_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/button:button_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/recycle_node:recycle_node_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/menu:menu_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/loading_progress:loading_progress_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/blank:blank_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/shape:shape_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/grid_col:grid_col_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/panel:panel_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/custom:custom_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/custom_node_ext:custom_node_ext_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/linear_layout:linear_layout_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/calendar:calendar_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/patternlock:patternlock_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/movingphoto:movingphoto_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/badge:badge_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/particle:particle_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/text_input:TextInputTest", + "foundation/arkui/ace_engine/test/unittest/core/pattern/video:video_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/calendar_picker:calendar_picker_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/side_bar:side_bar_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/image_animator:image_animator_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/render_node:render_node_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/image:image_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/divider:divider_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/grid:grid_test_regular", + "foundation/arkui/ace_engine/test/unittest/core/pattern/grid:grid_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/canvas:canvas_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/model:model_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/time_picker:time_picker_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/swiper:swiper_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/linear_split:linear_split_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/withtheme:withtheme_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/app_bar:app_bar_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/stack:stack_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/scrollable:scrollable_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/rich_editor_drag:rich_editor_drag_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/search:search_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/navigation:navigation_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/text_clock:text_clock_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/counter:counter_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/overlay:overlay_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/view_context:view_context_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/symbol:symbol_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/radio:radio_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/folder_stack:folder_stack_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/rich_editor:rich_editor_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/grid_container:grid_container_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/scroll:scroll_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/text_picker:text_picker_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/navigator:navigator_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/gauge:gauge_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/text_timer:text_timer_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/linear_indicator:linear_indicator_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/tabs:tabs_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/flex:flex_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/hyperlink:hyperlink_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:ui_extension_pattern_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:ui_extension_component_testtwo_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:accessibility_session_adapter_ui_extension_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:ui_extension_manager_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:platform_pattern_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:modal_ui_extension_proxy_impl_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:isolated_pattern_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:platform_event_proxy_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:security_ui_extension_pattern_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/window_scene:window_scene_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/rating:rating_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/select:select_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/relative_container:relative_container_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/select_overlay:select_overlay_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/progress:progress_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/marquee:marquee_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/scroll_bar:scroll_bar_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/slider:slider_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/text:text_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/text:text_test_nullptr", + "foundation/arkui/ace_engine/test/unittest/core/pattern/list:list_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/grid_row:grid_row_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:event_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:click_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:drag_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:drag_event_test_ng_base", + "foundation/arkui/ace_engine/test/unittest/core/event:event_hub_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:focus_hub_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:gesture_event_hub_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:input_event_hub_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:long_press_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:mouse_style_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:pan_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:scrollable_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:state_style_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:touch_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:response_ctrl_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:input_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:focus_box_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:axis_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:grid_property_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:accessibility_property_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:border_property_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:calc_length_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:gradient_property_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:measure_utils_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:property_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:layout_constraint_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:templates_parser_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pipeline:pipeline_context_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/animation:geometry_transition_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/svg:parse_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/svg:svg_dom_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/svg:svg_utils_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/svg:svg_context_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/svg:svg_node_test_ng", + "foundation/arkui/ace_engine/test/unittest/base:geometry_test", + "foundation/arkui/ace_engine/test/unittest/base:util_test", + "foundation/arkui/ace_engine/test/unittest/bridge/common/utils:bridge_utils_test", + "foundation/arkui/ace_engine/test/unittest/bridge/common/sourcemap:bridge_source_map_test" + ], + "adapting_test_targets": [ + "foundation/arkui/ace_engine/frameworks/core/animation/test/unittest/svg_animate:SvgAnimateTest", + "foundation/arkui/ace_engine/frameworks/core/animation/test/unittest/framework:AnimationTest", + "foundation/arkui/ace_engine/frameworks/core/animation/test/unittest/spring_chain:SpringChainTest", + "foundation/arkui/ace_engine/frameworks/bridge/test/unittest/pluginfrontend:PluginFrontendDelegateTest", + "foundation/arkui/ace_engine/frameworks/bridge/test/unittest/pluginfrontend:PluginFrontendTest", + "foundation/arkui/ace_engine/test/unittest/core/common/resource:resource_manager_test", + "foundation/arkui/ace_engine/test/unittest/core/common/recorder:event_recorder_test", + "foundation/arkui/ace_engine/test/unittest/core/common/others:thread_checker_test", + "foundation/arkui/ace_engine/test/unittest/core/common/ime:ime_test", + "foundation/arkui/ace_engine/test/unittest/core/image:image_cache_test", + "foundation/arkui/ace_engine/test/unittest/core/image:ImageProviderTest", + "foundation/arkui/ace_engine/test/unittest/core/image:ImageCompressorTest", + "foundation/arkui/ace_engine/test/unittest/core/pattern/web:web_pattern_unit_test_ohos", + "foundation/arkui/ace_engine/test/unittest/core/pattern/plugin:plugin_pattern_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:resample_and_velocity_test_ng" + ] + +} + diff --git a/scripts/ace_engine_tdd.py b/scripts/ace_engine_tdd.py new file mode 100644 index 0000000..497b9e7 --- /dev/null +++ b/scripts/ace_engine_tdd.py @@ -0,0 +1,221 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2025 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 re +import json +import mmap +from functools import lru_cache +from collections import defaultdict + + +class BuildProcessor: + + def __init__(self, root_dir, ace_root): + self.root_dir = root_dir + self.ace_root = ace_root + self.build_info = defaultdict(lambda: {"name": "", "source_list": [], "deps_list": [], "include_list": [], "config_list": []}) + self.data_json = [] + self.group_json = [] + + self.unittest_pattern = re.compile( + r'(ace|ohos)_unittest\("([^"]*)"\)\s*\{(.*?)(?=\})', + re.DOTALL | re.MULTILINE + ) + self.group_pattern = re.compile( + r'group\("([^"]*)"\)\s*\{(.*?)(?=\})', + re.DOTALL | re.MULTILINE + ) + self.sources_pattern = re.compile(r'sources\s*=\s*\[(.*?)\]', re.DOTALL) + self.deps_pattern = re.compile(r'deps\s*[+]?=\s*\[(.*?)\]', re.DOTALL) + self.includes_pattern = re.compile(r'include_dirs\s*[+]?=\s*\[(.*?)\]', re.DOTALL) + self.configs_pattern = re.compile(r'configs\s*[+]?=\s*\[(.*?)\]', re.DOTALL) + + def execute(self): + for root, _, files in os.walk(self.root_dir): + if "BUILD.gn" in files: + path = os.path.join(root, "BUILD.gn") + self.parse_build_gn(path) + self.parse_groups(path) + + change_files, oh_fields = self.process_changes() + + if len(oh_fields) == 1 and oh_fields[0] == "arkui_ace_engine": + print(" ".join(self.analyze_impact(change_files))) + else: + print(f"TDDarkuarkui_ace_engine") + self.generate_output() + + def parse_build_gn(self, file_path): + content = self._read_file(file_path) + processed_content = "\n".join(line.split("#")[0].rstrip() + for line in content.splitlines()) + + for match in self.unittest_pattern.finditer(processed_content): + self._process_unittest(match, file_path) + + def process_file(self, file_path): + content = self._read_file(file_path) + return {header for line in content.split('\n') + if (header := self._process_includes(line))} + + def parse_groups(self, file_path): + content = self._read_file(file_path) + processed_content = "\n".join(line.split("#")[0].rstrip() + for line in content.splitlines()) + + for match in self.group_pattern.finditer(processed_content): + self._process_group(match, file_path) + + def process_changes(self): + change_info = self._read_json("change_info.json") + openharmony_fields = [v["name"] for v in change_info.values() if "name" in v] + + change_files = [] + file_operations = { + "added": lambda x: x, + "rename": lambda x: [item for pair in x for item in pair], + "modified": lambda x: x, + "deleted": lambda x: x + } + + for value in change_info.values(): + changed_files = value.get("changed_file_list", {}) + for op, processor in file_operations.items(): + if op in changed_files: + change_files.extend(processor(changed_files[op])) + + return ( + [os.path.join(self.ace_root, f) for f in change_files], + openharmony_fields + ) + + def generate_output(self): + with open("test_targets.json", "w") as f: + json.dump(self.data_json, f, indent=2) + + with open("groups.json", "w") as f: + json.dump(self.group_json, f, indent=2) + + def analyze_impact(self, change_files): + tdd_data = self._read_json("developtools/integration_verification/scripts/ace_engine.json") or {} + adapted_targets = set(tdd_data.get("adapted_test_targets", [])) + adapting_targets = set(tdd_data.get("adapting_test_targets", [])) + + change_set = set(change_files) + impacted = [] + + for target in self.data_json: + target_sets = { + "source_list": set(target["source_list"]), + "deps_list": set(target["deps_list"]), + "includes_list": set(target["includes_list"]), + "configs_list": set(target["configs_list"]), + "source_h": set(target["source_h"]), + "dep_h": set(target["dep_h"]), + "includes_h": set(target["includes_h"]), + "configs_h": set(target["configs_h"]) + } + if any(change_set & s for s in target_sets.values()): + impacted.append(target["test_target"]) + if target["test_target"] in adapting_targets: + return ["TDDarkui_ace_engine"] + + return ["TDDarkui_ace_engine"] if not impacted else impacted + + @lru_cache(maxsize=128) + def _read_file(self, file_path): + try: + with open(file_path, 'r', encoding='utf-8') as f: + return f.read() + except Exception as e: + return "" + + def _process_includes(self, line): + for pattern in [r'#include\s*"(.*?)"', r'#include\s*<(.*?)>']: + match = re.match(pattern, line) + if match and (header := match.group(1)).endswith('.h'): + return header + return None + + def _process_unittest(self, match, file_path): + target_name = match.group(2) + target_content = match.group(3) + base_path = os.path.dirname(file_path) + + sources = self._get_gn_content(self.sources_pattern, target_content, base_path) + deps = self._get_gn_content(self.deps_pattern, target_content, base_path) + includes = self._get_gn_content(self.includes_pattern, target_content, base_path) + configs = self._get_gn_content(self.configs_pattern, target_content, base_path) + + source_h = {h for s in sources for h in self.process_file(s)} + dep_h = {h for d in deps for h in self.process_file(d)} + include_h = {h for s in includes for h in self.process_file(s)} + config_h = {h for d in configs for h in self.process_file(d)} + + build_target = f"{os.path.dirname(file_path)}:{target_name}" + self.data_json.append({ + "test_target": build_target, + "source_list": sources, + "deps_list": deps, + "includes_list": includes, + "configs_list": configs, + "source_h": list(source_h), + "dep_h": list(dep_h), + "includes_h": list(include_h), + "configs_h": list(config_h) + }) + + def _process_group(self, match, file_path): + group_name = match.group(1) + group_content = match.group(2) + base_path = os.path.dirname(file_path) + + deps = [self._normalize_path(d, base_path).replace("/:", ":") + for d in self._get_gn_content(self.deps_pattern, group_content, "")] + + self.group_json.append({ + "group_name": f"{base_path}:{group_name}", + "deps_list": deps + }) + + def _get_gn_content(self, pattern, content, base_path): + if not (match := pattern.search(content)): + return [] + return [self._normalize_path(s, base_path) + for s in match.group(1).split(',') if s.strip()] + + def _normalize_path(self, s, base_path): + s = s.strip().strip('"') + if '/' not in s: + return os.path.join(base_path, s) + return s.replace('$ace_root', self.ace_root) + + def _read_json(self, path): + try: + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as e: + return {} + + + +if __name__ == "__main__": + processor = BuildProcessor( + root_dir="foundation/arkui/ace_engine", + ace_root="foundation/arkui/ace_engine" + ) + processor.execute() + -- Gitee From c6117b4c5e2a32f5cd27bf3fe1e5efb5f04b62cf Mon Sep 17 00:00:00 2001 From: lin-yuye99 Date: Tue, 18 Mar 2025 10:04:35 +0800 Subject: [PATCH 2/6] add ace_engine_tdd.py Signed-off-by: lin-yuye99 --- {scripts => tools/gated_check_in}/ace_engine.json | 0 {scripts => tools/gated_check_in}/ace_engine_tdd.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {scripts => tools/gated_check_in}/ace_engine.json (100%) rename {scripts => tools/gated_check_in}/ace_engine_tdd.py (99%) diff --git a/scripts/ace_engine.json b/tools/gated_check_in/ace_engine.json similarity index 100% rename from scripts/ace_engine.json rename to tools/gated_check_in/ace_engine.json diff --git a/scripts/ace_engine_tdd.py b/tools/gated_check_in/ace_engine_tdd.py similarity index 99% rename from scripts/ace_engine_tdd.py rename to tools/gated_check_in/ace_engine_tdd.py index 497b9e7..d691770 100644 --- a/scripts/ace_engine_tdd.py +++ b/tools/gated_check_in/ace_engine_tdd.py @@ -110,7 +110,7 @@ class BuildProcessor: json.dump(self.group_json, f, indent=2) def analyze_impact(self, change_files): - tdd_data = self._read_json("developtools/integration_verification/scripts/ace_engine.json") or {} + tdd_data = self._read_json("developtools/integration_verification/tools/gated_check_in/ace_engine.json") or {} adapted_targets = set(tdd_data.get("adapted_test_targets", [])) adapting_targets = set(tdd_data.get("adapting_test_targets", [])) -- Gitee From d9b807feb43c411a44f5ba756232b28f321f0ead Mon Sep 17 00:00:00 2001 From: lin-yuye99 Date: Mon, 24 Mar 2025 16:23:12 +0800 Subject: [PATCH 3/6] update Signed-off-by: lin-yuye99 --- tools/gated_check_in/ace_engine.json | 28 ++++++++++++++++----- tools/gated_check_in/ace_engine_tdd.py | 34 ++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/tools/gated_check_in/ace_engine.json b/tools/gated_check_in/ace_engine.json index be92636..d6daf0d 100644 --- a/tools/gated_check_in/ace_engine.json +++ b/tools/gated_check_in/ace_engine.json @@ -230,7 +230,27 @@ "foundation/arkui/ace_engine/test/unittest/base:geometry_test", "foundation/arkui/ace_engine/test/unittest/base:util_test", "foundation/arkui/ace_engine/test/unittest/bridge/common/utils:bridge_utils_test", - "foundation/arkui/ace_engine/test/unittest/bridge/common/sourcemap:bridge_source_map_test" + "foundation/arkui/ace_engine/test/unittest/bridge/common/sourcemap:bridge_source_map_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:node_component_snapshot_test", + "foundation/arkui/ace_engine/test/unittest/interfaces:ui_input_event_first_test", + "foundation/arkui/ace_engine/test/unittest/interfaces/ace_kit:ace_kit_test", + "foundation/arkui/ace_engine/test/unittest/core/common/key_event_manager:key_event_manager_test", + "foundation/arkui/ace_engine/test/unittest/core/manager:avoid_info_manager_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_controller_func_wrapper_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_initiating_state_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/syntax:repeat_node_cache_2_syntax_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/container_modal:container_modal_pattern_enhance_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/navrouter:navdestination_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/lazy_layout:lazy_grid_layout_test", + "foundation/arkui/ace_engine/test/unittest/core/pattern/web:web_pattern_unit_test_ohos", + "foundation/arkui/ace_engine/test/unittest/core/pattern/arc_list:arc_list_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:dynamic_pattern_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:session_wrapper_impl_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:session_wrapper_impl_test_new_ng", + "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:security_session_wrapper_impl_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/event:drag_drop_event_test_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:accessibility_property_testtwo_ng", + "foundation/arkui/ace_engine/test/unittest/core/property:accessibility_property_test_three_ng" ], "adapting_test_targets": [ "foundation/arkui/ace_engine/frameworks/core/animation/test/unittest/svg_animate:SvgAnimateTest", @@ -245,10 +265,6 @@ "foundation/arkui/ace_engine/test/unittest/core/image:image_cache_test", "foundation/arkui/ace_engine/test/unittest/core/image:ImageProviderTest", "foundation/arkui/ace_engine/test/unittest/core/image:ImageCompressorTest", - "foundation/arkui/ace_engine/test/unittest/core/pattern/web:web_pattern_unit_test_ohos", - "foundation/arkui/ace_engine/test/unittest/core/pattern/plugin:plugin_pattern_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:resample_and_velocity_test_ng" + "foundation/arkui/ace_engine/test/unittest/core/pattern/plugin:plugin_pattern_test_ng" ] - } - diff --git a/tools/gated_check_in/ace_engine_tdd.py b/tools/gated_check_in/ace_engine_tdd.py index d691770..98b44c2 100644 --- a/tools/gated_check_in/ace_engine_tdd.py +++ b/tools/gated_check_in/ace_engine_tdd.py @@ -50,12 +50,16 @@ class BuildProcessor: self.parse_build_gn(path) self.parse_groups(path) + for target in self.data_json: + target["deps_list"] = self._get_deps_list(target) + target["dep_h"] = [h for d in target["deps_list"] for h in self.process_file(d)] + change_files, oh_fields = self.process_changes() if len(oh_fields) == 1 and oh_fields[0] == "arkui_ace_engine": print(" ".join(self.analyze_impact(change_files))) else: - print(f"TDDarkuarkui_ace_engine") + print(f"TDDarkui_ace_engine") self.generate_output() def parse_build_gn(self, file_path): @@ -129,9 +133,8 @@ class BuildProcessor: "configs_h": set(target["configs_h"]) } if any(change_set & s for s in target_sets.values()): - impacted.append(target["test_target"]) - if target["test_target"] in adapting_targets: - return ["TDDarkui_ace_engine"] + if target["test_target"] in adapted_targets: + impacted.append(target["test_target"]) return ["TDDarkui_ace_engine"] if not impacted else impacted @@ -143,6 +146,18 @@ class BuildProcessor: except Exception as e: return "" + def _get_deps_list(self, target): + ret = [] + for dep in target["deps_list"]: + ret = list(set(ret + self._get_source_list(dep))) + return ret + + def _get_source_list(self, dep): + for target in self.data_json: + if dep == target["test_target"]: + return target["source_list"] + return [] + def _process_includes(self, line): for pattern in [r'#include\s*"(.*?)"', r'#include\s*<(.*?)>']: match = re.match(pattern, line) @@ -157,7 +172,7 @@ class BuildProcessor: sources = self._get_gn_content(self.sources_pattern, target_content, base_path) deps = self._get_gn_content(self.deps_pattern, target_content, base_path) - includes = self._get_gn_content(self.includes_pattern, target_content, base_path) + includes = self._get_include_files(self._get_gn_content(self.includes_pattern, target_content, base_path)) configs = self._get_gn_content(self.configs_pattern, target_content, base_path) source_h = {h for s in sources for h in self.process_file(s)} @@ -178,6 +193,14 @@ class BuildProcessor: "configs_h": list(config_h) }) + def _get_include_files(self, includes_list): + all_files = [] + for path in includes_list: + for root, dirs, files in os.walk(path): + for file in files: + all_files.append(os.path.join(root, file)) + return all_files + def _process_group(self, match, file_path): group_name = match.group(1) group_content = match.group(2) @@ -219,3 +242,4 @@ if __name__ == "__main__": ) processor.execute() + -- Gitee From 2dcc60537f8cf0ae3c96fdc1ad90bfb6687bce7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E6=98=B1=E6=99=94?= Date: Tue, 25 Mar 2025 06:40:15 +0000 Subject: [PATCH 4/6] update tools/gated_check_in/ace_engine_tdd.py. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 林昱晔 --- tools/gated_check_in/ace_engine_tdd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/gated_check_in/ace_engine_tdd.py b/tools/gated_check_in/ace_engine_tdd.py index 98b44c2..08ab158 100644 --- a/tools/gated_check_in/ace_engine_tdd.py +++ b/tools/gated_check_in/ace_engine_tdd.py @@ -38,7 +38,7 @@ class BuildProcessor: r'group\("([^"]*)"\)\s*\{(.*?)(?=\})', re.DOTALL | re.MULTILINE ) - self.sources_pattern = re.compile(r'sources\s*=\s*\[(.*?)\]', re.DOTALL) + self.sources_pattern = re.compile(r'sources\s*[+]?=\s*\[(.*?)\]', re.DOTALL) self.deps_pattern = re.compile(r'deps\s*[+]?=\s*\[(.*?)\]', re.DOTALL) self.includes_pattern = re.compile(r'include_dirs\s*[+]?=\s*\[(.*?)\]', re.DOTALL) self.configs_pattern = re.compile(r'configs\s*[+]?=\s*\[(.*?)\]', re.DOTALL) -- Gitee From 0145eae5383a49beda2837d7251b37fd0539e103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E4=B8=96=E7=90=A6=5Fhw?= <670097973@qq.com> Date: Thu, 3 Apr 2025 11:09:19 +0800 Subject: [PATCH 5/6] add trace manager acl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 杨世琦_hw <670097973@qq.com> --- .../screenshot32/new_script/resource/acl_whitelist.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cases/smoke/basic/screenshot32/new_script/resource/acl_whitelist.json b/cases/smoke/basic/screenshot32/new_script/resource/acl_whitelist.json index b3a873d..6355182 100644 --- a/cases/smoke/basic/screenshot32/new_script/resource/acl_whitelist.json +++ b/cases/smoke/basic/screenshot32/new_script/resource/acl_whitelist.json @@ -148,7 +148,8 @@ "ohos.permission.CONTROL_SVC_CMD", "ohos.permission.MANAGE_WIFI_CONNECTION", "ohos.permission.INSTALL_PLUGIN_BUNDLE", - "ohos.permission.UNINSTALL_PLUGIN_BUNDLE" + "ohos.permission.UNINSTALL_PLUGIN_BUNDLE", + "ohos.permission.HIVIEW_TRACE_MANAGE" ] }, { @@ -339,5 +340,11 @@ "acls": [ "ohos.permission.MANAGE_SOFTBUS_NETWORK" ] + }, + { + "processName": "hiprofiler_plugins", + "acls": [ + "ohos.permission.HIVIEW_TRACE_MANAGE" + ] } ] -- Gitee From 728ece229710b21a67e5d096aaf5043b15fd02fe Mon Sep 17 00:00:00 2001 From: wujinhui Date: Wed, 16 Apr 2025 11:27:30 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=9B=BF=E6=8D=A2hap=20=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wujinhui --- .../new_script/resource/acl_whitelist.json | 9 +- .../resource/entry-default-signed.hap | Bin 379443 -> 371672 bytes .../screenshot32/new_script/resource/hap.jpeg | Bin 17264 -> 17352 bytes tools/gated_check_in/ace_engine.json | 270 ------------------ tools/gated_check_in/ace_engine_tdd.py | 245 ---------------- 5 files changed, 1 insertion(+), 523 deletions(-) delete mode 100644 tools/gated_check_in/ace_engine.json delete mode 100644 tools/gated_check_in/ace_engine_tdd.py diff --git a/cases/smoke/basic/screenshot32/new_script/resource/acl_whitelist.json b/cases/smoke/basic/screenshot32/new_script/resource/acl_whitelist.json index 6355182..b3a873d 100644 --- a/cases/smoke/basic/screenshot32/new_script/resource/acl_whitelist.json +++ b/cases/smoke/basic/screenshot32/new_script/resource/acl_whitelist.json @@ -148,8 +148,7 @@ "ohos.permission.CONTROL_SVC_CMD", "ohos.permission.MANAGE_WIFI_CONNECTION", "ohos.permission.INSTALL_PLUGIN_BUNDLE", - "ohos.permission.UNINSTALL_PLUGIN_BUNDLE", - "ohos.permission.HIVIEW_TRACE_MANAGE" + "ohos.permission.UNINSTALL_PLUGIN_BUNDLE" ] }, { @@ -340,11 +339,5 @@ "acls": [ "ohos.permission.MANAGE_SOFTBUS_NETWORK" ] - }, - { - "processName": "hiprofiler_plugins", - "acls": [ - "ohos.permission.HIVIEW_TRACE_MANAGE" - ] } ] diff --git a/cases/smoke/basic/screenshot32/new_script/resource/entry-default-signed.hap b/cases/smoke/basic/screenshot32/new_script/resource/entry-default-signed.hap index c9c43c0509f25ed6201fba38af579c8a41282c5b..64782886a932f31407a216848b028c05fa679ca5 100644 GIT binary patch delta 25196 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 delta 31805 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%0AQf})HLk+?E1DX;F%s)ggmQ(%qZcM&2ksZr|5dhd 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 XqJu^`LFIuLYY|zGKiRZcIlcXVRqDKx diff --git a/cases/smoke/basic/screenshot32/new_script/resource/hap.jpeg b/cases/smoke/basic/screenshot32/new_script/resource/hap.jpeg index 6f486e692ffac6beaa356027f683a79e6bde9fc9..d617bae19a4950c6a8d55c0a7c709cf5e996c819 100644 GIT binary patch delta 14499 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 delta 14394 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 H1OxvM&!3S4 diff --git a/tools/gated_check_in/ace_engine.json b/tools/gated_check_in/ace_engine.json deleted file mode 100644 index d6daf0d..0000000 --- a/tools/gated_check_in/ace_engine.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "adapted_test_targets": [ - "foundation/arkui/ace_engine/test/unittest/adapter/ohos/entrance:container_test", - "foundation/arkui/ace_engine/test/unittest/adapter/ohos/capability:html_convert_test", - "foundation/arkui/ace_engine/test/unittest/frameworks/core/common:container_scope_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:viewport_config_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:ui_content_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_group_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_delegate_proxy_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_delegate_stub_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_dispatcher_stub_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_delegate_impl_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:form_render_dispatcher_impl_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:drawable_descriptor_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:ui_event_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:extension_custom_node_test_ng", - "foundation/arkui/ace_engine/test/unittest/interfaces:ace_forward_compatibility_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:navigation_controller_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:native_node_napi_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:native_key_event_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:ui_input_event_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:drag_and_drop_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:node_transition_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:animate_impl_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:dialog_model_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:node_extened_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:node_animate_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:js_drawable_descriptor_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:xcomponent_controller_test", - "foundation/arkui/ace_engine/test/unittest/core/common:common_test", - "foundation/arkui/ace_engine/test/unittest/core/common/form:form_manager_test", - "foundation/arkui/ace_engine/test/unittest/core/common/plugin:plugin_manager_test", - "foundation/arkui/ace_engine/test/unittest/core/layout:box_layout_algorithm_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/layout:layout_property_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/layout:layout_wrapper_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/layout:layout_wrapper_build_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/layout:layout_wrapper_node_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/layout/safe_area:safeArea_test_expandSafeArea_ng", - "foundation/arkui/ace_engine/test/unittest/core/render:painter_test", - "foundation/arkui/ace_engine/test/unittest/core/render:drawing_prop_convertor_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/render:render_context_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/render:render_property_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:drag_animation_helper_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_func_wrapper_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_report_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_proxy_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:full_screen_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:post_event_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:select_overlay_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:select_overlay_proxy_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:shared_overlay_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:display_sync_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:frame_rate_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:focus_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:focus_view_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:safe_area_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:navigation_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_behavior_reporter_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/accessibility:accessibility_linux_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/accessibility:accessibility_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/accessibility:accessibility_adapter_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/accessibility:js_inspector_test", - "foundation/arkui/ace_engine/test/unittest/core/rosen:arkui_rosen_render_context_test", - "foundation/arkui/ace_engine/test/unittest/core/rosen:gradient_style_modifier_test", - "foundation/arkui/ace_engine/test/unittest/core/syntax:lazy_for_each_syntax_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/syntax:lazy_for_each_builder_syntax_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/syntax:for_each_syntax_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/syntax:if_else_syntax_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/syntax:content_slot_syntax_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/syntax:repeat_node_cache_syntax_test", - "foundation/arkui/ace_engine/test/unittest/core/image:image_provider_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/image:image_file_cache_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:view_stack_processor_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:distributed_ui_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:frame_node_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:frame_node_drop_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:geometry_node_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:inspector_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:ui_node_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:view_abstract_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:view_full_update_model_ng_test", - "foundation/arkui/ace_engine/test/unittest/core/base:view_partial_update_model_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:observer_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:view_abstract_model_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:short_cuts_little_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/base:short_cuts_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/gestures:gestures_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/waterflow:water_flow_test_original", - "foundation/arkui/ace_engine/test/unittest/core/pattern/waterflow:water_flow_test_segmented", - "foundation/arkui/ace_engine/test/unittest/core/pattern/waterflow:water_flow_test_sw", - "foundation/arkui/ace_engine/test/unittest/core/pattern/toggle:toggle_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/security_component:security_component_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/checkbox:checkbox_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/stage:stage_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/stepper:stepper_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/xcomponent:xcomponent_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/indexer:indexer_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/bubble:bubble_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/form_link:form_link_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/custom_frame_node:custom_frame_node_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/animator:animator_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/container_modal:container_modal_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/form:form_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/form:form_node_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/form:form_pattern_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/checkboxgroup:checkboxgroup_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/common_view:common_view_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/text_drag:text_drag_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/qrcode:qrcode_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/dialog:dialog_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/picker:date_picker_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/refresh:refresh_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/navrouter:navrouter_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/data_panel:data_panel_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/node_container:node_container_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/button:button_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/recycle_node:recycle_node_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/menu:menu_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/loading_progress:loading_progress_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/blank:blank_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/shape:shape_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/grid_col:grid_col_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/panel:panel_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/custom:custom_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/custom_node_ext:custom_node_ext_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/linear_layout:linear_layout_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/calendar:calendar_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/patternlock:patternlock_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/movingphoto:movingphoto_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/badge:badge_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/particle:particle_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/text_input:TextInputTest", - "foundation/arkui/ace_engine/test/unittest/core/pattern/video:video_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/calendar_picker:calendar_picker_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/side_bar:side_bar_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/image_animator:image_animator_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/render_node:render_node_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/image:image_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/divider:divider_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/grid:grid_test_regular", - "foundation/arkui/ace_engine/test/unittest/core/pattern/grid:grid_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/canvas:canvas_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/model:model_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/time_picker:time_picker_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/swiper:swiper_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/linear_split:linear_split_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/withtheme:withtheme_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/app_bar:app_bar_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/stack:stack_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/scrollable:scrollable_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/rich_editor_drag:rich_editor_drag_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/search:search_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/navigation:navigation_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/text_clock:text_clock_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/counter:counter_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/overlay:overlay_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/view_context:view_context_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/symbol:symbol_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/radio:radio_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/folder_stack:folder_stack_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/rich_editor:rich_editor_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/grid_container:grid_container_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/scroll:scroll_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/text_picker:text_picker_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/navigator:navigator_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/gauge:gauge_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/text_timer:text_timer_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/linear_indicator:linear_indicator_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/tabs:tabs_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/flex:flex_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/hyperlink:hyperlink_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:ui_extension_pattern_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:ui_extension_component_testtwo_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:accessibility_session_adapter_ui_extension_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:ui_extension_manager_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:platform_pattern_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:modal_ui_extension_proxy_impl_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:isolated_pattern_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:platform_event_proxy_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:security_ui_extension_pattern_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/window_scene:window_scene_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/rating:rating_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/select:select_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/relative_container:relative_container_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/select_overlay:select_overlay_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/progress:progress_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/marquee:marquee_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/scroll_bar:scroll_bar_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/slider:slider_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/text:text_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/text:text_test_nullptr", - "foundation/arkui/ace_engine/test/unittest/core/pattern/list:list_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/grid_row:grid_row_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:event_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:click_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:drag_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:drag_event_test_ng_base", - "foundation/arkui/ace_engine/test/unittest/core/event:event_hub_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:focus_hub_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:gesture_event_hub_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:input_event_hub_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:long_press_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:mouse_style_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:pan_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:scrollable_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:state_style_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:touch_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:response_ctrl_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:input_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:focus_box_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:axis_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:grid_property_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:accessibility_property_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:border_property_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:calc_length_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:gradient_property_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:measure_utils_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:property_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:layout_constraint_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:templates_parser_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pipeline:pipeline_context_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/animation:geometry_transition_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/svg:parse_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/svg:svg_dom_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/svg:svg_utils_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/svg:svg_context_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/svg:svg_node_test_ng", - "foundation/arkui/ace_engine/test/unittest/base:geometry_test", - "foundation/arkui/ace_engine/test/unittest/base:util_test", - "foundation/arkui/ace_engine/test/unittest/bridge/common/utils:bridge_utils_test", - "foundation/arkui/ace_engine/test/unittest/bridge/common/sourcemap:bridge_source_map_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:node_component_snapshot_test", - "foundation/arkui/ace_engine/test/unittest/interfaces:ui_input_event_first_test", - "foundation/arkui/ace_engine/test/unittest/interfaces/ace_kit:ace_kit_test", - "foundation/arkui/ace_engine/test/unittest/core/common/key_event_manager:key_event_manager_test", - "foundation/arkui/ace_engine/test/unittest/core/manager:avoid_info_manager_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_controller_func_wrapper_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/manager:drag_drop_initiating_state_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/syntax:repeat_node_cache_2_syntax_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/container_modal:container_modal_pattern_enhance_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/navrouter:navdestination_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/lazy_layout:lazy_grid_layout_test", - "foundation/arkui/ace_engine/test/unittest/core/pattern/web:web_pattern_unit_test_ohos", - "foundation/arkui/ace_engine/test/unittest/core/pattern/arc_list:arc_list_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:dynamic_pattern_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:session_wrapper_impl_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:session_wrapper_impl_test_new_ng", - "foundation/arkui/ace_engine/test/unittest/core/pattern/ui_extension:security_session_wrapper_impl_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/event:drag_drop_event_test_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:accessibility_property_testtwo_ng", - "foundation/arkui/ace_engine/test/unittest/core/property:accessibility_property_test_three_ng" - ], - "adapting_test_targets": [ - "foundation/arkui/ace_engine/frameworks/core/animation/test/unittest/svg_animate:SvgAnimateTest", - "foundation/arkui/ace_engine/frameworks/core/animation/test/unittest/framework:AnimationTest", - "foundation/arkui/ace_engine/frameworks/core/animation/test/unittest/spring_chain:SpringChainTest", - "foundation/arkui/ace_engine/frameworks/bridge/test/unittest/pluginfrontend:PluginFrontendDelegateTest", - "foundation/arkui/ace_engine/frameworks/bridge/test/unittest/pluginfrontend:PluginFrontendTest", - "foundation/arkui/ace_engine/test/unittest/core/common/resource:resource_manager_test", - "foundation/arkui/ace_engine/test/unittest/core/common/recorder:event_recorder_test", - "foundation/arkui/ace_engine/test/unittest/core/common/others:thread_checker_test", - "foundation/arkui/ace_engine/test/unittest/core/common/ime:ime_test", - "foundation/arkui/ace_engine/test/unittest/core/image:image_cache_test", - "foundation/arkui/ace_engine/test/unittest/core/image:ImageProviderTest", - "foundation/arkui/ace_engine/test/unittest/core/image:ImageCompressorTest", - "foundation/arkui/ace_engine/test/unittest/core/pattern/plugin:plugin_pattern_test_ng" - ] -} diff --git a/tools/gated_check_in/ace_engine_tdd.py b/tools/gated_check_in/ace_engine_tdd.py deleted file mode 100644 index 08ab158..0000000 --- a/tools/gated_check_in/ace_engine_tdd.py +++ /dev/null @@ -1,245 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2025 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 re -import json -import mmap -from functools import lru_cache -from collections import defaultdict - - -class BuildProcessor: - - def __init__(self, root_dir, ace_root): - self.root_dir = root_dir - self.ace_root = ace_root - self.build_info = defaultdict(lambda: {"name": "", "source_list": [], "deps_list": [], "include_list": [], "config_list": []}) - self.data_json = [] - self.group_json = [] - - self.unittest_pattern = re.compile( - r'(ace|ohos)_unittest\("([^"]*)"\)\s*\{(.*?)(?=\})', - re.DOTALL | re.MULTILINE - ) - self.group_pattern = re.compile( - r'group\("([^"]*)"\)\s*\{(.*?)(?=\})', - re.DOTALL | re.MULTILINE - ) - self.sources_pattern = re.compile(r'sources\s*[+]?=\s*\[(.*?)\]', re.DOTALL) - self.deps_pattern = re.compile(r'deps\s*[+]?=\s*\[(.*?)\]', re.DOTALL) - self.includes_pattern = re.compile(r'include_dirs\s*[+]?=\s*\[(.*?)\]', re.DOTALL) - self.configs_pattern = re.compile(r'configs\s*[+]?=\s*\[(.*?)\]', re.DOTALL) - - def execute(self): - for root, _, files in os.walk(self.root_dir): - if "BUILD.gn" in files: - path = os.path.join(root, "BUILD.gn") - self.parse_build_gn(path) - self.parse_groups(path) - - for target in self.data_json: - target["deps_list"] = self._get_deps_list(target) - target["dep_h"] = [h for d in target["deps_list"] for h in self.process_file(d)] - - change_files, oh_fields = self.process_changes() - - if len(oh_fields) == 1 and oh_fields[0] == "arkui_ace_engine": - print(" ".join(self.analyze_impact(change_files))) - else: - print(f"TDDarkui_ace_engine") - self.generate_output() - - def parse_build_gn(self, file_path): - content = self._read_file(file_path) - processed_content = "\n".join(line.split("#")[0].rstrip() - for line in content.splitlines()) - - for match in self.unittest_pattern.finditer(processed_content): - self._process_unittest(match, file_path) - - def process_file(self, file_path): - content = self._read_file(file_path) - return {header for line in content.split('\n') - if (header := self._process_includes(line))} - - def parse_groups(self, file_path): - content = self._read_file(file_path) - processed_content = "\n".join(line.split("#")[0].rstrip() - for line in content.splitlines()) - - for match in self.group_pattern.finditer(processed_content): - self._process_group(match, file_path) - - def process_changes(self): - change_info = self._read_json("change_info.json") - openharmony_fields = [v["name"] for v in change_info.values() if "name" in v] - - change_files = [] - file_operations = { - "added": lambda x: x, - "rename": lambda x: [item for pair in x for item in pair], - "modified": lambda x: x, - "deleted": lambda x: x - } - - for value in change_info.values(): - changed_files = value.get("changed_file_list", {}) - for op, processor in file_operations.items(): - if op in changed_files: - change_files.extend(processor(changed_files[op])) - - return ( - [os.path.join(self.ace_root, f) for f in change_files], - openharmony_fields - ) - - def generate_output(self): - with open("test_targets.json", "w") as f: - json.dump(self.data_json, f, indent=2) - - with open("groups.json", "w") as f: - json.dump(self.group_json, f, indent=2) - - def analyze_impact(self, change_files): - tdd_data = self._read_json("developtools/integration_verification/tools/gated_check_in/ace_engine.json") or {} - adapted_targets = set(tdd_data.get("adapted_test_targets", [])) - adapting_targets = set(tdd_data.get("adapting_test_targets", [])) - - change_set = set(change_files) - impacted = [] - - for target in self.data_json: - target_sets = { - "source_list": set(target["source_list"]), - "deps_list": set(target["deps_list"]), - "includes_list": set(target["includes_list"]), - "configs_list": set(target["configs_list"]), - "source_h": set(target["source_h"]), - "dep_h": set(target["dep_h"]), - "includes_h": set(target["includes_h"]), - "configs_h": set(target["configs_h"]) - } - if any(change_set & s for s in target_sets.values()): - if target["test_target"] in adapted_targets: - impacted.append(target["test_target"]) - - return ["TDDarkui_ace_engine"] if not impacted else impacted - - @lru_cache(maxsize=128) - def _read_file(self, file_path): - try: - with open(file_path, 'r', encoding='utf-8') as f: - return f.read() - except Exception as e: - return "" - - def _get_deps_list(self, target): - ret = [] - for dep in target["deps_list"]: - ret = list(set(ret + self._get_source_list(dep))) - return ret - - def _get_source_list(self, dep): - for target in self.data_json: - if dep == target["test_target"]: - return target["source_list"] - return [] - - def _process_includes(self, line): - for pattern in [r'#include\s*"(.*?)"', r'#include\s*<(.*?)>']: - match = re.match(pattern, line) - if match and (header := match.group(1)).endswith('.h'): - return header - return None - - def _process_unittest(self, match, file_path): - target_name = match.group(2) - target_content = match.group(3) - base_path = os.path.dirname(file_path) - - sources = self._get_gn_content(self.sources_pattern, target_content, base_path) - deps = self._get_gn_content(self.deps_pattern, target_content, base_path) - includes = self._get_include_files(self._get_gn_content(self.includes_pattern, target_content, base_path)) - configs = self._get_gn_content(self.configs_pattern, target_content, base_path) - - source_h = {h for s in sources for h in self.process_file(s)} - dep_h = {h for d in deps for h in self.process_file(d)} - include_h = {h for s in includes for h in self.process_file(s)} - config_h = {h for d in configs for h in self.process_file(d)} - - build_target = f"{os.path.dirname(file_path)}:{target_name}" - self.data_json.append({ - "test_target": build_target, - "source_list": sources, - "deps_list": deps, - "includes_list": includes, - "configs_list": configs, - "source_h": list(source_h), - "dep_h": list(dep_h), - "includes_h": list(include_h), - "configs_h": list(config_h) - }) - - def _get_include_files(self, includes_list): - all_files = [] - for path in includes_list: - for root, dirs, files in os.walk(path): - for file in files: - all_files.append(os.path.join(root, file)) - return all_files - - def _process_group(self, match, file_path): - group_name = match.group(1) - group_content = match.group(2) - base_path = os.path.dirname(file_path) - - deps = [self._normalize_path(d, base_path).replace("/:", ":") - for d in self._get_gn_content(self.deps_pattern, group_content, "")] - - self.group_json.append({ - "group_name": f"{base_path}:{group_name}", - "deps_list": deps - }) - - def _get_gn_content(self, pattern, content, base_path): - if not (match := pattern.search(content)): - return [] - return [self._normalize_path(s, base_path) - for s in match.group(1).split(',') if s.strip()] - - def _normalize_path(self, s, base_path): - s = s.strip().strip('"') - if '/' not in s: - return os.path.join(base_path, s) - return s.replace('$ace_root', self.ace_root) - - def _read_json(self, path): - try: - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - except Exception as e: - return {} - - - -if __name__ == "__main__": - processor = BuildProcessor( - root_dir="foundation/arkui/ace_engine", - ace_root="foundation/arkui/ace_engine" - ) - processor.execute() - - -- Gitee