microcks test exits with code 1 (contract failure) instead of code 11 (connection) when polling loop times out
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 1/5
- Thời gian dự kiến
- Dưới một giờ
- Mức phù hợp với người mới
- 88/100
Hướng nghiên cứu
Bắt đầu trong cmd/testExecutor.go tại runTestAndWait: vòng lặp polling có thể thoát ra khi inProgress vẫn là true và trả về lỗi nil, do đó cmd/test.go coi nó là errors.ErrTestFailed và cmd/exit.go ánh xạ nó thành exit code 1. Hãy thêm một kiểm tra inProgress sau vòng lặp, gói lỗi timeout thành errors.KindConnection, rồi xác minh bằng mock server Python từ issue cộng với go run main.go test ... --waitFor=100milli rằng CLI giờ thoát với 11 thay vì 1. Đối chiếu các mã kỳ vọng với documentation/error-handling.md và chạy các test Go hiện có.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Describe the bug
While going through the changes in PR #540 and the new documentation/error-handling.md, I noticed a gap in how the test polling loop handles timeouts.
In cmd/testExecutor.go, runTestAndWait polls the server in a loop until the test finishes or the deadline passes:
for nowInMilliseconds() < future {
testResultSummary, err := mc.GetTestResult(testResultID)
if err != nil {
return false, "", fmt.Errorf("checking test result: %w", err)
}
success = testResultSummary.Success
inProgress := testResultSummary.InProgress
if !inProgress {
break
}
time.Sleep(2 * time.Second)
}
return success, testResultID, nil
If the server hasn't finished by the time the deadline runs out, the loop exits with inProgress still true, but the function returns nil for the error. No timeout is ever flagged.
Back in cmd/test.go, the caller sees err == nil and !success, so it returns errors.ErrTestFailed:
success, testResultID, err := runTestAndWait(mc, params)
if err != nil {
return err
}
if !success {
return errors.ErrTestFailed // exit code 1
}
And cmd/exit.go maps that to exit code 1:
case stderrors.Is(err, errors.ErrTestFailed):
// A clean run with a non-conforming result — pytest-style exit 1.
return 1
The problem is that a polling timeout is not a contract conformance failure, it's an infrastructure/connection issue. According to error-handling.md, exit code 1 is strictly for "a clean run whose result did not conform". A timeout means the CLI never got a final result at all.
Expected behavior
When the polling loop runs out of time with inProgress still true, it should return a proper timeout error wrapped as KindConnection, something like:
if inProgress {
return false, testResultID, errors.Wrap(errors.KindConnection,
fmt.Errorf("test polling timed out after %dms waiting for result %s",
params.waitForMillis+10000, testResultID))
}
This would cause ExitCodeFor to return 11 and Handle to print a clear error to stderr, so CI/CD pipelines can tell apart "API contract broken" (exit 1) from "server was too slow or unreachable" (exit 11).
Actual behavior
MicrocksClient got status for test "test-hanging-1" - success: false, inProgress: true
MicrocksTester waiting for 2 seconds before checking again or exiting.
MicrocksClient got status for test "test-hanging-1" - success: false, inProgress: true
MicrocksTester waiting for 2 seconds before checking again or exiting.
... repeats until deadline ...
Test test-hanging-1: FAILURE (0ms)
Full TestResult details are available here: http://127.0.0.1:8888/#/tests/test-hanging-1
exit status 1
$ echo $?
1
The CLI exits with code 1 and falsely reports a contract test failure (FAILURE 0ms), with no error indicating that the run actually timed out.
How to Reproduce?
- Start a mock server simulating a test that remains in progress:
python3 -c '
from http.server import HTTPServer, BaseHTTPRequestHandler
class MockServer(BaseHTTPRequestHandler):
def do_POST(self):
self.send_response(201)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(b"{\"id\":\"test-hanging-1\"}")
def do_GET(self):
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(b"{\"id\":\"test-hanging-1\",\"success\":false,\"inProgress\":true}")
def log_message(self, *args): pass
HTTPServer(("127.0.0.1", 8888), MockServer).serve_forever()
'
-
Run the test command with a short wait deadline:
go run main.go test "MyAPI:1.0" "http://localhost:8080" HTTP --microcksURL=http://127.0.0.1:8888 --waitFor=100milli -
Check the exit status: It returns 1 instead of 11.
Root cause: in cmd/testExecutor.go (lines 76–103), the loop ends when nowInMilliseconds() >= future, but falls through to return success, testResultID, nil without verifying if inProgress was still true.
Microcks version or git rev
main
Install method (docker-compose, helm chart, operator, docker-desktop extension,...)
CLI
Additional information
The fix is small and self-contained, only cmd/testExecutor.go needs to change (add a post-loop inProgress check). All three callers of runTestAndWait (cmd/test.go, and two places in cmd/testDryRun.go) already have if err != nil { return err } guards, so they'll handle the new error correctly without any changes.
- Ngôn ngữ chính
- Go
- Star
- 57
- Fork
- 73
- Merge trung bình
- 1 ngày 9 giờ
- Pull request đã merge (30 ngày)
- 28
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của microcks/microcks-cli
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
microcks/microcks-cli#583 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug: YAML parse error in config is silently swallowed, login overwrites all other contextsCó thể đã có người làm @Sarthak-Shreshtha01 đã nhận 4 ngày trước. Đang mởcomponent/cli kind/bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
microcks/microcks-cli#572 · 5 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
import-dir uploads secondary artifacts before their primary API definitionCó thể đã có người làm @doraem-on đã nhận 11 ngày trước. Đang mởcomponent/cli kind/bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
microcks/microcks-cli#561 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
TEST: `ConnectAndGetToken` Returns Error on Non-200 ResponseCó thể đã có người làm @aniket866 đã nhận 14 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
microcks/microcks-cli#554 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Empty `AuthToken` Causes Cryptic JWT Parse ErrorCó thể đã có người làm @aniket866 đã nhận 14 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
microcks/microcks-cli#551 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của microcks/microcks-cli
Issue tương tự
-
unbounded value for n in `/v1/logs` can panic/OOMCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởsmall item
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
canonical/pebble#1127 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[schema-coverage] elasticstack_elasticsearch_synonym_set (data source)Có thể đã có người làm @github-actions đã nhận hôm nay. Đang mởacceptance-tests phase-coding schema-coverage testing triaged
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 81/100
elastic/terraform-provider-elasticstack#5211 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 89/100
open-policy-agent/opa#9366 · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
defect
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
nats-io/nats-server#8752 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement needs-acceptance wg/router-models-inference-runtime
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
vllm-project/semantic-router#5015 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày