1// Copyright 2017 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package main 16 17import ( 18 "bytes" 19 "io/ioutil" 20 "strconv" 21 "testing" 22) 23 24var testCases = []struct { 25 in, out string 26}{ 27 { 28 in: "File.java:40: error: cannot find symbol\n", 29 out: "\x1b[1mFile.java:40: \x1b[31merror:\x1b[0m\x1b[1m cannot find symbol\x1b[0m\n", 30 }, 31 { 32 in: "import static com.blah.SYMBOL;\n", 33 out: "import static com.blah.SYMBOL;\n", 34 }, 35 { 36 in: " ^ \n", 37 out: "\x1b[1m \x1b[32m^\x1b[0m\x1b[1m \x1b[0m\n", 38 }, 39 { 40 in: "File.java:398: warning: [RectIntersectReturnValueIgnored] Return value of com.blah.function() must be checked\n", 41 out: "\x1b[1mFile.java:398: \x1b[35mwarning:\x1b[0m\x1b[1m [RectIntersectReturnValueIgnored] Return value of com.blah.function() must be checked\x1b[0m\n", 42 }, 43 { 44 in: "warning: [options] blah\n", 45 out: "\x1b[1m\x1b[35mwarning:\x1b[0m\x1b[1m [options] blah\x1b[0m\n", 46 }, 47 { 48 in: " (see http://go/errorprone/bugpattern/RectIntersectReturnValueIgnored.md)\n", 49 out: " (see http://go/errorprone/bugpattern/RectIntersectReturnValueIgnored.md)\n", 50 }, 51 { 52 in: ` 53Note: Some input files use or override a deprecated API. 54Note: Recompile with -Xlint:deprecation for details. 55Note: Some input files use unchecked or unsafe operations. 56Note: Recompile with -Xlint:unchecked for details. 57Note: dir/file.java uses or overrides a deprecated API. 58Note: dir/file.java uses unchecked or unsafe operations. 59warning: [options] bootstrap class path not set in conjunction with -source 1.7 60`, 61 out: "\n", 62 }, 63 { 64 in: "\n", 65 out: "\n", 66 }, 67 { 68 in: ` 69javadoc: warning - The old Doclet and Taglet APIs in the packages 70com.sun.javadoc, com.sun.tools.doclets and their implementations 71are planned to be removed in a future JDK release. These 72components have been superseded by the new APIs in jdk.javadoc.doclet. 73Users are strongly recommended to migrate to the new APIs. 74javadoc: option --boot-class-path not allowed with target 1.9 75`, 76 out: "\n", 77 }, 78 { 79 in: ` 80warning: [options] bootstrap class path not set in conjunction with -source 1.9\n 811 warning 82`, 83 out: "\n", 84 }, 85 { 86 in: ` 87warning: foo 88warning: [options] bootstrap class path not set in conjunction with -source 1.9\n 892 warnings 90`, 91 out: "\n\x1b[1m\x1b[35mwarning:\x1b[0m\x1b[1m foo\x1b[0m\n1 warning\n", 92 }, 93 { 94 in: ` 95warning: [options] source value 8 is obsolete and will be removed in a future release 96warning: [options] target value 8 is obsolete and will be removed in a future release 97warning: [options] To suppress warnings about obsolete options, use -Xlint:-options. 983 warnings 99`, 100 out: "\n", 101 }, 102} 103 104func TestJavacColorize(t *testing.T) { 105 for i, test := range testCases { 106 t.Run(strconv.Itoa(i), func(t *testing.T) { 107 buf := new(bytes.Buffer) 108 proc := processor{} 109 err := proc.process(bytes.NewReader([]byte(test.in)), buf) 110 if err != nil { 111 t.Errorf("error: %q", err) 112 } 113 got := string(buf.Bytes()) 114 if got != test.out { 115 t.Errorf("expected %q got %q", test.out, got) 116 } 117 }) 118 } 119} 120 121func TestSubprocess(t *testing.T) { 122 t.Run("failure", func(t *testing.T) { 123 exitCode, err := Main(ioutil.Discard, "test", []string{"sh", "-c", "exit 9"}) 124 if err != nil { 125 t.Fatal("unexpected error", err) 126 } 127 if exitCode != 9 { 128 t.Fatal("expected exit code 9, got", exitCode) 129 } 130 }) 131 132 t.Run("signal", func(t *testing.T) { 133 exitCode, err := Main(ioutil.Discard, "test", []string{"sh", "-c", "kill -9 $$"}) 134 if err != nil { 135 t.Fatal("unexpected error", err) 136 } 137 if exitCode != 137 { 138 t.Fatal("expected exit code 137, got", exitCode) 139 } 140 }) 141 142 t.Run("success", func(t *testing.T) { 143 exitCode, err := Main(ioutil.Discard, "test", []string{"echo"}) 144 if err != nil { 145 t.Fatal("unexpected error", err) 146 } 147 if exitCode != 0 { 148 t.Fatal("expected exit code 0, got", exitCode) 149 } 150 }) 151 152} 153