You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/05/18 18:51:51 UTC

[2/2] git commit: ISIS-783: further minor improvements to integtest framework

ISIS-783: further minor improvements to integtest framework

* IntegrationTestAbstract#nextSession(), to supplement nextTransaction(); causes a new Isis/DataNucleus session (ie clear caches)
* IsisSystemForTest new openSession and closeSession
* ScenarioExecution new openSession and closeSesssion
* ScenarioExecution#injectServicesInto support @javax.inject.Inject for fields.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/27144fc3
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/27144fc3
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/27144fc3

Branch: refs/heads/master
Commit: 27144fc302e43f0cf06718eb796f980c06c975bb
Parents: d27a47d
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun May 18 17:51:33 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun May 18 17:51:33 2014 +0100

----------------------------------------------------------------------
 .../IntegrationTestAbstract.java                |  9 ++-
 .../integtestsupport/IsisSystemForTest.java     | 15 +++-
 .../ScenarioExecutionForIntegration.java        | 28 +++++++
 .../scenarios/ScenarioExecution.java            | 82 +++++++++++++++++++-
 4 files changed, 127 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/27144fc3/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
index df15345..54a3130 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract.java
@@ -70,7 +70,14 @@ public abstract class IntegrationTestAbstract {
         scenarioExecution().endTran(true);
         scenarioExecution().beginTran();
     }
-    
+
+    protected void nextSession() {
+        scenarioExecution().endTran(true);
+        scenarioExecution().closeSession();
+        scenarioExecution().openSession();
+        scenarioExecution().beginTran();
+    }
+
     // //////////////////////////////////////
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/27144fc3/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
index fb52ea6..5683b21 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
@@ -373,11 +373,22 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
 
     public void bounceSystem() throws Exception {
         firePreBounceSystem();
-        tearDownSystem(FireListeners.DONT_FIRE);
-        setUpSystem(FireListeners.DONT_FIRE);
+        closeSession();
+        openSession();
         firePostBounceSystem();
     }
 
+    public void openSession() throws Exception {
+        openSession(authenticationSession);
+    }
+
+    public void openSession(AuthenticationSession authenticationSession) throws Exception {
+        IsisContext.openSession(authenticationSession);
+    }
+
+    public void closeSession() throws Exception {
+        IsisContext.closeSession();
+    }
 
     private IsisSystemDefault createIsisSystem(List<Object> services) {
         final IsisSystemDefault system = new IsisSystemDefault(DeploymentType.UNIT_TESTING, services) {

http://git-wip-us.apache.org/repos/asf/isis/blob/27144fc3/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java
index 68476b5..1c36461 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/scenarios/ScenarioExecutionForIntegration.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.integtestsupport.scenarios;
 
 import org.apache.isis.applib.fixtures.InstallableFixture;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.integtestsupport.IsisSystemForTest;
 import org.apache.isis.core.specsupport.scenarios.ScenarioExecution;
 import org.apache.isis.core.specsupport.scenarios.ScenarioExecutionScope;
@@ -78,4 +79,31 @@ public class ScenarioExecutionForIntegration extends ScenarioExecution  {
         }
     }
 
+    @Override
+    public void openSession() {
+        try {
+            isft.openSession();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void openSession(AuthenticationSession authenticationSession) {
+        try {
+            isft.openSession(authenticationSession);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void closeSession() {
+        try {
+            isft.closeSession();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/27144fc3/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java
----------------------------------------------------------------------
diff --git a/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java b/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java
index 7a6179c..962c750 100644
--- a/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java
+++ b/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecution.java
@@ -16,19 +16,24 @@
  */
 package org.apache.isis.core.specsupport.scenarios;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
-
+import javax.inject.Inject;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
-
 import org.jmock.Mockery;
 import org.jmock.Sequence;
 import org.jmock.States;
 import org.jmock.internal.ExpectationBuilder;
-
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.fixtures.InstallableFixture;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 
 
 /**
@@ -133,6 +138,7 @@ public abstract class ScenarioExecution {
     }
 
 
+
     // //////////////////////////////////////
 
     /**
@@ -372,6 +378,41 @@ public abstract class ScenarioExecution {
     // //////////////////////////////////////
 
     /**
+     * For Cucumber hooks to call.
+     *
+     * <p>
+     * This implementation is a no-op, but subclasses of this class tailored to
+     * supporting integration specs are expected to override.
+     */
+    public void openSession() {
+        // do nothing
+    }
+
+    /**
+     * For Cucumber hooks to call.
+     *
+     * <p>
+     * This implementation is a no-op, but subclasses of this class tailored to
+     * supporting integration specs are expected to override.
+     */
+    public void openSession(AuthenticationSession authenticationSession) {
+        // do nothing
+    }
+
+    /**
+     * For Cucumber hooks to call.
+     *
+     * <p>
+     * This implementation is a no-op, but subclasses of this class tailored to
+     * supporting integration specs are expected to override.
+     */
+    public void closeSession() {
+        // do nothing
+    }
+
+    // //////////////////////////////////////
+
+    /**
      * For Cucumber hooks to call, performing transaction management around each step.
      * 
      * <p>
@@ -408,20 +449,53 @@ public abstract class ScenarioExecution {
                 final Class<?> serviceClass = parameterTypes[0];
                 if(method.getName().startsWith("inject")) {
                     final Object service = service(serviceClass);
-                        method.invoke(obj, service);
+                    method.invoke(obj, service);
                 }
                 if(method.getName().startsWith("set") && serviceClass == DomainObjectContainer.class) {
                     final Object container = container();
                     method.invoke(obj, container);
                 }
             }
+            autowireViaFields(obj, obj.getClass());
+
             return obj;
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
 
+    private void autowireViaFields(final Object object, final Class<?> cls) {
+        final List<Field> fields = Arrays.asList(cls.getDeclaredFields());
+        final Iterable<Field> injectFields = Iterables.filter(fields, new Predicate<Field>() {
+            @Override
+            public boolean apply(Field input) {
+                final Inject annotation = input.getAnnotation(javax.inject.Inject.class);
+                return annotation != null;
+            }
+        });
 
+        for (final Field field : injectFields) {
+            final Object service = service(field.getType());
+            final Class<?> serviceClass = service.getClass();
+            field.setAccessible(true);
+            invokeInjectorField(field, object, service);
+        }
 
+        // recurse up the hierarchy
+        final Class<?> superclass = cls.getSuperclass();
+        if(superclass != null) {
+            autowireViaFields(object, superclass);
+        }
+    }
+
+    private static void invokeInjectorField(final Field field, final Object target, final Object parameter) {
+        try {
+            field.set(target, parameter);
+        } catch (IllegalArgumentException e) {
+            throw new MetaModelException(e);
+        } catch (IllegalAccessException e) {
+            throw new MetaModelException(String.format("Cannot access the %s field in %s", field.getName(), target.getClass().getName()));
+        }
+    }
 
 }