View Javadoc
1   /*
2    * Copyright (c) 2002-2025 Gargoyle Software Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * https://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  package org.htmlunit.javascript.proxyautoconfig;
16  
17  import java.net.MalformedURLException;
18  import java.net.URL;
19  import java.text.DateFormat;
20  import java.text.SimpleDateFormat;
21  import java.util.Calendar;
22  import java.util.Locale;
23  
24  import org.htmlunit.BrowserVersion;
25  import org.htmlunit.SimpleWebTestCase;
26  import org.htmlunit.corejs.javascript.Undefined;
27  import org.htmlunit.javascript.JavaScriptEngine;
28  import org.junit.Test;
29  
30  /**
31   * Tests for the {@link ProxyAutoConfig}.
32   *
33   * @author Ahmed Ashour
34   * @author Ronald Brill
35   */
36  public class ProxyAutoConfigTest extends SimpleWebTestCase {
37  
38      /**
39       * Test case.
40       */
41      @Test
42      public void shExpMatch() {
43          assertTrue(ProxyAutoConfig.shExpMatch("http://home.netscape.com/people/ari/index.html", "*/ari/*"));
44          assertFalse(ProxyAutoConfig.shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*"));
45      }
46  
47      /**
48       * Test case.
49       */
50      @Test
51      public void weekdayRange() {
52          final Calendar calendar = Calendar.getInstance(Locale.ROOT);
53          final DateFormat dateFormat = new SimpleDateFormat("EEE", Locale.ROOT);
54          final String today = dateFormat.format(calendar.getTime()).toUpperCase(Locale.ROOT);
55          calendar.add(Calendar.DAY_OF_MONTH, 1);
56          final String tomorrow = dateFormat.format(calendar.getTime()).toUpperCase(Locale.ROOT);
57          calendar.add(Calendar.DAY_OF_MONTH, -2);
58          final String yesterday = dateFormat.format(calendar.getTime()).toUpperCase(Locale.ROOT);
59          assertTrue(ProxyAutoConfig.weekdayRange(today, Undefined.instance, Undefined.instance));
60          assertTrue(ProxyAutoConfig.weekdayRange(today, tomorrow, Undefined.instance));
61          assertTrue(ProxyAutoConfig.weekdayRange(yesterday, today, Undefined.instance));
62          assertTrue(ProxyAutoConfig.weekdayRange(yesterday, tomorrow, Undefined.instance));
63          assertFalse(ProxyAutoConfig.weekdayRange(tomorrow, yesterday, Undefined.instance));
64      }
65  
66      /**
67       * Test case.
68       */
69      @Test
70      public void dateRange() {
71          final Object undefined = Undefined.instance;
72          final Calendar calendar = Calendar.getInstance(Locale.ROOT);
73          final int today = calendar.get(Calendar.DAY_OF_MONTH);
74          calendar.add(Calendar.DAY_OF_MONTH, 1);
75          final int tomorrow = calendar.get(Calendar.DAY_OF_MONTH);
76          calendar.add(Calendar.DAY_OF_MONTH, -2);
77          final int yesterday = calendar.get(Calendar.DAY_OF_MONTH);
78          assertTrue(ProxyAutoConfig.dateRange(String.valueOf(today),
79                  undefined, undefined, undefined, undefined, undefined, undefined));
80          assertFalse(ProxyAutoConfig.dateRange(String.valueOf(yesterday),
81                  undefined, undefined, undefined, undefined, undefined, undefined));
82          assertFalse(ProxyAutoConfig.dateRange(String.valueOf(tomorrow),
83                  undefined, undefined, undefined, undefined, undefined, undefined));
84      }
85  
86      /**
87       * Test case.
88       */
89      @Test
90      public void timeRange() {
91          final Object undefined = Undefined.instance;
92          final Calendar calendar = Calendar.getInstance(Locale.ROOT);
93          final int now = calendar.get(Calendar.HOUR_OF_DAY);
94          calendar.add(Calendar.HOUR_OF_DAY, 2);
95          final int after = calendar.get(Calendar.HOUR_OF_DAY);
96          calendar.add(Calendar.HOUR_OF_DAY, -4);
97          final int before = calendar.get(Calendar.HOUR_OF_DAY);
98          assertTrue(ProxyAutoConfig.timeRange(String.valueOf(now),
99                  undefined, undefined, undefined, undefined, undefined, undefined));
100         assertFalse(ProxyAutoConfig.timeRange(String.valueOf(before),
101                 undefined, undefined, undefined, undefined, undefined, undefined));
102         assertFalse(ProxyAutoConfig.timeRange(String.valueOf(after),
103                 undefined, undefined, undefined, undefined, undefined, undefined));
104     }
105 
106     /**
107      * Test case.
108      */
109     @Test
110     public void simple() {
111         final String content = "function FindProxyForURL(url, host) { "
112                 + "return \"PROXY proxy.example.com:8080; DIRECT\"; }";
113         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME, content, URL_FIRST);
114         assertEquals("PROXY proxy.example.com:8080; DIRECT", value);
115     }
116 
117     /**
118      * Test case.
119      */
120     @Test
121     public void someConditions() throws MalformedURLException {
122         final String content = "function FindProxyForURL(url, host) {\n"
123                 + "  if (shExpMatch(host,\"*.example.com\")) {\n"
124                 + "    return \"DIRECT\";\n"
125                 + "  }\n"
126 
127                 + "  return \"PROXY proxy.example.com:8000; DIRECT\";\n"
128                 + "}";
129 
130         String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
131                                             content, new URL("ftp://www.example.com"));
132         assertEquals("DIRECT", value);
133 
134         value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME, content, new URL("ftp://example.com"));
135         assertEquals("PROXY proxy.example.com:8000; DIRECT", value);
136     }
137 
138     /**
139      * Test case.
140      */
141     @Test
142     public void bindings() {
143         final String content = "ProxyConfig.bindings.com = 'my_com';\n"
144             + "ProxyConfig.bindings.org = 'my_org';\n"
145             + "ProxyConfig.bindings.net = 'my_net';\n"
146             + "ProxyConfig.bindings.edu = 'my_edu';\n"
147             + "ProxyConfig.bindings.gov = 'my_gov';\n"
148             + "function FindProxyForURL(url, host) {\n"
149             + "  var returnValue = '';\n"
150             + "  for (var x in ProxyConfig.bindings) {\n"
151             + "    returnValue += x + ' ';\n"
152             + "  }\n"
153             + "  return returnValue;\n"
154             + "}\n";
155         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME, content, URL_FIRST);
156         assertEquals("com org net edu gov ", value);
157     }
158 
159     /**
160      * Test case for #1649.
161      */
162     @Test
163     public void isInNet() {
164         final boolean isInNet = ProxyAutoConfig.isInNet("www.1234abcd.abc", "172.16.0.0", "255.240.0.0");
165         assertFalse(isInNet);
166     }
167 
168     /**
169      * Test case for #1911.
170      */
171     @Test
172     public void isInNetRange() {
173         final boolean isInNet = ProxyAutoConfig.isInNet("172.22.0.7", "172.16.0.0", "255.240.0.0");
174         assertTrue(isInNet);
175     }
176 
177     /**
178      * Test case.
179      */
180     @Test
181     public void isPlainHostNameFalse() throws MalformedURLException {
182         final String content = "function FindProxyForURL(url, host) {\n"
183                 + "  if (isPlainHostName('www.mozilla.org')) {\n"
184                 + "    return 'DIRECT';\n"
185                 + "  }\n"
186 
187                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
188                 + "}";
189 
190         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
191                                             content, new URL("https://www.mozilla.org"));
192         assertEquals("PROXY proxy.example.com:8000; DIRECT", value);
193     }
194 
195     /**
196      * Test case.
197      */
198     @Test
199     public void isPlainHostNameTrue() throws MalformedURLException {
200         final String content = "function FindProxyForURL(url, host) {\n"
201                 + "  if (isPlainHostName('www')) {\n"
202                 + "    return 'DIRECT';\n"
203                 + "  }\n"
204 
205                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
206                 + "}";
207 
208         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
209                                             content, new URL("https://www.mozilla.org"));
210         assertEquals("DIRECT", value);
211     }
212 
213     /**
214      * Test case.
215      */
216     @Test
217     public void dnsDomainIsFalse() throws MalformedURLException {
218         final String content = "function FindProxyForURL(url, host) {\n"
219                 + "  if (dnsDomainIs('www', '.mozilla.org')) {\n"
220                 + "    return 'DIRECT';\n"
221                 + "  }\n"
222 
223                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
224                 + "}";
225 
226         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
227                                             content, new URL("https://www.mozilla.org"));
228         assertEquals("PROXY proxy.example.com:8000; DIRECT", value);
229     }
230 
231     /**
232      * Test case.
233      */
234     @Test
235     public void dnsDomainIsTrue() throws MalformedURLException {
236         final String content = "function FindProxyForURL(url, host) {\n"
237                 + "  if (dnsDomainIs('www.mozilla.org', '.mozilla.org')) {\n"
238                 + "    return 'DIRECT';\n"
239                 + "  }\n"
240 
241                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
242                 + "}";
243 
244         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
245                                             content, new URL("https://www.mozilla.org"));
246         assertEquals("DIRECT", value);
247     }
248 
249     /**
250      * Test case.
251      */
252     @Test
253     public void localHostOrDomainIsFalseDomain() throws MalformedURLException {
254         final String content = "function FindProxyForURL(url, host) {\n"
255                 + "  if (localHostOrDomainIs('www.google.com', 'www.mozilla.org')) {\n"
256                 + "    return 'DIRECT';\n"
257                 + "  }\n"
258 
259                 + "   return 'PROXY proxy.example.com:8000; DIRECT';\n"
260                 + "}";
261 
262         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
263                                             content, new URL("https://www.mozilla.org"));
264         assertEquals("PROXY proxy.example.com:8000; DIRECT", value);
265     }
266 
267     /**
268      * Test case.
269      */
270     @Test
271     public void localHostOrDomainIsFalseHostname() throws MalformedURLException {
272         final String content = "function FindProxyForURL(url, host) {\n"
273                 + "  if (localHostOrDomainIs('home.mozilla.org', 'www.mozilla.org')) {\n"
274                 + "    return 'DIRECT';\n"
275                 + "  }\n"
276 
277                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
278                 + "}";
279 
280         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
281                                             content, new URL("https://www.mozilla.org"));
282         assertEquals("PROXY proxy.example.com:8000; DIRECT", value);
283     }
284 
285     /**
286      * Test case.
287      */
288     @Test
289     public void localHostOrDomainIsTrue() throws MalformedURLException {
290         final String content = "function FindProxyForURL(url, host) {\n"
291                 + "  if (localHostOrDomainIs('www.mozilla.org', 'www.mozilla.org')) {\n"
292                 + "    return 'DIRECT';\n"
293                 + "  }\n"
294 
295                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
296                 + "}";
297 
298         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
299                                             content, new URL("https://www.mozilla.org"));
300         assertEquals("DIRECT", value);
301     }
302 
303     /**
304      * Test case.
305      */
306     @Test
307     public void localHostOrDomainIsTrueNoDomain() throws MalformedURLException {
308         final String content = "function FindProxyForURL(url, host) {\n"
309                 + "  if (localHostOrDomainIs('www', 'www.mozilla.org')) {\n"
310                 + "    return 'DIRECT';\n"
311                 + "  }\n"
312 
313                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
314                 + "}";
315 
316         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
317                                             content, new URL("https://www.mozilla.org"));
318         assertEquals("DIRECT", value);
319     }
320 
321     /**
322      * Test case.
323      */
324     @Test
325     public void isResolvableFalse() throws MalformedURLException {
326         final String content = "function FindProxyForURL(url, host) {\n"
327                 + "  if (isResolvable('A17.2547876535.817')) {\n"
328                 + "    return 'DIRECT';\n"
329                 + "  }\n"
330 
331                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
332                 + "}";
333 
334         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
335                                             content, new URL("https://www.mozilla.org"));
336         assertEquals("PROXY proxy.example.com:8000; DIRECT", value);
337     }
338 
339     /**
340      * Test case.
341      */
342     @Test
343     public void isResolvableTrue() throws MalformedURLException {
344         final String content = "function FindProxyForURL(url, host) {\n"
345                 + "  if (isResolvable('www.mozilla.org')) {\n"
346                 + "    return 'DIRECT';\n"
347                 + "  }\n"
348 
349                 + "  return 'PROXY proxy.example.com:8000; DIRECT';\n"
350                 + "}";
351 
352         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
353                                             content, new URL("https://www.mozilla.org"));
354         assertEquals("DIRECT", value);
355     }
356 
357     /**
358      * Test case.
359      */
360     @Test
361     public void dnsResolve() throws MalformedURLException {
362         final String content = "function FindProxyForURL(url, host) {\n"
363                 + "  return dnsResolve('www.wetator.org');\n"
364                 + "}";
365 
366         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
367                                             content, new URL("https://www.mozilla.org"));
368         assertTrue(value, value.contains("."));
369     }
370 
371     /**
372      * Test case.
373      */
374     @Test
375     public void convertAddr() throws MalformedURLException {
376         final String content = "function FindProxyForURL(url, host) {\n"
377                 + "  return convert_addr('192.0.2.172');\n"
378                 + "}";
379 
380         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
381                                             content, new URL("https://www.mozilla.org"));
382         assertEquals("-1073741140", value);
383     }
384 
385     /**
386      * Test case.
387      */
388     @Test
389     public void myIpAddress() throws MalformedURLException {
390         final String content = "function FindProxyForURL(url, host) {\n"
391                 + "  return myIpAddress();\n"
392                 + "}";
393 
394         final String value = JavaScriptEngine.evaluateProxyAutoConfig(BrowserVersion.CHROME,
395                                             content, new URL("https://www.mozilla.org"));
396         assertTrue(value, value.contains("."));
397     }
398 }