8025113: Convert 7 tools TryWithResources tests to jtreg format
Reviewed-by: darcy, jjg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/ResDeclOutsideTry.java Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,18 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8025113
+ * @author sogoel
+ * @summary Resources cannot be declared outside t-w-r block
+ * @compile/fail/ref=ResDeclOutsideTry.out -XDrawDiagnostics ResDeclOutsideTry.java
+ */
+
+public class ResDeclOutsideTry implements AutoCloseable {
+ ResDeclOutsideTry tr1;
+ ResDeclOutsideTry tr2 = new ResDeclOutsideTry();
+
+ String test1() {
+ try (tr1 = new ResDeclOutsideTry(); tr2;) {
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/ResDeclOutsideTry.out Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,3 @@
+ResDeclOutsideTry.java:14:17: compiler.err.expected: token.identifier
+ResDeclOutsideTry.java:14:48: compiler.err.expected: token.identifier
+2 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/ResInNestedExpr.java Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2010, 2013, 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 8025113
+ * @author sogoel
+ * @summary Resource creation in nested expressions
+ */
+
+/**
+ * This test checks for resource creation in nested expressions.
+ * test1() - Create 3 resource in nested new expressions, style 1
+ * test2() - Create 3 resource in nested new expressions, style 2
+ * test3() - Create 4 resources with resources as parameters: new expression; typeid & new expression
+ */
+
+public class ResInNestedExpr {
+
+ static final int expected = 5;
+ static int closed = 0;
+
+ static void closing(String clazz) {
+ closed++;
+ }
+
+ static void checkClosedCount() {
+ if (expected != closed) {
+ throw new RuntimeException("Did not find enough closed resources."
+ + "Expected " + expected + ", but found " + closed);
+ }
+ }
+ /**
+ * The "expected output" is each class name gotten with getSimpleName() to unclutter things.
+ * Each test method returns a classname of the resource and that is compared with
+ * values in this array.
+ */
+ static String[] expectedOutput = {
+ "aResource::bResource::cResource", //test1
+ "aResource::bResource::cResource&aResource::cResource", //test3
+ "aResource::bResource::cResource&aResource::cResource"}; //test2
+
+ static void compare(String s1, String s2) {
+ if (s1.compareTo(s2) != 0) {
+ throw new RuntimeException(s1 + "!=" + s2);
+ }
+ }
+
+ String test1() {
+ String ret = null;
+ try (bResource br = new bResource(new cResource());
+ aResource ar = new aResource(br)) {
+ ret = ar.getClass().getSimpleName() + "::" +
+ ar.getB().getClass().getSimpleName() + "::" +
+ ar.getB().getC().getClass().getSimpleName();
+ }
+ return ret;
+ }
+
+ String test2() {
+ String ret = null;
+ try (aResource ar = new aResource(new bResource(new cResource()), new cResource())) {
+ String abc = ar.getClass().getSimpleName() + "::" +
+ ar.getB().getClass().getSimpleName() + "::" +
+ ar.getB().getC().getClass().getSimpleName();
+ String ac = ar.getClass().getSimpleName() + "::" +
+ ar.getC().getClass().getSimpleName();
+ ret = abc + "&" + ac;
+ }
+ return ret;
+ }
+
+ String test3() {
+ String ret = null;
+ try (bResource br = new bResource(new cResource());
+ aResource ar = new aResource(br, new cResource())) {
+ String abc = ar.getClass().getSimpleName() + "::" +
+ ar.getB().getClass().getSimpleName() + "::" +
+ ar.getB().getC().getClass().getSimpleName();
+ String ac = ar.getClass().getSimpleName() + "::" +
+ ar.getC().getClass().getSimpleName();
+ ret = abc + "&" + ac;
+ }
+ return ret;
+ }
+
+ public static void main(String... args) {
+ ResInNestedExpr t = new ResInNestedExpr();
+ int eo = 0;
+ compare(expectedOutput[eo++], t.test1());
+ compare(expectedOutput[eo++], t.test3());
+ compare(expectedOutput[eo++], t.test2());
+ ResInNestedExpr.checkClosedCount();
+ }
+
+ /**
+ * A resource to implement AutoCloseable
+ * Contains two other resources as data items.
+ */
+ static class aResource implements AutoCloseable {
+
+ bResource bR;
+ cResource cR;
+
+ public aResource() {
+ bR = null;
+ cR = null;
+ }
+
+ public aResource(bResource br) {
+ bR = br;
+ }
+
+ public aResource(cResource cr) {
+ cR = cr;
+ }
+
+ public aResource(bResource br, cResource cr) {
+ bR = br;
+ cR = cr;
+ }
+
+ public bResource getB() {
+ return bR;
+ }
+
+ public cResource getC() {
+ return cR;
+ }
+
+ @Override
+ public void close() {
+ ResInNestedExpr.closing(this.getClass().getName());
+ }
+ }
+
+ /**
+ * A resource to implement AutoCloseable
+ * Contains one other resources as a data item.
+ */
+ static class bResource implements AutoCloseable {
+
+ cResource cR;
+
+ public bResource() {
+ cR = null;
+ }
+
+ public bResource(cResource cr) {
+ cR = cr;
+ }
+
+ public cResource getC() {
+ return cR;
+ }
+
+ @Override
+ public void close() {
+ ResInNestedExpr.closing(this.getClass().getName());
+ }
+ }
+
+ /** A resource to implement AutoCloseable */
+ static class cResource implements AutoCloseable {
+
+ public cResource() {
+ }
+
+ @Override
+ public void close() {
+ ResInNestedExpr.closing(this.getClass().getName());
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/ResourceNameConflict.java Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,36 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8025113
+ * @author sogoel
+ * @summary Resource var cannot have same name as local variable
+ * @compile/fail/ref=ResourceNameConflict.out -XDrawDiagnostics ResourceNameConflict.java
+ */
+
+/**
+ * Test methods and their description
+ * test1() - negative test - local variable used as test resource
+ * test2() - negative test - test resource already defined in an enclosing for statement
+ */
+
+public class ResourceNameConflict implements AutoCloseable {
+
+ static final String str = "asdf";
+
+ void test1() {
+ String tr = "A resource spec var cannot have same name as local var.";
+ try (ResourceNameConflict tr = new ResourceNameConflict()) {
+ }
+ }
+
+ void test2(String... strArray) {
+ for (String str : strArray) {
+ try (ResourceNameConflict str = new ResourceNameConflict()) {
+ }
+ }
+ }
+
+ @Override
+ public void close() {
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/ResourceNameConflict.out Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,3 @@
+ResourceNameConflict.java:21:35: compiler.err.already.defined: kindname.variable, tr, kindname.method, test1()
+ResourceNameConflict.java:27:39: compiler.err.already.defined: kindname.variable, str, kindname.method, test2(java.lang.String...)
+2 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/ResourceRedecl.java Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,37 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8025113
+ * @author sogoel
+ * @summary Redeclaration of resource variables
+ * @compile/fail/ref=ResourceRedecl.out -XDrawDiagnostics ResourceRedecl.java
+ */
+
+import java.io.*;
+
+public class ResourceRedecl {
+
+ public void test() {
+ // compiler error if name of an exception param is redeclared within the Block of the catch clause as a local var;
+ // or as an exception param of a catch clause in a try statement;
+ // or as a resource in a try-with-resources statement
+ try {
+ } catch (Exception exParam1) {
+ Object exParam1 = new Object();
+ try (java.io.FileInputStream exParam1 = new java.io.FileInputStream("foo.txt")) {
+ Object exParam1 = new Object();
+ } catch (IOException exParam1) {
+ }
+ }
+
+ // compiler error if resource is redeclared within the try Block as a local var
+ // or as an exception param of a catch clause in a try statement
+ try (java.io.FileInputStream exParam2 = new java.io.FileInputStream("bar.txt")) {
+ Object exParam2 = new Object();
+ try (BufferedReader br = new BufferedReader(new FileReader("zee.txt"))) {
+ } catch (IOException exParam2) {
+ }
+ } catch (Exception ex) {
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/ResourceRedecl.out Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,7 @@
+ResourceRedecl.java:19:20: compiler.err.already.defined: kindname.variable, exParam1, kindname.method, test()
+ResourceRedecl.java:20:42: compiler.err.already.defined: kindname.variable, exParam1, kindname.method, test()
+ResourceRedecl.java:21:24: compiler.err.already.defined: kindname.variable, exParam1, kindname.method, test()
+ResourceRedecl.java:22:34: compiler.err.already.defined: kindname.variable, exParam1, kindname.method, test()
+ResourceRedecl.java:29:20: compiler.err.already.defined: kindname.variable, exParam2, kindname.method, test()
+ResourceRedecl.java:31:34: compiler.err.already.defined: kindname.variable, exParam2, kindname.method, test()
+6 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/ResourceShadow.java Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2010, 2013, 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 8025113
+ * @author sogoel
+ * @summary Test shadowing of resource variable
+ */
+
+/*
+ * "...a variable declared in a resource specification
+ * may be shadowed (6.3.1) anywhere inside a class declaration nested
+ * within the Block of the try."
+ */
+public class ResourceShadow {
+
+ static final String str = "asdf"; //this is okay
+
+ /**
+ * Resource variable shadows switch and case variables
+ */
+ String test1() {
+ String ret = null;
+ switch (str) {
+ case str: //this is okay
+ try (SilentCloseable str = new SilentCloseable()) {
+ SilentCloseable tr = new SilentCloseable(str);
+ ret = str.getClass().getSimpleName();
+ }
+ break;
+ default:
+ ret = "";
+ }
+ return ret;
+ }
+
+ /**
+ * Resource variable may be shadowed (6.3.1) anywhere inside a class
+ * declaration nested within the Block of the try
+ */
+ String test2() {
+ String ret = null;
+ try (SilentCloseable str = new SilentCloseable()) {
+ class temp {
+
+ String str = "I am not a SilentCloseable";
+
+ public void printSTR() {
+ System.out.println(str);
+ }
+
+ public String getSTR() {
+ return str;
+ }
+ }
+ temp tmp = new temp();
+ SilentCloseable tr = new SilentCloseable(tmp.getSTR());
+ ret = tr.getMsg();
+ }
+ return ret;
+ }
+
+ public static void main(String... args) {
+ ResourceShadow t = new ResourceShadow();
+ if (t.test1().compareTo("SilentCloseable") != 0) {
+ throw new RuntimeException("FAIL-test1");
+ }
+ if (t.test2().compareTo("I am not a SilentCloseable") != 0) {
+ throw new RuntimeException("FAIL-test2");
+ }
+ }
+}
+
+class SilentCloseable implements AutoCloseable {
+
+ SilentCloseable testres = null;
+ String msg = "default";
+
+ @Override
+ public void close() {
+ }
+
+ public SilentCloseable() {
+ }
+
+ public SilentCloseable(String s) {
+ msg = s;
+ }
+
+ public SilentCloseable(SilentCloseable tr) {
+ testres = tr;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/TryWithResources/TestTwr09.java Wed Nov 13 16:36:08 2013 -0800
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2010, 2013, 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 8025113
+ * @author sogoel
+ * @summary t-w-r completes abruptly if the initialization of resource completes abruptly
+ */
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.File;
+
+/*
+ * If the initialization of the resource completes abruptly because of a
+ * throw of a value V ... and the automatic ->closing of the resource completes normally,
+ * then the try-with-resources statement completes abruptly because of the throw of value V.
+ */
+public class TestTwr09 {
+
+ /**
+ * throw from ctor of nested resource
+ * Check first resource is not open.
+ */
+ String test1() {
+ String ret = null;
+ try (ResCloseable tr = new ResCloseable(new ResCloseable("throw from inner resource ctor",3))) {
+ ret = "FAIL";
+ } catch (RuntimeException re) {
+ ret = re.getMessage();
+ }
+ return ret;
+ }
+
+ /**
+ * throw from ctor of 2nd resource.
+ * 1st resource, FileInputStream should be automatically closed.
+ */
+ String test2() {
+ String ret = null;
+ byte[] buf = new byte[1];
+ try (java.io.ByteArrayInputStream tr = new java.io.ByteArrayInputStream(buf);
+ ResCloseable str = new ResCloseable("throw from inner resource ctor",3)) {
+ ret = "FAIL";
+ } catch (final IOException fe) {
+ ret = "FAIL test2";
+ } catch (RuntimeException re) {
+ ret = "PASS test2";
+ }
+ System.out.println("Ret = " + ret);
+ return ret;
+ }
+
+ public static void main(String... args) {
+ TestTwr09 t = new TestTwr09();
+ if (t.test1().compareTo("throw from inner resource ctor") != 0) {
+ throw new RuntimeException("FAIL-test1");
+ }
+ if (t.test2().compareTo("PASS test2") != 0) {
+ throw new RuntimeException("FAIL-test2");
+ }
+ }
+}
+
+/** a simple resource the implements AutoCloseable so it can be used
+ * in twr's resource specification block.
+ */
+class ResCloseable implements AutoCloseable {
+
+ ResCloseable testres = null;
+ String msg = "default";
+ boolean bOpen = false;
+
+ public ResCloseable() {
+ bOpen = true;
+ }
+
+ public ResCloseable(ResCloseable tr) {
+ bOpen = true;
+ msg = tr.getMsg();
+ }
+
+ public ResCloseable(String s) {
+ bOpen = true;
+ msg = s;
+ }
+
+ public ResCloseable(String msg, int c) {
+ bOpen = true;
+ if (c == 3) {
+ throw new RuntimeException(msg);
+ }
+ }
+
+ @Override
+ public void close() {
+ bOpen = false;
+ }
+
+ public boolean isOpen() {
+ return bOpen;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+}
+