diff --git a/test-framework/core/src/main/java/org/keycloak/testframework/injection/AbstractInterceptorHelper.java b/test-framework/core/src/main/java/org/keycloak/testframework/injection/AbstractInterceptorHelper.java index 92b1731bacf..bb86497889c 100644 --- a/test-framework/core/src/main/java/org/keycloak/testframework/injection/AbstractInterceptorHelper.java +++ b/test-framework/core/src/main/java/org/keycloak/testframework/injection/AbstractInterceptorHelper.java @@ -1,6 +1,5 @@ package org.keycloak.testframework.injection; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -9,7 +8,6 @@ public abstract class AbstractInterceptorHelper { private final Registry registry; private final Class interceptorClass; private final List interceptions = new LinkedList<>(); - private final InterceptedBy interceptedBy = new InterceptedBy(); public AbstractInterceptorHelper(Registry registry, Class interceptorClass) { this.registry = registry; @@ -17,21 +15,18 @@ public abstract class AbstractInterceptorHelper { registry.getDeployedInstances().stream().filter(i -> isInterceptor(i.getSupplier())).forEach(i -> interceptions.add(new Interception(i))); registry.getRequestedInstances().stream().filter(r -> isInterceptor(r.getSupplier())).forEach(r -> interceptions.add(new Interception(r))); - - interceptions.forEach(i -> interceptedBy.put(i.supplier, i.instanceId)); - } - - public boolean sameInterceptors(InstanceContext instanceContext) { - InterceptedBy previousInterceptedBy = instanceContext.getNote("InterceptedBy", InterceptedBy.class); - return interceptedBy.equals(previousInterceptedBy); } public V intercept(V value, InstanceContext instanceContext) { for (Interception interception : interceptions) { value = intercept(value, interception.supplier, interception.existingInstance); registry.getLogger().logIntercepted(value, interception.supplier); + if (interception.existingInstance != null) { + interception.existingInstance.registerDependency(instanceContext); + } else { + interception.requestedInstance.registerDependency(instanceContext); + } } - instanceContext.addNote("InterceptedBy", interceptedBy); return value; } @@ -41,24 +36,21 @@ public abstract class AbstractInterceptorHelper { return interceptorClass.isAssignableFrom(supplier.getClass()); } - public static class InterceptedBy extends HashMap, Integer> { - } - private static class Interception { - private final int instanceId; private final Supplier supplier; + private final RequestedInstance requestedInstance; private final InstanceContext existingInstance; public Interception(InstanceContext existingInstance) { this.supplier = existingInstance.getSupplier(); - this.instanceId = existingInstance.getInstanceId(); + this.requestedInstance = null; this.existingInstance = existingInstance; } public Interception(RequestedInstance requestedInstance) { this.supplier = requestedInstance.getSupplier(); - this.instanceId = requestedInstance.getInstanceId(); + this.requestedInstance = requestedInstance; this.existingInstance = null; } } diff --git a/test-framework/core/src/main/java/org/keycloak/testframework/injection/InstanceContext.java b/test-framework/core/src/main/java/org/keycloak/testframework/injection/InstanceContext.java index 3779f09f576..7134d45b999 100644 --- a/test-framework/core/src/main/java/org/keycloak/testframework/injection/InstanceContext.java +++ b/test-framework/core/src/main/java/org/keycloak/testframework/injection/InstanceContext.java @@ -12,7 +12,7 @@ public class InstanceContext { private final Registry registry; private final Supplier supplier; private final A annotation; - private final Set> dependencies = new HashSet<>(); + private final Set> dependencies = new HashSet<>(); private T value; private Class requestedValueType; private LifeCycle lifeCycle; @@ -73,11 +73,11 @@ public class InstanceContext { return annotation; } - public Set> getDependencies() { + public Set> getDependencies() { return dependencies; } - public void registerDependency(InstanceContext instanceContext) { + public void registerDependency(InstanceContext instanceContext) { dependencies.add(instanceContext); } diff --git a/test-framework/core/src/main/java/org/keycloak/testframework/injection/Registry.java b/test-framework/core/src/main/java/org/keycloak/testframework/injection/Registry.java index b8632c00ff5..6f6cb110c21 100644 --- a/test-framework/core/src/main/java/org/keycloak/testframework/injection/Registry.java +++ b/test-framework/core/src/main/java/org/keycloak/testframework/injection/Registry.java @@ -114,6 +114,7 @@ public class Registry implements ExtensionContext.Store.CloseableResource { public void beforeEach(Object testInstance) { findRequestedInstances(testInstance); + destroyIncompatibleInstances(); matchDeployedInstancesWithRequestedInstances(); deployRequestedInstances(); injectFields(testInstance); @@ -145,6 +146,19 @@ public class Registry implements ExtensionContext.Store.CloseableResource { logger.logRequestedInstances(requestedInstances); } + private void destroyIncompatibleInstances() { + for (RequestedInstance requestedInstance : requestedInstances) { + InstanceContext deployedInstance = getDeployedInstance(requestedInstance); + if (deployedInstance != null) { + boolean compatible = requestedInstance.getLifeCycle().equals(deployedInstance.getLifeCycle()) && deployedInstance.getSupplier().compatible(deployedInstance, requestedInstance); + if (!compatible) { + logger.logDestroyIncompatible(deployedInstance); + destroy(deployedInstance); + } + } + } + } + private void matchDeployedInstancesWithRequestedInstances() { Iterator> itr = requestedInstances.iterator(); while (itr.hasNext()) { @@ -154,9 +168,6 @@ public class Registry implements ExtensionContext.Store.CloseableResource { if (requestedInstance.getLifeCycle().equals(deployedInstance.getLifeCycle()) && deployedInstance.getSupplier().compatible(deployedInstance, requestedInstance)) { logger.logReusingCompatibleInstance(deployedInstance); itr.remove(); - } else { - logger.logDestroyIncompatible(deployedInstance); - destroy(deployedInstance); } } } @@ -172,6 +183,11 @@ public class Registry implements ExtensionContext.Store.CloseableResource { instance.setValue(requestedInstance.getSupplier().getValue(instance)); deployedInstances.add(instance); + if (!requestedInstance.getDependencies().isEmpty()) { + Set> dependencies = requestedInstance.getDependencies(); + dependencies.forEach(instance::registerDependency); + } + logger.logCreatedInstance(requestedInstance, instance); } } diff --git a/test-framework/core/src/main/java/org/keycloak/testframework/injection/RequestedInstance.java b/test-framework/core/src/main/java/org/keycloak/testframework/injection/RequestedInstance.java index 312d4580029..90e5fd7246d 100644 --- a/test-framework/core/src/main/java/org/keycloak/testframework/injection/RequestedInstance.java +++ b/test-framework/core/src/main/java/org/keycloak/testframework/injection/RequestedInstance.java @@ -1,12 +1,15 @@ package org.keycloak.testframework.injection; import java.lang.annotation.Annotation; +import java.util.HashSet; +import java.util.Set; public class RequestedInstance { private final int instanceId; private final Supplier supplier; private final A annotation; + private final Set> dependencies = new HashSet<>(); private final Class valueType; private final LifeCycle lifeCycle; private final String ref; @@ -44,4 +47,11 @@ public class RequestedInstance { return ref; } + public void registerDependency(InstanceContext instanceContext) { + dependencies.add(instanceContext); + } + + public Set> getDependencies() { + return dependencies; + } } diff --git a/test-framework/core/src/main/java/org/keycloak/testframework/realm/RealmSupplier.java b/test-framework/core/src/main/java/org/keycloak/testframework/realm/RealmSupplier.java index eb4afbb1a08..e0cc863833d 100644 --- a/test-framework/core/src/main/java/org/keycloak/testframework/realm/RealmSupplier.java +++ b/test-framework/core/src/main/java/org/keycloak/testframework/realm/RealmSupplier.java @@ -58,12 +58,7 @@ public class RealmSupplier implements Supplier { @Override public boolean compatible(InstanceContext a, RequestedInstance b) { - if (!a.getAnnotation().config().equals(b.getAnnotation().config())) { - return false; - } - - RealmConfigInterceptorHelper interceptor = new RealmConfigInterceptorHelper(a.getRegistry()); - return interceptor.sameInterceptors(a); + return a.getAnnotation().config().equals(b.getAnnotation().config()); } @Override diff --git a/test-framework/core/src/main/java/org/keycloak/testframework/server/AbstractKeycloakServerSupplier.java b/test-framework/core/src/main/java/org/keycloak/testframework/server/AbstractKeycloakServerSupplier.java index 2f477a4f266..78f3c3a5d6f 100644 --- a/test-framework/core/src/main/java/org/keycloak/testframework/server/AbstractKeycloakServerSupplier.java +++ b/test-framework/core/src/main/java/org/keycloak/testframework/server/AbstractKeycloakServerSupplier.java @@ -59,12 +59,7 @@ public abstract class AbstractKeycloakServerSupplier implements Supplier a, RequestedInstance b) { - if (!a.getAnnotation().config().equals(b.getAnnotation().config())) { - return false; - } - - ServerConfigInterceptorHelper interceptor = new ServerConfigInterceptorHelper(a.getRegistry()); - return interceptor.sameInterceptors(a); + return a.getAnnotation().config().equals(b.getAnnotation().config()); } @Override diff --git a/test-framework/core/src/test/java/org/keycloak/testframework/injection/RegistryTest.java b/test-framework/core/src/test/java/org/keycloak/testframework/injection/RegistryTest.java index 5884ffa764e..313e4f12370 100644 --- a/test-framework/core/src/test/java/org/keycloak/testframework/injection/RegistryTest.java +++ b/test-framework/core/src/test/java/org/keycloak/testframework/injection/RegistryTest.java @@ -274,6 +274,28 @@ public class RegistryTest { } } + @Test + public void testIncompatibleParent() { + MockParentSupplier.COMPATIBLE = false; + RealmIncompatibleParentTest test = new RealmIncompatibleParentTest(); + registry.beforeEach(test); + + MockParentValue parent1 = test.parent; + MockChildValue child1 = test.child; + + Assertions.assertNotNull(test.parent); + Assertions.assertNotNull(test.child); + + registry.afterEach(); + + registry.beforeEach(test); + + Assertions.assertNotNull(test.parent); + Assertions.assertNotEquals(parent1, test.parent); + Assertions.assertNotNull(test.child); + Assertions.assertNotEquals(child1, test.child); + } + public static void assertRunning(Object... values) { MatcherAssert.assertThat(MockInstances.INSTANCES, Matchers.hasItems(values)); MatcherAssert.assertThat(MockInstances.INSTANCES, Matchers.hasSize(values.length)); @@ -334,4 +356,15 @@ public class RegistryTest { @MockChildAnnotation(ref = "ABC", parentRef = "ABC") MockChildValue childABC; } + + public static final class RealmIncompatibleParentTest { + + @MockChildAnnotation + MockChildValue child; + + @MockParentAnnotation + MockParentValue parent; + + } + }