diff src/tests/gov/nasa/jpf/test/vm/basic/AnnotationTest.java @ 0:61d41facf527

initial v8 import (history reset)
author Peter Mehlitz <Peter.C.Mehlitz@nasa.gov>
date Fri, 23 Jan 2015 10:14:01 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tests/gov/nasa/jpf/test/vm/basic/AnnotationTest.java	Fri Jan 23 10:14:01 2015 -0800
@@ -0,0 +1,556 @@
+/*
+ * Copyright (C) 2014, United States Government, as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All rights reserved.
+ *
+ * The Java Pathfinder core (jpf-core) platform is 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 gov.nasa.jpf.test.vm.basic;
+
+import gov.nasa.jpf.ListenerAdapter;
+import gov.nasa.jpf.jvm.bytecode.GETFIELD;
+import gov.nasa.jpf.jvm.bytecode.JVMInvokeInstruction;
+import gov.nasa.jpf.util.test.TestJPF;
+import gov.nasa.jpf.vm.AnnotationInfo;
+import gov.nasa.jpf.vm.FieldInfo;
+import gov.nasa.jpf.vm.Instruction;
+import gov.nasa.jpf.vm.ThreadInfo;
+import gov.nasa.jpf.vm.VM;
+import gov.nasa.jpf.vm.MethodInfo;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Method;
+
+import org.junit.Test;
+
+
+public class AnnotationTest extends TestJPF {
+
+  @Test //----------------------------------------------------------------------
+  @A1("foo")
+  public void testStringValueOk () {
+    if (verifyNoPropertyViolation()) {
+      try {
+        java.lang.reflect.Method method =
+                AnnotationTest.class.getMethod("testStringValueOk");
+        A1 annotation = method.getAnnotation(A1.class);
+
+        assert ("foo".equals(annotation.value()));
+        
+      } catch (SecurityException e) {
+        e.printStackTrace();
+      } catch (NoSuchMethodException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A1 {
+    String value();
+  }
+
+
+  @Test //----------------------------------------------------------------------
+  @A2({"foo", "boo"})
+  public void testStringArrayValueOk () {
+    if (verifyNoPropertyViolation()) {
+      try {
+        java.lang.reflect.Method method =
+                AnnotationTest.class.getMethod("testStringArrayValueOk");
+        A2 annotation = method.getAnnotation(A2.class);
+
+        Object v = annotation.value();
+        assert v instanceof String[];
+
+        String[] a = (String[])v;
+        assert a.length == 2;
+
+        assert "foo".equals(a[0]);
+        assert "boo".equals(a[1]);
+
+      } catch (SecurityException e) {
+        e.printStackTrace();
+      } catch (NoSuchMethodException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A2 {
+    String[] value();
+  }
+
+  @Test //----------------------------------------------------------------------
+  @A3(Long.MAX_VALUE)
+  public void testLongValueOk () {
+    if (verifyNoPropertyViolation()) {
+      try {
+        java.lang.reflect.Method method =
+                AnnotationTest.class.getMethod("testLongValueOk");
+        A3 annotation = method.getAnnotation(A3.class);
+
+        assert (annotation.value() == Long.MAX_VALUE);
+      } catch (SecurityException e) {
+        e.printStackTrace();
+      } catch (NoSuchMethodException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A3 {
+    long value();
+  }
+
+
+  @Test //----------------------------------------------------------------------
+  @A4(a="one",b=42.0)
+  public void testNamedParamsOk () {
+    if (verifyNoPropertyViolation()) {
+      try {
+        java.lang.reflect.Method method =
+                AnnotationTest.class.getMethod("testNamedParamsOk");
+        A4 annotation = method.getAnnotation(A4.class);
+
+        assert ("one".equals(annotation.a()));
+        assert ( 42.0 == annotation.b());
+
+        System.out.println(annotation);
+
+      } catch (SecurityException e) {
+        e.printStackTrace();
+      } catch (NoSuchMethodException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A4 {
+    String a();
+    double b();
+  }
+
+
+  @Test //----------------------------------------------------------------------
+  @A5(b="foo")
+  public void testPartialDefaultParamsOk () {
+    if (verifyNoPropertyViolation()) {
+      try {
+        java.lang.reflect.Method method =
+                AnnotationTest.class.getMethod("testPartialDefaultParamsOk");
+        A5 annotation = method.getAnnotation(A5.class);
+
+        assert ("whatever".equals(annotation.a()));
+
+        System.out.println(annotation);
+
+      } catch (SecurityException e) {
+        e.printStackTrace();
+      } catch (NoSuchMethodException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A5 {
+    String a() default "whatever";
+    String b();
+  }
+
+  @Test //----------------------------------------------------------------------
+  @A6
+  public void testSingleDefaultParamOk () {
+    if (verifyNoPropertyViolation()) {
+      try {
+        java.lang.reflect.Method method =
+                AnnotationTest.class.getMethod("testSingleDefaultParamOk");
+        A6 annotation = method.getAnnotation(A6.class);
+        
+        assert ("whatever".equals(annotation.value()));
+
+        System.out.println(annotation);
+
+      } catch (SecurityException e) {
+        e.printStackTrace();
+      } catch (NoSuchMethodException e) {
+        e.printStackTrace();
+      }
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A6 {
+    String value() default "whatever";
+  }
+  
+  @A6
+  @Test
+  public void testAnnotationClass() throws ClassNotFoundException, NoSuchMethodException {
+    if (verifyNoPropertyViolation()) { 
+      Class clazz = Class.forName("gov.nasa.jpf.test.vm.basic.AnnotationTest");
+      Method method = clazz.getDeclaredMethod("testAnnotationClass");
+      Annotation annotations[] = method.getAnnotations();
+      
+      for (int i=0; i<annotations.length; i++){
+        System.out.printf("  a[%d] = %s\n", i, annotations[i].toString());
+      }
+      
+      assertEquals(2, annotations.length);
+      assertNotNull(annotations[0]);
+      assertNotNull(annotations[1]);      
+
+      assertTrue(annotations[0] instanceof A6);
+      assertTrue(annotations[1] instanceof Test);
+    }
+  }
+
+  //--------------------------------------------------------------------
+
+  public enum MyEnum {
+    ONE, TWO
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A7 {
+    MyEnum value();
+  }
+
+  @Test
+  @A7(MyEnum.ONE)
+  public void testEnumValue() throws ClassNotFoundException, NoSuchMethodException {
+    if (verifyNoPropertyViolation()){
+      Class clazz = Class.forName("gov.nasa.jpf.test.vm.basic.AnnotationTest");  // Any class outside of this file will do.
+      Method method = clazz.getDeclaredMethod("testEnumValue");               // Any method with an annotation will do.
+      Annotation annotations[] = method.getAnnotations();
+
+      assertEquals(2, annotations.length);
+      assertNotNull(annotations[1]);
+
+      assertTrue(annotations[1] instanceof A7);
+      A7 ann = (A7)annotations[1];
+      assertTrue( ann.value() == MyEnum.ONE);
+    }
+  }
+
+  //--------------------------------------------------------------------
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A8 {
+    Class value();
+  }
+
+  @Test
+  @A8(AnnotationTest.class)
+  public void testClassValue() throws ClassNotFoundException, NoSuchMethodException {
+    if (verifyNoPropertyViolation()){
+      Class clazz = Class.forName("gov.nasa.jpf.test.vm.basic.AnnotationTest");  // Any class outside of this file will do.
+      Method method = clazz.getDeclaredMethod("testClassValue");               // Any method with an annotation will do.
+      Annotation annotations[] = method.getAnnotations();
+
+      assertEquals(2, annotations.length);
+      assertNotNull(annotations[1]);
+
+      assertTrue(annotations[1] instanceof A8);
+      A8 ann = (A8)annotations[1];
+      assertTrue( ann.value() == AnnotationTest.class);
+    }
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A11 {
+      Class<?>[] value();
+  }
+
+  @Test
+  @A11({ AnnotationTest.class, Class.class })
+  public void testClassArrayValueOk() throws ClassNotFoundException, SecurityException, NoSuchMethodException {
+    if (verifyNoPropertyViolation()) {
+      Class<?> clazz = Class.forName(AnnotationTest.class.getName());
+      Method method = clazz.getDeclaredMethod("testClassArrayValueOk");
+      Annotation[] annotations = method.getAnnotations();
+      assertEquals(2, annotations.length);
+      assertNotNull(annotations[1]);
+
+      assertTrue(annotations[1] instanceof A11);
+      A11 ann = (A11) annotations[1];
+      assertTrue(ann.value()[0] == AnnotationTest.class);
+      assertTrue(ann.value()[1] == Class.class);
+    }
+  }
+
+  //-------------------------------------------------------------------
+  static class MyClass {
+    @A1("the answer")
+    int data = 42;
+  }
+  
+  public static class DataListener extends ListenerAdapter {
+
+    @Override
+    public void executeInstruction(VM vm, ThreadInfo ti, Instruction insnToExecute){
+      if (insnToExecute instanceof GETFIELD){
+        FieldInfo fi = ((GETFIELD)insnToExecute).getFieldInfo();
+        if (fi.getName().equals("data")){
+          AnnotationInfo ai = fi.getAnnotation("gov.nasa.jpf.test.vm.basic.AnnotationTest$A1");
+          System.out.println("annotation for " + fi.getFullName() + " = " + ai);
+          
+          if (ai != null){
+            String val = ai.getValueAsString("value");
+            System.out.println("   value = " + val);
+            
+            if (val == null || !val.equals("the answer")){
+              fail("wrong @A1 value = " + val);
+            }
+          } else {
+            fail("no @A1 annotation for field " + fi.getFullName());
+          }
+        }
+      }
+    }
+  }
+  
+  @Test
+  public void testFieldAnnotation(){
+    if (verifyNoPropertyViolation("+listener=.test.vm.basic.AnnotationTest$DataListener")){
+      MyClass obj = new MyClass();
+      int d = obj.data;
+    }
+  }
+  
+  //-------------------------------------------------------------------
+  public static class ArgListener extends ListenerAdapter {
+
+    @Override
+    public void executeInstruction (VM vm, ThreadInfo ti, Instruction insnToExecute){
+      if (insnToExecute instanceof JVMInvokeInstruction){
+        MethodInfo mi = ((JVMInvokeInstruction)insnToExecute).getInvokedMethod();
+        if (mi.getName().equals("foo")){
+          System.out.println("-- called method: " + mi.getUniqueName());
+          
+          AnnotationInfo[][] pai = mi.getParameterAnnotations();
+          
+          assert pai != null : "no parameter annotations found";
+          assert pai.length == 2 : "wrong number of parameter annotation arrays: " + pai.length;
+          assert pai[0] != null : "no parameter annotation for first argument found";
+          assert pai[0].length == 1 : "wrong number of annotations for first argument: "+ pai[0].length;
+          assert pai[1] != null : "no parameter annotation for second argument found";
+          assert pai[1].length == 0 : "wrong number of annotations for first argument: "+ pai[1].length;
+          
+          for (int i=0; i<pai.length; i++){
+            System.out.println("-- annotations for parameter: " + i);
+            AnnotationInfo[] ai = pai[i];
+            if (ai != null && ai.length > 0) {
+              for (int j = 0; j < ai.length; j++) {
+                assert (ai[i] != null) : "null annotation for paramter: " + j;
+                System.out.println(ai[i].asString());
+              }
+            } else {
+              System.out.println("none");
+            }
+          }
+        }
+      }
+    }
+  }
+  
+  public void foo (@A1("arghh") MyClass x, String s){
+    // nothing
+  }
+  
+  @Test
+  public void testParameterAnnotation(){
+    if (verifyNoPropertyViolation("+listener=.test.vm.basic.AnnotationTest$ArgListener")){
+      MyClass obj = new MyClass();
+      foo( obj, "blah");
+    }        
+  }
+  
+  //---------------------------------------------------------------
+  
+  @Retention(RetentionPolicy.RUNTIME)
+  @Inherited
+  public @interface A9 {
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  public @interface A10 {
+  }
+  
+  @A9()
+  public static class Parent {
+  }
+
+  @A10
+  public static class Child1 extends Parent {
+  }
+
+  public static class Child2 extends Child1 {
+  }
+ 
+  @Test
+  public void getAnnotationsTest () {
+    if (verifyNoPropertyViolation()) {      
+      assertTrue(Parent.class.getAnnotations().length == 1);
+      assertTrue(Child1.class.getAnnotations().length == 2);
+      assertTrue(Child2.class.getAnnotations().length == 1);
+    }
+  }
+  
+
+  //---------------------------------------------------------------
+  // test for RuntimeVisibleAnnotations attributes that in turn have
+  // element_value entries
+  @Retention(RetentionPolicy.RUNTIME)
+  @interface A12 { // this one has the string value
+    String value();
+  }
+
+  @Retention(RetentionPolicy.RUNTIME)
+  @A12("Whatever")
+  @interface A13 {
+    // this one has a RuntimeVisibleAnnotation attribute for A11 with a
+    // String entry value
+  }
+
+  @A13 // causes loading of @C
+  @Test
+  public void testRecursiveRuntimeVisibleAnnotationValue(){
+    if (verifyNoPropertyViolation()){
+      // nothing to do other than just causing the loading of A12
+    }
+  }
+  
+  
+  //---------------------------------------------------------------
+  // test of char annotations
+  @Retention(RetentionPolicy.RUNTIME)
+  public @interface A14 {
+    char value();
+  }
+  
+  @Test
+  @A14('x')
+  public void testCharAnnotation(){
+    if (verifyNoPropertyViolation()){
+      try {
+        Class<?> clazz = Class.forName(AnnotationTest.class.getName());
+        Method method = clazz.getDeclaredMethod("testCharAnnotation");
+        Annotation[] annotations = method.getAnnotations();
+        assertEquals(2, annotations.length);
+        assertNotNull(annotations[1]);
+
+        assertTrue(annotations[1] instanceof A14);
+        A14 ann = (A14) annotations[1];
+        assertTrue(ann.value() == 'x');
+        
+      } catch (Throwable t){
+        t.printStackTrace();
+        fail("unexpected exception: " + t);
+      }
+    }
+  }
+  
+  //---------------------------------------------------------------
+  // test of char annotations
+  @Retention(RetentionPolicy.RUNTIME)
+  public @interface A15 {
+    float value();
+  }
+  
+  @Test
+  @A15(12.34f)
+  public void testFloatAnnotation(){
+    if (verifyNoPropertyViolation()){
+      try {
+        Class<?> clazz = Class.forName(AnnotationTest.class.getName());
+        Method method = clazz.getDeclaredMethod("testFloatAnnotation");
+        Annotation[] annotations = method.getAnnotations();
+        assertEquals(2, annotations.length);
+        assertNotNull(annotations[1]);
+
+        assertTrue(annotations[1] instanceof A15);
+        A15 ann = (A15) annotations[1];
+        assertTrue(Math.abs(ann.value() - 12.34f) < 0.00001);
+        
+      } catch (Throwable t){
+        t.printStackTrace();
+        fail("unexpected exception: " + t);
+      }
+    }
+  }
+
+  // test of char annotations
+  @Retention(RetentionPolicy.RUNTIME)
+  public @interface A16 {
+    double value();
+  }
+  
+  @Test
+  @A16(Double.MAX_VALUE)
+  public void testDoubleAnnotation(){
+    if (verifyNoPropertyViolation()){
+      try {
+        Class<?> clazz = Class.forName(AnnotationTest.class.getName());
+        Method method = clazz.getDeclaredMethod("testDoubleAnnotation");
+        Annotation[] annotations = method.getAnnotations();
+        assertEquals(2, annotations.length);
+        assertNotNull(annotations[1]);
+
+        assertTrue(annotations[1] instanceof A16);
+        A16 ann = (A16) annotations[1];
+        assertTrue(ann.value() == Double.MAX_VALUE);
+        
+      } catch (Throwable t){
+        t.printStackTrace();
+        fail("unexpected exception: " + t);
+      }
+    }
+  }
+
+  // test of char annotations
+  @Retention(RetentionPolicy.RUNTIME)
+  public @interface A17 {
+    long value();
+  }
+  
+  @Test
+  @A17(Long.MAX_VALUE)
+  public void testLongAnnotation(){
+    if (verifyNoPropertyViolation()){
+      try {
+        Class<?> clazz = Class.forName(AnnotationTest.class.getName());
+        Method method = clazz.getDeclaredMethod("testLongAnnotation");
+        Annotation[] annotations = method.getAnnotations();
+        assertEquals(2, annotations.length);
+        assertNotNull(annotations[1]);
+
+        assertTrue(annotations[1] instanceof A17);
+        A17 ann = (A17) annotations[1];
+        assertTrue(ann.value() == Long.MAX_VALUE);
+        
+      } catch (Throwable t){
+        t.printStackTrace();
+        fail("unexpected exception: " + t);
+      }
+    }
+  }
+
+}