View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.utils;
18  
19  import static org.apache.juneau.common.utils.Utils.*;
20  import static org.junit.jupiter.api.Assertions.*;
21  
22  import org.apache.juneau.*;
23  import org.apache.juneau.common.utils.*;
24  import org.apache.juneau.svl.*;
25  import org.junit.jupiter.api.*;
26  
27  class StringVarResolver_Test extends TestBase {
28  
29  	//====================================================================================================
30  	// test - Basic tests
31  	//====================================================================================================
32  	@Test void a06_test() {
33  		var vr = VarResolver.create().vars(XVar.class).build();
34  
35  		var t = (String)null;
36  		assertEquals(null, vr.resolve(t));
37  
38  		t = "";
39  		assertEquals("", vr.resolve(t));
40  
41  		t = "foo";
42  		assertEquals("foo", vr.resolve(t));
43  
44  		t = "$X{y}";
45  		assertEquals("xyx", vr.resolve(t));
46  
47  		t = "$X{y}x";
48  		assertEquals("xyxx", vr.resolve(t));
49  
50  		t = "x$X{y}";
51  		assertEquals("xxyx", vr.resolve(t));
52  
53  		t = "$X{y}$X{y}";
54  		assertEquals("xyxxyx", vr.resolve(t));
55  
56  		t = "z$X{y}z$X{y}z";
57  		assertEquals("zxyxzxyxz", vr.resolve(t));
58  
59  		t = "$X{$X{y}}";
60  		assertEquals("xxyxx", vr.resolve(t));
61  
62  		t = "$X{z$X{y}z}";
63  		assertEquals("xzxyxzx", vr.resolve(t));
64  
65  		t = "$X.{y}";
66  		assertEquals("$X.{y}", vr.resolve(t));
67  
68  		t = "z$X.{y}z";
69  		assertEquals("z$X.{y}z", vr.resolve(t));
70  
71  		t = "z$X.{$X.{z}}z";
72  		assertEquals("z$X.{$X.{z}}z", vr.resolve(t));
73  
74  		// Non-existent vars
75  		t = "$Y{y}";
76  		assertEquals("$Y{y}", vr.resolve(t));
77  
78  		t = "$Y{y}x";
79  		assertEquals("$Y{y}x", vr.resolve(t));
80  
81  		t = "x$Y{y}";
82  		assertEquals("x$Y{y}", vr.resolve(t));
83  	}
84  
85  	public static class XVar extends SimpleVar {
86  		public XVar() {
87  			super("X");
88  		}
89  		@Override
90  		public String resolve(VarResolverSession session, String arg) {
91  			return "x" + arg + "x";
92  		}
93  	}
94  
95  	//====================================================================================================
96  	// test - No-name variables
97  	//====================================================================================================
98  	@Test void a01_test2() {
99  		var vr = VarResolver.create().vars(BlankVar.class).build();
100 		var t = "${y}";
101 
102 		assertEquals("xyx", vr.resolve(t));
103 
104 		t = "${${y}}";
105 		assertEquals("xxyxx", vr.resolve(t));
106 
107 		t = "${${y}${y}}";
108 		assertEquals("xxyxxyxx", vr.resolve(t));
109 
110 		t = "z${z${y}z}z";
111 		assertEquals("zxzxyxzxz", vr.resolve(t));
112 	}
113 
114 	public static class BlankVar extends SimpleVar {
115 		public BlankVar() {
116 			super("");
117 		}
118 		@Override
119 		public String resolve(VarResolverSession session, String arg) {
120 			return "x" + arg + "x";
121 		}
122 	}
123 
124 	//====================================================================================================
125 	// test - No-name variables
126 	//====================================================================================================
127 	@Test void a02_escaped$() {
128 		var vr = VarResolver.create().vars(BlankVar.class).build();
129 		var t = "${y}";
130 
131 		assertEquals("xyx", vr.resolve(t));
132 		t = "\\${y}";
133 		assertEquals("${y}", vr.resolve(t));
134 
135 		t = "foo\\${y}foo";
136 		assertEquals("foo${y}foo", vr.resolve(t));
137 	}
138 
139 	//====================================================================================================
140 	// test - Escape sequences.
141 	//====================================================================================================
142 	@Test void a03_escapedSequences() {
143 		var vr = VarResolver.create().vars(XVar.class).build();
144 		var b = '\\';
145 		var t = "A|A".replace('|',b);
146 
147 		assertEquals("A|A".replace('|',b), vr.resolve(t));
148 		t = "A||A".replace('|',b);
149 		assertEquals("A|A".replace('|',b), vr.resolve(t));
150 		t = "A|A$X{B}".replace('|',b);
151 		assertEquals("A|AxBx".replace('|',b), vr.resolve(t));
152 		t = "A||A$X{B}".replace('|',b);
153 		assertEquals("A|AxBx".replace('|',b), vr.resolve(t));
154 		t = "A|$X{B}".replace('|',b);
155 		assertEquals("A$X{B}".replace('|',b), vr.resolve(t));
156 		t = "A||$X{B}".replace('|',b);
157 		assertEquals("A|xBx".replace('|',b), vr.resolve(t));
158 		t = "A$X|{B}".replace('|',b);
159 		assertEquals("A$X{B}".replace('|',b), vr.resolve(t));
160 		t = "A$X{B|}".replace('|',b);
161 		assertEquals("A$X{B}".replace('|',b), vr.resolve(t));
162 		t = "A$X{B}|".replace('|',b);
163 		assertEquals("AxBx|".replace('|',b), vr.resolve(t));
164 	}
165 
166 	//====================================================================================================
167 	// Test $E variables
168 	//====================================================================================================
169 	@Test void a07_test$E() {
170 		var t = "$E{PATH}";
171 
172 		assertFalse(Utils.isEmpty(VarResolver.DEFAULT.resolve(t)));
173 	}
174 
175 	//====================================================================================================
176 	// Test that StringResolver(parent) works as expected.
177 	//====================================================================================================
178 	@Test void a04_parent() {
179 		var vr = VarResolver.create().defaultVars().vars(XMultipartVar.class).build();
180 		System.setProperty("a", "a1");
181 		System.setProperty("b", "b1");
182 
183 		var t = "$X{$S{a},$S{b}}";
184 		assertEquals("a1+b1", vr.resolve(t));
185 		t = "$X{$S{a}}";
186 		assertEquals("a1", vr.resolve(t));
187 	}
188 
189 	public static class XMultipartVar extends MultipartVar {
190 		public XMultipartVar() {
191 			super("X");
192 		}
193 		@Override /* MultipartVar */
194 		public String resolve(VarResolverSession session, String[] args) {
195 			return Utils.join(args, '+');
196 		}
197 	}
198 
199 	//====================================================================================================
200 	// Test false triggers.
201 	//====================================================================================================
202 	@Test void a05_falseTriggers() {
203 		var vrb = VarResolver.create().defaultVars();
204 
205 		// Should reject names with characters outside A-Za-z
206 		for (Class<? extends Var> c : a(InvalidVar1.class, InvalidVar2.class, InvalidVar3.class, InvalidVar4.class, InvalidVar5.class)) {
207 			assertThrows(Exception.class, ()->VarResolver.create().vars(c).build());
208 		}
209 
210 		var vr = vrb.build();
211 
212 		// These should all be unchanged.
213 		var in = "$@{foobar}";
214 		assertEquals(in, vr.resolve(in));
215 		in = "$[{foobar}";
216 		assertEquals(in, vr.resolve(in));
217 		in = "$`{foobar}";
218 		assertEquals(in, vr.resolve(in));
219 		in = "$|{foobar}";
220 		assertEquals(in, vr.resolve(in));
221 		in = "${{foobar}";
222 		assertEquals(in, vr.resolve(in));
223 		in = "${$foobar}";
224 		assertEquals(in, vr.resolve(in));
225 
226 		System.setProperty("foobar", "baz");
227 
228 		in = "$";
229 		assertEquals(in, vr.resolve(in));
230 
231 		in = "$S";
232 		assertEquals(in, vr.resolve(in));
233 
234 		in = "$S{";
235 		assertEquals(in, vr.resolve(in));
236 
237 		in = "$S{foobar";
238 
239 		assertEquals(in, vr.resolve(in));
240 		in = "$S{foobar}$";
241 		assertEquals("baz$", vr.resolve(in));
242 
243 		in = "$S{foobar}$S";
244 		assertEquals("baz$S", vr.resolve(in));
245 
246 		in = "$S{foobar}$S{";
247 		assertEquals("baz$S{", vr.resolve(in));
248 
249 		in = "$S{foobar}$S{foobar";
250 		assertEquals("baz$S{foobar", vr.resolve(in));
251 
252 		System.clearProperty("foobar");
253 
254 		// Test nulls returned by StringVar.
255 		// Should be converted to blanks.
256 		vrb.vars(AlwaysNullVar.class);
257 
258 		vr = vrb.build();
259 
260 		in = "$A{xxx}";
261 		assertEquals("", vr.resolve(in));
262 		in = "x$A{xxx}";
263 		assertEquals("x", vr.resolve(in));
264 		in = "$A{xxx}x";
265 		assertEquals("x", vr.resolve(in));
266 	}
267 
268 	public static class AlwaysNullVar extends SimpleVar {
269 		public AlwaysNullVar() {
270 			super("A");
271 		}
272 		@Override
273 		public String resolve(VarResolverSession session, String key) {
274 			return null;
275 		}
276 	}
277 
278 	public static class InvalidVar extends SimpleVar {
279 		public InvalidVar(String c) {
280 			super(c);
281 		}
282 		@Override
283 		public String resolve(VarResolverSession session, String key) {
284 			return null;
285 		}
286 	}
287 
288 	public static class InvalidVar1 extends InvalidVar {
289 		public InvalidVar1() {
290 			super(null);
291 		}
292 	}
293 	public static class InvalidVar2 extends InvalidVar {
294 		public InvalidVar2() {
295 			super("@");
296 		}
297 	}
298 	public static class InvalidVar3 extends InvalidVar {
299 		public InvalidVar3() {
300 			super("[");
301 		}
302 	}
303 	public static class InvalidVar4 extends InvalidVar {
304 		public InvalidVar4() {
305 			super("`");
306 		}
307 	}
308 	public static class InvalidVar5 extends InvalidVar {
309 		public InvalidVar5() {
310 			super("|");
311 		}
312 	}
313 }