]> source.dussan.org Git - dcevm.git/commitdiff
Allow classes to reside outside of test class.
authorIvan Dubrov <idubrov@guidewire.com>
Fri, 2 May 2014 05:39:50 +0000 (22:39 -0700)
committerIvan Dubrov <idubrov@guidewire.com>
Fri, 2 May 2014 05:39:52 +0000 (22:39 -0700)
Adding support for extra classes being redefined to the test framework.
Rewriting lambda test a little, extracting classes with lambda's to top
level.

dcevm/src/main/java/com/github/dcevm/HotSwapTool.java
dcevm/src/test/java7/com/github/dcevm/test/util/HotSwapTestHelper.java
dcevm/src/test/java8/com/github/dcevm/test/lambdas/LambdaA.java [new file with mode: 0644]
dcevm/src/test/java8/com/github/dcevm/test/lambdas/LambdaA___1.java [new file with mode: 0644]
dcevm/src/test/java8/com/github/dcevm/test/lambdas/LambdaTest.java

index 72d77590cb088510e86f8641db96874761633a5f..43baa850fdb7d5b9bf6b7ca7be3cdb1a9d6cd213 100644 (file)
@@ -131,7 +131,7 @@ public class HotSwapTool {
      * @param outerClass    the outer class whose inner classes should be redefined
      * @param versionNumber the target version number
      */
-    public static void toVersion(Class<?> outerClass, int versionNumber) {
+    public static void toVersion(Class<?> outerClass, int versionNumber, Class<?>... extraClasses) {
         assert versionNumber >= 0;
 
         if (versionNumber == getCurrentVersion(outerClass)) {
@@ -141,6 +141,18 @@ public class HotSwapTool {
 
         Map<String, File> files = findClassesWithVersion(outerClass, versionNumber);
 
+        for (Class<?> extra : extraClasses) {
+            if (parseClassVersion(extra.getSimpleName()) == versionNumber) {
+                String packageName = extra.getPackage().getName().replace('.', '/');
+                URL url = extra.getClassLoader().getResource(packageName);
+                if (url == null) {
+                    throw new IllegalArgumentException("Cannot find URL corresponding to the package '" + packageName + "'");
+                }
+                File file = new File(url.getFile(), extra.getSimpleName() + ".class");
+                files.put(extra.getName(), file);
+            }
+        }
+
         try {
             Map<Class<?>, byte[]> map = buildRedefinitionMap(files);
 
@@ -171,11 +183,10 @@ public class HotSwapTool {
         }
         File folder = new File(url.getFile());
         for (File f : folder.listFiles(IsClassFile.INSTANCE)) {
-            String fileName = f.getName();
             String simpleName = f.getName().substring(0, f.getName().length() - CLASS_FILE_SUFFIX.length());
             String name = baseClass.getPackage().getName() + '.' + simpleName;
 
-            if (isInnerClass(name, baseClass) && parseClassVersion(fileName) == version) {
+            if (isInnerClass(name, baseClass) && parseClassVersion(simpleName) == version) {
                 classes.put(name, f);
             }
         }
@@ -202,12 +213,12 @@ public class HotSwapTool {
     /**
      * Parse version of the class from the class name. Classes are named in the form of [Name]___[Version]
      */
-    private static int parseClassVersion(String name) {
-        int index = name.indexOf(IDENTIFIER);
+    private static int parseClassVersion(String simpleName) {
+        int index = simpleName.indexOf(IDENTIFIER);
         if (index == -1) {
             return 0;
         }
-        return Integer.valueOf(name.substring(index + IDENTIFIER.length(), name.length() - CLASS_FILE_SUFFIX.length()));
+        return Integer.valueOf(simpleName.substring(index + IDENTIFIER.length(), simpleName.length()));
     }
 
     private static String stripVersion(String className) {
index b6fc4ff0ea88c02c787e39fa8a6a9644ab2c31f5..8ba4217b971c6b5b408a6183f9ffa2c31fd5b7fd 100644 (file)
@@ -49,8 +49,8 @@ public class HotSwapTestHelper {
      *
      * @param versionNumber the target version number
      */
-    public static void __toVersion__(int versionNumber) {
-        HotSwapTool.toVersion(determineOuter(0), versionNumber);
+    public static void __toVersion__(int versionNumber, Class<?>... extra) {
+        HotSwapTool.toVersion(determineOuter(0), versionNumber, extra);
     }
 
     /**
diff --git a/dcevm/src/test/java8/com/github/dcevm/test/lambdas/LambdaA.java b/dcevm/src/test/java8/com/github/dcevm/test/lambdas/LambdaA.java
new file mode 100644 (file)
index 0000000..670cf8b
--- /dev/null
@@ -0,0 +1,13 @@
+package com.github.dcevm.test.lambdas;
+
+import java.util.concurrent.Callable;
+
+public class LambdaA {
+    public Callable<Integer> createLambda() {
+        return () -> 10;
+    }
+
+    public Callable<Integer> createLambda2() {
+        return () -> 20;
+    }
+}
diff --git a/dcevm/src/test/java8/com/github/dcevm/test/lambdas/LambdaA___1.java b/dcevm/src/test/java8/com/github/dcevm/test/lambdas/LambdaA___1.java
new file mode 100644 (file)
index 0000000..3769715
--- /dev/null
@@ -0,0 +1,14 @@
+package com.github.dcevm.test.lambdas;
+
+import java.util.concurrent.Callable;
+
+public class LambdaA___1 {
+
+    public Callable<Integer> createLambda() {
+        return () -> 30;
+    }
+
+    public Callable<Integer> createLambda2() {
+        return () -> 40;
+    }
+}
index ba04fa738f1c0483f09d7545711ec13e509f9572..efacdbbc29a71b8e3adcffd62e6cf986beb3a8b9 100644 (file)
@@ -36,7 +36,11 @@ import static com.github.dcevm.test.util.HotSwapTestHelper.__version__;
 import static org.junit.Assert.assertEquals;
 
 /**
- * Tests for lambda expressions
+ * Tests for lambda expressions.
+ *
+ * These lambdas are sneaky. First, it seems like generated lambda method names are arbitrary and depend
+ * on the compilation order. However, for redefinition test we want to make sure that generated method names would
+ * actually match in old and new versions, so we have keep classes being redefined outside of this inner class.
  *
  * @author Ivan Dubrov
  */
@@ -48,39 +52,16 @@ public class LambdaTest {
     __toVersion__(0);
   }
 
-  // Version 0
-  public static class A {
-    public Callable<Integer> createLambda() {
-      return () -> 10;
-    }
-
-    public Callable<Integer> createLambda2() {
-      return () -> 20;
-    }
-  }
-
-  // Version 1
-  public static class A___1 {
-    public Callable<Integer> createLambda2() {
-      return () -> 40;
-    }
-
-    public Callable<Integer> createLambda() {
-      return () -> 30;
-    }
-  }
-
   @Test
-  @Ignore
   public void testMethodLambda() throws Exception {
-    A a = new A();
+    LambdaA a = new LambdaA();
     Callable<Integer> lambda = a.createLambda();
     Callable<Integer> lambda2 = a.createLambda2();
 
     assertEquals(10, (int) lambda.call());
     assertEquals(20, (int) lambda2.call());
 
-    __toVersion__(1);
+    __toVersion__(1, LambdaA___1.class);
 
     assertEquals(30, (int) lambda.call());
     assertEquals(40, (int) lambda2.call());