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()