Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions extensions/arc/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,24 +38,28 @@
<artifactId>arc-processor</artifactId>
</dependency>

<!--
- The following 2 dependencies must NOT be test-scoped, because test-scoped dependencies
- are always loaded by the Runtime CL (not by Base Runtime CL) and so are considered
- application archives. All tests using them require a NON-application archive.
-->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5-internal</artifactId>
<scope>test</scope>
<artifactId>quarkus-arc-test-supplement</artifactId>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc-test-supplement-decorator</artifactId>
</dependency>

<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc-test-supplement</artifactId>
<artifactId>quarkus-junit5-internal</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc-test-supplement-decorator</artifactId>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<!-- Used to test wrong @Singleton detection -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ public void test() {
assertTrue(MySyntheticBeanDisposer.disposed);
}

@Test
public void testNonAppArchive() {
assertTrue(SomeClassInExternalLibrary.class.getClassLoader().getName().contains("Quarkus Base Runtime ClassLoader"));
}

@ApplicationScoped
public static class MyBean {
@Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ public void test() {
assertTrue(MySyntheticObserver.notified);
}

@Test
public void testNonAppArchive() {
assertTrue(SomeClassInExternalLibrary.class.getClassLoader().getName().contains("Quarkus Base Runtime ClassLoader"));
}

@ApplicationScoped
public static class MyBean {
@Inject
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.quarkus.arc.test.decorator;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.List;

Expand All @@ -10,6 +11,7 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.arc.test.supplement.decorator.SomeDecorator;
import io.quarkus.arc.test.supplement.decorator.SomeInterface;
import io.quarkus.builder.Version;
import io.quarkus.maven.dependency.Dependency;
Expand All @@ -35,6 +37,11 @@ public void test() {
assertEquals("Delegated: SomeBean", bean.ping());
}

@Test
public void testNonAppArchive() {
assertTrue(SomeDecorator.class.getClassLoader().getName().contains("Quarkus Base Runtime ClassLoader"));
}

@Dependent
public static class SomeBean implements SomeInterface {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
package io.quarkus.arc.test.decorator;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.List;

import jakarta.decorator.Decorator;
import jakarta.decorator.Delegate;
import jakarta.enterprise.event.Event;
import jakarta.enterprise.inject.Instance;
import jakarta.inject.Inject;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.arc.ClientProxy;
import io.quarkus.arc.test.supplement.ConsumerOfSomeBeanInExternalLibrary;
import io.quarkus.arc.test.supplement.ConsumerOfSomeDepBeanInExternalLibrary;
import io.quarkus.arc.test.supplement.SomeBeanInExternalLibrary;
import io.quarkus.arc.test.supplement.SomeDepBeanInExternalLibrary;
import io.quarkus.arc.test.supplement.SomeEventInExternalLibrary;
import io.quarkus.arc.test.supplement.SomeInterfaceInExternalLibrary;
import io.quarkus.arc.test.supplement.SomeProducedDependencyInExternalLibrary;
import io.quarkus.builder.Version;
import io.quarkus.maven.dependency.Dependency;
import io.quarkus.test.QuarkusUnitTest;
Expand All @@ -30,9 +40,111 @@ public class DecoratorOfExternalBeanTest {
@Inject
SomeBeanInExternalLibrary bean;

@Inject
ConsumerOfSomeBeanInExternalLibrary consumer;

@Inject
SomeDepBeanInExternalLibrary depBean;

@Inject
ConsumerOfSomeDepBeanInExternalLibrary depConsumer;

@Inject
Event<SomeEventInExternalLibrary> event;

@Inject
Instance<SomeProducedDependencyInExternalLibrary> instance;

@Test
public void test() {
public void testNormalScope() {
assertEquals("Delegated: Hello", bean.hello());

assertFalse(SomeBeanInExternalLibrary.pinged);
assertFalse(SomeBeanInExternalLibrary.observed);
assertFalse(SomeBeanInExternalLibrary.produced);
assertFalse(SomeBeanInExternalLibrary.disposed);

assertEquals("pong", consumer.ping());

assertTrue(SomeBeanInExternalLibrary.pinged);
assertFalse(SomeBeanInExternalLibrary.observed);
assertFalse(SomeBeanInExternalLibrary.produced);
assertFalse(SomeBeanInExternalLibrary.disposed);

event.fire(new SomeEventInExternalLibrary());

assertTrue(SomeBeanInExternalLibrary.pinged);
assertTrue(SomeBeanInExternalLibrary.observed);
assertFalse(SomeBeanInExternalLibrary.produced);
assertFalse(SomeBeanInExternalLibrary.disposed);

SomeProducedDependencyInExternalLibrary dependency = instance.get();

assertTrue(SomeBeanInExternalLibrary.pinged);
assertTrue(SomeBeanInExternalLibrary.observed);
assertTrue(SomeBeanInExternalLibrary.produced);
assertFalse(SomeBeanInExternalLibrary.disposed);

assertEquals("Produced: Hello", dependency.hello());

assertTrue(SomeBeanInExternalLibrary.pinged);
assertTrue(SomeBeanInExternalLibrary.observed);
assertTrue(SomeBeanInExternalLibrary.produced);
assertFalse(SomeBeanInExternalLibrary.disposed);

instance.destroy(dependency);

assertTrue(SomeBeanInExternalLibrary.pinged);
assertTrue(SomeBeanInExternalLibrary.observed);
assertTrue(SomeBeanInExternalLibrary.produced);
assertTrue(SomeBeanInExternalLibrary.disposed);
}

@Test
public void testPseudoScope() {
assertEquals("Delegated: DepHello", depBean.hello());

assertFalse(SomeDepBeanInExternalLibrary.pinged);

assertEquals("pong", depConsumer.ping());

assertTrue(SomeDepBeanInExternalLibrary.pinged);
}

@Test
public void testNonAppArchive() {
assertTrue(SomeInterfaceInExternalLibrary.class.getClassLoader().getName()
.contains("Quarkus Base Runtime ClassLoader"));
assertTrue(SomeBeanInExternalLibrary.class.getClassLoader().getName()
.contains("Quarkus Base Runtime ClassLoader"));
assertTrue(ConsumerOfSomeBeanInExternalLibrary.class.getClassLoader().getName()
.contains("Quarkus Base Runtime ClassLoader"));
assertTrue(SomeDepBeanInExternalLibrary.class.getClassLoader().getName()
.contains("Quarkus Base Runtime ClassLoader"));
assertTrue(ConsumerOfSomeDepBeanInExternalLibrary.class.getClassLoader().getName()
.contains("Quarkus Base Runtime ClassLoader"));
assertTrue(SomeEventInExternalLibrary.class.getClassLoader().getName()
.contains("Quarkus Base Runtime ClassLoader"));
assertTrue(SomeProducedDependencyInExternalLibrary.class.getClassLoader().getName()
.contains("Quarkus Base Runtime ClassLoader"));

// client proxies are non-app
assertTrue(bean.getClass().getSimpleName().endsWith("_ClientProxy"));
assertTrue(bean.getClass().getClassLoader().getName().contains("Quarkus Base Runtime ClassLoader"));
assertTrue(consumer.getClass().getSimpleName().endsWith("_ClientProxy"));
assertTrue(consumer.getClass().getClassLoader().getName().contains("Quarkus Base Runtime ClassLoader"));
}

@Test
public void testAppArchive() {
assertTrue(MyDecorator.class.getClassLoader().getName().contains("Quarkus Runtime ClassLoader"));

// decoration subclasses are app
SomeBeanInExternalLibrary unwrappedBean = ClientProxy.unwrap(bean);
assertTrue(unwrappedBean.getClass().getSimpleName().endsWith("_Subclass"));
assertTrue(unwrappedBean.getClass().getClassLoader().getName().contains("Quarkus Runtime ClassLoader"));
assertTrue(depBean.getClass().getSimpleName().endsWith("_Subclass"));
assertTrue(depBean.getClass().getClassLoader().getName().contains("Quarkus Runtime ClassLoader"));
}

@Decorator
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.quarkus.arc.test.supplement;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

@ApplicationScoped
public class ConsumerOfSomeBeanInExternalLibrary {
@Inject
SomeBeanInExternalLibrary bean;

public String ping() {
return bean.ping();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.quarkus.arc.test.supplement;

import jakarta.enterprise.context.Dependent;
import jakarta.inject.Inject;

@Dependent
public class ConsumerOfSomeDepBeanInExternalLibrary {
@Inject
SomeDepBeanInExternalLibrary bean;

public String ping() {
return bean.ping();
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,47 @@
package io.quarkus.arc.test.supplement;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.Dependent;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.Disposes;
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Inject;

@Dependent
@ApplicationScoped
public class SomeBeanInExternalLibrary implements SomeInterfaceInExternalLibrary {
public static boolean pinged;
public static boolean observed;
public static boolean produced;
public static boolean disposed;

@Inject
SomeDependencyInExternalLibrary dependency;

@Override
public String hello() {
return "Hello";
return dependency.hello();
}

// methods below are intentionally package-private to verify
// behavior in Quarkus dev mode (multiple classloaders)

String ping() {
pinged = true;
return "pong";
}

void init(@Observes SomeEventInExternalLibrary event) {
observed = true;
}

@Produces
@Dependent
SomeProducedDependencyInExternalLibrary produce(SomeDependencyInExternalLibrary dependency) {
produced = true;
return new SomeProducedDependencyInExternalLibrary(dependency);
}

void dispose(@Disposes SomeProducedDependencyInExternalLibrary dependency) {
disposed = true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.quarkus.arc.test.supplement;

import jakarta.enterprise.context.Dependent;

@Dependent
public class SomeDepBeanInExternalLibrary implements SomeInterfaceInExternalLibrary {
public static boolean pinged;

@Override
public String hello() {
return "DepHello";
}

// methods below are intentionally package-private to verify
// behavior in Quarkus dev mode (multiple classloaders)

String ping() {
pinged = true;
return "pong";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.quarkus.arc.test.supplement;

import jakarta.enterprise.context.Dependent;

@Dependent
public class SomeDependencyInExternalLibrary {
public String hello() {
return "Hello";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.quarkus.arc.test.supplement;

public class SomeEventInExternalLibrary {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.quarkus.arc.test.supplement;

public class SomeProducedDependencyInExternalLibrary {
private final SomeDependencyInExternalLibrary dependency;

public SomeProducedDependencyInExternalLibrary(SomeDependencyInExternalLibrary dependency) {
this.dependency = dependency;
}

public String hello() {
return "Produced: " + dependency.hello();
}
}
Loading
Loading