Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/ci_run.yml
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,11 @@ jobs:
./foc-devnet version 2>&1 || echo "version command failed"
echo '```'
echo ""
echo "## Devnet status"
echo '```'
./foc-devnet status 2>&1 || echo "status command failed"
echo '```'
echo ""
echo "## Resolved dependencies"
if [ -f "$CI_DEPENDENCY_METADATA" ]; then
echo '```json'
Expand Down
28 changes: 27 additions & 1 deletion scenarios/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,24 @@ def get_version_info():
return "foc-devnet version: not available"


def get_status_info():
"""Capture the current devnet status for inclusion in the report."""
for binary in ["./foc-devnet", "foc-devnet"]:
try:
result = subprocess.run(
[binary, "status"],
capture_output=True,
text=True,
timeout=30,
)
output = (result.stdout + result.stderr).strip()
if output:
return output
except (FileNotFoundError, subprocess.TimeoutExpired):
continue
return "foc-devnet status: not available"


_REPORT_TEMPLATE = Template("""
# Scenarios Tests

Expand All @@ -56,6 +74,11 @@ def get_version_info():
## Versions info
$version_info

## Devnet status
```
$status_info
```

## Resolved dependencies
$dependency_table

Expand Down Expand Up @@ -101,12 +124,15 @@ def write_report(results: list[TestResult] | None = None, elapsed: int = 0):
passed = sum(1 for r in results if r.is_passed)
content = _REPORT_TEMPLATE.substitute(
run_type=os.environ.get("SCENARIO_RUN_TYPE", "local"),
date=datetime.datetime.now(datetime.UTC).strftime("%d-%B-%Y %H:%M:%S GMT +0"),
date=datetime.datetime.now(datetime.timezone.utc).strftime(
"%d-%B-%Y %H:%M:%S GMT +0"
),
pass_count=passed,
fail_count=total - passed,
total_count=total,
ci_run_link=_build_ci_run_link(),
version_info=f"```\n{get_version_info()}\n```",
status_info=get_status_info(),
dependency_table=format_markdown_table(),
test_summary=_build_test_summary(results),
)
Expand Down
35 changes: 35 additions & 0 deletions scripts/tests/test_scenario_report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import subprocess
import tempfile
import unittest
from pathlib import Path
from unittest.mock import patch

from scenarios import report


class ScenarioReportTests(unittest.TestCase):
def test_report_embeds_status(self):
with tempfile.TemporaryDirectory() as directory:
report_path = Path(directory) / "scenario_report.md"
with patch.object(report, "REPORT_MD", str(report_path)):
with patch.object(report, "get_version_info", return_value="version"):
with patch.object(
report, "get_status_info", return_value="status output"
):
report.write_report()

content = report_path.read_text()

self.assertIn("## Devnet status", content)
self.assertIn("status output", content)

@patch("scenarios.report.subprocess.run")
def test_status_output_includes_stderr(self, run):
run.return_value = subprocess.CompletedProcess(
["./foc-devnet", "status"],
1,
stdout="status output\n",
stderr="status warning\n",
)

self.assertEqual(report.get_status_info(), "status output\nstatus warning")
3 changes: 2 additions & 1 deletion src/logger.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::paths::foc_devnet_run_log_file;
use std::fs;
use std::io::IsTerminal;
use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};

/// Initializes the logging system.
Expand All @@ -20,7 +21,7 @@ pub fn init_logging(run_id: &str) -> Result<(), Box<dyn std::error::Error>> {
let file_layer = fmt::layer().with_ansi(false).with_writer(log_file);

let stdout_layer = fmt::layer()
.with_ansi(true)
.with_ansi(std::io::stdout().is_terminal())
.with_writer(std::io::stdout)
.with_target(false)
.with_file(true)
Expand Down