Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[JUnit Platform] Use EngineDiscoveryRequestResolver #2835

Draft
wants to merge 31 commits into
base: main
Choose a base branch
from
Draft
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
47d345c
[JUnit Platform] Use EngineDiscoveryRequestResolver
mpkorstanje Dec 16, 2023
4ea85b3
WIP
mpkorstanje Jan 4, 2024
bd9ac67
WIP
mpkorstanje Jan 4, 2024
b39764c
WIP
mpkorstanje Feb 15, 2024
9440631
Merge branch 'main' into junit-platform-refactor
mpkorstanje Feb 20, 2024
b6ab3cb
Fix formating
mpkorstanje Feb 20, 2024
b78dac7
WIP
mpkorstanje Feb 20, 2024
15c7221
Merge remote-tracking branch 'origin/main' into junit-platform-refactor
mpkorstanje Jun 13, 2024
c5be199
Fix
mpkorstanje Jun 13, 2024
4596d74
Fix sorting
mpkorstanje Jun 13, 2024
294d880
Clean up
mpkorstanje Jun 13, 2024
17a2881
Merge remote-tracking branch 'origin/main' into junit-platform-refactor
mpkorstanje Sep 5, 2024
5f2ca2f
Merge remote-tracking branch 'origin/main' into junit-platform-refactor
mpkorstanje Oct 31, 2024
9002a1f
WIP
mpkorstanje Oct 31, 2024
a68cc19
Extract FeaturesPropertyResolver
mpkorstanje Nov 1, 2024
ac85314
Refactor tests
mpkorstanje Nov 2, 2024
ff5c6d7
Notes
mpkorstanje Nov 2, 2024
300b405
Simplify
mpkorstanje Nov 6, 2024
1a9e1a7
Move tests for tags to CucumberTestEngineTest
mpkorstanje Nov 6, 2024
26b42ca
Move more tests to CucumberTestEngineTest
mpkorstanje Nov 7, 2024
c090dad
Make it look more like Junit
mpkorstanje Nov 8, 2024
4315b80
Instantiate Configuration exactly once
mpkorstanje Nov 8, 2024
daa5eb4
Merge remote-tracking branch 'origin/main' into junit-platform-refactor
mpkorstanje Nov 21, 2024
a0f84f1
Warn when selectClasspathResource is incorrectly used
mpkorstanje Nov 21, 2024
5c6b17e
Clean up
mpkorstanje Nov 21, 2024
117e1de
Update CHANGELOG
mpkorstanje Nov 24, 2024
514040e
Merge remote-tracking branch 'origin/main' into junit-platform-refactor
mpkorstanje Jan 16, 2025
abb234c
Remove unused code
mpkorstanje Jan 16, 2025
a54ab73
Merge remote-tracking branch 'origin/main' into junit-platform-refactor
mpkorstanje Jan 30, 2025
9e42cae
Merge remote-tracking branch 'origin/main' into junit-platform-refactor
mpkorstanje Feb 9, 2025
cc1c3f5
Use JUnit 5.12.0-RC1
mpkorstanje Feb 9, 2025
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
Prev Previous commit
Next Next commit
Make it look more like Junit
mpkorstanje committed Nov 8, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit c090dad1f4e8d75f6151e9bbcad2afa785d25974
Original file line number Diff line number Diff line change
@@ -15,12 +15,15 @@
import io.cucumber.tagexpressions.Expression;
import io.cucumber.tagexpressions.TagExpressionParser;
import org.junit.platform.engine.ConfigurationParameters;
import org.junit.platform.engine.support.config.PrefixedConfigurationParameters;
import org.junit.platform.engine.support.hierarchical.Node.ExecutionMode;

import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
import java.util.regex.Pattern;
@@ -29,6 +32,8 @@
import static io.cucumber.core.resource.ClasspathSupport.CLASSPATH_SCHEME_PREFIX;
import static io.cucumber.junit.platform.engine.Constants.ANSI_COLORS_DISABLED_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.EXECUTION_DRY_RUN_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.EXECUTION_EXCLUSIVE_RESOURCES_PREFIX;
import static io.cucumber.junit.platform.engine.Constants.EXECUTION_MODE_FEATURE_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.FEATURES_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.FILTER_NAME_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.FILTER_TAGS_PROPERTY_NAME;
@@ -44,15 +49,15 @@
import static io.cucumber.junit.platform.engine.Constants.UUID_GENERATOR_PROPERTY_NAME;
import static java.util.Objects.requireNonNull;

class CucumberEngineOptions implements
class CucumberConfiguration implements
io.cucumber.core.plugin.Options,
io.cucumber.core.runner.Options,
io.cucumber.core.backend.Options,
io.cucumber.core.eventbus.Options {

private final ConfigurationParameters configurationParameters;

CucumberEngineOptions(ConfigurationParameters configurationParameters) {
CucumberConfiguration(ConfigurationParameters configurationParameters) {
this.configurationParameters = requireNonNull(configurationParameters);
}

@@ -188,4 +193,18 @@ Set<FeatureWithLinesSelector> featuresWithLines() {
.collect(Collectors.toSet()))
.orElse(Collections.emptySet());
}

ExecutionMode getExecutionModeFeature() {
return configurationParameters.get(EXECUTION_MODE_FEATURE_PROPERTY_NAME,
value -> ExecutionMode.valueOf(value.toUpperCase(Locale.US)))
.orElse(ExecutionMode.CONCURRENT);
}

ExclusiveResourceConfiguration getExclusiveResourceConfiguration(String tag) {
requireNonNull(tag);
return new ExclusiveResourceConfiguration(new PrefixedConfigurationParameters(
configurationParameters,
EXECUTION_EXCLUSIVE_RESOURCES_PREFIX + tag));

}
}
Original file line number Diff line number Diff line change
@@ -8,20 +8,28 @@
import java.util.Optional;
import java.util.function.Consumer;

import static java.util.Objects.requireNonNull;

class CucumberEngineDescriptor extends EngineDescriptor implements Node<CucumberEngineExecutionContext> {

static final String ENGINE_ID = "cucumber";
private final CucumberConfiguration configuration;
private final TestSource source;

CucumberEngineDescriptor(UniqueId uniqueId) {
this(uniqueId, null);
CucumberEngineDescriptor(UniqueId uniqueId, CucumberConfiguration configuration) {
this(uniqueId, configuration, null);
}

CucumberEngineDescriptor(UniqueId uniqueId, TestSource source) {
CucumberEngineDescriptor(UniqueId uniqueId, CucumberConfiguration configuration, TestSource source) {
super(uniqueId, "Cucumber");
this.configuration = requireNonNull(configuration);
this.source = source;
}

public CucumberConfiguration getConfiguration() {
return configuration;
}

@Override
public Optional<TestSource> getSource() {
return Optional.ofNullable(this.source);
Original file line number Diff line number Diff line change
@@ -34,15 +34,15 @@
public final class CucumberEngineExecutionContext implements EngineExecutionContext {

private static final Logger log = LoggerFactory.getLogger(CucumberEngineExecutionContext.class);
private final CucumberEngineOptions options;
private final CucumberConfiguration options;

private CucumberExecutionContext context;

CucumberEngineExecutionContext(ConfigurationParameters configurationParameters) {
options = new CucumberEngineOptions(configurationParameters);
options = new CucumberConfiguration(configurationParameters);
}

CucumberEngineOptions getOptions() {
CucumberConfiguration getOptions() {
return options;
}

Original file line number Diff line number Diff line change
@@ -43,7 +43,8 @@ public String getId() {
@Override
public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId uniqueId) {
TestSource testSource = createEngineTestSource(discoveryRequest);
CucumberEngineDescriptor engineDescriptor = new CucumberEngineDescriptor(uniqueId, testSource);
CucumberConfiguration configuration = new CucumberConfiguration(discoveryRequest.getConfigurationParameters());
CucumberEngineDescriptor engineDescriptor = new CucumberEngineDescriptor(uniqueId, configuration, testSource);
FeaturesPropertyResolver resolver = new FeaturesPropertyResolver(new DiscoverySelectorResolver());
resolver.resolveSelectors(discoveryRequest, engineDescriptor);
return engineDescriptor;
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ class DiscoverySelectorResolver {
private static final EngineDiscoveryRequestResolver<CucumberEngineDescriptor> resolver = EngineDiscoveryRequestResolver
.<CucumberEngineDescriptor>builder()
.addResourceContainerSelectorResolver(new IsFeature())
.addSelectorResolver(context -> new FeatureResolver(context.getDiscoveryRequest().getConfigurationParameters()))
.addSelectorResolver(context -> new FeatureResolver(context.getEngineDescriptor().getConfiguration()))
.addTestDescriptorVisitor(context -> new FeatureOrderingVisitor())
.addTestDescriptorVisitor(context -> new FeatureElementOrderingVisitor())
.addTestDescriptorVisitor(context -> TestDescriptor::prune)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package io.cucumber.junit.platform.engine;

import org.junit.platform.engine.ConfigurationParameters;

import java.util.Arrays;
import java.util.stream.Stream;

import static io.cucumber.junit.platform.engine.Constants.READ_SUFFIX;
import static io.cucumber.junit.platform.engine.Constants.READ_WRITE_SUFFIX;
import static java.util.Objects.requireNonNull;

final class ExclusiveResourceConfiguration {

private final ConfigurationParameters parameters;

ExclusiveResourceConfiguration(ConfigurationParameters parameters) {
this.parameters = requireNonNull(parameters);
}

public Stream<String> exclusiveReadWriteResource() {
return parameters.get(READ_WRITE_SUFFIX, s -> Arrays.stream(s.split(","))
.map(String::trim))
.orElse(Stream.empty());
}

public Stream<String> exclusiveReadResource() {
return parameters.get(READ_SUFFIX, s -> Arrays.stream(s.split(","))
.map(String::trim))
.orElse(Stream.empty());
}

}
Original file line number Diff line number Diff line change
@@ -1,30 +1,20 @@
package io.cucumber.junit.platform.engine;

import io.cucumber.core.gherkin.Pickle;
import io.cucumber.core.resource.ClasspathSupport;
import org.junit.platform.engine.ConfigurationParameters;
import org.junit.platform.engine.TestSource;
import org.junit.platform.engine.TestTag;
import org.junit.platform.engine.UniqueId;
import org.junit.platform.engine.support.config.PrefixedConfigurationParameters;
import org.junit.platform.engine.support.descriptor.AbstractTestDescriptor;
import org.junit.platform.engine.support.descriptor.ClasspathResourceSource;
import org.junit.platform.engine.support.hierarchical.ExclusiveResource;
import org.junit.platform.engine.support.hierarchical.ExclusiveResource.LockMode;
import org.junit.platform.engine.support.hierarchical.Node;

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;

import static io.cucumber.junit.platform.engine.Constants.EXECUTION_EXCLUSIVE_RESOURCES_PREFIX;
import static io.cucumber.junit.platform.engine.Constants.EXECUTION_MODE_FEATURE_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.READ_SUFFIX;
import static io.cucumber.junit.platform.engine.Constants.READ_WRITE_SUFFIX;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;

@@ -34,13 +24,10 @@ abstract class FeatureElementDescriptor extends AbstractTestDescriptor implement
private final int line;

FeatureElementDescriptor(
ConfigurationParameters parameters, UniqueId uniqueId, String name, TestSource source, int line
CucumberConfiguration configuration, UniqueId uniqueId, String name, TestSource source, int line
) {
super(uniqueId, name, source);
this.executionMode = parameters
.get(EXECUTION_MODE_FEATURE_PROPERTY_NAME,
value -> ExecutionMode.valueOf(value.toUpperCase(Locale.US)))
.orElse(ExecutionMode.CONCURRENT);
this.executionMode = configuration.getExecutionModeFeature();
this.line = line;
}

@@ -56,9 +43,9 @@ int getLine() {
static final class ExamplesDescriptor extends FeatureElementDescriptor {

ExamplesDescriptor(
ConfigurationParameters parameters, UniqueId uniqueId, String name, TestSource source, int line
CucumberConfiguration configuration, UniqueId uniqueId, String name, TestSource source, int line
) {
super(parameters, uniqueId, name, source, line);
super(configuration, uniqueId, name, source, line);
}

@Override
@@ -71,9 +58,9 @@ public Type getType() {
static final class RuleDescriptor extends FeatureElementDescriptor {

RuleDescriptor(
ConfigurationParameters parameters, UniqueId uniqueId, String name, TestSource source, int line
CucumberConfiguration configuration, UniqueId uniqueId, String name, TestSource source, int line
) {
super(parameters, uniqueId, name, source, line);
super(configuration, uniqueId, name, source, line);
}

@Override
@@ -86,10 +73,10 @@ public Type getType() {
static final class ScenarioOutlineDescriptor extends FeatureElementDescriptor {

ScenarioOutlineDescriptor(
ConfigurationParameters parameters, UniqueId uniqueId, String name,
CucumberConfiguration configuration, UniqueId uniqueId, String name,
TestSource source, int line
) {
super(parameters, uniqueId, name, source, line);
super(configuration, uniqueId, name, source, line);
}

@Override
@@ -106,18 +93,19 @@ static final class PickleDescriptor extends FeatureElementDescriptor {
private final Set<ExclusiveResource> exclusiveResources = new LinkedHashSet<>(0);

PickleDescriptor(
ConfigurationParameters parameters, UniqueId uniqueId, String name, TestSource source,
CucumberConfiguration configuration, UniqueId uniqueId, String name, TestSource source,
int line, Pickle pickle
) {
super(parameters, uniqueId, name, source, line);
super(configuration, uniqueId, name, source, line);
this.pickle = pickle;
this.tags = getTags(pickle);
this.tags.forEach(tag -> {
ExclusiveResourceOptions exclusiveResourceOptions = new ExclusiveResourceOptions(parameters, tag);
exclusiveResourceOptions.exclusiveReadWriteResource()
ExclusiveResourceConfiguration exclusiveResourceConfiguration = configuration
.getExclusiveResourceConfiguration(tag.getName());
exclusiveResourceConfiguration.exclusiveReadWriteResource()
.map(resource -> new ExclusiveResource(resource, LockMode.READ_WRITE))
.forEach(exclusiveResources::add);
exclusiveResourceOptions.exclusiveReadResource()
exclusiveResourceConfiguration.exclusiveReadResource()
.map(resource -> new ExclusiveResource(resource, LockMode.READ))
.forEach(exclusiveResources::add);
});
@@ -200,38 +188,6 @@ public Set<TestTag> getTags() {
return tags;
}

Optional<String> getPackage() {
return getSource()
.filter(ClasspathResourceSource.class::isInstance)
.map(ClasspathResourceSource.class::cast)
.map(ClasspathResourceSource::getClasspathResourceName)
.map(ClasspathSupport::packageNameOfResource);
}

private static final class ExclusiveResourceOptions {

private final ConfigurationParameters parameters;

ExclusiveResourceOptions(ConfigurationParameters parameters, TestTag tag) {
this.parameters = new PrefixedConfigurationParameters(
parameters,
EXECUTION_EXCLUSIVE_RESOURCES_PREFIX + tag.getName());
}

public Stream<String> exclusiveReadWriteResource() {
return parameters.get(READ_WRITE_SUFFIX, s -> Arrays.stream(s.split(","))
.map(String::trim))
.orElse(Stream.empty());
}

public Stream<String> exclusiveReadResource() {
return parameters.get(READ_SUFFIX, s -> Arrays.stream(s.split(","))
.map(String::trim))
.orElse(Stream.empty());
}

}

}

}
Loading