test/tools/javac/annotations/typeAnnotations/classfile/ClassfileTestHelper.java

Tue, 12 Mar 2013 17:39:34 +0100

author
jfranck
date
Tue, 12 Mar 2013 17:39:34 +0100
changeset 1629
f427043f8c65
parent 1534
bec996065c45
child 1755
ddb4a2bfcd82
permissions
-rw-r--r--

7196531: Duplicate error messages on repeating annotations
Reviewed-by: jjg

     1 /*
     2  * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  */
    24 import java.lang.annotation.*;
    25 import java.io.*;
    26 import java.net.URL;
    27 import java.util.List;
    29 import com.sun.tools.classfile.*;
    31 public class ClassfileTestHelper {
    32     int expected_tinvisibles = 0;
    33     int expected_tvisibles = 0;
    34     int expected_invisibles = 0;
    35     int expected_visibles = 0;
    37     //Makes debugging much easier. Set to 'false' for less output.
    38     public Boolean verbose = true;
    39     void println(String msg) { if(verbose) System.out.println(msg); }
    41     File writeTestFile(String fname, String source) throws IOException {
    42       File f = new File(fname);
    43         PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(f)));
    44         out.println(source);
    45         out.close();
    46         return f;
    47     }
    49     File compile(File f) {
    50         int rc = com.sun.tools.javac.Main.compile(new String[] {
    51                 "-source", "1.8", "-g", f.getPath() });
    52         if (rc != 0)
    53             throw new Error("compilation failed. rc=" + rc);
    54         String path = f.getPath();
    55         return new File(path.substring(0, path.length() - 5) + ".class");
    56     }
    58     ClassFile getClassFile(String name) throws IOException, ConstantPoolException {
    59         URL url = getClass().getResource(name);
    60         InputStream in = url.openStream();
    61         try {
    62             return ClassFile.read(in);
    63         } finally {
    64             in.close();
    65         }
    66     }
    68     ClassFile getClassFile(URL url) throws IOException, ConstantPoolException {
    69             InputStream in = url.openStream();
    70             try {
    71                 return ClassFile.read(in);
    72             } finally {
    73                 in.close();
    74             }
    75     }
    77     /************ Helper annotations counting methods ******************/
    78     void test(ClassFile cf) {
    79         test("CLASS",cf, null, null, Attribute.RuntimeVisibleTypeAnnotations, true);
    80         test("CLASS",cf, null, null, Attribute.RuntimeInvisibleTypeAnnotations, false);
    81         //RuntimeAnnotations since one annotation can result in two attributes.
    82         test("CLASS",cf, null, null, Attribute.RuntimeVisibleAnnotations, true);
    83         test("CLASS",cf, null, null, Attribute.RuntimeInvisibleAnnotations, false);
    84     }
    86     void test(ClassFile cf, Method m) {
    87         test("METHOD",cf, null, m, Attribute.RuntimeVisibleTypeAnnotations, true);
    88         test("METHOD",cf, null, m, Attribute.RuntimeInvisibleTypeAnnotations, false);
    89         test("METHOD",cf, null, m, Attribute.RuntimeVisibleAnnotations, true);
    90         test("METHOD",cf, null, m, Attribute.RuntimeInvisibleAnnotations, false);
    91     }
    93     void test(ClassFile cf, Field f) {
    94         test("FIELD",cf, f, null, Attribute.RuntimeVisibleTypeAnnotations, true);
    95         test("FIELD",cf, f, null, Attribute.RuntimeInvisibleTypeAnnotations, false);
    96         test("FIELD",cf, f, null, Attribute.RuntimeVisibleAnnotations, true);
    97         test("FIELD",cf, f, null, Attribute.RuntimeInvisibleAnnotations, false);
    98     }
   101     // Test the result of Attributes.getIndex according to expectations
   102     // encoded in the class/field/method name; increment annotations counts.
   103     void test(String ttype, ClassFile cf, Field f, Method m, String annName, boolean visible) {
   104         String testtype = ttype;
   105         String name = null;
   106         int index = -1;
   107         Attribute attr = null;
   108         boolean isTAattr = annName.contains("TypeAnnotations");
   109         try {
   110             switch(testtype) {
   111                 case "FIELD":
   112                     name = f.getName(cf.constant_pool);
   113                     index = f.attributes.getIndex(cf.constant_pool, annName);
   114                     if(index!= -1) attr = f.attributes.get(index);
   115                     break;
   116                 case "METHOD":
   117                     name = m.getName(cf.constant_pool);
   118                     index = m.attributes.getIndex(cf.constant_pool, annName);
   119                     if(index!= -1) attr = m.attributes.get(index);
   120                     break;
   121                 default:
   122                     name = cf.getName();
   123                     index = cf.attributes.getIndex(cf.constant_pool, annName);
   124                     if(index!= -1) attr = cf.attributes.get(index);
   125             }
   126         } catch(ConstantPoolException cpe) { cpe.printStackTrace(); }
   128         if (index != -1) {
   129             assert attr instanceof RuntimeTypeAnnotations_attribute;
   130             if(isTAattr) { //count RuntimeTypeAnnotations
   131                 RuntimeTypeAnnotations_attribute tAttr =
   132                         (RuntimeTypeAnnotations_attribute)attr;
   133                 println(testtype + ": " + name + ", " + annName + ": " +
   134                         tAttr.annotations.length );
   135                 allt += tAttr.annotations.length;
   136                 if (visible)
   137                     tvisibles += tAttr.annotations.length;
   138                 else
   139                     tinvisibles += tAttr.annotations.length;
   140             } else {
   141                 RuntimeAnnotations_attribute tAttr =
   142                         (RuntimeAnnotations_attribute)attr;
   143                 println(testtype + ": " + name + ", " + annName + ": " +
   144                         tAttr.annotations.length );
   145                 all += tAttr.annotations.length;
   146                 if (visible)
   147                     visibles += tAttr.annotations.length;
   148                 else
   149                     invisibles += tAttr.annotations.length;
   150             }
   151         }
   152     }
   154     void countAnnotations() {
   155         errors=0;
   156         int expected_allt = expected_tvisibles + expected_tinvisibles;
   157         int expected_all = expected_visibles + expected_invisibles;
   159         if (expected_allt != allt) {
   160             errors++;
   161             System.err.println("Failure: expected " + expected_allt +
   162                     " type annotations but found " + allt);
   163         }
   164         if (expected_all != all) {
   165             errors++;
   166             System.err.println("Failure: expected " + expected_all +
   167                     " annotations but found " + all);
   168         }
   169         if (expected_tvisibles != tvisibles) {
   170             errors++;
   171             System.err.println("Failure: expected " + expected_tvisibles +
   172                     " typevisible annotations but found " + tvisibles);
   173         }
   175         if (expected_tinvisibles != tinvisibles) {
   176             errors++;
   177             System.err.println("Failure: expected " + expected_tinvisibles +
   178                     " typeinvisible annotations but found " + tinvisibles);
   179         }
   180         allt=0;
   181         tvisibles=0;
   182         tinvisibles=0;
   183         all=0;
   184         visibles=0;
   185         invisibles=0;
   186     }
   188     int errors;
   189     int allt;
   190     int tvisibles;
   191     int tinvisibles;
   192     int all;
   193     int visibles;
   194     int invisibles;
   195 }

mercurial