blob: 3c7bccf13627b834f7c3b2a2229684d2c4ebefa5 [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"errors"
"io"
"testing"
)
func getErrorIndicatingKernelBug() error {
return errors.New("waitid: errno 512")
}
func TestWrapperRetriesCompilationsOnApparentKernelBugsSurfacedInGo(t *testing.T) {
withTestContext(t, func(ctx *testContext) {
ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
switch {
case ctx.cmdCount < kernelBugRetryLimit:
return getErrorIndicatingKernelBug()
case ctx.cmdCount == kernelBugRetryLimit:
return nil
default:
t.Fatalf("unexpected command: %#v", cmd)
return nil
}
}
ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc)))
if ctx.cmdCount != kernelBugRetryLimit {
t.Errorf("expected %d retries. Got: %d", kernelBugRetryLimit, ctx.cmdCount)
}
})
}
func TestWrapperRetriesCompilationsOnApparentKernelBugsSurfacedInGCC(t *testing.T) {
withTestContext(t, func(ctx *testContext) {
ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
if ctx.cmdCount >= kernelBugRetryLimit {
return nil
}
_, err := io.WriteString(stderr, "fatal error: failed to get exit status: Unknown error 512")
if err != nil {
t.Fatalf("Failed writing to stdout: %v", err)
}
return newExitCodeError(1)
}
ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc)))
if ctx.cmdCount != kernelBugRetryLimit {
t.Errorf("expected %d retries. Got: %d", kernelBugRetryLimit, ctx.cmdCount)
}
})
}
func TestWrapperOnlyRetriesCompilationAFiniteNumberOfTimes(t *testing.T) {
withTestContext(t, func(ctx *testContext) {
kernelBugErr := getErrorIndicatingKernelBug()
ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
if ctx.cmdCount > kernelBugRetryLimit {
t.Fatal("command count exceeded kernel bug retry limit; infinite loop?")
}
return kernelBugErr
}
stderr := ctx.mustFail(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc)))
if err := verifyInternalError(stderr); err != nil {
t.Errorf("Internal error wasn't reported: %v", err)
}
if ctx.cmdCount != kernelBugRetryLimit {
t.Errorf("expected %d retries. Got: %d", kernelBugRetryLimit, ctx.cmdCount)
}
})
}