| // Copyright 2017 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package main |
| |
| import ( |
| "bytes" |
| "io/ioutil" |
| "strconv" |
| "testing" |
| ) |
| |
| var testCases = []struct { |
| in, out string |
| }{ |
| { |
| in: "File.java:40: error: cannot find symbol\n", |
| out: "\x1b[1mFile.java:40: \x1b[31merror:\x1b[0m\x1b[1m cannot find symbol\x1b[0m\n", |
| }, |
| { |
| in: "import static com.blah.SYMBOL;\n", |
| out: "import static com.blah.SYMBOL;\n", |
| }, |
| { |
| in: " ^ \n", |
| out: "\x1b[1m \x1b[32m^\x1b[0m\x1b[1m \x1b[0m\n", |
| }, |
| { |
| in: "File.java:398: warning: [RectIntersectReturnValueIgnored] Return value of com.blah.function() must be checked\n", |
| out: "\x1b[1mFile.java:398: \x1b[35mwarning:\x1b[0m\x1b[1m [RectIntersectReturnValueIgnored] Return value of com.blah.function() must be checked\x1b[0m\n", |
| }, |
| { |
| in: "warning: [options] blah\n", |
| out: "\x1b[1m\x1b[35mwarning:\x1b[0m\x1b[1m [options] blah\x1b[0m\n", |
| }, |
| { |
| in: " (see http://go/errorprone/bugpattern/RectIntersectReturnValueIgnored.md)\n", |
| out: " (see http://go/errorprone/bugpattern/RectIntersectReturnValueIgnored.md)\n", |
| }, |
| { |
| in: ` |
| Note: Some input files use or override a deprecated API. |
| Note: Recompile with -Xlint:deprecation for details. |
| Note: Some input files use unchecked or unsafe operations. |
| Note: Recompile with -Xlint:unchecked for details. |
| Note: dir/file.java uses or overrides a deprecated API. |
| Note: dir/file.java uses unchecked or unsafe operations. |
| warning: [options] bootstrap class path not set in conjunction with -source 1.7 |
| `, |
| out: "\n", |
| }, |
| { |
| in: "\n", |
| out: "\n", |
| }, |
| { |
| in: ` |
| javadoc: warning - The old Doclet and Taglet APIs in the packages |
| com.sun.javadoc, com.sun.tools.doclets and their implementations |
| are planned to be removed in a future JDK release. These |
| components have been superseded by the new APIs in jdk.javadoc.doclet. |
| Users are strongly recommended to migrate to the new APIs. |
| javadoc: option --boot-class-path not allowed with target 1.9 |
| `, |
| out: "\n", |
| }, |
| { |
| in: ` |
| warning: [options] bootstrap class path not set in conjunction with -source 1.9\n |
| 1 warning |
| `, |
| out: "\n", |
| }, |
| { |
| in: ` |
| warning: foo |
| warning: [options] bootstrap class path not set in conjunction with -source 1.9\n |
| 2 warnings |
| `, |
| out: "\n\x1b[1m\x1b[35mwarning:\x1b[0m\x1b[1m foo\x1b[0m\n1 warning\n", |
| }, |
| } |
| |
| func TestJavacColorize(t *testing.T) { |
| for i, test := range testCases { |
| t.Run(strconv.Itoa(i), func(t *testing.T) { |
| buf := new(bytes.Buffer) |
| proc := processor{} |
| err := proc.process(bytes.NewReader([]byte(test.in)), buf) |
| if err != nil { |
| t.Errorf("error: %q", err) |
| } |
| got := string(buf.Bytes()) |
| if got != test.out { |
| t.Errorf("expected %q got %q", test.out, got) |
| } |
| }) |
| } |
| } |
| |
| func TestSubprocess(t *testing.T) { |
| t.Run("failure", func(t *testing.T) { |
| exitCode, err := Main(ioutil.Discard, "test", []string{"sh", "-c", "exit 9"}) |
| if err != nil { |
| t.Fatal("unexpected error", err) |
| } |
| if exitCode != 9 { |
| t.Fatal("expected exit code 9, got", exitCode) |
| } |
| }) |
| |
| t.Run("signal", func(t *testing.T) { |
| exitCode, err := Main(ioutil.Discard, "test", []string{"sh", "-c", "kill -9 $$"}) |
| if err != nil { |
| t.Fatal("unexpected error", err) |
| } |
| if exitCode != 137 { |
| t.Fatal("expected exit code 137, got", exitCode) |
| } |
| }) |
| |
| t.Run("success", func(t *testing.T) { |
| exitCode, err := Main(ioutil.Discard, "test", []string{"echo"}) |
| if err != nil { |
| t.Fatal("unexpected error", err) |
| } |
| if exitCode != 0 { |
| t.Fatal("expected exit code 0, got", exitCode) |
| } |
| }) |
| |
| } |