75 lines
2.4 KiB
Go
75 lines
2.4 KiB
Go
// 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)
|
|
}
|
|
})
|
|
}
|