aboutsummaryrefslogtreecommitdiff
path: root/compiler_wrapper/compiler_wrapper_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'compiler_wrapper/compiler_wrapper_test.go')
-rw-r--r--compiler_wrapper/compiler_wrapper_test.go198
1 files changed, 198 insertions, 0 deletions
diff --git a/compiler_wrapper/compiler_wrapper_test.go b/compiler_wrapper/compiler_wrapper_test.go
new file mode 100644
index 00000000..71cd36df
--- /dev/null
+++ b/compiler_wrapper/compiler_wrapper_test.go
@@ -0,0 +1,198 @@
+// Copyright 2019 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 (
+ "bytes"
+ "errors"
+ "fmt"
+ "io"
+ "path/filepath"
+ "strings"
+ "syscall"
+ "testing"
+)
+
+func TestAddCommonFlags(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.cfg.commonFlags = []string{"-someflag"}
+ cmd := ctx.must(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(gccX86_64, mainCc)))
+ if err := verifyArgOrder(cmd, "-someflag", mainCc); err != nil {
+ t.Error(err)
+ }
+ })
+}
+
+func TestAddGccConfigFlags(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.cfg.gccFlags = []string{"-someflag"}
+ cmd := ctx.must(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(gccX86_64, mainCc)))
+ if err := verifyArgOrder(cmd, "-someflag", mainCc); err != nil {
+ t.Error(err)
+ }
+ })
+}
+
+func TestAddClangConfigFlags(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.cfg.clangFlags = []string{"-someflag"}
+ cmd := ctx.must(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(clangX86_64, mainCc)))
+ if err := verifyArgOrder(cmd, "-someflag", mainCc); err != nil {
+ t.Error(err)
+ }
+ })
+}
+
+func TestLogGeneralExecError(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ testOldWrapperPaths := []string{
+ "",
+ filepath.Join(ctx.tempDir, "fakewrapper"),
+ }
+ for _, testOldWrapperPath := range testOldWrapperPaths {
+ ctx.cfg.oldWrapperPath = testOldWrapperPath
+ // Note: No need to write the old wrapper as we don't execute
+ // it due to the general error from the new error.
+ ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
+ return errors.New("someerror")
+ }
+ stderr := ctx.mustFail(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc)))
+ if err := verifyInternalError(stderr); err != nil {
+ t.Fatal(err)
+ }
+ if !strings.Contains(stderr, gccX86_64) {
+ t.Errorf("could not find compiler path on stderr. Got: %s", stderr)
+ }
+ if !strings.Contains(stderr, "someerror") {
+ t.Errorf("could not find original error on stderr. Got: %s", stderr)
+ }
+ }
+ })
+}
+
+func TestForwardStdin(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ io.WriteString(&ctx.stdinBuffer, "someinput")
+ ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
+ stdinStr := ctx.readAllString(stdin)
+ if stdinStr != "someinput" {
+ return fmt.Errorf("unexpected stdin. Got: %s", stdinStr)
+ }
+ return nil
+ }
+ ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, "-", mainCc)))
+ })
+}
+
+func TestLogMissingCCacheExecError(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.cfg.useCCache = true
+
+ testOldWrapperPaths := []string{
+ "",
+ filepath.Join(ctx.tempDir, "fakewrapper"),
+ }
+ for _, testOldWrapperPath := range testOldWrapperPaths {
+ ctx.cfg.oldWrapperPath = testOldWrapperPath
+ // Note: No need to write the old wrapper as we don't execute
+ // it due to the general error from the new error.
+ ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
+ return syscall.ENOENT
+ }
+ ctx.stderrBuffer.Reset()
+ stderr := ctx.mustFail(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc)))
+ if err := verifyNonInternalError(stderr, "ccache not found under .*. Please install it"); err != nil {
+ t.Fatal(err)
+ }
+ }
+ })
+}
+
+func TestLogExitCodeErrorWhenComparingToOldWrapper(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.cfg.mockOldWrapperCmds = false
+ ctx.cfg.oldWrapperPath = filepath.Join(ctx.tempDir, "fakewrapper")
+
+ ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
+ writePythonMockWrapper(ctx, &mockWrapperConfig{
+ Cmds: []*mockWrapperCmd{
+ {
+ Path: cmd.Path,
+ Args: cmd.Args,
+ ExitCode: 2,
+ },
+ },
+ })
+ fmt.Fprint(stderr, "someerror")
+ return newExitCodeError(2)
+ }
+
+ exitCode := callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc))
+ if exitCode != 2 {
+ t.Fatalf("Expected exit code 2. Got: %d", exitCode)
+ }
+ if err := verifyNonInternalError(ctx.stderrString(), "someerror"); err != nil {
+ t.Fatal(err)
+ }
+ })
+}
+
+func TestErrorOnLogRusageAndForceDisableWError(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.env = []string{
+ "FORCE_DISABLE_WERROR=1",
+ "GETRUSAGE=rusage.log",
+ }
+ stderr := ctx.mustFail(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc)))
+ if err := verifyNonInternalError(stderr, "GETRUSAGE is meaningless with FORCE_DISABLE_WERROR"); err != nil {
+ t.Error(err)
+ }
+ })
+}
+
+func TestErrorOnLogRusageAndBisect(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.env = []string{
+ "BISECT_STAGE=xyz",
+ "GETRUSAGE=rusage.log",
+ }
+ stderr := ctx.mustFail(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc)))
+ if err := verifyNonInternalError(stderr, "BISECT_STAGE is meaningless with GETRUSAGE"); err != nil {
+ t.Error(err)
+ }
+ })
+}
+
+func TestErrorOnBisectAndForceDisableWError(t *testing.T) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.env = []string{
+ "BISECT_STAGE=xyz",
+ "FORCE_DISABLE_WERROR=1",
+ }
+ stderr := ctx.mustFail(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, mainCc)))
+ if err := verifyNonInternalError(stderr, "BISECT_STAGE is meaningless with FORCE_DISABLE_WERROR"); err != nil {
+ t.Error(err)
+ }
+ })
+}
+
+func TestPrintUserCompilerError(t *testing.T) {
+ buffer := bytes.Buffer{}
+ printCompilerError(&buffer, newUserErrorf("abcd"))
+ if buffer.String() != "abcd\n" {
+ t.Errorf("Unexpected string. Got: %s", buffer.String())
+ }
+}
+
+func TestPrintOtherCompilerError(t *testing.T) {
+ buffer := bytes.Buffer{}
+ printCompilerError(&buffer, errors.New("abcd"))
+ if buffer.String() != "Internal error. Please report to chromeos-toolchain@google.com.\nabcd\n" {
+ t.Errorf("Unexpected string. Got: %s", buffer.String())
+ }
+}