Skip to content

Commit

Permalink
Fix and re-enable Linux TV commissioner-generated-passcode CI test (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
shaoltan-amazon authored Oct 31, 2024
1 parent 7826146 commit a7ee9d4
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 49 deletions.
17 changes: 7 additions & 10 deletions .github/workflows/examples-linux-tv-casting-app.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,13 @@ jobs:
"python3 ./scripts/tests/run_tv_casting_test.py"
timeout-minutes: 2 # Comment this out to debug if GitHub Action times out.

# TODO: this test is flaky and was disabled
# https://github.com/project-chip/connectedhomeip/issues/34598
#
# - name:
# Test casting from Linux tv-casting-app to Linux tv-app -
# Commissioner Generated Passcode
# run: |
# ./scripts/run_in_build_env.sh \
# "python3 ./scripts/tests/run_tv_casting_test.py --commissioner-generated-passcode=True"
# timeout-minutes: 2 # Comment this out to debug if GitHub Action times out.
- name:
Test casting from Linux tv-casting-app to Linux tv-app -
Commissioner Generated Passcode
run: |
./scripts/run_in_build_env.sh \
"python3 ./scripts/tests/run_tv_casting_test.py --commissioner-generated-passcode=True"
timeout-minutes: 2 # Comment this out to debug if GitHub Action times out.

- name: Uploading Size Reports
uses: ./.github/actions/upload-size-reports
Expand Down
84 changes: 49 additions & 35 deletions scripts/tests/linux/log_line_processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@

import logging
import queue
import select
import subprocess
import threading
import time
Expand Down Expand Up @@ -45,44 +44,47 @@ class ProcessOutputCapture:
def __init__(self, command: List[str], output_path: str):
# in/out/err are pipes
self.command = command
self.output_file = None # Output file handle
self.output_path = output_path
self.output_lines = queue.Queue()
self.process = None
self.io_thread = None
self.stdout_thread = None
self.stderr_thread = None
self.lock = threading.Lock()
self.done = False

def _io_thread(self):
"""Reads process lines and writes them to an output file.
def _write_to_file(self, line: str, is_error_line=False):
"""Writes a line to an output file in a thread-safe manner."""
with self.lock:
if is_error_line:
self.output_file.write(f"!!STDERR!! : {line}")
else:
self.output_file.write(line)
self.output_file.flush()

def _stdout_thread(self):
"""Reads stdout process lines and writes them to an output file.
It also sends the output lines to `self.output_lines` for later
reading
reading.
"""
while not self.done:
out_line = self.process.stdout.readline()
if not out_line:
break
self._write_to_file(out_line)
self.output_lines.put(out_line)

def _stderr_thread(self):
"""Reads stderr process lines and writes them to an output file.
The lines are marked as error lines when written to the file.
"""
out_wait = select.poll()
out_wait.register(self.process.stdout, select.POLLIN | select.POLLHUP)

err_wait = select.poll()
err_wait.register(self.process.stderr, select.POLLIN | select.POLLHUP)

with open(self.output_path, "wt") as f:
f.write("PROCESS START: %s\n" % time.ctime())
while not self.done:
changes = out_wait.poll(0.1)
if changes:
out_line = self.process.stdout.readline()
if not out_line:
# stdout closed (otherwise readline should have at least \n)
continue
f.write(out_line)
self.output_lines.put(out_line)

changes = err_wait.poll(0)
if changes:
err_line = self.process.stderr.readline()
if not err_line:
# stderr closed (otherwise readline should have at least \n)
continue
f.write(f"!!STDERR!! : {err_line}")
f.write("PROCESS END: %s\n" % time.ctime())
while not self.done:
err_line = self.process.stderr.readline()
if not err_line:
break
self._write_to_file(err_line, is_error_line=True)

def __enter__(self):
self.done = False
Expand All @@ -92,9 +94,14 @@ def __enter__(self):
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
bufsize=1, # Enable line buffering for immediate output from subprocess
)
self.io_thread = threading.Thread(target=self._io_thread)
self.io_thread.start()
self.output_file = open(self.output_path, "wt", buffering=1) # Enable line buffering for immediate output
self._write_to_file(f"### PROCESS START: {time.ctime()} ###\n")
self.stdout_thread = threading.Thread(target=self._stdout_thread)
self.stderr_thread = threading.Thread(target=self._stderr_thread)
self.stdout_thread.start()
self.stderr_thread.start()
return self

def __exit__(self, exception_type, exception_value, traceback):
Expand All @@ -103,8 +110,15 @@ def __exit__(self, exception_type, exception_value, traceback):
self.process.terminate()
self.process.wait()

if self.io_thread:
self.io_thread.join()
if self.stdout_thread:
self.stdout_thread.join()

if self.stderr_thread:
self.stderr_thread.join()

if self.output_file:
self._write_to_file(f"### PROCESS END: {time.ctime()} ###\n")
self.output_file.close()

if exception_value:
# When we fail because of an exception, report the entire log content
Expand Down
9 changes: 5 additions & 4 deletions scripts/tests/linux/tv_casting_test_sequences.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,15 +235,16 @@
# Validate that commissioning succeeded in the tv-app output.
Step(app=App.TV_APP, output_msg=['------PROMPT USER: commissioning success']),

# TODO: Enable the following steps once we fix https://github.com/project-chip/connectedhomeip/issues/36289
# Validate that we are able to subscribe to the media playback cluster by reading the CurrentState value and that it matches {ATTRIBUTE_CURRENT_PLAYBACK_STATE}.
Step(app=App.TV_CASTING_APP, output_msg=[f'Read CurrentState value: {ATTRIBUTE_CURRENT_PLAYBACK_STATE}']),
# Step(app=App.TV_CASTING_APP, output_msg=[f'Read CurrentState value: {ATTRIBUTE_CURRENT_PLAYBACK_STATE}']),

# Validate the LaunchURL in the tv-app output.
Step(app=App.TV_APP,
output_msg=['ContentLauncherManager::HandleLaunchUrl TEST CASE ContentURL=https://www.test.com/videoid DisplayString=Test video']),
# Step(app=App.TV_APP,
# output_msg=['ContentLauncherManager::HandleLaunchUrl TEST CASE ContentURL=https://www.test.com/videoid DisplayString=Test video']),

# Validate the LaunchURL in the tv-casting-app output.
Step(app=App.TV_CASTING_APP, output_msg=['LaunchURL Success with response.data: exampleData']),
# Step(app=App.TV_CASTING_APP, output_msg=['LaunchURL Success with response.data: exampleData']),

# Signal to stop the tv-casting-app as we finished validation.
Step(app=App.TV_CASTING_APP, input_cmd=STOP_APP),
Expand Down

0 comments on commit a7ee9d4

Please sign in to comment.