Add smoke-long-session workflow to validate MCPG timeout robustness - #4512
Merged
Conversation
5 tasks
…ness Agent-Logs-Url: https://github.com/github/gh-aw-mcpg/sessions/2bfbba95-f3ba-4447-a1cb-24827fb3d28e Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Add long-running smoke test workflow for MCPG timeout robustness
Add smoke-long-session workflow to validate MCPG timeout robustness
Apr 24, 2026
lpcox
marked this pull request as ready for review
April 24, 2026 21:01
Contributor
There was a problem hiding this comment.
Pull request overview
Adds a new agentic smoke-test workflow intended to exercise the MCP Gateway’s timeout behavior under long-running unified sessions, plus an automated “rebuild” workflow to keep the compiled lock file up to date.
Changes:
- Introduces
smoke-long-session.md, a long-duration (up to 120m) end-to-end timeout robustness smoke test using a local Python mock MCP HTTP backend. - Adds
rebuild-smoke-long-session.ymlto recompile the workflow intosmoke-long-session.lock.ymlwhen the source.mdchanges (and open a PR if needed).
Show a summary per file
| File | Description |
|---|---|
.github/workflows/smoke-long-session.md |
New long-session smoke test workflow covering session survival, idle reconnection, tool timeout enforcement, and graceful session expiry. |
.github/workflows/rebuild-smoke-long-session.yml |
New maintenance workflow that rebuilds the compiled lock workflow from the .md source using gh aw compile. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comments suppressed due to low confidence (2)
.github/workflows/smoke-long-session.md:356
- Gateway tool names are prefixed with a triple underscore ("___") in unified mode. This request uses "mock__slow_tool", so the timeout test will fail as a "tool not found" rather than exercising toolTimeout; use "mock___slow_tool".
-H "Authorization: smoke-test-key" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{"jsonrpc":"2.0","id":20,"method":"tools/call","params":{"name":"mock__slow_tool","arguments":{}}}')
.github/workflows/smoke-long-session.md:403
- This post-expiry call still targets "mock__echo_tool", but unified-mode tool names are "___". As written it will fail due to tool lookup rather than validating session expiry behavior; use "mock___echo_tool".
-H "Authorization: smoke-test-key" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "Mcp-Session-Id: $SESSION_ID" \
-d '{"jsonrpc":"2.0","id":30,"method":"tools/call","params":{"name":"mock__echo_tool","arguments":{"message":"after-expiry"}}}')
- Files reviewed: 2/2 changed files
- Comments generated: 4
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This was referenced Apr 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No automated test exercises the gateway's layered timeout stack (session, tool, connect) under realistic long-running conditions — regressions only surface in production.
New files
.github/workflows/smoke-long-session.mdAgentic workflow covering four timeout scenarios end-to-end, with no Docker or external service dependencies:
echo_toolcalls at T=0, 15m, 25m, 35m must all succeed under a 45m unified session timeouttools/listafter a 10-minute idle gap confirms transparent backend reconnectionslow_tool(90s backend sleep, 60stoolTimeout) must return a JSON-RPC error within 75s; a hang or success is a failureThe mock MCP backend is a self-contained Python HTTP server written inline during the run (no containers):
On any assertion failure the workflow creates a GitHub issue with the results table, raw failure lines, and the last 50 lines of the gateway log. Runs weekly +
workflow_dispatch, capped at 120 minutes..github/workflows/rebuild-smoke-long-session.ymlMirrors the existing
rebuild-smoke-copilot.ymlpattern: recompilessmoke-long-session.lock.ymlviagh aw compileand opens a PR when the source.mdchanges.Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
example.com/tmp/go-build2244702282/b513/launcher.test /tmp/go-build2244702282/b513/launcher.test -test.testlogfile=/tmp/go-build2244702282/b513/testlog.txt -test.paniconexit0 -test.timeout=10m0s /tmp/go-build2244702282/b428/vet.cfg 1.80.0/backoff.go 1.80.0/balancer_wrapper.go x_amd64/vet -p crypto/cipher -lang=go1.25 x_amd64/vet -p g_.a -trimpath x_amd64/vet -I rs/otlp/otlptrac-atomic -I x_amd64/vet(dns block)/tmp/go-build2649518652/b509/launcher.test /tmp/go-build2649518652/b509/launcher.test -test.testlogfile=/tmp/go-build2649518652/b509/testlog.txt -test.paniconexit0 -test.timeout=10m0s -test.v=true(dns block)invalid-host-that-does-not-exist-12345.com/tmp/go-build2244702282/b495/config.test /tmp/go-build2244702282/b495/config.test -test.testlogfile=/tmp/go-build2244702282/b495/testlog.txt -test.paniconexit0 -test.timeout=10m0s /tmp/go-build2244702282/b407/vet.cfg 1.80.0/internal/go1.25.9 ache/go/1.25.9/x-c=4 x_amd64/vet -p fmt ut-1031285315.c x_amd64/vet -p g_.a -trimpath x_amd64/vet -I telabs/wazero/ex-atomic -I x_amd64/vet(dns block)/tmp/go-build2649518652/b491/config.test /tmp/go-build2649518652/b491/config.test -test.testlogfile=/tmp/go-build2649518652/b491/testlog.txt -test.paniconexit0 -test.timeout=10m0s -test.v=true --no-pager io.containerd.rudocker0 ash fa5c99c17f8e542b0772e9ad76183d95d4b/log.json b861fb53a8b780818e91286772070847--root 98b3be242853b886440d800c20d10914/var/run/docker/runtime-runc/moby cp /hom�� /tmp/tmp.Xr2JyCITCc/ca-certifica--log-format y e-handler ntime.v2.task/mo/usr/bin/networkctl -goversion 64/pkg/tool/linu--no-pager(dns block)nonexistent.local/tmp/go-build2244702282/b513/launcher.test /tmp/go-build2244702282/b513/launcher.test -test.testlogfile=/tmp/go-build2244702282/b513/testlog.txt -test.paniconexit0 -test.timeout=10m0s /tmp/go-build2244702282/b428/vet.cfg 1.80.0/backoff.go 1.80.0/balancer_wrapper.go x_amd64/vet -p crypto/cipher -lang=go1.25 x_amd64/vet -p g_.a -trimpath x_amd64/vet -I rs/otlp/otlptrac-atomic -I x_amd64/vet(dns block)/tmp/go-build2649518652/b509/launcher.test /tmp/go-build2649518652/b509/launcher.test -test.testlogfile=/tmp/go-build2649518652/b509/testlog.txt -test.paniconexit0 -test.timeout=10m0s -test.v=true(dns block)slow.example.com/tmp/go-build2244702282/b513/launcher.test /tmp/go-build2244702282/b513/launcher.test -test.testlogfile=/tmp/go-build2244702282/b513/testlog.txt -test.paniconexit0 -test.timeout=10m0s /tmp/go-build2244702282/b428/vet.cfg 1.80.0/backoff.go 1.80.0/balancer_wrapper.go x_amd64/vet -p crypto/cipher -lang=go1.25 x_amd64/vet -p g_.a -trimpath x_amd64/vet -I rs/otlp/otlptrac-atomic -I x_amd64/vet(dns block)/tmp/go-build2649518652/b509/launcher.test /tmp/go-build2649518652/b509/launcher.test -test.testlogfile=/tmp/go-build2649518652/b509/testlog.txt -test.paniconexit0 -test.timeout=10m0s -test.v=true(dns block)this-host-does-not-exist-12345.com/tmp/go-build2244702282/b522/mcp.test /tmp/go-build2244702282/b522/mcp.test -test.testlogfile=/tmp/go-build2244702282/b522/testlog.txt -test.paniconexit0 -test.timeout=10m0s .cfg�� aw-mcpg/internal-s aw-mcpg/internal-w x_amd64/vet --gdwarf-5 g/protobuf/inter-test.testlogfile=/tmp/go-build2244702282/b516/testlog.txt -o x_amd64/vet .cfg�� 1169162/b463/_pkg_.a -trimpath x_amd64/vet -I ny/timefmt-go -I x_amd64/vet(dns block)/tmp/go-build2649518652/b518/mcp.test /tmp/go-build2649518652/b518/mcp.test -test.testlogfile=/tmp/go-build2649518652/b518/testlog.txt -test.paniconexit0 -test.timeout=10m0s -test.v=true (create|run) y /usr/bin/chronyc b0a3170a1d63e55d/usr/libexec/docker/docker-init 4702282/b106/vet--version(dns block)If you need me to access, download, or install something from one of these locations, you can either: