1a3e0fd82Sopenharmony_ci#!/usr/bin/env python
2a3e0fd82Sopenharmony_ci# -*- coding: utf-8 -*-
3a3e0fd82Sopenharmony_ci# Copyright (c) 2022 Huawei Device Co., Ltd.
4a3e0fd82Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
5a3e0fd82Sopenharmony_ci# you may not use this file except in compliance with the License.
6a3e0fd82Sopenharmony_ci# You may obtain a copy of the License at
7a3e0fd82Sopenharmony_ci#
8a3e0fd82Sopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
9a3e0fd82Sopenharmony_ci#
10a3e0fd82Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
11a3e0fd82Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
12a3e0fd82Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a3e0fd82Sopenharmony_ci# See the License for the specific language governing permissions and
14a3e0fd82Sopenharmony_ci# limitations under the License.
15a3e0fd82Sopenharmony_ci
16a3e0fd82Sopenharmony_ciimport threading
17a3e0fd82Sopenharmony_ciimport socket
18a3e0fd82Sopenharmony_ciimport json
19a3e0fd82Sopenharmony_ciimport time
20a3e0fd82Sopenharmony_ciimport subprocess
21a3e0fd82Sopenharmony_ciimport os
22a3e0fd82Sopenharmony_ciimport shutil
23a3e0fd82Sopenharmony_ci
24a3e0fd82Sopenharmony_ci
25a3e0fd82Sopenharmony_ciclass TestServer(threading.Thread):
26a3e0fd82Sopenharmony_ci
27a3e0fd82Sopenharmony_ci    IP = '127.0.0.1'
28a3e0fd82Sopenharmony_ci
29a3e0fd82Sopenharmony_ci    PORT = 23495
30a3e0fd82Sopenharmony_ci
31a3e0fd82Sopenharmony_ci    config_file_name = "config.json"
32a3e0fd82Sopenharmony_ci
33a3e0fd82Sopenharmony_ci    # Run base_ Dir directory
34a3e0fd82Sopenharmony_ci    TestModeBase = 1
35a3e0fd82Sopenharmony_ci
36a3e0fd82Sopenharmony_ci    # Run run_dir directory
37a3e0fd82Sopenharmony_ci    TestModeRun = 2
38a3e0fd82Sopenharmony_ci
39a3e0fd82Sopenharmony_ci    # Send config information
40a3e0fd82Sopenharmony_ci    S_C_MAIN_ID_SEND_CONFIG_INFO = 1
41a3e0fd82Sopenharmony_ci
42a3e0fd82Sopenharmony_ci    # Request to start test
43a3e0fd82Sopenharmony_ci    C_S_MAIN_ID_REQUEST_TEST_INFO = 2
44a3e0fd82Sopenharmony_ci
45a3e0fd82Sopenharmony_ci    # Distribute test data
46a3e0fd82Sopenharmony_ci    S_C_MAIN_ID_SEND_TEST_INFO = 3
47a3e0fd82Sopenharmony_ci
48a3e0fd82Sopenharmony_ci    # Test a set of data
49a3e0fd82Sopenharmony_ci    C_S_MAIN_ID_TEST_FINISH_INFO = 4
50a3e0fd82Sopenharmony_ci
51a3e0fd82Sopenharmony_ci    # All tests completed
52a3e0fd82Sopenharmony_ci    S_C_MAIN_ID_All_TESTS_COMPLETE = 5
53a3e0fd82Sopenharmony_ci
54a3e0fd82Sopenharmony_ci
55a3e0fd82Sopenharmony_ci    def __init__(self):
56a3e0fd82Sopenharmony_ci        threading.Thread.__init__(self)
57a3e0fd82Sopenharmony_ci        print("tcp_server_init__")
58a3e0fd82Sopenharmony_ci        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
59a3e0fd82Sopenharmony_ci        self.tcp_server_socket.bind((self.IP, self.PORT))
60a3e0fd82Sopenharmony_ci        self.tcp_server_socket.listen(128)
61a3e0fd82Sopenharmony_ci
62a3e0fd82Sopenharmony_ci        self.config = self.read_data_from_json(self.config_file_name)
63a3e0fd82Sopenharmony_ci        self.test_group_index = 0
64a3e0fd82Sopenharmony_ci
65a3e0fd82Sopenharmony_ci
66a3e0fd82Sopenharmony_ci    def send_message(self, conn, info):
67a3e0fd82Sopenharmony_ci        clientdata = json.dumps(info).encode("utf-8")
68a3e0fd82Sopenharmony_ci        print('send msg:  ', clientdata)
69a3e0fd82Sopenharmony_ci        conn.send(clientdata)
70a3e0fd82Sopenharmony_ci
71a3e0fd82Sopenharmony_ci
72a3e0fd82Sopenharmony_ci    def init_data(self):
73a3e0fd82Sopenharmony_ci        self.test_case_index = 0
74a3e0fd82Sopenharmony_ci        self.test_case = self.config['testGroup'][self.test_group_index]['test_case']
75a3e0fd82Sopenharmony_ci        self.test_case_dir = self.config['testGroup'][self.test_group_index]['test_case_dir']
76a3e0fd82Sopenharmony_ci
77a3e0fd82Sopenharmony_ci        if len(self.config['testGroup'][self.test_group_index]['test_case']) <= 0:
78a3e0fd82Sopenharmony_ci            self.test_case = self.traverasl_files(self.config['testGroup'][self.test_group_index]['test_case_dir'])
79a3e0fd82Sopenharmony_ci            print(self.test_case)
80a3e0fd82Sopenharmony_ci
81a3e0fd82Sopenharmony_ci
82a3e0fd82Sopenharmony_ci    def tcp_connect(self, conn, addr):
83a3e0fd82Sopenharmony_ci        print(' Connected by: ', addr)
84a3e0fd82Sopenharmony_ci        time.sleep(3)
85a3e0fd82Sopenharmony_ci
86a3e0fd82Sopenharmony_ci        self.init_data()
87a3e0fd82Sopenharmony_ci        self.start_test(conn)
88a3e0fd82Sopenharmony_ci        while True:
89a3e0fd82Sopenharmony_ci            data = conn.recv(1024)
90a3e0fd82Sopenharmony_ci            data = (int)(data.decode("utf-8"))
91a3e0fd82Sopenharmony_ci            print("recv msg: ", data)
92a3e0fd82Sopenharmony_ci            if data == self.C_S_MAIN_ID_REQUEST_TEST_INFO:
93a3e0fd82Sopenharmony_ci                print("begin test: ", data)
94a3e0fd82Sopenharmony_ci                self.test_case_index = 0
95a3e0fd82Sopenharmony_ci                self.send_test_info(conn)
96a3e0fd82Sopenharmony_ci            elif data == self.C_S_MAIN_ID_TEST_FINISH_INFO:
97a3e0fd82Sopenharmony_ci                self.test_case_index += 1
98a3e0fd82Sopenharmony_ci                self.send_test_info(conn)
99a3e0fd82Sopenharmony_ci
100a3e0fd82Sopenharmony_ci
101a3e0fd82Sopenharmony_ci    def send_all_test_finish(self, conn):
102a3e0fd82Sopenharmony_ci        send_config =  {'main_id':self.S_C_MAIN_ID_All_TESTS_COMPLETE}
103a3e0fd82Sopenharmony_ci        self.send_message(conn, send_config)
104a3e0fd82Sopenharmony_ci
105a3e0fd82Sopenharmony_ci        self.test_group_index += 1
106a3e0fd82Sopenharmony_ci        if self.test_group_index >= len(self.config['testGroup']):
107a3e0fd82Sopenharmony_ci            self.test_group_index = 0
108a3e0fd82Sopenharmony_ci            return
109a3e0fd82Sopenharmony_ci
110a3e0fd82Sopenharmony_ci        print("send_all_test_finish------test_group_index=", self.test_group_index,\
111a3e0fd82Sopenharmony_ci                "------len=", len(self.config['testGroup']))
112a3e0fd82Sopenharmony_ci        self.start_client_process()
113a3e0fd82Sopenharmony_ci
114a3e0fd82Sopenharmony_ci
115a3e0fd82Sopenharmony_ci    def send_test_info(self, conn):
116a3e0fd82Sopenharmony_ci        if len(self.test_case):
117a3e0fd82Sopenharmony_ci            if self.test_case_index < len(self.test_case):
118a3e0fd82Sopenharmony_ci                json_data = self.read_data_from_json(self.test_case_dir + '/' + self.test_case[self.test_case_index])
119a3e0fd82Sopenharmony_ci                json_data['main_id'] = self.S_C_MAIN_ID_SEND_TEST_INFO
120a3e0fd82Sopenharmony_ci                print(json_data)
121a3e0fd82Sopenharmony_ci                self.send_message(conn, json_data)
122a3e0fd82Sopenharmony_ci            else:
123a3e0fd82Sopenharmony_ci                self.send_all_test_finish(conn)
124a3e0fd82Sopenharmony_ci
125a3e0fd82Sopenharmony_ci
126a3e0fd82Sopenharmony_ci    def start_test(self, conn):
127a3e0fd82Sopenharmony_ci        send_config = self.config['testGroup'][self.test_group_index]
128a3e0fd82Sopenharmony_ci        test_mode = send_config['test_mode']
129a3e0fd82Sopenharmony_ci        base_dir = send_config['base_dir']
130a3e0fd82Sopenharmony_ci        run_dir = send_config['run_dir']
131a3e0fd82Sopenharmony_ci        log_dir = send_config['log_dir']
132a3e0fd82Sopenharmony_ci
133a3e0fd82Sopenharmony_ci        if test_mode == self.TestModeBase:
134a3e0fd82Sopenharmony_ci            self.clear_directory(base_dir)
135a3e0fd82Sopenharmony_ci        elif test_mode == self.TestModeRun:
136a3e0fd82Sopenharmony_ci            self.clear_directory(run_dir)
137a3e0fd82Sopenharmony_ci
138a3e0fd82Sopenharmony_ci        send_config =  {'main_id': self.S_C_MAIN_ID_SEND_CONFIG_INFO,\
139a3e0fd82Sopenharmony_ci            'test_mode': test_mode,\
140a3e0fd82Sopenharmony_ci            'base_dir': base_dir,\
141a3e0fd82Sopenharmony_ci            'run_dir': run_dir,\
142a3e0fd82Sopenharmony_ci            'log_dir': log_dir}
143a3e0fd82Sopenharmony_ci
144a3e0fd82Sopenharmony_ci        self.send_message(conn, send_config)
145a3e0fd82Sopenharmony_ci
146a3e0fd82Sopenharmony_ci
147a3e0fd82Sopenharmony_ci    def read_data_from_json(self, filename):
148a3e0fd82Sopenharmony_ci        with open(filename, 'r') as json_file:
149a3e0fd82Sopenharmony_ci            json_data = json.load(json_file)
150a3e0fd82Sopenharmony_ci
151a3e0fd82Sopenharmony_ci        return json_data
152a3e0fd82Sopenharmony_ci
153a3e0fd82Sopenharmony_ci
154a3e0fd82Sopenharmony_ci    def start_client_process(self):
155a3e0fd82Sopenharmony_ci        print(time.time(), '----time is up')
156a3e0fd82Sopenharmony_ci        process_dir = self.config['testGroup'][self.test_group_index]['process_dir']
157a3e0fd82Sopenharmony_ci        process_name = self.config['testGroup'][self.test_group_index]['process_name']
158a3e0fd82Sopenharmony_ci
159a3e0fd82Sopenharmony_ci        process = process_dir + process_name + ' -f'
160a3e0fd82Sopenharmony_ci        subprocess.Popen(process, cwd=process_dir)
161a3e0fd82Sopenharmony_ci        result = subprocess.getstatusoutput(process_dir)
162a3e0fd82Sopenharmony_ci        print(result)
163a3e0fd82Sopenharmony_ci
164a3e0fd82Sopenharmony_ci
165a3e0fd82Sopenharmony_ci    def traverasl_files(self, path):
166a3e0fd82Sopenharmony_ci        self.filelist = []
167a3e0fd82Sopenharmony_ci        obj = os.scandir(path)
168a3e0fd82Sopenharmony_ci        for entry in obj:
169a3e0fd82Sopenharmony_ci            if entry.is_file():
170a3e0fd82Sopenharmony_ci                self.filelist.append(entry.name)
171a3e0fd82Sopenharmony_ci
172a3e0fd82Sopenharmony_ci        return self.filelist
173a3e0fd82Sopenharmony_ci
174a3e0fd82Sopenharmony_ci
175a3e0fd82Sopenharmony_ci    def clear_directory(self, filepath):
176a3e0fd82Sopenharmony_ci        if not os.path.exists(filepath):
177a3e0fd82Sopenharmony_ci            os.mkdir(filepath)
178a3e0fd82Sopenharmony_ci        else:
179a3e0fd82Sopenharmony_ci            shutil.rmtree(filepath)
180a3e0fd82Sopenharmony_ci            os.mkdir(filepath)
181a3e0fd82Sopenharmony_ci
182a3e0fd82Sopenharmony_ci
183a3e0fd82Sopenharmony_ci    def run(self):
184a3e0fd82Sopenharmony_ci        print("TcpServer_run__")
185a3e0fd82Sopenharmony_ci        while True:
186a3e0fd82Sopenharmony_ci            conn, addr = self.tcp_server_socket.accept()
187a3e0fd82Sopenharmony_ci            print("TcpServer_run__, conn, addr", conn, addr)
188a3e0fd82Sopenharmony_ci            thread_recv = threading.Thread(target=self.tcp_connect, args=(conn, addr))
189a3e0fd82Sopenharmony_ci            thread_recv.start()
190a3e0fd82Sopenharmony_ci
191a3e0fd82Sopenharmony_ci        self.tcp_server_socket.close()