microcks test exits with code 1 (contract failure) instead of code 11 (connection) when polling loop times out
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 1/5
- Temps estimé
- Moins d'une heure
- Accessibilité débutants
- 88/100
Piste de recherche
Commence dans cmd/testExecutor.go à runTestAndWait : la boucle de polling peut sortir avec inProgress encore à true et renvoyer une erreur nil, donc cmd/test.go la traite comme errors.ErrTestFailed et cmd/exit.go la mappe sur le code de sortie 1. Ajoute une vérification de inProgress post-boucle qui enveloppe une erreur de timeout en errors.KindConnection, puis vérifie à l'aide du serveur mock Python de l'issue plus go run main.go test ... --waitFor=100milli que la CLI sort désormais avec 11 au lieu de 1. Compare les codes attendus avec documentation/error-handling.md et lance les tests Go existants.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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.
- Langage dominant
- Go
- Étoiles
- 57
- Forks
- 73
- Merge moyen
- 1 j 9 h
- PR mergées (30 j)
- 28
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de microcks/microcks-cli
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
microcks/microcks-cli#583 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug: YAML parse error in config is silently swallowed, login overwrites all other contextsPeut-être pris @Sarthak-Shreshtha01 l’a pris il y a 5 jours. Ouvertecomponent/cli kind/bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
microcks/microcks-cli#572 · 5 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
import-dir uploads secondary artifacts before their primary API definitionPeut-être pris @doraem-on l’a pris il y a 12 jours. Ouvertecomponent/cli kind/bug
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
microcks/microcks-cli#561 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
TEST: `ConnectAndGetToken` Returns Error on Non-200 ResponsePeut-être pris @aniket866 l’a pris il y a 15 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
microcks/microcks-cli#554 ·
Les mainteneurs répondent en général sous 1 jour
-
Empty `AuthToken` Causes Cryptic JWT Parse ErrorPeut-être pris @aniket866 l’a pris il y a 15 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
microcks/microcks-cli#551 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de microcks/microcks-cli
Issues similaires
-
scaleway_lb_frontend: updating a frontend with external_acls = true deletes all scaleway_lb_aclOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
scaleway/terraform-provider-scaleway#4485 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
Les mainteneurs répondent en général sous 1 jour
-
Add SolentaPeut-être pris @sharmao07 l’a pris aujourd’hui. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
slavakurilyak/awesome-ai-agents#760 ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100