From 4d88eb0b69236716d7ad499552c20e1b3912b17a Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Sun, 12 Jan 2025 22:37:41 -0500 Subject: [PATCH 01/12] [test] allow list injection for tests (#761) * [test] allow list injection for tests now can do ```java @InjectTest class ListInject { @Inject List testSomei; @Test void test() { assertThat(testSomei).isNotEmpty(); } } ``` * also optional * Update MetaReader.java * remove if --- .../java/io/avaje/inject/test/MetaReader.java | 50 +++++++++++++------ .../org/example/coffee/list/ListInject.java | 22 ++++++++ 2 files changed, 58 insertions(+), 14 deletions(-) create mode 100644 inject-test/src/test/java/org/example/coffee/list/ListInject.java diff --git a/inject-test/src/main/java/io/avaje/inject/test/MetaReader.java b/inject-test/src/main/java/io/avaje/inject/test/MetaReader.java index 0d7a91b1d..ac02315c4 100644 --- a/inject-test/src/main/java/io/avaje/inject/test/MetaReader.java +++ b/inject-test/src/main/java/io/avaje/inject/test/MetaReader.java @@ -1,24 +1,27 @@ package io.avaje.inject.test; -import io.avaje.inject.BeanScope; -import io.avaje.inject.BeanScopeBuilder; -import jakarta.inject.Inject; -import jakarta.inject.Named; -import jakarta.inject.Qualifier; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.internal.configuration.plugins.Plugins; -import org.mockito.internal.util.reflection.GenericMaster; - import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.Optional; + +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.internal.configuration.plugins.Plugins; +import org.mockito.internal.util.reflection.GenericMaster; + +import io.avaje.inject.BeanScope; +import io.avaje.inject.BeanScopeBuilder; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.inject.Qualifier; final class MetaReader { @@ -349,9 +352,28 @@ Object get(Object instance) { } void setFromScope(BeanScope beanScope, Object testInstance) throws IllegalAccessException { - if (!valueAlreadyProvided) { - set(field, beanScope.get(type(), name), testInstance); + if (valueAlreadyProvided) { + return; + } + final var type = type(); + + if (type instanceof ParameterizedType) { + final var parameterizedType = (ParameterizedType) type; + final var rawType = parameterizedType.getRawType(); + final var typeArguments = parameterizedType.getActualTypeArguments(); + + if (rawType.equals(List.class)) { + set(field, beanScope.list(typeArguments[0]), testInstance); + return; + } + + if (rawType.equals(Optional.class)) { + set(field, beanScope.getOptional(typeArguments[0], name), testInstance); + return; + } } + + set(field, beanScope.get(type, name), testInstance); } void setFromPlugin(Object value, Object testInstance) throws IllegalAccessException { diff --git a/inject-test/src/test/java/org/example/coffee/list/ListInject.java b/inject-test/src/test/java/org/example/coffee/list/ListInject.java new file mode 100644 index 000000000..2f8ee96e4 --- /dev/null +++ b/inject-test/src/test/java/org/example/coffee/list/ListInject.java @@ -0,0 +1,22 @@ +package org.example.coffee.list; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import io.avaje.inject.test.InjectTest; +import jakarta.inject.Inject; + +@InjectTest +class ListInject { + + @Inject List testSomei; + + @Test + void test() { + + assertThat(testSomei).isNotEmpty(); + } +} From face168e3d630f35781dfb2f18bae1825ea732a1 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 13 Jan 2025 16:44:19 +1300 Subject: [PATCH 02/12] [test] Add test for @InjectTest Optional field injection --- .../src/test/java/org/example/coffee/list/ListInject.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/inject-test/src/test/java/org/example/coffee/list/ListInject.java b/inject-test/src/test/java/org/example/coffee/list/ListInject.java index 2f8ee96e4..ffa471f54 100644 --- a/inject-test/src/test/java/org/example/coffee/list/ListInject.java +++ b/inject-test/src/test/java/org/example/coffee/list/ListInject.java @@ -3,7 +3,10 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.List; +import java.util.Optional; +import jakarta.inject.Named; +import org.example.optional.Que; import org.junit.jupiter.api.Test; import io.avaje.inject.test.InjectTest; @@ -14,9 +17,11 @@ class ListInject { @Inject List testSomei; + @Inject @Named("frodo") Optional frodo; + @Test void test() { - assertThat(testSomei).isNotEmpty(); + assertThat(frodo).isNotEmpty(); } } From f9baeb00ceb3e2bb23982690dcef4609794264a9 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 13 Jan 2025 17:09:59 +1300 Subject: [PATCH 03/12] Failing test for ModuleOrdering that skips the extra test module(s) (#760) * Failing test for ModuleOrdering that skips the extra test module(s) Test components in src/test that are not annotated with @TestScope go into an extra module. This module is ignored/skipped by the compiled module ordering. A fix for this is desired. * Add ModuleOrdering.supportsExpected() such that we only use compiled module ordering when ... When it supports the modules that are being used. When it does not then fall back to the default ordering mechanism. * Opps, need to set factoryOrder variable there ... * [test] Add test injecting BeanScope into a test component --------- Co-authored-by: Josiah Noel <32279667+SentryMan@users.noreply.github.com> --- .../other/InjectTestOnlyComponentTest.java | 29 +++++++++++++++++++ .../org/example/myapp/other/WireOther2.java | 19 ++++++++++++ .../org/example/myapp/other/WireOther3.java | 18 ++++++++++++ .../inject/generator/SimpleOrderWriter.java | 12 +++++++- .../io/avaje/inject/DBeanScopeBuilder.java | 15 ++++------ .../io/avaje/inject/spi/ModuleOrdering.java | 16 +++++++--- 6 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 blackbox-test-inject/src/test/java/org/example/myapp/other/InjectTestOnlyComponentTest.java create mode 100644 blackbox-test-inject/src/test/java/org/example/myapp/other/WireOther2.java create mode 100644 blackbox-test-inject/src/test/java/org/example/myapp/other/WireOther3.java diff --git a/blackbox-test-inject/src/test/java/org/example/myapp/other/InjectTestOnlyComponentTest.java b/blackbox-test-inject/src/test/java/org/example/myapp/other/InjectTestOnlyComponentTest.java new file mode 100644 index 000000000..0d92d3aa9 --- /dev/null +++ b/blackbox-test-inject/src/test/java/org/example/myapp/other/InjectTestOnlyComponentTest.java @@ -0,0 +1,29 @@ +package org.example.myapp.other; + +import io.avaje.inject.test.InjectTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +@InjectTest +public class InjectTestOnlyComponentTest { + + @Inject WireOther myTestOnlyComponent; + @Inject WireOther2 myTestOnlyComponent2; + @Inject WireOther3 withBeanScope; + + @Test + void test() { + assertThat(myTestOnlyComponent).isNotNull(); + assertThat(myTestOnlyComponent.component).isNotNull(); + assertThat(myTestOnlyComponent.plugin).isNotNull(); + + assertThat(myTestOnlyComponent2).isNotNull(); + assertThat(myTestOnlyComponent2.component).isNotNull(); + assertThat(myTestOnlyComponent2.plugin).isNotNull(); + + assertThat(withBeanScope).isNotNull(); + assertThat(withBeanScope.beanScope).isNotNull(); + } +} diff --git a/blackbox-test-inject/src/test/java/org/example/myapp/other/WireOther2.java b/blackbox-test-inject/src/test/java/org/example/myapp/other/WireOther2.java new file mode 100644 index 000000000..962fd81df --- /dev/null +++ b/blackbox-test-inject/src/test/java/org/example/myapp/other/WireOther2.java @@ -0,0 +1,19 @@ +package org.example.myapp.other; + +import io.avaje.inject.PostConstruct; +import jakarta.inject.Singleton; +import org.example.external.aspect.PluginProvidedClass; +import org.other.one.OtherComponent; + +@Singleton +public class WireOther2 { + OtherComponent component; + PluginProvidedClass plugin; + + @PostConstruct + public void postConstruct(OtherComponent component, PluginProvidedClass plugin) { + this.component = component; + this.plugin = plugin; + } + +} diff --git a/blackbox-test-inject/src/test/java/org/example/myapp/other/WireOther3.java b/blackbox-test-inject/src/test/java/org/example/myapp/other/WireOther3.java new file mode 100644 index 000000000..398bbdc41 --- /dev/null +++ b/blackbox-test-inject/src/test/java/org/example/myapp/other/WireOther3.java @@ -0,0 +1,18 @@ +package org.example.myapp.other; + +import io.avaje.inject.BeanScope; +import io.avaje.inject.PostConstruct; +import jakarta.inject.Singleton; +import org.example.external.aspect.PluginProvidedClass; +import org.other.one.OtherComponent; + +@Singleton +public class WireOther3 { + BeanScope beanScope; + + @PostConstruct + public void postConstruct(BeanScope beanScope) { + this.beanScope = beanScope; + } + +} diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/SimpleOrderWriter.java b/inject-generator/src/main/java/io/avaje/inject/generator/SimpleOrderWriter.java index 7d02a1083..58e11a06a 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/SimpleOrderWriter.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/SimpleOrderWriter.java @@ -76,7 +76,17 @@ private void writeStartClass() { private void writeBuildMethods() { writer.append( - "\n" + "\n" + + " @Override\n" + + " public boolean supportsExpected(List modules) {\n" + + " if (modules.size() != sortedModules.length) {\n" + + " return false;\n" + + " }\n" + + " return modules.stream()\n" + + " .map(m -> m.getClass().getTypeName())\n" + + " .allMatch(k -> INDEXES.containsKey(k));\n" + + " }\n" + + "\n" + " @Override\n" + " public List factories() {\n" + " return List.of(sortedModules);\n" diff --git a/inject/src/main/java/io/avaje/inject/DBeanScopeBuilder.java b/inject/src/main/java/io/avaje/inject/DBeanScopeBuilder.java index 71f209dc2..2fc52a275 100644 --- a/inject/src/main/java/io/avaje/inject/DBeanScopeBuilder.java +++ b/inject/src/main/java/io/avaje/inject/DBeanScopeBuilder.java @@ -6,13 +6,7 @@ import java.lang.System.Logger.Level; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; @@ -257,10 +251,13 @@ public BeanScope build() { // sort factories by dependsOn ModuleOrdering factoryOrder = new FactoryOrder(parent, includeModules, !suppliedBeans.isEmpty()); + var modules = serviceLoader.modules(); if (factoryOrder.isEmpty()) { // prefer generated ModuleOrdering if provided - factoryOrder = serviceLoader.moduleOrdering().orElse(factoryOrder); - serviceLoader.modules().forEach(factoryOrder::add); + factoryOrder = serviceLoader.moduleOrdering() + .filter(o -> o.supportsExpected(modules)) + .orElse(factoryOrder); + modules.forEach(factoryOrder::add); } final var moduleNames = factoryOrder.orderModules(); diff --git a/inject/src/main/java/io/avaje/inject/spi/ModuleOrdering.java b/inject/src/main/java/io/avaje/inject/spi/ModuleOrdering.java index 5e68b3bd0..984c50404 100644 --- a/inject/src/main/java/io/avaje/inject/spi/ModuleOrdering.java +++ b/inject/src/main/java/io/avaje/inject/spi/ModuleOrdering.java @@ -8,6 +8,18 @@ */ public interface ModuleOrdering extends InjectExtension { + /** + * Return true if ordering supports the modules passed in. + */ + default boolean supportsExpected(List modules) { + return true; + } + + /** + * Accept a module for ordering + */ + void add(AvajeModule module); + /** * Order the factories, returning the ordered list of module names. */ @@ -23,8 +35,4 @@ public interface ModuleOrdering extends InjectExtension { */ boolean isEmpty(); - /** - * Accept a module for ordering - */ - void add(AvajeModule module); } From 0a244ab68fea72d23236ee22cfd368cdcfcc3927 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 13 Jan 2025 17:14:25 +1300 Subject: [PATCH 04/12] Version 11.2-RC1 --- blackbox-aspect/pom.xml | 2 +- blackbox-other/pom.xml | 2 +- blackbox-test-inject/pom.xml | 2 +- inject-aop/pom.xml | 2 +- inject-events/pom.xml | 2 +- inject-generator/pom.xml | 2 +- inject-maven-plugin/pom.xml | 2 +- inject-test/pom.xml | 2 +- inject/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/blackbox-aspect/pom.xml b/blackbox-aspect/pom.xml index dcc8c3e5d..6e805a043 100644 --- a/blackbox-aspect/pom.xml +++ b/blackbox-aspect/pom.xml @@ -5,7 +5,7 @@ avaje-inject-parent io.avaje - 11.1 + 11.2-RC1 4.0.0 diff --git a/blackbox-other/pom.xml b/blackbox-other/pom.xml index 62882aa26..93a17fefa 100644 --- a/blackbox-other/pom.xml +++ b/blackbox-other/pom.xml @@ -6,7 +6,7 @@ avaje-inject-parent io.avaje - 11.1 + 11.2-RC1 blackbox-other diff --git a/blackbox-test-inject/pom.xml b/blackbox-test-inject/pom.xml index 3638a747a..b46a70f4d 100644 --- a/blackbox-test-inject/pom.xml +++ b/blackbox-test-inject/pom.xml @@ -5,7 +5,7 @@ avaje-inject-parent io.avaje - 11.1 + 11.2-RC1 4.0.0 diff --git a/inject-aop/pom.xml b/inject-aop/pom.xml index af6fbddf6..3bf5546af 100644 --- a/inject-aop/pom.xml +++ b/inject-aop/pom.xml @@ -5,7 +5,7 @@ io.avaje avaje-inject-parent - 11.1 + 11.2-RC1 avaje-inject-aop diff --git a/inject-events/pom.xml b/inject-events/pom.xml index cc79b167e..f4e457919 100644 --- a/inject-events/pom.xml +++ b/inject-events/pom.xml @@ -3,7 +3,7 @@ io.avaje avaje-inject-parent - 11.1 + 11.2-RC1 avaje-inject-events avaje inject events diff --git a/inject-generator/pom.xml b/inject-generator/pom.xml index 7eae3cd89..287b76206 100644 --- a/inject-generator/pom.xml +++ b/inject-generator/pom.xml @@ -6,7 +6,7 @@ io.avaje avaje-inject-parent - 11.1 + 11.2-RC1 avaje-inject-generator diff --git a/inject-maven-plugin/pom.xml b/inject-maven-plugin/pom.xml index be7b3048c..7852ede1d 100644 --- a/inject-maven-plugin/pom.xml +++ b/inject-maven-plugin/pom.xml @@ -4,7 +4,7 @@ avaje-inject-parent io.avaje - 11.1 + 11.2-RC1 avaje-inject-maven-plugin diff --git a/inject-test/pom.xml b/inject-test/pom.xml index c3835ecb7..50dfa1086 100644 --- a/inject-test/pom.xml +++ b/inject-test/pom.xml @@ -4,7 +4,7 @@ io.avaje avaje-inject-parent - 11.1 + 11.2-RC1 avaje-inject-test diff --git a/inject/pom.xml b/inject/pom.xml index 2039ba33c..b5c1acd8c 100644 --- a/inject/pom.xml +++ b/inject/pom.xml @@ -4,7 +4,7 @@ io.avaje avaje-inject-parent - 11.1 + 11.2-RC1 avaje-inject diff --git a/pom.xml b/pom.xml index b66eed511..644fc5c69 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.avaje avaje-inject-parent - 11.1 + 11.2-RC1 pom avaje inject parent parent pom for avaje inject library @@ -23,7 +23,7 @@ false -Dnet.bytebuddy.experimental=true - 2025-01-07T19:41:49Z + 2025-01-13T04:10:43Z - 2025-01-13T04:10:43Z + 2025-01-15T20:36:06Z diff --git a/inject-test/pom.xml b/inject-test/pom.xml index c0e46246b..4870096a5 100644 --- a/inject-test/pom.xml +++ b/inject-test/pom.xml @@ -105,7 +105,7 @@ org.jetbrains annotations - 26.0.1 + 26.0.2 test From add33db597ff1f54a893e31adb598240b4e54fe0 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Fri, 31 Jan 2025 07:56:23 +1300 Subject: [PATCH 12/12] Version 11.2 --- blackbox-aspect/pom.xml | 2 +- blackbox-other/pom.xml | 2 +- blackbox-test-inject/pom.xml | 2 +- inject-aop/pom.xml | 2 +- inject-events/pom.xml | 2 +- inject-generator/pom.xml | 2 +- inject-maven-plugin/pom.xml | 2 +- inject-test/pom.xml | 2 +- inject/pom.xml | 2 +- pom.xml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/blackbox-aspect/pom.xml b/blackbox-aspect/pom.xml index 856d43c83..17a9bccb4 100644 --- a/blackbox-aspect/pom.xml +++ b/blackbox-aspect/pom.xml @@ -5,7 +5,7 @@ avaje-inject-parent io.avaje - 11.2-RC2 + 11.2 4.0.0 diff --git a/blackbox-other/pom.xml b/blackbox-other/pom.xml index 4bbfb21d4..0af6d242f 100644 --- a/blackbox-other/pom.xml +++ b/blackbox-other/pom.xml @@ -6,7 +6,7 @@ avaje-inject-parent io.avaje - 11.2-RC2 + 11.2 blackbox-other diff --git a/blackbox-test-inject/pom.xml b/blackbox-test-inject/pom.xml index ec6746ea8..e73e88f32 100644 --- a/blackbox-test-inject/pom.xml +++ b/blackbox-test-inject/pom.xml @@ -5,7 +5,7 @@ avaje-inject-parent io.avaje - 11.2-RC2 + 11.2 4.0.0 diff --git a/inject-aop/pom.xml b/inject-aop/pom.xml index a6e2ac1be..232386039 100644 --- a/inject-aop/pom.xml +++ b/inject-aop/pom.xml @@ -5,7 +5,7 @@ io.avaje avaje-inject-parent - 11.2-RC2 + 11.2 avaje-inject-aop diff --git a/inject-events/pom.xml b/inject-events/pom.xml index da1ed75dc..66d311fc0 100644 --- a/inject-events/pom.xml +++ b/inject-events/pom.xml @@ -3,7 +3,7 @@ io.avaje avaje-inject-parent - 11.2-RC2 + 11.2 avaje-inject-events avaje inject events diff --git a/inject-generator/pom.xml b/inject-generator/pom.xml index 374c55b79..4e5bdb6f0 100644 --- a/inject-generator/pom.xml +++ b/inject-generator/pom.xml @@ -6,7 +6,7 @@ io.avaje avaje-inject-parent - 11.2-RC2 + 11.2 avaje-inject-generator diff --git a/inject-maven-plugin/pom.xml b/inject-maven-plugin/pom.xml index dd06234be..46730589e 100644 --- a/inject-maven-plugin/pom.xml +++ b/inject-maven-plugin/pom.xml @@ -4,7 +4,7 @@ avaje-inject-parent io.avaje - 11.2-RC2 + 11.2 avaje-inject-maven-plugin diff --git a/inject-test/pom.xml b/inject-test/pom.xml index 4870096a5..23446b9c8 100644 --- a/inject-test/pom.xml +++ b/inject-test/pom.xml @@ -4,7 +4,7 @@ io.avaje avaje-inject-parent - 11.2-RC2 + 11.2 avaje-inject-test diff --git a/inject/pom.xml b/inject/pom.xml index cf1e07375..84820b5ed 100644 --- a/inject/pom.xml +++ b/inject/pom.xml @@ -4,7 +4,7 @@ io.avaje avaje-inject-parent - 11.2-RC2 + 11.2 avaje-inject diff --git a/pom.xml b/pom.xml index 278c9d6e2..3b2674dec 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.avaje avaje-inject-parent - 11.2-RC2 + 11.2 pom avaje inject parent parent pom for avaje inject library @@ -23,7 +23,7 @@ false -Dnet.bytebuddy.experimental=true - 2025-01-15T20:36:06Z + 2025-01-30T18:52:51Z