diff --git a/py-scripts/lf_multi_traffic.py b/py-scripts/lf_multi_traffic.py index 55f523924..ce91a9575 100755 --- a/py-scripts/lf_multi_traffic.py +++ b/py-scripts/lf_multi_traffic.py @@ -328,6 +328,7 @@ import time # noqa: E402 import traceback # noqa: E402 import copy # noqa: E402 +import shutil # noqa: E402 from multiprocessing import Event, Lock, Manager, Value # noqa: E402 from types import SimpleNamespace # noqa: E402 @@ -5762,7 +5763,6 @@ def run_zoom_test( self.zoom_test_obj.stop_signal = True logger.info("Waiting for Browser Cleanup in Laptops") time.sleep(10) - self.zoom_test_obj.app = None if self.dowebgui: self.zoom_test_obj.stop_webui() @@ -5770,6 +5770,8 @@ def run_zoom_test( self.zoom_test_obj.generate_report_from_data() elif api_stats_collection: self.zoom_test_obj.generate_report_from_api() + self.zoom_test_obj.app = None + time.sleep(5) # self.zoom_test_obj.redis_client = None if self.dowebgui: self.webgui_test_done("zoom") @@ -11337,358 +11339,86 @@ def add_frames_graphs_to_report(current_cord, current_angle, curr_yt_obj=curr_yt file_path, mode="r", encoding="utf-8", errors="ignore" ) as file: csv_reader = csv.DictReader(file) + fieldnames = csv_reader.fieldnames or [] + is_api_format = "audio_input_jitter_avg" in fieldnames for row in csv_reader: + if is_api_format: + ai_jit = float(row["audio_input_jitter_avg"] or 0) + ao_jit = float(row["audio_output_jitter_avg"] or 0) + ai_lat = float(row["audio_input_latency_avg"] or 0) + ao_lat = float(row["audio_output_latency_avg"] or 0) + ai_loss = float(row["audio_input_avg_loss_avg"] or 0) + ao_loss = float(row["audio_output_avg_loss_avg"] or 0) + vi_jit = float(row["video_input_jitter_avg"] or 0) + vo_jit = float(row["video_output_jitter_avg"] or 0) + vi_lat = float(row["video_input_latency_avg"] or 0) + vo_lat = float(row["video_output_latency_avg"] or 0) + vi_loss = float(row["video_input_avg_loss_avg"] or 0) + vo_loss = float(row["video_output_avg_loss_avg"] or 0) + else: + ai_jit = float(row["Sent Audio Jitter (ms)"]) + ao_jit = float(row["Receive Audio Jitter (ms)"]) + ai_lat = float(row["Sent Audio Latency (ms)"]) + ao_lat = float(row["Receive Audio Latency (ms)"]) + ai_loss = float((row["Sent Audio Packet loss (%)"]).split(" ")[0].replace("%", "")) + ao_loss = float((row["Receive Audio Packet loss (%)"]).split(" ")[0].replace("%", "")) + vi_jit = float(row["Sent Video Jitter (ms)"]) + vo_jit = float(row["Receive Video Jitter (ms)"]) + vi_lat = float(row["Sent Video Latency (ms)"]) + vo_lat = float(row["Receive Video Latency (ms)"]) + vi_loss = float((row["Sent Video Packet loss (%)"]).split(" ")[0].replace("%", "")) + vo_loss = float((row["Receive Video Packet loss (%)"]).split(" ")[0].replace("%", "")) - per_client_data["audio_jitter_s"].append( - float(row["Sent Audio Jitter (ms)"]) - ) - per_client_data["audio_jitter_r"].append( - float(row["Receive Audio Jitter (ms)"]) - ) - per_client_data["audio_latency_s"].append( - float(row["Sent Audio Latency (ms)"]) - ) - per_client_data["audio_latency_r"].append( - float(row["Receive Audio Latency (ms)"]) - ) - per_client_data["audio_pktloss_s"].append( - float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - ) - per_client_data["audio_pktloss_r"].append( - float( - (row["Receive Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - ) - per_client_data["video_jitter_s"].append( - float(row["Sent Video Jitter (ms)"]) - ) - per_client_data["video_jitter_r"].append( - float(row["Receive Video Jitter (ms)"]) - ) - per_client_data["video_latency_s"].append( - float(row["Sent Video Latency (ms)"]) - ) - per_client_data["video_latency_r"].append( - float(row["Receive Video Latency (ms)"]) - ) - per_client_data["video_pktloss_s"].append( - float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - ) - per_client_data["video_pktloss_r"].append( - float( - (row["Receive Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - ) - - temp_max_audio_jitter_s = max( - temp_max_audio_jitter_s, - float(row["Sent Audio Jitter (ms)"]), - ) - temp_max_audio_jitter_r = max( - temp_max_audio_jitter_r, - float(row["Receive Audio Jitter (ms)"]), - ) - temp_max_audio_latency_s = max( - temp_max_audio_latency_s, - float(row["Sent Audio Latency (ms)"]), - ) - temp_max_audio_latency_r = max( - temp_max_audio_latency_r, - float(row["Receive Audio Latency (ms)"]), - ) - temp_max_audio_pktloss_s = max( - temp_max_audio_pktloss_s, - float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ), - ) - temp_max_audio_pktloss_r = max( - temp_max_audio_pktloss_r, - float( - (row["Receive Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ), - ) - - temp_max_video_jitter_s = max( - temp_max_video_jitter_s, - float(row["Sent Video Jitter (ms)"]), - ) - temp_max_video_jitter_r = max( - temp_max_video_jitter_r, - float(row["Receive Video Jitter (ms)"]), - ) - temp_max_video_latency_s = max( - temp_max_video_latency_s, - float(row["Sent Video Latency (ms)"]), - ) - temp_max_video_latency_r = max( - temp_max_video_latency_r, - float(row["Receive Video Latency (ms)"]), - ) - temp_max_video_pktloss_s = max( - temp_max_video_pktloss_s, - float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ), - ) - temp_max_video_pktloss_r = max( - temp_max_video_pktloss_r, - float( - (row["Receive Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ), - ) - - temp_min_audio_jitter_s = ( - min( - temp_min_audio_jitter_s, - float(row["Sent Audio Jitter (ms)"]), - ) - if temp_min_audio_jitter_s > 0 - and float(row["Sent Audio Jitter (ms)"]) > 0 - else ( - float(row["Sent Audio Jitter (ms)"]) - if float(row["Sent Audio Jitter (ms)"]) > 0 - else temp_min_audio_jitter_s - ) - ) - temp_min_audio_jitter_r = ( - min( - temp_min_audio_jitter_r, - float(row["Receive Audio Jitter (ms)"]), - ) - if temp_min_audio_jitter_r > 0 - and float(row["Receive Audio Jitter (ms)"]) > 0 - else ( - float(row["Receive Audio Jitter (ms)"]) - if float(row["Receive Audio Jitter (ms)"]) > 0 - else temp_min_audio_jitter_r - ) - ) - temp_min_audio_latency_s = ( - min( - temp_min_audio_latency_s, - float(row["Sent Audio Latency (ms)"]), - ) - if temp_min_audio_latency_s > 0 - and float(row["Sent Audio Latency (ms)"]) > 0 - else ( - float(row["Sent Audio Latency (ms)"]) - if float(row["Sent Audio Latency (ms)"]) > 0 - else temp_min_audio_jitter_s - ) - ) - temp_min_audio_latency_r = ( - min( - temp_min_audio_latency_r, - float(row["Receive Audio Latency (ms)"]), - ) - if temp_min_audio_latency_r > 0 - and float(row["Receive Audio Latency (ms)"]) > 0 - else ( - float(row["Receive Audio Latency (ms)"]) - if float(row["Receive Audio Latency (ms)"]) > 0 - else temp_min_audio_jitter_r - ) - ) - - temp_min_audio_pktloss_s = ( - min( - temp_min_audio_pktloss_s, - float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ), - ) - if temp_min_audio_pktloss_s > 0 - and float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - > 0 - else ( - float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - if float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - > 0 - else temp_min_audio_pktloss_s - ) - ) - temp_min_audio_pktloss_r = ( - min( - temp_min_audio_pktloss_r, - float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ), - ) - if temp_min_audio_pktloss_r > 0 - and float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - > 0 - else ( - float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - if float( - (row["Sent Audio Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - > 0 - else temp_min_audio_pktloss_r - ) - ) + per_client_data["audio_jitter_s"].append(ai_jit) + per_client_data["audio_jitter_r"].append(ao_jit) + per_client_data["audio_latency_s"].append(ai_lat) + per_client_data["audio_latency_r"].append(ao_lat) + per_client_data["audio_pktloss_s"].append(ai_loss) + per_client_data["audio_pktloss_r"].append(ao_loss) + per_client_data["video_jitter_s"].append(vi_jit) + per_client_data["video_jitter_r"].append(vo_jit) + per_client_data["video_latency_s"].append(vi_lat) + per_client_data["video_latency_r"].append(vo_lat) + per_client_data["video_pktloss_s"].append(vi_loss) + per_client_data["video_pktloss_r"].append(vo_loss) - temp_min_video_jitter_s = ( - min( - temp_min_video_jitter_s, - float(row["Sent Video Jitter (ms)"]), - ) - if temp_min_video_jitter_s > 0 - and float(row["Sent Video Jitter (ms)"]) > 0 - else ( - float(row["Sent Video Jitter (ms)"]) - if float(row["Sent Video Jitter (ms)"]) > 0 - else temp_min_video_jitter_s - ) - ) - temp_min_video_jitter_r = ( - min( - temp_min_video_jitter_r, - float(row["Receive Video Jitter (ms)"]), - ) - if temp_min_video_jitter_r > 0 - and float(row["Receive Video Jitter (ms)"]) > 0 - else ( - float(row["Receive Video Jitter (ms)"]) - if float(row["Receive Video Jitter (ms)"]) > 0 - else temp_min_video_jitter_r - ) - ) - temp_min_video_latency_s = ( - min( - temp_min_video_latency_s, - float(row["Sent Video Latency (ms)"]), - ) - if temp_min_video_latency_s > 0 - and float(row["Sent Video Latency (ms)"]) > 0 - else ( - float(row["Sent Video Latency (ms)"]) - if float(row["Sent Video Latency (ms)"]) > 0 - else temp_min_video_latency_s - ) - ) - temp_min_video_latency_r = ( - min( - temp_min_video_latency_r, - float(row["Receive Video Latency (ms)"]), - ) - if temp_min_video_latency_r > 0 - and float(row["Receive Video Latency (ms)"]) > 0 - else ( - float(row["Receive Video Latency (ms)"]) - if float(row["Receive Video Latency (ms)"]) > 0 - else temp_min_video_latency_r - ) - ) + temp_max_audio_jitter_s = max(temp_max_audio_jitter_s, ai_jit) + temp_max_audio_jitter_r = max(temp_max_audio_jitter_r, ao_jit) + temp_max_audio_latency_s = max(temp_max_audio_latency_s, ai_lat) + temp_max_audio_latency_r = max(temp_max_audio_latency_r, ao_lat) + temp_max_audio_pktloss_s = max(temp_max_audio_pktloss_s, ai_loss) + temp_max_audio_pktloss_r = max(temp_max_audio_pktloss_r, ao_loss) + temp_max_video_jitter_s = max(temp_max_video_jitter_s, vi_jit) + temp_max_video_jitter_r = max(temp_max_video_jitter_r, vo_jit) + temp_max_video_latency_s = max(temp_max_video_latency_s, vi_lat) + temp_max_video_latency_r = max(temp_max_video_latency_r, vo_lat) + temp_max_video_pktloss_s = max(temp_max_video_pktloss_s, vi_loss) + temp_max_video_pktloss_r = max(temp_max_video_pktloss_r, vo_loss) - temp_min_video_pktloss_s = ( - min( - temp_min_video_pktloss_s, - float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ), - ) - if temp_min_video_pktloss_s > 0 - and float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - > 0 - else ( - float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - if float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - > 0 - else temp_min_video_pktloss_s - ) - ) - temp_min_video_pktloss_r = ( - min( - temp_min_video_pktloss_r, - float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ), - ) - if temp_min_video_pktloss_r > 0 - and float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - > 0 - else ( - float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - if float( - (row["Sent Video Packet loss (%)"]) - .split(" ")[0] - .replace("%", "") - ) - > 0 - else temp_min_video_pktloss_r - ) - ) + if ai_jit > 0: + temp_min_audio_jitter_s = ai_jit if temp_min_audio_jitter_s == 0 else min(temp_min_audio_jitter_s, ai_jit) + if ao_jit > 0: + temp_min_audio_jitter_r = ao_jit if temp_min_audio_jitter_r == 0 else min(temp_min_audio_jitter_r, ao_jit) + if ai_lat > 0: + temp_min_audio_latency_s = ai_lat if temp_min_audio_latency_s == 0 else min(temp_min_audio_latency_s, ai_lat) + if ao_lat > 0: + temp_min_audio_latency_r = ao_lat if temp_min_audio_latency_r == 0 else min(temp_min_audio_latency_r, ao_lat) + if ai_loss > 0: + temp_min_audio_pktloss_s = ai_loss if temp_min_audio_pktloss_s == 0 else min(temp_min_audio_pktloss_s, ai_loss) + if ao_loss > 0: + temp_min_audio_pktloss_r = ao_loss if temp_min_audio_pktloss_r == 0 else min(temp_min_audio_pktloss_r, ao_loss) + if vi_jit > 0: + temp_min_video_jitter_s = vi_jit if temp_min_video_jitter_s == 0 else min(temp_min_video_jitter_s, vi_jit) + if vo_jit > 0: + temp_min_video_jitter_r = vo_jit if temp_min_video_jitter_r == 0 else min(temp_min_video_jitter_r, vo_jit) + if vi_lat > 0: + temp_min_video_latency_s = vi_lat if temp_min_video_latency_s == 0 else min(temp_min_video_latency_s, vi_lat) + if vo_lat > 0: + temp_min_video_latency_r = vo_lat if temp_min_video_latency_r == 0 else min(temp_min_video_latency_r, vo_lat) + if vi_loss > 0: + temp_min_video_pktloss_s = vi_loss if temp_min_video_pktloss_s == 0 else min(temp_min_video_pktloss_s, vi_loss) + if vo_loss > 0: + temp_min_video_pktloss_r = vo_loss if temp_min_video_pktloss_r == 0 else min(temp_min_video_pktloss_r, vo_loss) elif self.do_bandsteering: if not self.dowebgui: @@ -11797,7 +11527,7 @@ def add_frames_graphs_to_report(current_cord, current_angle, curr_yt_obj=curr_yt temp_min_video_pktloss_r = vo_loss if temp_min_video_pktloss_r == 0 else min(temp_min_video_pktloss_r, vo_loss) except Exception as e: - logging.error(f"Error in reading data in client {self.zoom_obj_dict[ce][obj_name]['obj'].device_names[i]}", e) + logging.error(f"Error in reading data in client {self.zoom_obj_dict[ce][obj_name]['obj'].device_names[i]}: {e}") no_csv_client.append(curr_zoom_obj.device_names[i]) rejected_clients.append(curr_zoom_obj.device_names[i]) if curr_zoom_obj.device_names[i] not in no_csv_client: @@ -11832,6 +11562,19 @@ def add_frames_graphs_to_report(current_cord, current_angle, curr_yt_obj=curr_yt final_dataset.append(per_client_data.copy()) + try: + src_dir = curr_zoom_obj.report.path_date_time + dst_dir = self.overall_report.path_date_time + for csv_file in os.listdir(src_dir): + if csv_file.endswith('.csv'): + shutil.copy2( + os.path.join(src_dir, csv_file), + os.path.join(dst_dir, csv_file) + ) + logging.info(f"Copied zoom CSV {csv_file} to overall report directory") + except Exception as e: + logging.error(f"Error copying zoom CSVs to overall report directory: {e}") + self.overall_report.set_table_title("Test Devices:") self.overall_report.build_table_title() diff --git a/py-scripts/real_application_tests/zoom_automation/lf_interop_zoom.py b/py-scripts/real_application_tests/zoom_automation/lf_interop_zoom.py index f390061d6..7fe972920 100644 --- a/py-scripts/real_application_tests/zoom_automation/lf_interop_zoom.py +++ b/py-scripts/real_application_tests/zoom_automation/lf_interop_zoom.py @@ -1981,6 +1981,8 @@ def generate_report(self): _results_dir_name="zoom_call_report", _path=self.path) report_path_date_time = report.get_path_date_time() + self.report = report + self.report_path_date_time = report_path_date_time report.set_title("Zoom Call Automated Report") report.build_banner()