microcks test exits with code 1 (contract failure) instead of code 11 (connection) when polling loop times out
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 1/5
- Tiempo estimado
- Menos de una hora
- Aptitud para principiantes
- 88/100
Línea de trabajo
Empieza en cmd/testExecutor.go, en runTestAndWait: el bucle de sondeo puede salir con inProgress todavía en true y devuelve un error nil, por lo que cmd/test.go lo trata como errors.ErrTestFailed y cmd/exit.go lo asigna al código de salida 1. Añade una comprobación de inProgress después del bucle que envuelva un error de timeout como errors.KindConnection y luego verifica, usando el servidor mock de Python del issue más go run main.go test ... --waitFor=100milli, que la CLI ahora salga con 11 en lugar de 1. Comprueba los códigos esperados con documentation/error-handling.md y ejecuta los tests de Go existentes.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- Go
- Estrellas
- 57
- Forks
- 73
- Merge medio
- 1 d 9 h
- PR fusionados (30 d)
- 28
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de microcks/microcks-cli
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
microcks/microcks-cli#583 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug: YAML parse error in config is silently swallowed, login overwrites all other contextsPosiblemente ocupada @Sarthak-Shreshtha01 la tomó hace 4 días. Abiertocomponent/cli kind/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
microcks/microcks-cli#572 · 5 comentarios ·
Los mantenedores suelen responder en 1 día
-
import-dir uploads secondary artifacts before their primary API definitionPosiblemente ocupada @doraem-on la tomó hace 11 días. Abiertocomponent/cli kind/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
microcks/microcks-cli#561 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
TEST: `ConnectAndGetToken` Returns Error on Non-200 ResponsePosiblemente ocupada @aniket866 la tomó hace 14 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
microcks/microcks-cli#554 ·
Los mantenedores suelen responder en 1 día
-
Empty `AuthToken` Causes Cryptic JWT Parse ErrorPosiblemente ocupada @aniket866 la tomó hace 14 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
microcks/microcks-cli#551 ·
Los mantenedores suelen responder en 1 día
Todos los issues de microcks/microcks-cli
Issues similares
-
unbounded value for n in `/v1/logs` can panic/OOMPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abiertosmall item
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
canonical/pebble#1127 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
[schema-coverage] elasticstack_elasticsearch_synonym_set (data source)Posiblemente ocupada @github-actions la tomó hoy. Abiertoacceptance-tests phase-coding schema-coverage testing triaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 81/100
elastic/terraform-provider-elasticstack#5211 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 89/100
open-policy-agent/opa#9366 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
defect
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
nats-io/nats-server#8752 ·
Los mantenedores suelen responder en 1 día
-
enhancement needs-acceptance wg/router-models-inference-runtime
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
vllm-project/semantic-router#5015 · 1 comentario ·
Los mantenedores suelen responder en 1 día