Skip to content

Commit

Permalink
Avoid repeatedly computing enclosing instance types
Browse files Browse the repository at this point in the history
  • Loading branch information
marcphilipp committed Jan 26, 2025
1 parent a8c91a8 commit c1fc7d1
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;

import org.apiguardian.api.API;
import org.junit.jupiter.api.extension.TestInstances;
Expand Down Expand Up @@ -79,8 +80,8 @@ protected TestInstances instantiateTestClass(JupiterEngineExecutionContext paren
}

@Override
public Set<ResourceLocksProvider.Lock> evaluateResourceLocksProvider(ResourceLocksProvider provider) {
return provider.provideForClass(getTestClass());
public Function<ResourceLocksProvider, Set<ResourceLocksProvider.Lock>> getResourceLocksProviderEvaluator() {
return provider -> provider.provideForClass(getTestClass());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;

import org.apiguardian.api.API;
import org.junit.jupiter.api.extension.ExtensionContext;
Expand Down Expand Up @@ -97,13 +98,13 @@ public ExclusiveResourceCollector getExclusiveResourceCollector() {
}

@Override
public Set<ResourceLocksProvider.Lock> evaluateResourceLocksProvider(ResourceLocksProvider provider) {
public Function<ResourceLocksProvider, Set<ResourceLocksProvider.Lock>> getResourceLocksProviderEvaluator() {
List<Class<?>> enclosingInstanceTypes = getParent() //
.filter(ClassBasedTestDescriptor.class::isInstance) //
.map(ClassBasedTestDescriptor.class::cast) //
.map(ClassBasedTestDescriptor::getEnclosingTestClasses) //
.orElseGet(Collections::emptyList);
return provider.provideForMethod(enclosingInstanceTypes, getTestClass(), getTestMethod());
return provider -> provider.provideForMethod(enclosingInstanceTypes, getTestClass(), getTestMethod());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;

import org.apiguardian.api.API;
import org.junit.jupiter.api.extension.TestInstances;
Expand Down Expand Up @@ -87,8 +88,9 @@ protected TestInstances instantiateTestClass(JupiterEngineExecutionContext paren
}

@Override
public Set<ResourceLocksProvider.Lock> evaluateResourceLocksProvider(ResourceLocksProvider provider) {
return provider.provideForNestedClass(getEnclosingTestClasses(), getTestClass());
public Function<ResourceLocksProvider, Set<ResourceLocksProvider.Lock>> getResourceLocksProviderEvaluator() {
List<Class<?>> enclosingTestClasses = getEnclosingTestClasses();
return provider -> provider.provideForNestedClass(enclosingTestClasses, getTestClass());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Stream;

import org.junit.jupiter.api.parallel.ResourceLocksProvider;
Expand All @@ -35,27 +36,31 @@ default Stream<ExclusiveResource> determineExclusiveResources() {
parent = parent.getParent().orElse(null);
}

Function<ResourceLocksProvider, Set<ResourceLocksProvider.Lock>> evaluator = getResourceLocksProviderEvaluator();

if (ancestors.isEmpty()) {
return determineOwnExclusiveResources();
return determineOwnExclusiveResources(evaluator);
}

Stream<ExclusiveResource> parentStaticResourcesForChildren = ancestors.getLast() //
.getExclusiveResourceCollector().getStaticResourcesFor(CHILDREN);

Stream<ExclusiveResource> ancestorDynamicResources = ancestors.stream() //
.map(ResourceLockAware::getExclusiveResourceCollector) //
.flatMap(collector -> collector.getDynamicResources(this::evaluateResourceLocksProvider));
.flatMap(collector -> collector.getDynamicResources(evaluator));

return Stream.of(ancestorDynamicResources, parentStaticResourcesForChildren, determineOwnExclusiveResources())//
return Stream.of(ancestorDynamicResources, parentStaticResourcesForChildren,
determineOwnExclusiveResources(evaluator))//
.flatMap(s -> s);
}

default Stream<ExclusiveResource> determineOwnExclusiveResources() {
return this.getExclusiveResourceCollector().getAllExclusiveResources(this::evaluateResourceLocksProvider);
default Stream<ExclusiveResource> determineOwnExclusiveResources(
Function<ResourceLocksProvider, Set<ResourceLocksProvider.Lock>> providerToLocks) {
return this.getExclusiveResourceCollector().getAllExclusiveResources(providerToLocks);
}

ExclusiveResourceCollector getExclusiveResourceCollector();

Set<ResourceLocksProvider.Lock> evaluateResourceLocksProvider(ResourceLocksProvider provider);
Function<ResourceLocksProvider, Set<ResourceLocksProvider.Lock>> getResourceLocksProviderEvaluator();

}

0 comments on commit c1fc7d1

Please sign in to comment.