1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.jexl3;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
21 import static org.junit.jupiter.api.Assertions.assertNotNull;
22 import static org.junit.jupiter.api.Assertions.assertThrows;
23
24 import java.io.StringWriter;
25
26 import org.junit.jupiter.api.Test;
27
28
29
30
31
32
33
34 class JxltFeatureEnforcementTest {
35
36 @Test
37 void testTemplateScriptHonorsLoopFeature() {
38 final JexlFeatures features = new JexlFeatures().loops(false);
39 final JexlEngine jexl = new JexlBuilder().features(features).create();
40 final JxltEngine jxlt = jexl.createJxltEngine();
41
42 assertThrows(JexlException.Feature.class,
43 () -> jxlt.createTemplate("$$ while(true);\nhello"),
44 "template script must honor the engine loop feature lockdown");
45 }
46
47 @Test
48 void testJxltExpressionHonorsMethodCallFeature() {
49 final JexlFeatures features = new JexlFeatures().methodCall(false);
50 final JexlEngine jexl = new JexlBuilder().features(features).create();
51 final JxltEngine jxlt = jexl.createJxltEngine();
52
53 final JxltEngine.Exception xjxlt = assertThrows(JxltEngine.Exception.class,
54 () -> jxlt.createExpression("${'abc'.size()}"),
55 "JXLT expression must honor the engine method-call feature lockdown");
56 assertInstanceOf(JexlException.Feature.class, xjxlt.getCause());
57 }
58
59 @Test
60 void testFeaturesRestoredAfterJxltParse() {
61
62 final JexlFeatures features = new JexlFeatures().loops(false);
63 final JexlEngine jexl = new JexlBuilder().features(features).create();
64 final JxltEngine jxlt = jexl.createJxltEngine();
65 assertThrows(JexlException.Feature.class, () -> jxlt.createTemplate("$$ for(var i : [1,2]) {}\nx"));
66
67 assertEquals(42, jexl.createScript("40 + 2").execute(null));
68 assertThrows(JexlException.Feature.class, () -> jexl.createScript("while(true);"));
69 }
70
71 @Test
72 void testPermissiveTemplateStillWorks() {
73
74 final JexlEngine jexl = new JexlBuilder().create();
75 final JxltEngine jxlt = jexl.createJxltEngine();
76 final JxltEngine.Template t = jxlt.createTemplate("$$ for(var i : [1,2]) {\nhello ${i}\n$$ }");
77 assertNotNull(t);
78 final StringWriter strw = new StringWriter();
79 t.evaluate(new MapContext(), strw);
80 assertEquals("hello 1\nhello 2\n", strw.toString());
81 }
82 }