blob: a47e98fa295f8a0e26636153e9951dc4acfd1010 [file] [log] [blame]
/*
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8162359
* @summary extra space in javac -help for -J and @ options
* @modules jdk.compiler
* @library /tools/lib
* @build toolbox.TestRunner toolbox.ToolBox
* @run main StreamsTest
*/
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import static java.util.Arrays.asList;
import toolbox.TestRunner;
import toolbox.ToolBox;
public class StreamsTest extends TestRunner {
public static void main(String... args) throws Exception {
new StreamsTest().runTests(m -> new Object[] { Paths.get(m.getName()) });
}
StreamsTest() {
super(System.err);
}
ToolBox tb = new ToolBox();
static final String LINESEP = System.getProperty("line.separator");
@Test // errors should be written to stderr
public void testError(Path base) throws Exception {
Path src = base.resolve("src");
Path classes = base.resolve("classes");
tb.writeJavaFiles(src,
"import java.util.*; class C { # }");
test(asList("-d", classes.toString(), src.resolve("C.java").toString()),
null, "illegal character: '#'");
}
@Test // warnings should be written to stderr
public void testWarning(Path base) throws Exception {
Path src = base.resolve("src");
Path classes = base.resolve("classes");
tb.writeJavaFiles(src,
"import java.util.*; class C { List list = new ArrayList(); }");
test(asList("-d", classes.toString(), "-Xlint", src.resolve("C.java").toString()),
null, "warning: [rawtypes]");
}
@Test // notes should be written to stderr
public void testNote(Path base) throws Exception {
Path src = base.resolve("src");
Path classes = base.resolve("classes");
tb.writeJavaFiles(src,
"import java.util.*; class C { List<String> list = (List<String>) new ArrayList(); }");
test(asList("-d", classes.toString(), src.resolve("C.java").toString()),
null, "uses unchecked or unsafe operations.");
}
@Test // help output should be written to stdout
public void testHelp(Path base) throws Exception {
test(asList("-help"), "Usage: javac <options> <source files>", null);
}
@Test // version output should be written to stdout
public void testVersion(Path base) throws Exception {
test(asList("-version"), "javac", null);
}
@Test // version output should be written to stdout
public void testFullVersion(Path base) throws Exception {
test(asList("-fullversion"), "javac full version", null);
}
/**
* Run javac as though run from the command line (but avoiding the entry point that
* calls System.exit()), and that that expected output appears on appropriate output streams.
* @param options the command-line options for javac
* @param expectOut a string that should be contained in the output generated on stdout,
* or null, if no output should be generated to stdout
* @param expectErra string that should be contained in the output generated on stderr,
* or null, if no output should be generated to stderr
* @throws IOException if a problem occurs while setting up the streams
*/
void test(List<String> options, String expectOut, String expectErr) throws IOException {
out.println("test " + options);
ByteArrayOutputStream bsOut = new ByteArrayOutputStream();
ByteArrayOutputStream bsErr = new ByteArrayOutputStream();
try (PrintStream psOut = new PrintStream(bsOut); PrintStream psErr = new PrintStream(bsErr)) {
int rc;
PrintStream saveOut = System.out;
PrintStream saveErr = System.err;
try {
System.setOut(psOut);
System.setErr(psErr);
rc = com.sun.tools.javac.Main.compile(options.toArray(new String[0]));
} finally {
System.setErr(saveErr);
System.setOut(saveOut);
}
System.err.println("javac exit code: " + rc);
}
check("stdout", bsOut.toString(), expectOut);
check("stderr", bsErr.toString(), expectErr);
}
/**
* Check that output is as expected.
* @param name the name of the stream on which the output was found
* @param actual the contents written to the stream
* @param expect string that should be contained in the output, or null, if the output should be empty
*/
void check(String name, String actual, String expect) {
out.println("Check " + name);
out.println("Expected: " + (expect == null ? "(nothing)" : expect));
out.println("Actual:");
out.println(actual.replace("\n", LINESEP));
if (expect == null) {
if (!actual.isEmpty()) {
error(name + ": unexpected output");
}
} else if (!actual.contains(expect)) {
error(name + ": expected output not found");
}
}
}