Skip to content

Commit ca345cd

Browse files
authored
Merge pull request #1357 from HubSpot/jasmith_hubspot/fatal-error-deferred-exception
feat(eager): add FATAL error when a node is deferred due to an exception
2 parents 9bb72a6 + e34cfa3 commit ca345cd

6 files changed

Lines changed: 42 additions & 6 deletions

File tree

‎src/main/java/com/hubspot/jinjava/tree/ExpressionNode.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.hubspot.jinjava.interpret.DeferredValueException;
1919
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
20+
import com.hubspot.jinjava.interpret.TemplateError;
2021
import com.hubspot.jinjava.lib.expression.DefaultExpressionStrategy;
2122
import com.hubspot.jinjava.lib.expression.ExpressionStrategy;
2223
import com.hubspot.jinjava.tree.output.OutputNode;
@@ -49,6 +50,11 @@ public OutputNode render(JinjavaInterpreter interpreter) {
4950
return expressionStrategy.interpretOutput(master, interpreter);
5051
} catch (DeferredValueException e) {
5152
interpreter.getContext().handleDeferredNode(this);
53+
if (interpreter.getConfig().getExecutionMode().useEagerParser()) {
54+
interpreter.addError(
55+
TemplateError.fromException(e, getLineNumber(), getStartPosition())
56+
);
57+
}
5258
return new RenderedOutputNode(master.getImage());
5359
} finally {
5460
postProcess(interpreter);

‎src/main/java/com/hubspot/jinjava/tree/TagNode.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.hubspot.jinjava.interpret.InvalidInputException;
2222
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
2323
import com.hubspot.jinjava.interpret.OutputTooBigException;
24+
import com.hubspot.jinjava.interpret.TemplateError;
2425
import com.hubspot.jinjava.lib.tag.FlexibleTag;
2526
import com.hubspot.jinjava.lib.tag.Tag;
2627
import com.hubspot.jinjava.tree.output.OutputNode;
@@ -58,6 +59,11 @@ public OutputNode render(JinjavaInterpreter interpreter) {
5859
return tag.interpretOutput(this, interpreter);
5960
} catch (DeferredValueException e) {
6061
interpreter.getContext().handleDeferredNode(this);
62+
if (interpreter.getConfig().getExecutionMode().useEagerParser()) {
63+
interpreter.addError(
64+
TemplateError.fromException(e, getLineNumber(), getStartPosition())
65+
);
66+
}
6167
return new RenderedOutputNode(reconstructImage());
6268
} catch (
6369
InterpretException

‎src/test/java/com/hubspot/jinjava/EagerTest.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.hubspot.jinjava.interpret.Context;
1010
import com.hubspot.jinjava.interpret.DeferredValue;
1111
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
12+
import com.hubspot.jinjava.interpret.TemplateError.ErrorType;
1213
import com.hubspot.jinjava.loader.LocationResolver;
1314
import com.hubspot.jinjava.loader.RelativePathResolver;
1415
import com.hubspot.jinjava.loader.ResourceLocator;
@@ -1591,6 +1592,14 @@ public void itFailsOnModificationInAliasedMacro() {
15911592
interpreter.render(input);
15921593
// We don't support this
15931594
assertThat(interpreter.getContext().getDeferredNodes()).isNotEmpty();
1595+
assertThat(interpreter.getErrors())
1596+
.singleElement()
1597+
.satisfies(error -> {
1598+
assertThat(error.getSeverity()).isEqualTo(ErrorType.FATAL);
1599+
assertThat(error.getMessage())
1600+
.contains("Cannot modify temporary import alias outside of import tag");
1601+
});
1602+
interpreter.removeLastError();
15941603
}
15951604

15961605
@Test

‎src/test/java/com/hubspot/jinjava/el/ext/eager/EagerAstDotTest.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import com.hubspot.jinjava.interpret.Context;
1111
import com.hubspot.jinjava.interpret.DeferredValue;
1212
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
13+
import com.hubspot.jinjava.interpret.TemplateError;
14+
import com.hubspot.jinjava.interpret.TemplateError.ErrorType;
1315
import com.hubspot.jinjava.mode.EagerExecutionMode;
1416
import com.hubspot.jinjava.random.RandomNumberGeneratorStrategy;
1517
import com.hubspot.jinjava.testobjects.EagerAstDotTestObjects;
@@ -74,5 +76,8 @@ public void itDefersNodeWhenNestedDeferredMapDotThrowsDeferredValueException() {
7476
assertThat(interpreter.render("{{ foo_map.bar.deferred }}"))
7577
.isEqualTo("{{ foo_map.bar.deferred }}");
7678
assertThat(interpreter.getContext().getDeferredNodes()).isNotEmpty();
79+
assertThat(interpreter.getErrors())
80+
.extracting(TemplateError::getSeverity)
81+
.containsExactly(ErrorType.FATAL);
7782
}
7883
}

‎src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerDoTagTest.java‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import com.hubspot.jinjava.LegacyOverrides;
88
import com.hubspot.jinjava.interpret.DeferredValue;
99
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
10+
import com.hubspot.jinjava.interpret.TemplateError;
1011
import com.hubspot.jinjava.interpret.TemplateError.ErrorReason;
12+
import com.hubspot.jinjava.interpret.TemplateError.ErrorType;
1113
import com.hubspot.jinjava.lib.tag.DoTagTest;
1214
import com.hubspot.jinjava.lib.tag.Tag;
1315
import com.hubspot.jinjava.mode.EagerExecutionMode;
@@ -65,8 +67,11 @@ public void itLimitsLength() {
6567
}
6668
context.setDeferredExecutionMode(true);
6769
interpreter.render(String.format("{%% do deferred.append('%s') %%}", tooLong));
68-
assertThat(interpreter.getErrors()).hasSize(1);
69-
assertThat(interpreter.getErrors().get(0).getReason())
70-
.isEqualTo(ErrorReason.OUTPUT_TOO_BIG);
70+
assertThat(interpreter.getErrors())
71+
.extracting(TemplateError::getReason)
72+
.containsExactly(ErrorReason.EXCEPTION, ErrorReason.OUTPUT_TOO_BIG);
73+
assertThat(interpreter.getErrors().get(0).getSeverity()).isEqualTo(ErrorType.FATAL);
74+
assertThat(interpreter.getErrors().get(0).getMessage())
75+
.contains("Can not convert deferred result to string");
7176
}
7277
}

‎src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerSetTagTest.java‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import com.hubspot.jinjava.ExpectedNodeInterpreter;
77
import com.hubspot.jinjava.interpret.DeferredValue;
88
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
9+
import com.hubspot.jinjava.interpret.TemplateError;
910
import com.hubspot.jinjava.interpret.TemplateError.ErrorReason;
11+
import com.hubspot.jinjava.interpret.TemplateError.ErrorType;
1012
import com.hubspot.jinjava.lib.tag.SetTagTest;
1113
import com.hubspot.jinjava.mode.EagerExecutionMode;
1214
import com.hubspot.jinjava.objects.Namespace;
@@ -165,9 +167,12 @@ public void itLimitsLength() {
165167
}
166168
context.setDeferredExecutionMode(true);
167169
interpreter.render(String.format("{%% set deferred = '%s' %%}", tooLong));
168-
assertThat(interpreter.getErrors()).hasSize(1);
169-
assertThat(interpreter.getErrors().get(0).getReason())
170-
.isEqualTo(ErrorReason.OUTPUT_TOO_BIG);
170+
assertThat(interpreter.getErrors())
171+
.extracting(TemplateError::getReason)
172+
.containsExactly(ErrorReason.EXCEPTION, ErrorReason.OUTPUT_TOO_BIG);
173+
assertThat(interpreter.getErrors().get(0).getSeverity()).isEqualTo(ErrorType.FATAL);
174+
assertThat(interpreter.getErrors().get(0).getMessage())
175+
.contains("Output too big for eager execution");
171176
}
172177

173178
@Test

0 commit comments

Comments
 (0)