aboutsummaryrefslogtreecommitdiff
path: root/compiler_wrapper/iwyu_flag_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'compiler_wrapper/iwyu_flag_test.go')
-rw-r--r--compiler_wrapper/iwyu_flag_test.go135
1 files changed, 135 insertions, 0 deletions
diff --git a/compiler_wrapper/iwyu_flag_test.go b/compiler_wrapper/iwyu_flag_test.go
new file mode 100644
index 00000000..76135944
--- /dev/null
+++ b/compiler_wrapper/iwyu_flag_test.go
@@ -0,0 +1,135 @@
+// Copyright 2022 The ChromiumOS Authors
+// 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"
+ "strings"
+ "testing"
+)
+
+func TestIWYUArgOrder(t *testing.T) {
+ withIWYUTestContext(t, func(ctx *testContext) {
+ ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
+ if ctx.cmdCount == 2 {
+ if err := verifyArgOrder(cmd, "-checks=.*", mainCc, "--", "-resource-dir=.*", mainCc, "--some_arg"); err != nil {
+ return err
+ }
+ }
+ return nil
+ }
+ ctx.must(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(clangX86_64, mainCc, "--some_arg")))
+ if ctx.cmdCount < 2 {
+ t.Error("expected multiple calls.")
+ }
+ })
+}
+
+func TestIgnoreNonZeroExitCodeFromIWYU(t *testing.T) {
+ withIWYUTestContext(t, func(ctx *testContext) {
+ ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
+ if ctx.cmdCount == 2 {
+ return newExitCodeError(23)
+ }
+ return nil
+ }
+ ctx.must(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(clangX86_64, mainCc)))
+ stderr := ctx.stderrString()
+ if err := verifyNonInternalError(stderr, "include-what-you-use failed"); err != nil {
+ t.Error(err)
+ }
+ })
+}
+
+func TestReportGeneralErrorsFromIWYU(t *testing.T) {
+ withIWYUTestContext(t, func(ctx *testContext) {
+ ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
+ if ctx.cmdCount > 1 {
+ return errors.New("someerror")
+ }
+ return nil
+ }
+ stderr := ctx.mustFail(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(clangX86_64, mainCc)))
+ if err := verifyInternalError(stderr); err != nil {
+ t.Fatal(err)
+ }
+ if !strings.Contains(stderr, "someerror") {
+ t.Errorf("unexpected error. Got: %s", stderr)
+ }
+ })
+}
+
+func TestUseIWYUBasedOnFileExtension(t *testing.T) {
+ withIWYUTestContext(t, func(ctx *testContext) {
+ testData := []struct {
+ args []string
+ iwyu bool
+ }{
+ {[]string{"main.cc"}, true},
+ {[]string{"main.cc"}, true},
+ {[]string{"main.C"}, true},
+ {[]string{"main.cxx"}, true},
+ {[]string{"main.c++"}, true},
+ {[]string{"main.xy"}, false},
+ {[]string{"-o", "main.cc"}, false},
+ {[]string{}, false},
+ }
+ for _, tt := range testData {
+ ctx.cmdCount = 0
+ ctx.must(callCompiler(ctx, ctx.cfg,
+ ctx.newCommand(clangX86_64, tt.args...)))
+ if ctx.cmdCount > 1 && !tt.iwyu {
+ t.Errorf("expected a call to iwyu but got none for args %s", tt.args)
+ }
+ if ctx.cmdCount == 1 && tt.iwyu {
+ t.Errorf("expected no call to iwyu but got one for args %s", tt.args)
+ }
+ }
+ })
+}
+
+func TestIWYUFiltersIWYUFlags(t *testing.T) {
+ withIWYUTestContext(t, func(ctx *testContext) {
+ addedFlag := "--some_iwyu_flag=flag"
+ ctx.cmdMock = func(cmd *command, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
+ switch ctx.cmdCount {
+ case 1:
+ if err := verifyPath(cmd, "usr/bin/clang"); err != nil {
+ t.Error(err)
+ } else if err := verifyArgCount(cmd, 0, addedFlag); err != nil {
+ t.Error(err)
+ }
+ return nil
+ case 2:
+ if err := verifyPath(cmd, "usr/bin/include-what-you-use"); err != nil {
+ t.Error(err)
+ } else if verifyArgCount(cmd, 1, addedFlag); err != nil {
+ t.Error(err)
+ }
+ return nil
+ default:
+ return nil
+ }
+ }
+ cmd := ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(clangX86_64, mainCc, "-iwyu-flag="+addedFlag)))
+ if ctx.cmdCount < 2 {
+ t.Errorf("expected multiple calls.")
+ }
+ if err := verifyPath(cmd, "usr/bin/clang"); err != nil {
+ t.Error(err)
+ }
+ })
+}
+
+func withIWYUTestContext(t *testing.T, work func(ctx *testContext)) {
+ withTestContext(t, func(ctx *testContext) {
+ ctx.env = []string{"WITH_IWYU=1"}
+ work(ctx)
+ })
+}