8025113: Convert 7 tools TryWithResources tests to jtreg format
authorsogoel
Wed, 13 Nov 2013 16:36:08 -0800
changeset 21714 f5b7edec4304
parent 21713 b3fcc9c0fea3
child 21715 f4afc37a97a2
8025113: Convert 7 tools TryWithResources tests to jtreg format Reviewed-by: darcy, jjg
langtools/test/tools/javac/TryWithResources/ResDeclOutsideTry.java
langtools/test/tools/javac/TryWithResources/ResDeclOutsideTry.out
langtools/test/tools/javac/TryWithResources/ResInNestedExpr.java
langtools/test/tools/javac/TryWithResources/ResourceNameConflict.java
langtools/test/tools/javac/TryWithResources/ResourceNameConflict.out
langtools/test/tools/javac/TryWithResources/ResourceRedecl.java
langtools/test/tools/javac/TryWithResources/ResourceRedecl.out
langtools/test/tools/javac/TryWithResources/ResourceShadow.java
langtools/test/tools/javac/TryWithResources/TestTwr09.java
--- /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;
+    }
+}
+