Skip to content

Commit f3efd5d

Browse files
author
Julien Kronegg
committed
fix: disabling cache if scenario-scoped glue is present for #2971
1 parent ff2468c commit f3efd5d

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

cucumber-core/src/main/java/io/cucumber/core/runner/CachingGlue.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ final class CachingGlue implements Glue {
8787
private Locale locale = null;
8888
private StepExpressionFactory stepExpressionFactory = null;
8989
private boolean dirtyCache = false;
90+
private boolean hasScenarioScopedGlue = false;
9091

9192
CachingGlue(EventBus bus) {
9293
this.bus = bus;
@@ -108,42 +109,47 @@ public void addAfterAllHook(StaticHookDefinition afterAllHook) {
108109
public void addStepDefinition(StepDefinition stepDefinition) {
109110
stepDefinitions.add(stepDefinition);
110111
dirtyCache = true;
112+
hasScenarioScopedGlue |= stepDefinition instanceof ScenarioScoped;
111113
}
112114

113115
@Override
114116
public void addBeforeHook(HookDefinition hookDefinition) {
115117
beforeHooks.add(CoreHookDefinition.create(hookDefinition, bus::generateId));
116118
beforeHooks.sort(HOOK_ORDER_ASCENDING);
119+
hasScenarioScopedGlue |= hookDefinition instanceof ScenarioScoped;
117120
}
118121

119122
@Override
120123
public void addAfterHook(HookDefinition hookDefinition) {
121124
afterHooks.add(CoreHookDefinition.create(hookDefinition, bus::generateId));
122125
afterHooks.sort(HOOK_ORDER_ASCENDING);
126+
hasScenarioScopedGlue |= hookDefinition instanceof ScenarioScoped;
123127
}
124128

125129
@Override
126130
public void addBeforeStepHook(HookDefinition hookDefinition) {
127131
beforeStepHooks.add(CoreHookDefinition.create(hookDefinition, bus::generateId));
128132
beforeStepHooks.sort(HOOK_ORDER_ASCENDING);
133+
hasScenarioScopedGlue |= hookDefinition instanceof ScenarioScoped;
129134
}
130135

131136
@Override
132137
public void addAfterStepHook(HookDefinition hookDefinition) {
133138
afterStepHooks.add(CoreHookDefinition.create(hookDefinition, bus::generateId));
134139
afterStepHooks.sort(HOOK_ORDER_ASCENDING);
140+
hasScenarioScopedGlue |= hookDefinition instanceof ScenarioScoped;
135141
}
136142

137143
@Override
138144
public void addParameterType(ParameterTypeDefinition parameterType) {
139145
parameterTypeDefinitions.add(parameterType);
140146
dirtyCache = true;
147+
hasScenarioScopedGlue |= parameterType instanceof ScenarioScoped;
141148
}
142149

143150
@Override
144151
public void addDataTableType(DataTableTypeDefinition dataTableType) {
145152
dataTableTypeDefinitions.add(dataTableType);
146-
dirtyCache = true;
147153
}
148154

149155
@Override
@@ -169,7 +175,6 @@ public void addDefaultDataTableCellTransformer(
169175
@Override
170176
public void addDocStringType(DocStringTypeDefinition docStringType) {
171177
docStringTypeDefinitions.add(docStringType);
172-
dirtyCache = true;
173178
}
174179

175180
List<StaticHookDefinition> getBeforeAllHooks() {
@@ -246,8 +251,10 @@ void prepareGlue(Locale locale) throws DuplicateStepDefinitionException {
246251
boolean firstTime = stepTypeRegistry == null;
247252
boolean languageChanged = !locale.equals(this.locale);
248253
boolean mustRebuildCache = false;
249-
if (firstTime || languageChanged || dirtyCache) {
254+
if (firstTime || languageChanged || dirtyCache || hasScenarioScopedGlue) {
250255
// conditions changed => invalidate the glue cache
256+
// Note: we have a prudent approach of avoiding caching if
257+
// scenario-scoped glue exist (e.g. cucumber-java8).
251258
this.locale = locale;
252259
stepTypeRegistry = new StepTypeRegistry(locale);
253260
stepExpressionFactory = new StepExpressionFactory(stepTypeRegistry, bus);
@@ -483,14 +490,8 @@ void removeScenarioScopedGlue() {
483490
dirty = true;
484491
dirtyCache = true;
485492
}
486-
if (removeScenarioScopedGlue(dataTableTypeDefinitions)) {
487-
dirty = true;
488-
dirtyCache = true;
489-
}
490-
if (removeScenarioScopedGlue(docStringTypeDefinitions)) {
491-
dirty = true;
492-
dirtyCache = true;
493-
}
493+
dirty |= removeScenarioScopedGlue(dataTableTypeDefinitions);
494+
dirty |= removeScenarioScopedGlue(docStringTypeDefinitions);
494495
if (removeScenarioScopedGlue(parameterTypeDefinitions)) {
495496
dirty = true;
496497
dirtyCache = true;
@@ -501,6 +502,7 @@ void removeScenarioScopedGlue() {
501502
if (dirty) {
502503
stepDefinitionsByPattern.clear();
503504
}
505+
hasScenarioScopedGlue = false;
504506
}
505507

506508
private boolean removeScenarioScopedGlue(Iterable<?> glues) {

cucumber-core/src/test/java/io/cucumber/core/runner/CachingGlueTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ void prepareGlue_cache_evicted_when_dataTableType_added() {
599599
StepTypeRegistry stepTypeRegistry2 = glue.getStepTypeRegistry();
600600

601601
// Then
602-
assertThat(stepTypeRegistry1 != stepTypeRegistry2, is(true));
602+
assertThat(stepTypeRegistry1 == stepTypeRegistry2, is(true));
603603
}
604604

605605
@Test
@@ -614,7 +614,7 @@ void prepareGlue_cache_evicted_when_docString_added() {
614614
StepTypeRegistry stepTypeRegistry2 = glue.getStepTypeRegistry();
615615

616616
// Then
617-
assertThat(stepTypeRegistry1 != stepTypeRegistry2, is(true));
617+
assertThat(stepTypeRegistry1 == stepTypeRegistry2, is(true));
618618
}
619619

620620
private static class MockedScenarioScopedStepDefinition extends StubStepDefinition implements ScenarioScoped {

0 commit comments

Comments
 (0)