Skip to content

Commit

Permalink
Initial TCK tests for build compatible extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
Ladicek committed Nov 23, 2021
1 parent 1084ceb commit c61a532
Show file tree
Hide file tree
Showing 83 changed files with 1,619 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
package org.jboss.cdi.tck.shrinkwrap;

import jakarta.enterprise.inject.build.compatible.spi.BuildCompatibleExtension;
import jakarta.enterprise.inject.spi.Extension;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
Expand Down Expand Up @@ -210,6 +211,16 @@ public T withExtensions(Class<? extends Extension>... extensionClasses) {
return withServiceProvider(new ServiceProviderDescriptor(Extension.class, extensionClasses));
}

/**
* Add CDI build compatible extension. This method does not add the specified extension class to the archive.
*
* @param extensionClass
* @return self
*/
public T withBuildCompatibleExtension(Class<? extends BuildCompatibleExtension> extensionClass) {
return withServiceProvider(new ServiceProviderDescriptor(BuildCompatibleExtension.class, extensionClass));
}

/**
* Add service provider.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier;

import jakarta.enterprise.inject.build.compatible.spi.BuildCompatibleExtension;
import jakarta.enterprise.inject.build.compatible.spi.ClassConfig;
import jakarta.enterprise.inject.build.compatible.spi.Discovery;
import jakarta.enterprise.inject.build.compatible.spi.Enhancement;
import jakarta.enterprise.inject.build.compatible.spi.FieldConfig;
import jakarta.enterprise.inject.build.compatible.spi.ScannedClasses;

public class ChangeBeanQualifierExtension implements BuildCompatibleExtension {
@Discovery
public void discovery(ScannedClasses scan) {
scan.add("org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier.MyServiceFoo");
scan.add("org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier.MyServiceBar");
scan.add("org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier.MyServiceBaz");
}

@Enhancement(types = MyServiceFoo.class)
public void foo(ClassConfig clazz) {
clazz.removeAnnotation(ann -> ann.name().equals(MyQualifier.class.getName()));
}

@Enhancement(types = MyServiceBar.class)
public void bar(ClassConfig clazz) {
clazz.addAnnotation(MyQualifier.class);
}

@Enhancement(types = MyOtherService.class)
public void service(FieldConfig field) {
if ("myService".equals(field.info().name())) {
field.addAnnotation(MyQualifier.class);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.cdi.tck.AbstractTest;
import org.jboss.cdi.tck.shrinkwrap.WebArchiveBuilder;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.test.audit.annotations.SpecVersion;
import org.testng.annotations.Test;

import static org.testng.Assert.assertTrue;

@SpecVersion(spec = "cdi", version = "4.0")
public class ChangeBeanQualifierTest extends AbstractTest {
@Deployment
public static WebArchive createTestArchive() {
// no beans.xml + an extension = not a bean archive, bean classes are added through the extension
return new WebArchiveBuilder()
.withTestClassPackage(ChangeBeanQualifierTest.class)
.withBuildCompatibleExtension(ChangeBeanQualifierExtension.class)
.build();
}

@Test
//@SpecAssertion(section = TODO, id = "TODO")
public void test() {
MyOtherService bean = getContextualReference(MyOtherService.class);
// all beans are dependent, so there's no client proxy and direct field access and `instanceof` are OK
assertTrue(bean.myService instanceof MyServiceBar);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier;

import jakarta.enterprise.context.Dependent;
import org.jboss.arquillian.core.api.annotation.Inject;

@Dependent
public class MyOtherService {
@Inject
MyService myService;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier;

import jakarta.inject.Qualifier;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface MyQualifier {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier;

public interface MyService {
String hello();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier;

import jakarta.enterprise.context.Dependent;

@Dependent
public class MyServiceBar implements MyService {
private static final String VALUE = "bar";

@Override
public String hello() {
return VALUE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier;

import jakarta.enterprise.context.Dependent;

@Dependent
public class MyServiceBaz implements MyService {
@Override
public String hello() {
throw new UnsupportedOperationException();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeBeanQualifier;

import jakarta.enterprise.context.Dependent;

@Dependent
@MyQualifier
public class MyServiceFoo implements MyService {
private final String value = "foo";

@Override
public String hello() {
return value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInjectionPoint;

import jakarta.enterprise.inject.build.compatible.spi.AnnotationBuilder;
import jakarta.enterprise.inject.build.compatible.spi.BuildCompatibleExtension;
import jakarta.enterprise.inject.build.compatible.spi.ClassConfig;
import jakarta.enterprise.inject.build.compatible.spi.Enhancement;

public class ChangeInjectionPointExtension implements BuildCompatibleExtension {
@Enhancement(types = MyOtherService.class)
public void service(ClassConfig clazz) {
clazz.fields()
.stream()
.filter(it -> "myService".equals(it.info().name()))
.forEach(field -> field.addAnnotation(AnnotationBuilder.of(MyQualifier.class).build()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInjectionPoint;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.cdi.tck.AbstractTest;
import org.jboss.cdi.tck.shrinkwrap.WebArchiveBuilder;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.test.audit.annotations.SpecVersion;
import org.testng.annotations.Test;

import static org.testng.Assert.assertTrue;

@SpecVersion(spec = "cdi", version = "4.0")
public class ChangeInjectionPointTest extends AbstractTest {
@Deployment
public static WebArchive createTestArchive() {
// no beans.xml + an extension = not a bean archive, bean classes are added through the extension
return new WebArchiveBuilder()
.withTestClassPackage(ChangeInjectionPointTest.class)
.withBuildCompatibleExtension(ChangeInjectionPointExtension.class)
.build();
}

@Test
//@SpecAssertion(section = TODO, id = "TODO")
public void test() {
MyOtherService bean = getContextualReference(MyOtherService.class);
// all beans are dependent, so there's no client proxy and direct field access and `instanceof` are OK
assertTrue(bean.myService instanceof MyServiceBar);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInjectionPoint;

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

@Dependent
public class MyOtherService {
@Inject
MyService myService;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInjectionPoint;

import jakarta.inject.Qualifier;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface MyQualifier {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInjectionPoint;

public interface MyService {
String hello();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInjectionPoint;

import jakarta.enterprise.context.Dependent;

@Dependent
@MyQualifier
public class MyServiceBar implements MyService {
@Override
public String hello() {
return "bar";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInjectionPoint;

import jakarta.enterprise.context.Dependent;

@Dependent
public class MyServiceFoo implements MyService {
@Override
public String hello() {
return "foo";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeObserverQualifier;

import jakarta.enterprise.inject.build.compatible.spi.BuildCompatibleExtension;
import jakarta.enterprise.inject.build.compatible.spi.Discovery;
import jakarta.enterprise.inject.build.compatible.spi.Enhancement;
import jakarta.enterprise.inject.build.compatible.spi.MethodConfig;
import jakarta.enterprise.inject.build.compatible.spi.ScannedClasses;

public class ChangeObserverQualifierExtension implements BuildCompatibleExtension {
@Discovery
public void discovery(ScannedClasses scan) {
scan.add("org.jboss.cdi.tck.tests.build.compatible.extensions.changeObserverQualifier.MyConsumer");
scan.add("org.jboss.cdi.tck.tests.build.compatible.extensions.changeObserverQualifier.MyProducer");
}

@Enhancement(types = MyConsumer.class)
public void consumer(MethodConfig method) {
switch (method.info().name()) {
case "consume":
method.parameters().get(0).addAnnotation(MyQualifier.class);
break;
case "noConsume":
method.parameters().get(0).removeAllAnnotations();
break;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeObserverQualifier;

import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.cdi.tck.AbstractTest;
import org.jboss.cdi.tck.shrinkwrap.WebArchiveBuilder;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.test.audit.annotations.SpecVersion;
import org.testng.annotations.Test;

import java.util.Set;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;

@SpecVersion(spec = "cdi", version = "4.0")
public class ChangeObserverQualifierTest extends AbstractTest {
@Deployment
public static WebArchive createTestArchive() {
// no beans.xml + an extension = not a bean archive, bean classes are added through the extension
return new WebArchiveBuilder()
.withTestClassPackage(ChangeObserverQualifierTest.class)
.withBuildCompatibleExtension(ChangeObserverQualifierExtension.class)
.build();
}

@Test
//@SpecAssertion(section = TODO, id = "TODO")
public void test() {
MyProducer producer = getContextualReference(MyProducer.class);
producer.produce();

assertEquals(MyConsumer.events, Set.of("qualified"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeObserverQualifier;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;

import java.util.HashSet;
import java.util.Set;

@ApplicationScoped
public class MyConsumer {
static final Set<String> events = new HashSet<>();

void consume(@Observes MyEvent event) {
events.add(event.payload);
}

void noConsume(@Observes MyEvent event) {
events.add("must-not-happen-" + event.payload);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeObserverQualifier;

public class MyEvent {
final String payload;

public MyEvent(String payload) {
this.payload = payload;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeObserverQualifier;

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

@ApplicationScoped
public class MyProducer {
@Inject
Event<MyEvent> unqualified;

@Inject
@MyQualifier
Event<MyEvent> qualified;

void produce() {
unqualified.fire(new MyEvent("unqualified"));
qualified.fire(new MyEvent("qualified"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.jboss.cdi.tck.tests.build.compatible.extensions.changeObserverQualifier;

import jakarta.inject.Qualifier;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface MyQualifier {
}
Loading

0 comments on commit c61a532

Please sign in to comment.