Skip to content

Commit 9e1c0b6

Browse files
authored
Merge branch 'main' into dependabot/maven/org.slf4j-slf4j-simple-2.0.16
2 parents 9eda95e + ff8a556 commit 9e1c0b6

File tree

12 files changed

+370
-16
lines changed

12 files changed

+370
-16
lines changed

integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/resource/injection/AbstractArquillianResourceTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
3232
import org.jboss.shrinkwrap.api.spec.WebArchive;
3333
import org.junit.jupiter.api.Assertions;
34-
import org.junit.jupiter.api.Disabled;
3534
import org.junit.jupiter.api.Test;
3635
import org.junit.jupiter.api.extension.ExtendWith;
3736

@@ -65,7 +64,6 @@ public void checkUrl() {
6564
}
6665

6766
@Test
68-
@Disabled("https://github.com/arquillian/arquillian-core/issues/312")
6967
public void checkParameterUrl(@ArquillianResource final URL url) {
7068
Assertions.assertNotNull(url, "The URL should have been injected");
7169
Assertions.assertEquals(TestEnvironment.protocol(), url.getProtocol());
@@ -83,7 +81,6 @@ public void checkUri() {
8381
}
8482

8583
@Test
86-
@Disabled("https://github.com/arquillian/arquillian-core/issues/312")
8784
public void checkParameterUri(@ArquillianResource final URI uri) {
8885
Assertions.assertNotNull(uri, "The URI should have been injected");
8986
checkHost(uri.getHost());

integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/resource/injection/ClientArquillianResourceTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,29 @@
1919

2020
package org.jboss.arquillian.integration.test.resource.injection;
2121

22+
import java.net.URL;
23+
import java.nio.file.Path;
24+
2225
import org.jboss.arquillian.container.test.api.RunAsClient;
26+
import org.jboss.arquillian.integration.test.common.TestEnvironment;
27+
import org.jboss.arquillian.test.api.ArquillianResource;
28+
import org.junit.jupiter.api.Assertions;
29+
import org.junit.jupiter.api.Test;
30+
import org.junit.jupiter.api.io.TempDir;
2331

2432
/**
2533
* @author <a href="mailto:[email protected]">James R. Perkins</a>
2634
*/
2735
@RunAsClient
2836
public class ClientArquillianResourceTest extends AbstractArquillianResourceTest {
37+
38+
@Test
39+
public void checkMultipleParameters(@ArquillianResource final URL url, @TempDir final Path tempDir) {
40+
Assertions.assertNotNull(url, "The URL should have been injected");
41+
Assertions.assertEquals(TestEnvironment.protocol(), url.getProtocol());
42+
checkHost(url.getHost());
43+
Assertions.assertEquals(TestEnvironment.port(), url.getPort());
44+
Assertions.assertEquals("/" + DEPLOYMENT_NAME + "/", url.getPath());
45+
Assertions.assertNotNull(tempDir, "The temp dir should have been injected");
46+
}
2947
}

integration-tests/junit5-tests/src/test/java/org/jboss/arquillian/integration/test/resource/injection/InContainerArquillianResourceTest.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@
1919

2020
package org.jboss.arquillian.integration.test.resource.injection;
2121

22+
import java.net.URL;
23+
import java.nio.file.Path;
2224
import javax.naming.Context;
2325
import javax.naming.InitialContext;
2426

27+
import org.jboss.arquillian.integration.test.common.TestEnvironment;
2528
import org.jboss.arquillian.test.api.ArquillianResource;
2629
import org.junit.jupiter.api.Assertions;
27-
import org.junit.jupiter.api.Disabled;
2830
import org.junit.jupiter.api.Test;
31+
import org.junit.jupiter.api.condition.DisabledIfSystemProperty;
32+
import org.junit.jupiter.api.io.TempDir;
2933

3034
/**
3135
* @author <a href="mailto:[email protected]">James R. Perkins</a>
@@ -46,7 +50,7 @@ public void checkContext() throws Exception {
4650
}
4751

4852
@Test
49-
@Disabled("https://github.com/arquillian/arquillian-core/issues/312")
53+
@DisabledIfSystemProperty(named = "javax.naming.Context.parameter", matches = "skip")
5054
public void checkContextParameter(@ArquillianResource final Context context) throws Exception {
5155
Assertions.assertNotNull(context, "The Context should have been injected");
5256
final Object bm = context.lookup("java:comp/BeanManager");
@@ -61,10 +65,20 @@ public void checkInitialContext() throws Exception {
6165
}
6266

6367
@Test
64-
@Disabled("https://github.com/arquillian/arquillian-core/issues/312")
68+
@DisabledIfSystemProperty(named = "javax.naming.Context.parameter", matches = "skip")
6569
public void checkInitialContextParameter(@ArquillianResource final InitialContext initialContext) throws Exception {
6670
Assertions.assertNotNull(initialContext, "The InitialContext should have been injected");
6771
final Object bm = initialContext.lookup("java:comp/BeanManager");
6872
Assertions.assertNotNull(bm);
6973
}
74+
75+
@Test
76+
public void checkMultipleParameters(@ArquillianResource final URL url, @TempDir final Path tempDir) {
77+
Assertions.assertNotNull(url, "The URL should have been injected");
78+
Assertions.assertEquals(TestEnvironment.protocol(), url.getProtocol());
79+
checkHost(url.getHost());
80+
Assertions.assertEquals(TestEnvironment.port(), url.getPort());
81+
Assertions.assertEquals("/" + DEPLOYMENT_NAME + "/", url.getPath());
82+
Assertions.assertNotNull(tempDir, "The temp dir should have been injected");
83+
}
7084
}

integration-tests/pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@
257257
<groupId>fish.payara.arquillian</groupId>
258258
<artifactId>arquillian-payara-server-managed</artifactId>
259259
<version>${version.fish.payara.arquillian}</version>
260+
<scope>test</scope>
260261
</dependency>
261262
</dependencies>
262263

@@ -292,6 +293,7 @@
292293
<systemPropertyVariables>
293294
<payara.home>${payara.home}</payara.home>
294295
<arq.host>localhost</arq.host>
296+
<javax.naming.Context.parameter>skip</javax.naming.Context.parameter>
295297
</systemPropertyVariables>
296298
</configuration>
297299
</plugin>

junit5/container/src/main/java/org/jboss/arquillian/junit5/container/JUnitJupiterDeploymentAppender.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.jboss.arquillian.junit5.container;
22

33

4+
import org.jboss.arquillian.container.test.spi.RemoteLoadableExtension;
45
import org.jboss.arquillian.junit5.ArquillianExtension;
56
import org.jboss.arquillian.container.test.spi.TestRunner;
67
import org.jboss.arquillian.container.test.spi.client.deployment.CachedAuxilliaryArchiveAppender;
@@ -22,6 +23,8 @@ protected Archive<?> buildArchive() {
2223
.addAsServiceProvider(
2324
TestRunner.class,
2425
JUnitJupiterTestRunner.class)
25-
.addAsServiceProvider(TestEngine.class, JupiterTestEngine.class);
26+
.addAsServiceProvider(TestEngine.class, JupiterTestEngine.class)
27+
// The remote extension for in-container tests
28+
.addAsServiceProvider(RemoteLoadableExtension.class, JUnitJupiterRemoteExtension.class);
2629
}
2730
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* JBoss, Home of Professional Open Source.
3+
*
4+
* Copyright 2024 Red Hat, Inc., and individual contributors
5+
* as indicated by the @author tags.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
20+
package org.jboss.arquillian.junit5.container;
21+
22+
import org.jboss.arquillian.container.test.spi.RemoteLoadableExtension;
23+
import org.jboss.arquillian.core.spi.LoadableExtension;
24+
import org.jboss.arquillian.junit5.MethodParameterObserver;
25+
26+
/**
27+
* The remote extension for JUnit 5 in-container tests.
28+
*
29+
* @author <a href="mailto:[email protected]">James R. Perkins</a>
30+
*/
31+
public class JUnitJupiterRemoteExtension implements RemoteLoadableExtension {
32+
33+
@Override
34+
public void register(LoadableExtension.ExtensionBuilder builder) {
35+
builder.observer(MethodParameterObserver.class);
36+
}
37+
}

junit5/core/src/main/java/org/jboss/arquillian/junit5/ArquillianExtension.java

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@
99
import org.jboss.arquillian.test.spi.LifecycleMethodExecutor;
1010
import org.jboss.arquillian.test.spi.TestMethodExecutor;
1111
import org.jboss.arquillian.test.spi.TestResult;
12+
import org.jboss.arquillian.test.spi.TestRunnerAdaptor;
1213
import org.junit.jupiter.api.extension.AfterAllCallback;
1314
import org.junit.jupiter.api.extension.AfterEachCallback;
1415
import org.junit.jupiter.api.extension.BeforeAllCallback;
1516
import org.junit.jupiter.api.extension.BeforeEachCallback;
1617
import org.junit.jupiter.api.extension.ExtensionContext;
1718
import org.junit.jupiter.api.extension.InvocationInterceptor;
19+
import org.junit.jupiter.api.extension.ParameterContext;
20+
import org.junit.jupiter.api.extension.ParameterResolutionException;
21+
import org.junit.jupiter.api.extension.ParameterResolver;
1822
import org.junit.jupiter.api.extension.ReflectiveInvocationContext;
1923
import org.junit.jupiter.api.extension.TestExecutionExceptionHandler;
2024
import org.junit.platform.commons.JUnitException;
@@ -23,12 +27,13 @@
2327
import static org.jboss.arquillian.junit5.ContextStore.getContextStore;
2428
import static org.jboss.arquillian.junit5.JUnitJupiterTestClassLifecycleManager.getManager;
2529

26-
public class ArquillianExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, InvocationInterceptor, TestExecutionExceptionHandler {
30+
public class ArquillianExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, InvocationInterceptor, TestExecutionExceptionHandler, ParameterResolver {
2731
public static final String RUNNING_INSIDE_ARQUILLIAN = "insideArquillian";
2832

2933
private static final String CHAIN_EXCEPTION_MESSAGE_PREFIX = "Chain of InvocationInterceptors never called invocation";
3034

31-
private static final Predicate<ExtensionContext> IS_INSIDE_ARQUILLIAN = (context -> Boolean.parseBoolean(context.getConfigurationParameter(RUNNING_INSIDE_ARQUILLIAN).orElse("false")));
35+
private static final Predicate<ExtensionContext> IS_INSIDE_ARQUILLIAN = (context -> Boolean.parseBoolean(context.getConfigurationParameter(RUNNING_INSIDE_ARQUILLIAN)
36+
.orElse("false")));
3237

3338
@Override
3439
public void beforeAll(ExtensionContext context) throws Exception {
@@ -46,18 +51,31 @@ public void afterAll(ExtensionContext context) throws Exception {
4651

4752
@Override
4853
public void beforeEach(ExtensionContext context) throws Exception {
49-
getManager(context).getAdaptor().before(
50-
context.getRequiredTestInstance(),
51-
context.getRequiredTestMethod(),
52-
LifecycleMethodExecutor.NO_OP);
54+
// Get the adapter, test instance and method
55+
final TestRunnerAdaptor adapter = getManager(context)
56+
.getAdaptor();
57+
final Object instance = context.getRequiredTestInstance();
58+
final Method method = context.getRequiredTestMethod();
59+
// Create a new parameter holder
60+
final MethodParameters methodParameters = ContextStore.getContextStore(context).createMethodParameters();
61+
// Fired to set the MethodParameters on the producer
62+
adapter.fireCustomLifecycle(new MethodParameterProducerEvent(instance, method, methodParameters));
63+
adapter.before(
64+
instance,
65+
method,
66+
LifecycleMethodExecutor.NO_OP);
5367
}
5468

5569
@Override
5670
public void afterEach(ExtensionContext context) throws Exception {
57-
getManager(context).getAdaptor().after(
71+
try {
72+
getManager(context).getAdaptor().after(
5873
context.getRequiredTestInstance(),
5974
context.getRequiredTestMethod(),
6075
LifecycleMethodExecutor.NO_OP);
76+
} finally {
77+
ContextStore.getContextStore(context).removeMethodParameters();
78+
}
6179
}
6280

6381
@Override
@@ -190,4 +208,40 @@ private boolean isRunAsClient(ExtensionContext extensionContext) throws Exceptio
190208
manager.getAdaptor().fireCustomLifecycle(runModeEvent);
191209
return runModeEvent.isRunAsClient();
192210
}
211+
212+
@Override
213+
public boolean supportsParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext) throws ParameterResolutionException {
214+
try {
215+
// Get the parameter holder
216+
final MethodParameters holder = ContextStore.getContextStore(extensionContext).getMethodParameters();
217+
if (holder == null) {
218+
throw createParameterResolutionException(parameterContext, null);
219+
}
220+
return holder.get(parameterContext.getIndex()) != null;
221+
} catch (Exception e) {
222+
throw createParameterResolutionException(parameterContext, e);
223+
}
224+
}
225+
226+
@Override
227+
public Object resolveParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext) throws ParameterResolutionException {
228+
try {
229+
// Get the parameter holder
230+
final MethodParameters holder = ContextStore.getContextStore(extensionContext).getMethodParameters();
231+
if (holder == null) {
232+
throw createParameterResolutionException(parameterContext, null);
233+
}
234+
return holder.get(parameterContext.getIndex());
235+
} catch (Exception e) {
236+
throw createParameterResolutionException(parameterContext, e);
237+
}
238+
}
239+
240+
private static ParameterResolutionException createParameterResolutionException(final ParameterContext parameterContext, final Throwable cause) {
241+
final String msg = String.format("Failed to resolve parameter %s", parameterContext.getParameter().getName());
242+
if (cause == null) {
243+
return new ParameterResolutionException(msg);
244+
}
245+
return new ParameterResolutionException(msg, cause);
246+
}
193247
}

junit5/core/src/main/java/org/jboss/arquillian/junit5/ContextStore.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
package org.jboss.arquillian.junit5;
22

3-
import org.junit.jupiter.api.extension.ExtensionContext;
4-
53
import java.lang.reflect.InvocationTargetException;
64
import java.lang.reflect.Method;
75
import java.util.Optional;
86

7+
import org.junit.jupiter.api.extension.ExtensionContext;
8+
99
class ContextStore {
1010
private static final String NAMESPACE_KEY = "arquillianNamespace";
1111

1212
private static final String INTERCEPTED_TEMPLATE_NAMESPACE_KEY = "interceptedTestTemplates";
1313

1414
private static final String RESULT_NAMESPACE_KEY = "results";
1515

16+
private static final String PARAMETER_NAMESPACE_KEY = "methodParameters";
17+
1618
private final ExtensionContext context;
1719

1820
private ContextStore(ExtensionContext context) {
@@ -60,4 +62,34 @@ Optional<Throwable> getResult(String uniqueId) {
6062
final ExtensionContext.Store resultStore = getResultStore();
6163
return Optional.ofNullable(resultStore.getOrDefault(uniqueId, Throwable.class, null));
6264
}
65+
66+
/**
67+
* Creates a new method parameter holder and stores it in the current context.
68+
*
69+
* @return the method parameters holder
70+
*/
71+
MethodParameters createMethodParameters() {
72+
final MethodParameters methodParameters = new MethodParameters();
73+
context.getStore(ExtensionContext.Namespace.create(NAMESPACE_KEY, PARAMETER_NAMESPACE_KEY))
74+
.put(PARAMETER_NAMESPACE_KEY, methodParameters);
75+
return methodParameters;
76+
}
77+
78+
/**
79+
* Gets the method parameters holder.
80+
*
81+
* @return the method parameters holder or {@code null} if one was not created
82+
*/
83+
MethodParameters getMethodParameters() {
84+
return context.getStore(ExtensionContext.Namespace.create(NAMESPACE_KEY, PARAMETER_NAMESPACE_KEY))
85+
.get(PARAMETER_NAMESPACE_KEY, MethodParameters.class);
86+
}
87+
88+
/**
89+
* Removes the method parameters holder.
90+
*/
91+
void removeMethodParameters() {
92+
context.getStore(ExtensionContext.Namespace.create(NAMESPACE_KEY, PARAMETER_NAMESPACE_KEY))
93+
.remove(PARAMETER_NAMESPACE_KEY);
94+
}
6395
}

0 commit comments

Comments
 (0)