1ca0551cfSopenharmony_ci#!/usr/bin/env python3
2ca0551cfSopenharmony_ci# -*- coding: utf-8 -*-
3ca0551cfSopenharmony_ci
4ca0551cfSopenharmony_ci#
5ca0551cfSopenharmony_ci# Copyright (c) 2024 Huawei Device Co., Ltd.
6ca0551cfSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
7ca0551cfSopenharmony_ci# you may not use this file except in compliance with the License.
8ca0551cfSopenharmony_ci# You may obtain a copy of the License at
9ca0551cfSopenharmony_ci#
10ca0551cfSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
11ca0551cfSopenharmony_ci#
12ca0551cfSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
13ca0551cfSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
14ca0551cfSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15ca0551cfSopenharmony_ci# See the License for the specific language governing permissions and
16ca0551cfSopenharmony_ci# limitations under the License.
17ca0551cfSopenharmony_ci#
18ca0551cfSopenharmony_ci
19ca0551cfSopenharmony_ciimport os
20ca0551cfSopenharmony_ciimport subprocess
21ca0551cfSopenharmony_ciimport time
22ca0551cfSopenharmony_ci
23ca0551cfSopenharmony_ci
24ca0551cfSopenharmony_cidef get_time_stamp():
25ca0551cfSopenharmony_ci    return int(round(time.time() * 1000))
26ca0551cfSopenharmony_ci
27ca0551cfSopenharmony_ci
28ca0551cfSopenharmony_cidef print_success(info):
29ca0551cfSopenharmony_ci    print("\033[32m{}\033[0m".format(info))
30ca0551cfSopenharmony_ci
31ca0551cfSopenharmony_ci
32ca0551cfSopenharmony_cidef print_failure(info):
33ca0551cfSopenharmony_ci    print("\033[31m{}\033[0m".format(info))
34ca0551cfSopenharmony_ci
35ca0551cfSopenharmony_ci
36ca0551cfSopenharmony_cidef print_info(info):
37ca0551cfSopenharmony_ci    print("\033[33m{}\033[0m".format(info))
38ca0551cfSopenharmony_ci
39ca0551cfSopenharmony_ci
40ca0551cfSopenharmony_cidef is_subsequence(first_file, second_file):
41ca0551cfSopenharmony_ci    first_info = first_file.read()
42ca0551cfSopenharmony_ci    second_info = second_file.readline()
43ca0551cfSopenharmony_ci    while second_info:
44ca0551cfSopenharmony_ci        if first_info.find(second_info) == -1:
45ca0551cfSopenharmony_ci            print("line\n", second_info, "is not in output file")
46ca0551cfSopenharmony_ci            return False
47ca0551cfSopenharmony_ci        second_info = second_file.readline()
48ca0551cfSopenharmony_ci    return True
49ca0551cfSopenharmony_ci
50ca0551cfSopenharmony_ci
51ca0551cfSopenharmony_cidef content_compare(file1, file2, lhd, rhd):
52ca0551cfSopenharmony_ci    line_num = 0
53ca0551cfSopenharmony_ci    for line1, line2 in zip(lhd, rhd):
54ca0551cfSopenharmony_ci        line_num += 1
55ca0551cfSopenharmony_ci        if line1 != line2:
56ca0551cfSopenharmony_ci            print_failure(f"{file1}:{line_num}:{line1}")
57ca0551cfSopenharmony_ci            print_failure(f"{file2}:{line_num}:{line2}")
58ca0551cfSopenharmony_ci            return False
59ca0551cfSopenharmony_ci    return True
60ca0551cfSopenharmony_ci
61ca0551cfSopenharmony_ci
62ca0551cfSopenharmony_cidef compare_file(first_file_path, second_file_path):
63ca0551cfSopenharmony_ci    with open(first_file_path, 'r') as first_file:
64ca0551cfSopenharmony_ci        with open(second_file_path, 'r') as second_file:
65ca0551cfSopenharmony_ci            return content_compare(first_file_path, second_file_path, first_file.readlines(), second_file.readlines())
66ca0551cfSopenharmony_ci
67ca0551cfSopenharmony_ci
68ca0551cfSopenharmony_cidef compare_target_files(first_file_path, second_file_path):
69ca0551cfSopenharmony_ci    first_files_list = get_all_files(first_file_path)
70ca0551cfSopenharmony_ci    second_files_list = get_all_files(second_file_path)
71ca0551cfSopenharmony_ci
72ca0551cfSopenharmony_ci    first_files = set([file[len(first_file_path):] for file in first_files_list])
73ca0551cfSopenharmony_ci    second_files = set([file[len(second_file_path):-4] for file in second_files_list])
74ca0551cfSopenharmony_ci    if len(first_files) != len(second_files):
75ca0551cfSopenharmony_ci        print(f"[ERROR] result file num({len(first_files)}) != expect file num({len(second_files)})")
76ca0551cfSopenharmony_ci        return False
77ca0551cfSopenharmony_ci
78ca0551cfSopenharmony_ci    common_files = first_files & second_files
79ca0551cfSopenharmony_ci
80ca0551cfSopenharmony_ci    for files in common_files:
81ca0551cfSopenharmony_ci        if not compare_file("{}{}".format(first_file_path, files), "{}{}.txt".format(second_file_path, files)):
82ca0551cfSopenharmony_ci            print("file ", "{}{}".format(first_file_path, files), "{}{}.txt".format(second_file_path, files), \
83ca0551cfSopenharmony_ci                  "is different")
84ca0551cfSopenharmony_ci            return False
85ca0551cfSopenharmony_ci    return True
86ca0551cfSopenharmony_ci
87ca0551cfSopenharmony_ci
88ca0551cfSopenharmony_cidef exec_command(command):
89ca0551cfSopenharmony_ci    return subprocess.getstatusoutput(command)
90ca0551cfSopenharmony_ci
91ca0551cfSopenharmony_ci
92ca0551cfSopenharmony_cidef file_exists(file_path):
93ca0551cfSopenharmony_ci    return os.path.isfile(file_path)
94ca0551cfSopenharmony_ci
95ca0551cfSopenharmony_ci
96ca0551cfSopenharmony_cidef make_binary_file(file_path):
97ca0551cfSopenharmony_ci    print("making idl-gen...")
98ca0551cfSopenharmony_ci    return exec_command("make --directory={} --jobs=4".format(file_path))
99ca0551cfSopenharmony_ci
100ca0551cfSopenharmony_ci
101ca0551cfSopenharmony_cidef clean_binary_file(file_path):
102ca0551cfSopenharmony_ci    return exec_command("make --directory={} clean".format(file_path))
103ca0551cfSopenharmony_ci
104ca0551cfSopenharmony_ci
105ca0551cfSopenharmony_cidef get_all_files(path):
106ca0551cfSopenharmony_ci    file_list = []
107ca0551cfSopenharmony_ci    items = os.listdir(path)
108ca0551cfSopenharmony_ci    for item in items:
109ca0551cfSopenharmony_ci        item_path = os.path.join(path, item)
110ca0551cfSopenharmony_ci        if not os.path.isdir(item_path):
111ca0551cfSopenharmony_ci            file_list.append(item_path)
112ca0551cfSopenharmony_ci        else:
113ca0551cfSopenharmony_ci            file_list += get_all_files(item_path)
114ca0551cfSopenharmony_ci    return file_list
115ca0551cfSopenharmony_ci
116ca0551cfSopenharmony_ci
117ca0551cfSopenharmony_cidef get_all_idl_files(idl_path):
118ca0551cfSopenharmony_ci    file_list = get_all_files(idl_path)
119ca0551cfSopenharmony_ci    idl_file_list = []
120ca0551cfSopenharmony_ci    for file in file_list:
121ca0551cfSopenharmony_ci        if os.path.splitext(file)[-1] == ".idl":
122ca0551cfSopenharmony_ci            idl_file_list.append(file)
123ca0551cfSopenharmony_ci    return idl_file_list
124ca0551cfSopenharmony_ci
125ca0551cfSopenharmony_ci
126ca0551cfSopenharmony_cidef get_idl():
127ca0551cfSopenharmony_ci    current_path = os.path.dirname(os.path.abspath(__file__))
128ca0551cfSopenharmony_ci    relative_path = os.path.join(current_path, get_idl_name())
129ca0551cfSopenharmony_ci    return os.path.realpath(relative_path)
130ca0551cfSopenharmony_ci
131ca0551cfSopenharmony_ci
132ca0551cfSopenharmony_cidef get_idl_name():
133ca0551cfSopenharmony_ci    idl_name = 'idl-gen'
134ca0551cfSopenharmony_ci    if os.name == 'nt':
135ca0551cfSopenharmony_ci        idl_name = 'idl-gen.exe'
136ca0551cfSopenharmony_ci    elif os.name == 'posix':
137ca0551cfSopenharmony_ci        idl_name = 'idl-gen'
138ca0551cfSopenharmony_ci    return idl_name
139ca0551cfSopenharmony_ci
140ca0551cfSopenharmony_ci
141ca0551cfSopenharmony_cidef get_subclasses(cls):
142ca0551cfSopenharmony_ci    return cls.__subclasses__()
143