Skip to content

Commit 27d5201

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

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
@@ -86,6 +86,7 @@ final class CachingGlue implements Glue {
8686
private Locale locale = null;
8787
private StepExpressionFactory stepExpressionFactory = null;
8888
private boolean dirtyCache = false;
89+
private boolean hasScenarioScopedGlue = false;
8990

9091
CachingGlue(EventBus bus) {
9192
this.bus = bus;
@@ -107,42 +108,47 @@ public void addAfterAllHook(StaticHookDefinition afterAllHook) {
107108
public void addStepDefinition(StepDefinition stepDefinition) {
108109
stepDefinitions.add(stepDefinition);
109110
dirtyCache = true;
111+
hasScenarioScopedGlue |= stepDefinition instanceof ScenarioScoped;
110112
}
111113

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

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

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

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

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

142149
@Override
143150
public void addDataTableType(DataTableTypeDefinition dataTableType) {
144151
dataTableTypeDefinitions.add(dataTableType);
145-
dirtyCache = true;
146152
}
147153

148154
@Override
@@ -168,7 +174,6 @@ public void addDefaultDataTableCellTransformer(
168174
@Override
169175
public void addDocStringType(DocStringTypeDefinition docStringType) {
170176
docStringTypeDefinitions.add(docStringType);
171-
dirtyCache = true;
172177
}
173178

174179
List<StaticHookDefinition> getBeforeAllHooks() {
@@ -245,8 +250,10 @@ void prepareGlue(Locale locale) throws DuplicateStepDefinitionException {
245250
boolean firstTime = stepTypeRegistry == null;
246251
boolean languageChanged = !locale.equals(this.locale);
247252
boolean mustRebuildCache = false;
248-
if (firstTime || languageChanged || dirtyCache) {
253+
if (firstTime || languageChanged || dirtyCache || hasScenarioScopedGlue) {
249254
// conditions changed => invalidate the glue cache
255+
// Note: we have a prudent approach of avoiding caching if
256+
// scenario-scoped glue exist (e.g. cucumber-java8).
250257
this.locale = locale;
251258
stepTypeRegistry = new StepTypeRegistry(locale);
252259
stepExpressionFactory = new StepExpressionFactory(stepTypeRegistry, bus);
@@ -466,14 +473,8 @@ void removeScenarioScopedGlue() {
466473
dirty = true;
467474
dirtyCache = true;
468475
}
469-
if (removeScenarioScopedGlue(dataTableTypeDefinitions)) {
470-
dirty = true;
471-
dirtyCache = true;
472-
}
473-
if (removeScenarioScopedGlue(docStringTypeDefinitions)) {
474-
dirty = true;
475-
dirtyCache = true;
476-
}
476+
dirty |= removeScenarioScopedGlue(dataTableTypeDefinitions);
477+
dirty |= removeScenarioScopedGlue(docStringTypeDefinitions);
477478
if (removeScenarioScopedGlue(parameterTypeDefinitions)) {
478479
dirty = true;
479480
dirtyCache = true;
@@ -484,6 +485,7 @@ void removeScenarioScopedGlue() {
484485
if (dirty) {
485486
stepDefinitionsByPattern.clear();
486487
}
488+
hasScenarioScopedGlue = false;
487489
}
488490

489491
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)