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

[isis] branch master updated: ISIS-1954: introduces IntegrationTestJupiter as base class for integration tests for the JUnit 5 Jupiter Engine

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new ddfc8cd  ISIS-1954: introduces IntegrationTestJupiter as base class for integration tests for the JUnit 5 Jupiter Engine
ddfc8cd is described below

commit ddfc8cd86b7d7d9eb52a1ec19936e838d9a895c8
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 31 14:17:47 2018 +0200

    ISIS-1954: introduces IntegrationTestJupiter as base class for
    integration tests for the JUnit 5 Jupiter Engine
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1954
---
 .../integtestsupport/IntegrationTestAbstract3.java |  88 +---------------
 .../integtestsupport/IntegrationTestJupiter.java   |  96 +++++++++++++++++
 .../apache/isis/core/integtestsupport/Util.java    | 116 +++++++++++++++++++++
 3 files changed, 215 insertions(+), 85 deletions(-)

diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
index 7bd30b3..2394f74 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestAbstract3.java
@@ -18,16 +18,8 @@
  */
 package org.apache.isis.core.integtestsupport;
 
-import java.util.List;
-
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.Module;
-import org.apache.isis.applib.NonRecoverableException;
-import org.apache.isis.applib.RecoverableException;
-import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
-import org.apache.isis.applib.services.xactn.TransactionService;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.integtestsupport.components.DefaultHeadlessTransactionSupport;
 import org.apache.isis.core.runtime.headless.HeadlessTransactionSupport;
 import org.apache.isis.core.runtime.headless.HeadlessWithBootstrappingAbstract;
 import org.apache.isis.core.runtime.headless.IsisSystem;
@@ -73,82 +65,15 @@ public abstract class IntegrationTestAbstract3 extends HeadlessWithBootstrapping
                         base.evaluate();
                         final IsisSystem isft = IsisSystem.get();
                         isft.getService(HeadlessTransactionSupport.class).endTransaction();
-                    } catch(final Throwable e) {
-                        // determine if underlying cause is an applib-defined exception,
-                        final RecoverableException recoverableException =
-                                determineIfRecoverableException(e);
-                        final NonRecoverableException nonRecoverableException =
-                                determineIfNonRecoverableException(e);
-
-                        if(recoverableException != null) {
-                            try {
-                                final IsisSystem isft = IsisSystem.get();
-                                isft.getService(TransactionService.class).flushTransaction(); // don't care if npe
-                                isft.getService(IsisJdoSupport.class).getJdoPersistenceManager().flush();
-                            } catch (Exception ignore) {
-                                // ignore
-                            }
-                        }
-                        // attempt to close this
-                        try {
-                            final IsisSystem isft = IsisSystem.getElseNull();
-                            isft.closeSession(); // don't care if npe
-                        } catch(Exception ignore) {
-                            // ignore
-                        }
-
-                        // attempt to start another
-                        try {
-                            final IsisSystem isft = IsisSystem.getElseNull();
-                            isft.openSession(); // don't care if npe
-                        } catch(Exception ignore) {
-                            // ignore
-                        }
-
-
-                        // if underlying cause is an applib-defined, then
-                        // throw that rather than Isis' wrapper exception
-                        if(recoverableException != null) {
-                            throw recoverableException;
-                        }
-                        if(nonRecoverableException != null) {
-                            throw nonRecoverableException;
-                        }
-
-                        // report on the error that caused
-                        // a problem for *this* test
-                        throw e;
-                    }
-                }
-
-                NonRecoverableException determineIfNonRecoverableException(final Throwable e) {
-                    NonRecoverableException nonRecoverableException = null;
-                    final List<Throwable> causalChain2 = _Exceptions.getCausalChain(e);
-                    for (final Throwable cause : causalChain2) {
-                        if(cause instanceof NonRecoverableException) {
-                            nonRecoverableException = (NonRecoverableException) cause;
-                            break;
-                        }
+                    } catch(final Exception e) {
+                    	Util.handleTransactionContextException(e);
                     }
-                    return nonRecoverableException;
                 }
 
-                RecoverableException determineIfRecoverableException(final Throwable e) {
-                    RecoverableException recoverableException = null;
-                    final List<Throwable> causalChain = _Exceptions.getCausalChain(e);
-                    for (final Throwable cause : causalChain) {
-                        if(cause instanceof RecoverableException) {
-                            recoverableException = (RecoverableException) cause;
-                            break;
-                        }
-                    }
-                    return recoverableException;
-                }
             };
         }
     }
 
-
     protected IntegrationTestAbstract3(final Module module) {
         this(new LogConfig(Level.INFO), module);
     }
@@ -156,16 +81,9 @@ public abstract class IntegrationTestAbstract3 extends HeadlessWithBootstrapping
     protected IntegrationTestAbstract3(
             final LogConfig logConfig,
             final Module module) {
-        super(logConfig, addHeadlessTransactionSupport(module));
+        super(logConfig, Util.addHeadlessTransactionSupport(module));
     }
 
-    //[ahuber] hooks into the bootstrapping, such that the 
-    // DefaultHeadlessTransactionSupport is registered as an additional service
-    private static Module addHeadlessTransactionSupport(Module module) {
-    	module.getAdditionalServices().add(DefaultHeadlessTransactionSupport.class);
-		return module;
-	}
-
 	@Override
     @Before
     public void bootstrapAndSetupIfRequired() {
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestJupiter.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestJupiter.java
new file mode 100644
index 0000000..34314d4
--- /dev/null
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IntegrationTestJupiter.java
@@ -0,0 +1,96 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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 org.apache.isis.core.integtestsupport;
+
+import org.apache.isis.applib.AppManifest;
+import org.apache.isis.applib.Module;
+import org.apache.isis.core.runtime.headless.HeadlessTransactionSupport;
+import org.apache.isis.core.runtime.headless.HeadlessWithBootstrappingAbstract;
+import org.apache.isis.core.runtime.headless.IsisSystem;
+import org.apache.isis.core.runtime.headless.logging.LogConfig;
+import org.junit.jupiter.api.extension.AfterEachCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.slf4j.event.Level;
+
+/**
+ * Base class for integration tests for the JUnit 5 Jupiter Engine, 
+ * uses a {@link Module} to bootstrap, rather than an {@link AppManifest}.
+ * 
+ * @since 2.0.0
+ */
+@ExtendWith(IntegrationTestJupiter.HeadlessTransactionRule.class)
+public abstract class IntegrationTestJupiter extends HeadlessWithBootstrappingAbstract {
+
+	private static class HeadlessTransactionRule implements AfterEachCallback, BeforeEachCallback {
+
+		@Override
+		public void beforeEach(ExtensionContext context) throws Exception {
+			final IntegrationTestJupiter testInstance = testInstance(context);
+			testInstance.bootstrapAndSetupIfRequired();
+		}
+
+		@Override
+		public void afterEach(ExtensionContext context) throws Exception {
+
+			try {
+				final IsisSystem isft = IsisSystem.get();
+				isft.getService(HeadlessTransactionSupport.class).endTransaction();
+			} catch(final Exception e) {
+				Util.handleTransactionContextException(e);
+			} finally {
+				final IntegrationTestJupiter testInstance = testInstance(context);
+				testInstance.tearDownAllModules();
+			}
+		}
+
+		// -- HELPER
+		private IntegrationTestJupiter testInstance(ExtensionContext context) {
+			final IntegrationTestJupiter testInstance = (IntegrationTestJupiter) context.getTestInstance().get();
+			return testInstance;
+		}
+
+	}
+
+	protected IntegrationTestJupiter(final Module module) {
+		this(new LogConfig(Level.INFO), module);
+	}
+
+	protected IntegrationTestJupiter(
+			final LogConfig logConfig,
+			final Module module) {
+		super(logConfig, Util.addHeadlessTransactionSupport(module));
+	}
+
+	@Override
+	protected void bootstrapAndSetupIfRequired() {
+
+		super.bootstrapAndSetupIfRequired();
+
+		log("### TEST: " + this.getClass().getCanonicalName());
+	}
+
+	@Override
+	protected void tearDownAllModules() {
+
+		super.tearDownAllModules();
+	}
+
+}
\ No newline at end of file
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/Util.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/Util.java
new file mode 100644
index 0000000..9c28bfe
--- /dev/null
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/Util.java
@@ -0,0 +1,116 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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 org.apache.isis.core.integtestsupport;
+
+import java.util.List;
+
+import org.apache.isis.applib.Module;
+import org.apache.isis.applib.NonRecoverableException;
+import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.integtestsupport.components.DefaultHeadlessTransactionSupport;
+import org.apache.isis.core.runtime.headless.IsisSystem;
+
+class Util {
+	
+	//[ahuber] hooks into the bootstrapping, such that the 
+    // DefaultHeadlessTransactionSupport is registered as an additional service
+	public static Module addHeadlessTransactionSupport(Module module) {
+    	module.getAdditionalServices().add(DefaultHeadlessTransactionSupport.class);
+		return module;
+	}
+
+	public static void handleTransactionContextException(Exception e) throws Exception {
+		// determine if underlying cause is an applib-defined exception,
+        final RecoverableException recoverableException =
+                determineIfRecoverableException(e);
+        final NonRecoverableException nonRecoverableException =
+                determineIfNonRecoverableException(e);
+
+        if(recoverableException != null) {
+            try {
+                final IsisSystem isft = IsisSystem.get();
+                isft.getService(TransactionService.class).flushTransaction(); // don't care if npe
+                isft.getService(IsisJdoSupport.class).getJdoPersistenceManager().flush();
+            } catch (Exception ignore) {
+                // ignore
+            }
+        }
+        // attempt to close this
+        try {
+            final IsisSystem isft = IsisSystem.getElseNull();
+            isft.closeSession(); // don't care if npe
+        } catch(Exception ignore) {
+            // ignore
+        }
+
+        // attempt to start another
+        try {
+            final IsisSystem isft = IsisSystem.getElseNull();
+            isft.openSession(); // don't care if npe
+        } catch(Exception ignore) {
+            // ignore
+        }
+
+
+        // if underlying cause is an applib-defined, then
+        // throw that rather than Isis' wrapper exception
+        if(recoverableException != null) {
+            throw recoverableException;
+        }
+        if(nonRecoverableException != null) {
+            throw nonRecoverableException;
+        }
+
+        // report on the error that caused
+        // a problem for *this* test
+        throw e;
+	}
+
+	 private static NonRecoverableException determineIfNonRecoverableException(final Exception e) {
+         NonRecoverableException nonRecoverableException = null;
+         final List<Throwable> causalChain2 = _Exceptions.getCausalChain(e);
+         for (final Throwable cause : causalChain2) {
+             if(cause instanceof NonRecoverableException) {
+                 nonRecoverableException = (NonRecoverableException) cause;
+                 break;
+             }
+         }
+         return nonRecoverableException;
+     }
+
+     private static RecoverableException determineIfRecoverableException(final Exception e) {
+         RecoverableException recoverableException = null;
+         final List<Throwable> causalChain = _Exceptions.getCausalChain(e);
+         for (final Throwable cause : causalChain) {
+             if(cause instanceof RecoverableException) {
+                 recoverableException = (RecoverableException) cause;
+                 break;
+             }
+         }
+         return recoverableException;
+     }
+
+
+	
+	
+}

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.