aboutsummaryrefslogtreecommitdiffstats
path: root/dcevm/src
diff options
context:
space:
mode:
authorIvan Dubrov <idubrov@guidewire.com>2015-07-10 14:22:07 -0700
committerIvan Dubrov <idubrov@guidewire.com>2015-07-10 14:22:07 -0700
commit220d2d53e0ca62efe7e8cd325445cd9eef8619b7 (patch)
tree25d3268a48885f2cd0179f17324825715f3615b7 /dcevm/src
parentd616b7126ccf8e7dc93d621035ef568323ac18cc (diff)
downloaddcevm-220d2d53e0ca62efe7e8cd325445cd9eef8619b7.tar.gz
dcevm-220d2d53e0ca62efe7e8cd325445cd9eef8619b7.zip
Fixing fields handling
Diffstat (limited to 'dcevm/src')
-rw-r--r--dcevm/src/test/java7/com/github/dcevm/test/fields/InstanceFieldHandleTest.java154
-rw-r--r--dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java154
2 files changed, 308 insertions, 0 deletions
diff --git a/dcevm/src/test/java7/com/github/dcevm/test/fields/InstanceFieldHandleTest.java b/dcevm/src/test/java7/com/github/dcevm/test/fields/InstanceFieldHandleTest.java
new file mode 100644
index 00000000..a47ce5c5
--- /dev/null
+++ b/dcevm/src/test/java7/com/github/dcevm/test/fields/InstanceFieldHandleTest.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2010, 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.
+ *
+ */
+package com.github.dcevm.test.fields;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+
+import static com.github.dcevm.test.util.HotSwapTestHelper.__toVersion__;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test for replacing field with MethodHandle pointing to it.
+ *
+ * Technically, should work for Java 7, but currently is not supported in Java 7.
+ *
+ * @author Ivan Dubrov
+ */
+public class InstanceFieldHandleTest {
+
+ // Version 0
+ public static class A {
+ public int fieldA;
+ public int fieldB;
+
+ public int getFieldA() {
+ return -1;
+ }
+ }
+
+ // Version 1 (fields swapped and new one is added)
+ public static class A___1 {
+ public int fieldB;
+ public int fieldA;
+ public String fieldC;
+
+ public int getFieldA() {
+ return fieldA;
+ }
+ }
+
+ // Version 2 (fields removed)
+ public static class A___2 {
+ }
+
+ // Version 3 (field type changed)
+ public static class A___3 {
+ public String fieldA;
+ public int fieldB;
+ }
+
+ @Before
+ @After
+ public void setUp() throws Exception {
+ __toVersion__(0);
+ }
+
+ @Test
+ public void testFieldChangeOrder() throws Throwable {
+ A a = new A();
+ MethodHandle getter = MethodHandles.publicLookup().findGetter(A.class, "fieldA", int.class);
+ MethodHandle setter = MethodHandles.publicLookup().findSetter(A.class, "fieldA", int.class);
+
+ a.fieldA = 3;
+ assertEquals(3, getter.invoke(a));
+
+ // Swap fields
+ __toVersion__(1);
+
+ assertEquals(3, getter.invoke(a));
+ setter.invoke(a, 53);
+ assertEquals(53, a.getFieldA());
+ assertEquals(53, getter.invoke(a));
+ }
+
+ @Test
+ public void testFieldRemoved() throws Throwable {
+ A a = new A();
+ MethodHandle getter = MethodHandles.publicLookup().findGetter(A.class, "fieldA", int.class);
+ MethodHandle setter = MethodHandles.publicLookup().findSetter(A.class, "fieldA", int.class);
+
+ a.fieldA = 3;
+ assertEquals(3, getter.invoke(a));
+
+ // Remove fieldA
+ __toVersion__(2);
+
+ try {
+ getter.invoke(a);
+ Assert.fail("Handle should have been cleared!");
+ } catch (NullPointerException e) {
+ // Handle was cleared!
+ }
+
+ try {
+ setter.invoke(a, 10);
+ Assert.fail("Handle should have been cleared!");
+ } catch (NullPointerException e) {
+ // Handle was cleared!
+ }
+ }
+
+ @Test
+ public void testFieldTypeChange() throws Throwable {
+ A a = new A();
+ MethodHandle getter = MethodHandles.publicLookup().findGetter(A.class, "fieldA", int.class);
+ MethodHandle setter = MethodHandles.publicLookup().findSetter(A.class, "fieldA", int.class);
+
+ a.fieldA = 3;
+ assertEquals(3, getter.invoke(a));
+
+ // Remove fieldA
+ __toVersion__(3);
+
+ try {
+ getter.invoke(a);
+ Assert.fail("Handle should have been cleared!");
+ } catch (NullPointerException e) {
+ // Handle was cleared!
+ }
+
+ try {
+ setter.invoke(a, 10);
+ Assert.fail("Handle should have been cleared!");
+ } catch (NullPointerException e) {
+ // Handle was cleared!
+ }
+ }
+} \ No newline at end of file
diff --git a/dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java b/dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java
new file mode 100644
index 00000000..ee669917
--- /dev/null
+++ b/dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2010, 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.
+ *
+ */
+package com.github.dcevm.test.fields;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+
+import static com.github.dcevm.test.util.HotSwapTestHelper.__toVersion__;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test for replacing field with MethodHandle pointing to it.
+ *
+ * Technically, should work for Java 7, but currently is not supported in Java 7.
+ *
+ * @author Ivan Dubrov
+ */
+public class StaticFieldHandleTest {
+
+ // Version 0
+ public static class A {
+ public static int fieldA;
+ public static int fieldB;
+
+ public static int getFieldA() {
+ return -1;
+ }
+ }
+
+ // Version 1 (fields swapped)
+ public static class A___1 {
+ public static int fieldB;
+ public static int fieldA;
+ public static String fieldC;
+
+ public static int getFieldA() {
+ return fieldA;
+ }
+ }
+
+ // Version 2 (fields removed)
+ public static class A___2 {
+ }
+
+ // Version 3 (field type changed)
+ public static class A___3 {
+ public static String fieldA;
+ public static int fieldB;
+ }
+
+ @Before
+ @After
+ public void setUp() throws Exception {
+ __toVersion__(0);
+ }
+
+ @Test
+ public void testStaticFieldChangeOrder() throws Throwable {
+ MethodHandle getter = MethodHandles.publicLookup().findStaticGetter(A.class, "fieldA", int.class);
+ MethodHandle setter = MethodHandles.publicLookup().findStaticSetter(A.class, "fieldA", int.class);
+
+ A.fieldA = 3;
+ A.fieldB = 5;
+ assertEquals(3, getter.invoke());
+
+ // Swap fields A and B
+ __toVersion__(1);
+
+ assertEquals(3, getter.invoke());
+ setter.invoke(12);
+ assertEquals(12, A.getFieldA());
+ assertEquals(12, getter.invoke());
+ }
+
+ @Test
+ public void testStaticFieldRemoved() throws Throwable {
+ MethodHandle getter = MethodHandles.publicLookup().findStaticGetter(A.class, "fieldA", int.class);
+ MethodHandle setter = MethodHandles.publicLookup().findStaticSetter(A.class, "fieldA", int.class);
+
+ A.fieldA = 3;
+ A.fieldB = 5;
+ assertEquals(3, getter.invoke());
+
+ // Remove fieldA
+ __toVersion__(2);
+
+ try {
+ getter.invoke();
+ Assert.fail("Handle should have been cleared!");
+ } catch (NullPointerException e) {
+ // Handle was cleared!
+ }
+
+ try {
+ setter.invoke(15);
+ Assert.fail("Handle should have been cleared!");
+ } catch (NullPointerException e) {
+ // Handle was cleared!
+ }
+ }
+
+ @Test
+ public void testStaticFieldTypeChange() throws Throwable {
+ MethodHandle getter = MethodHandles.publicLookup().findStaticGetter(A.class, "fieldA", int.class);
+ MethodHandle setter = MethodHandles.publicLookup().findStaticSetter(A.class, "fieldA", int.class);
+
+ A.fieldA = 3;
+ A.fieldB = 5;
+ assertEquals(3, getter.invoke());
+
+ // Remove fieldA
+ __toVersion__(3);
+
+ try {
+ getter.invoke();
+ Assert.fail("Handle should have been cleared!");
+ } catch (NullPointerException e) {
+ // Handle was cleared!
+ }
+
+ try {
+ setter.invoke(15);
+ Assert.fail("Handle should have been cleared!");
+ } catch (NullPointerException e) {
+ // Handle was cleared!
+ }
+ }
+} \ No newline at end of file