Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

microcks test exits with code 1 (contract failure) instead of code 11 (connection) when polling loop times out

Aperta Adatta ai principianti
#573 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
1/5
Tempo stimato
Meno di un'ora
Idoneità per principianti
88/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
go
Ambito
cli

Direzione di ricerca

Inizia in cmd/testExecutor.go a runTestAndWait: il ciclo di polling può uscire con inProgress ancora true e restituisce un errore nil, quindi cmd/test.go lo tratta come errors.ErrTestFailed e cmd/exit.go lo mappa sul codice di uscita 1. Aggiungi un controllo di inProgress a fine ciclo che wrappa un errore di timeout come errors.KindConnection, poi verifica usando il mock server Python dell'issue più go run main.go test ... --waitFor=100milli che la CLI ora esca con 11 invece di 1. Incrocia i codici attesi con documentation/error-handling.md ed esegui i test Go esistenti.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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?
  1. 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()
'
  1. 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

  2. Check the exit status: It returns 1 instead of 11.

Image

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.

Lingua principale
Go
Stelle
57
Fork
73
Merge medio
1g 9h
PR unite (30g)
28

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di microcks/microcks-cli

Tutte le issue di microcks/microcks-cli

Issue simili

Altre issue su Go

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.