diff --git a/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/FileWriterExtension.java b/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/FileWriterExtension.java
new file mode 100644
index 000000000..9640fa7d7
--- /dev/null
+++ b/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/FileWriterExtension.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2021 JBoss by Red Hat.
+ *
+ * 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 org.jboss.arquillian.integration.test.lifecycle;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+/**
+ *
+ * @author lprimak
+ */
+public class FileWriterExtension implements BeforeAllCallback, ExtensionContext.Store.CloseableResource {
+ private static Path TMP_FILE_PATH;
+ static final String TMP_FILE_ASSET_NAME = "temporaryFileAsset";
+
+ enum RunsWhere {
+ CLIENT,
+ SERVER,
+ }
+
+ @Override
+ public void beforeAll(ExtensionContext extensionContext) throws Exception {
+ if (!isRunningOnServer()) {
+ Path tempDir = Files.createTempDirectory("arquillianLifecycleTest");
+ initTmpFileName(tempDir);
+ assertTrue(tempDir.toFile().delete(), "Cleanup Failed");
+ createTmpFile();
+ }
+ extensionContext.getRoot().getStore(ExtensionContext.Namespace.GLOBAL).put(this.getClass().getName(), this);
+ }
+
+ @Override
+ public void close() throws Throwable {
+ if (isRunningOnServer()) {
+ return;
+ }
+ String contents;
+ try (FileReader fileReader = new FileReader(getTmpFilePath().toFile())) {
+ char[] buf = new char[1000];
+ int length = fileReader.read(buf);
+ contents = new String(buf, 0, length - 1);
+ }
+ Path tempDir = getTmpFilePath().getParent();
+ Files.walk(tempDir).map(Path::toFile).forEach(File::delete);
+ assertTrue(tempDir.toFile().delete(), "Cleanup Failed");
+ assertEquals("before_all,before_each,test_one,after_each,before_each,test_two,after_each,after_all", contents);
+ }
+
+ static void initTmpFileName(Path tmpDirBase) {
+ TMP_FILE_PATH = tmpDirBase.getParent().resolve(
+ tmpDirBase.getFileName() + "-arquillianLifecycleTest")
+ .resolve("lifecycleOutput");
+ }
+
+ void createTmpFile() throws IOException {
+ TMP_FILE_PATH.getParent().toFile().mkdir();
+ File tmpFile = TMP_FILE_PATH.toFile();
+ tmpFile.delete();
+ assertTrue(tmpFile.createNewFile(), "cannot create results file");
+ }
+
+ static Path getTmpFilePath() {
+ if (isRunningOnServer()) {
+ try (InputStream istrm = Thread.currentThread().getContextClassLoader()
+ .getResourceAsStream(TMP_FILE_ASSET_NAME)) {
+ return Paths.get(new BufferedReader(new InputStreamReader(istrm)).readLine());
+ } catch (IOException ioe) {
+ throw new RuntimeException(ioe);
+ }
+ } else {
+ return TMP_FILE_PATH;
+ }
+ }
+
+ static void appendToFile(String str) {
+ try (FileWriter fw = new FileWriter(getTmpFilePath().toFile(), true)) {
+ fw.append(str + ",");
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ static void checkRunsWhere(RunsWhere expected) {
+ assertEquals(expected, isRunningOnServer() ? RunsWhere.SERVER : RunsWhere.CLIENT);
+ }
+
+ static boolean isRunningOnServer() {
+ try {
+ new InitialContext().lookup("java:comp/env");
+ return true;
+ } catch (NamingException ex) {
+ return false;
+ }
+ }
+}
diff --git a/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/Greeter.java b/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/Greeter.java
new file mode 100644
index 000000000..98e4816b1
--- /dev/null
+++ b/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/Greeter.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2021 JBoss by Red Hat.
+ *
+ * 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 org.jboss.arquillian.integration.test.lifecycle;
+
+import jakarta.enterprise.context.Dependent;
+import java.io.PrintStream;
+
+/**
+ *
+ * @author lprimak
+ */
+@Dependent
+public class Greeter {
+ public void greet(PrintStream to, String name) {
+ to.println(createGreeting(name));
+ }
+
+ public String createGreeting(String name) {
+ return "Hello, " + name + "!";
+ }
+}
diff --git a/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/LifecycleMethodsTest.java b/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/LifecycleMethodsTest.java
new file mode 100644
index 000000000..f9d28fe97
--- /dev/null
+++ b/integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/lifecycle/LifecycleMethodsTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2021 JBoss by Red Hat.
+ *
+ * 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 org.jboss.arquillian.integration.test.lifecycle;
+
+import jakarta.inject.Inject;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit5.ArquillianExtension;
+import static org.jboss.arquillian.integration.test.lifecycle.FileWriterExtension.RunsWhere.CLIENT;
+import static org.jboss.arquillian.integration.test.lifecycle.FileWriterExtension.RunsWhere.SERVER;
+import static org.jboss.arquillian.integration.test.lifecycle.FileWriterExtension.TMP_FILE_ASSET_NAME;
+import static org.jboss.arquillian.integration.test.lifecycle.FileWriterExtension.appendToFile;
+import static org.jboss.arquillian.integration.test.lifecycle.FileWriterExtension.checkRunsWhere;
+import static org.jboss.arquillian.integration.test.lifecycle.FileWriterExtension.getTmpFilePath;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+/**
+ *
+ * @author lprimak
+ */
+@ExtendWith(FileWriterExtension.class)
+@ExtendWith(ArquillianExtension.class)
+public class LifecycleMethodsTest {
+ @Inject
+ Greeter greeter;
+
+ @Test
+ @Order(1)
+ void one() {
+ assertEquals("one", "one");
+ appendToFile("test_one");
+ checkRunsWhere(SERVER);
+ }
+
+ @Test
+ @Order(2)
+ void should_create_greeting() {
+ assertEquals("Hello, Earthling!", greeter.createGreeting("Earthling"));
+ greeter.greet(System.out, "Earthling");
+ appendToFile("test_two");
+ checkRunsWhere(SERVER);
+ }
+
+ @BeforeAll
+ static void beforeAll() {
+ appendToFile("before_all");
+ checkRunsWhere(CLIENT);
+ }
+
+ @BeforeEach
+ void beforeEach() {
+ appendToFile("before_each");
+ checkRunsWhere(SERVER);
+ }
+
+ @AfterEach
+ void afterEeach() {
+ appendToFile("after_each");
+ checkRunsWhere(SERVER);
+ }
+
+ @AfterAll
+ static void afterAll() {
+ appendToFile("after_all");
+ checkRunsWhere(CLIENT);
+ }
+
+
+ @Deployment
+ static JavaArchive createDeployment() {
+ JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
+ .addClass(FileWriterExtension.class)
+ .addClass(Greeter.class)
+ .addAsResource(new StringAsset(getTmpFilePath().toString()), TMP_FILE_ASSET_NAME);
+ return jar;
+ }
+}
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 01fa508ca..1366e1281 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -108,6 +108,19 @@
+
+ lifecycle-tests
+
+ test
+
+ test
+
+ ${skipTests}
+
+ org.jboss.arquillian.integration.test.lifecycle.*Test
+
+
+
manual-mode-tests