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 95func TestJavacColorize(t *testing.T) { 96 for i, test := range testCases { 97 t.Run(strconv.Itoa(i), func(t *testing.T) { 98 buf := new(bytes.Buffer) 99 proc := processor{} 100 err := proc.process(bytes.NewReader([]byte(test.in)), buf) 101 if err != nil { 102 t.Errorf("error: %q", err) 103 } 104 got := string(buf.Bytes()) 105 if got != test.out { 106 t.Errorf("expected %q got %q", test.out, got) 107 } 108 }) 109 } 110} 111 112func TestSubprocess(t *testing.T) { 113 t.Run("failure", func(t *testing.T) { 114 exitCode, err := Main(ioutil.Discard, "test", []string{"sh", "-c", "exit 9"}) 115 if err != nil { 116 t.Fatal("unexpected error", err) 117 } 118 if exitCode != 9 { 119 t.Fatal("expected exit code 9, got", exitCode) 120 } 121 }) 122 123 t.Run("signal", func(t *testing.T) { 124 exitCode, err := Main(ioutil.Discard, "test", []string{"sh", "-c", "kill -9 $$"}) 125 if err != nil { 126 t.Fatal("unexpected error", err) 127 } 128 if exitCode != 137 { 129 t.Fatal("expected exit code 137, got", exitCode) 130 } 131 }) 132 133 t.Run("success", func(t *testing.T) { 134 exitCode, err := Main(ioutil.Discard, "test", []string{"echo"}) 135 if err != nil { 136 t.Fatal("unexpected error", err) 137 } 138 if exitCode != 0 { 139 t.Fatal("expected exit code 0, got", exitCode) 140 } 141 }) 142 143} 144