// 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)
		}
	})
}
