From 7dc54a93afb90ca1b030e9b4ebfb3c5ffea40dda Mon Sep 17 00:00:00 2001 From: Kendall Goto Date: Tue, 22 Jul 2025 19:12:42 -0700 Subject: [PATCH 1/5] create thread to read chip-tool output in background --- .../sdk_tests/support/yaml_tests/matter_yaml_runner.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py index ce95aaff..348244f9 100644 --- a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py +++ b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py @@ -17,6 +17,7 @@ import json import subprocess +import threading from pathlib import Path from typing import Any, Optional, Union @@ -116,10 +117,17 @@ async def setup( self.__test_harness_runner = WebSocketRunner(config=web_socket_config) self.__chip_tool_log = await self.chip_server.start(server_type, use_paa_certs) + def read_chip_log(gen): + with open(YAML_TESTS_PATH_BASE / "chip_output.log", "wb") as f: + for data in gen: + f.write(data) + self.__chip_tool_log_reader = threading.Thread(target=read_chip_log, args=(self.__chip_tool_log,)) + self.__chip_tool_log_reader.start() async def stop(self) -> None: await self.stop_runner() await self.chip_server.stop() + self.__chip_tool_log_reader.join() def __get_gateway_ip(self) -> str: """ From fc6e9294f7e702f018934766573537a5147e278e Mon Sep 17 00:00:00 2001 From: Kendall Goto Date: Tue, 22 Jul 2025 19:51:03 -0700 Subject: [PATCH 2/5] handle errors for read_chip_log Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../sdk_tests/support/yaml_tests/matter_yaml_runner.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py index 348244f9..002d8dbe 100644 --- a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py +++ b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py @@ -118,9 +118,12 @@ async def setup( self.__chip_tool_log = await self.chip_server.start(server_type, use_paa_certs) def read_chip_log(gen): - with open(YAML_TESTS_PATH_BASE / "chip_output.log", "wb") as f: - for data in gen: - f.write(data) + try: + with open(YAML_TESTS_PATH_BASE / "chip_output.log", "wb") as f: + for data in gen: + f.write(data) + except Exception as e: + self.logger.error(f"Error in chip-tool log reader thread: {e}") self.__chip_tool_log_reader = threading.Thread(target=read_chip_log, args=(self.__chip_tool_log,)) self.__chip_tool_log_reader.start() From 4c6e080bfb30ea8741924bbcd91a7777dddd3840 Mon Sep 17 00:00:00 2001 From: Kendall Goto Date: Tue, 22 Jul 2025 20:13:21 -0700 Subject: [PATCH 3/5] switch to asyncio executor instead of directly using threading --- .../sdk_tests/support/yaml_tests/matter_yaml_runner.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py index 002d8dbe..4b5bf3f5 100644 --- a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py +++ b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py @@ -17,7 +17,7 @@ import json import subprocess -import threading +import asyncio from pathlib import Path from typing import Any, Optional, Union @@ -124,13 +124,12 @@ def read_chip_log(gen): f.write(data) except Exception as e: self.logger.error(f"Error in chip-tool log reader thread: {e}") - self.__chip_tool_log_reader = threading.Thread(target=read_chip_log, args=(self.__chip_tool_log,)) - self.__chip_tool_log_reader.start() + loop = asyncio.get_running_loop() + loop.run_in_executor(None, read_chip_log, self.__chip_tool_log) async def stop(self) -> None: await self.stop_runner() await self.chip_server.stop() - self.__chip_tool_log_reader.join() def __get_gateway_ip(self) -> str: """ From fee4f1309547c267daa60f34eebabd43140cb8e9 Mon Sep 17 00:00:00 2001 From: Kendall Goto Date: Tue, 22 Jul 2025 20:16:24 -0700 Subject: [PATCH 4/5] lint matter_yaml_runner --- .../sdk_tests/support/yaml_tests/matter_yaml_runner.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py index 4b5bf3f5..8d66564d 100644 --- a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py +++ b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py @@ -19,7 +19,7 @@ import subprocess import asyncio from pathlib import Path -from typing import Any, Optional, Union +from typing import Any, Optional, Union, Generator import loguru from matter.yamltests.definitions import SpecDefinitionsFromPaths @@ -117,13 +117,15 @@ async def setup( self.__test_harness_runner = WebSocketRunner(config=web_socket_config) self.__chip_tool_log = await self.chip_server.start(server_type, use_paa_certs) - def read_chip_log(gen): + + def read_chip_log(gen: Generator) -> None: try: with open(YAML_TESTS_PATH_BASE / "chip_output.log", "wb") as f: for data in gen: f.write(data) except Exception as e: self.logger.error(f"Error in chip-tool log reader thread: {e}") + loop = asyncio.get_running_loop() loop.run_in_executor(None, read_chip_log, self.__chip_tool_log) From e83a3cf9aed97b2a6e06a3bc74823d8f2948c27b Mon Sep 17 00:00:00 2001 From: Kendall Goto Date: Tue, 22 Jul 2025 20:18:35 -0700 Subject: [PATCH 5/5] sort imports --- .../matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py index 8d66564d..261dd5eb 100644 --- a/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py +++ b/test_collections/matter/sdk_tests/support/yaml_tests/matter_yaml_runner.py @@ -15,11 +15,11 @@ # from __future__ import annotations +import asyncio import json import subprocess -import asyncio from pathlib import Path -from typing import Any, Optional, Union, Generator +from typing import Any, Generator, Optional, Union import loguru from matter.yamltests.definitions import SpecDefinitionsFromPaths