• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #define LOG_TAG "ProxyResolverTest"
6 #include <utils/Log.h>
7 
8 #include <string.h>
9 
10 #include <gtest/gtest.h>
11 
12 #include "android_runtime/AndroidRuntime.h"
13 #include "proxy_test_script.h"
14 #include "proxy_resolver_v8.h"
15 
16 using namespace android;
17 namespace net {
18 namespace {
19 
20 // Javascript bindings for ProxyResolverV8, which returns mock values.
21 // Each time one of the bindings is called into, we push the input into a
22 // list, for later verification.
23 class MockJSBindings : public ProxyResolverJSBindings, public ProxyErrorListener {
24  public:
MockJSBindings()25   MockJSBindings() : my_ip_address_count(0), my_ip_address_ex_count(0) {}
26 
MyIpAddress(std::string * ip_address)27   virtual bool MyIpAddress(std::string* ip_address) {
28     my_ip_address_count++;
29     *ip_address = my_ip_address_result;
30     return !my_ip_address_result.empty();
31   }
32 
MyIpAddressEx(std::string * ip_address_list)33   virtual bool MyIpAddressEx(std::string* ip_address_list) {
34     my_ip_address_ex_count++;
35     *ip_address_list = my_ip_address_ex_result;
36     return !my_ip_address_ex_result.empty();
37   }
38 
DnsResolve(const std::string & host,std::string * ip_address)39   virtual bool DnsResolve(const std::string& host, std::string* ip_address) {
40     dns_resolves.push_back(host);
41     *ip_address = dns_resolve_result;
42     return !dns_resolve_result.empty();
43   }
44 
DnsResolveEx(const std::string & host,std::string * ip_address_list)45   virtual bool DnsResolveEx(const std::string& host,
46                             std::string* ip_address_list) {
47     dns_resolves_ex.push_back(host);
48     *ip_address_list = dns_resolve_ex_result;
49     return !dns_resolve_ex_result.empty();
50   }
51 
AlertMessage(String16 message)52   virtual void AlertMessage(String16 message) {
53     String8 m8(message);
54     std::string mstd(m8.string());
55 
56     ALOGD("PAC-alert: %s\n", mstd.c_str());  // Helpful when debugging.
57     alerts.push_back(mstd);
58   }
59 
ErrorMessage(const String16 message)60   virtual void ErrorMessage(const String16 message) {
61     String8 m8(message);
62     std::string mstd(m8.string());
63 
64     ALOGD("PAC-error: %s\n", mstd.c_str());  // Helpful when debugging.
65     errors.push_back(mstd);
66   }
67 
Shutdown()68   virtual void Shutdown() {}
69 
70   // Mock values to return.
71   std::string my_ip_address_result;
72   std::string my_ip_address_ex_result;
73   std::string dns_resolve_result;
74   std::string dns_resolve_ex_result;
75 
76   // Inputs we got called with.
77   std::vector<std::string> alerts;
78   std::vector<std::string> errors;
79   std::vector<std::string> dns_resolves;
80   std::vector<std::string> dns_resolves_ex;
81   int my_ip_address_count;
82   int my_ip_address_ex_count;
83 };
84 
85 // This is the same as ProxyResolverV8, but it uses mock bindings in place of
86 // the default bindings, and has a helper function to load PAC scripts from
87 // disk.
88 class ProxyResolverV8WithMockBindings : public ProxyResolverV8 {
89  public:
ProxyResolverV8WithMockBindings(MockJSBindings * mock_js_bindings)90   ProxyResolverV8WithMockBindings(MockJSBindings* mock_js_bindings) :
91       ProxyResolverV8(mock_js_bindings, mock_js_bindings), mock_js_bindings_(mock_js_bindings) {
92   }
93 
mock_js_bindings() const94   MockJSBindings* mock_js_bindings() const {
95     return mock_js_bindings_;
96   }
97 
98  private:
99   MockJSBindings* mock_js_bindings_;
100 };
101 
102 // Doesn't really matter what these values are for many of the tests.
103 const String16 kQueryUrl("http://www.google.com");
104 const String16 kQueryHost("www.google.com");
105 String16 kResults;
106 
107 String16 currentPac;
108 #define SCRIPT(x) (currentPac = String16(x))
109 
addString(std::vector<std::string> * list,std::string str)110 void addString(std::vector<std::string>* list, std::string str) {
111   if (str.compare(0, 6, "DIRECT") == 0) {
112     list->push_back("DIRECT");
113   } else if (str.compare(0, 6, "PROXY ") == 0) {
114     list->push_back(str.substr(6));
115   } else {
116     ALOGE("Unrecognized proxy string");
117   }
118 }
119 
string16ToProxyList(String16 response)120 std::vector<std::string> string16ToProxyList(String16 response) {
121     std::vector<std::string> ret;
122     String8 response8(response);
123     std::string rstr(response8.string());
124     if (rstr.find(';') == std::string::npos) {
125         addString(&ret, rstr);
126         return ret;
127     }
128     char str[128];
129     rstr.copy(str, 0, rstr.length());
130     const char* pch = strtok(str, ";");
131 
132     while (pch != NULL) {
133         // Skip leading whitespace
134         while ((*pch) == ' ') ++pch;
135         std::string pstring(pch);
136         addString(&ret, pstring);
137 
138         pch = strtok(NULL, "; \t");
139     }
140 
141     return ret;
142 }
143 
StringPrintf(std::string str,int d)144 std::string StringPrintf(std::string str, int d) {
145     char buf[30];
146     sprintf(buf, str.c_str(), d);
147     return std::string(buf);
148 }
149 
TEST(ProxyResolverV8Test,Direct)150 TEST(ProxyResolverV8Test, Direct) {
151   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
152   int result = resolver.SetPacScript(SCRIPT(DIRECT_JS));
153   EXPECT_EQ(OK, result);
154 
155   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
156 
157   EXPECT_EQ(OK, result);
158   std::vector<std::string> proxies = string16ToProxyList(kResults);
159   EXPECT_EQ(proxies.size(), 1U);
160   EXPECT_EQ("DIRECT",proxies[0]);
161 
162   EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size());
163   EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size());
164 }
165 
TEST(ProxyResolverV8Test,ReturnEmptyString)166 TEST(ProxyResolverV8Test, ReturnEmptyString) {
167   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
168   int result = resolver.SetPacScript(SCRIPT(RETURN_EMPTY_STRING_JS));
169   EXPECT_EQ(OK, result);
170 
171   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
172 
173   EXPECT_EQ(OK, result);
174   std::vector<std::string> proxies = string16ToProxyList(kResults);
175   EXPECT_EQ(proxies.size(), 0U);
176 
177   EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size());
178   EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size());
179 }
180 
TEST(ProxyResolverV8Test,Basic)181 TEST(ProxyResolverV8Test, Basic) {
182   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
183   int result = resolver.SetPacScript(SCRIPT(PASSTHROUGH_JS));
184   EXPECT_EQ(OK, result);
185 
186   // The "FindProxyForURL" of this PAC script simply concatenates all of the
187   // arguments into a pseudo-host. The purpose of this test is to verify that
188   // the correct arguments are being passed to FindProxyForURL().
189   {
190     String16 queryUrl("http://query.com/path");
191     String16 queryHost("query.com");
192     result = resolver.GetProxyForURL(queryUrl, queryHost, &kResults);
193     EXPECT_EQ(OK, result);
194     std::vector<std::string> proxies = string16ToProxyList(kResults);
195     EXPECT_EQ(1U, proxies.size());
196     EXPECT_EQ("http.query.com.path.query.com", proxies[0]);
197   }
198   {
199     String16 queryUrl("ftp://query.com:90/path");
200     String16 queryHost("query.com");
201     int result = resolver.GetProxyForURL(queryUrl, queryHost, &kResults);
202 
203     EXPECT_EQ(OK, result);
204     // Note that FindProxyForURL(url, host) does not expect |host| to contain
205     // the port number.
206     std::vector<std::string> proxies = string16ToProxyList(kResults);
207     EXPECT_EQ(1U, proxies.size());
208     EXPECT_EQ("ftp.query.com.90.path.query.com", proxies[0]);
209 
210     EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size());
211     EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size());
212   }
213 
214   // We call this so we'll have code coverage of the function and valgrind will
215   // make sure nothing bad happens.
216   //
217   // NOTE: This is here instead of in its own test so that we'll be calling it
218   // after having done something, in hopes it won't be a no-op.
219   resolver.PurgeMemory();
220 }
221 
TEST(ProxyResolverV8Test,BadReturnType)222 TEST(ProxyResolverV8Test, BadReturnType) {
223   // These are the files of PAC scripts which each return a non-string
224   // types for FindProxyForURL(). They should all fail with
225   // ERR_PAC_SCRIPT_FAILED.
226   static const String16 files[] = {
227       String16(RETURN_UNDEFINED_JS),
228       String16(RETURN_INTEGER_JS),
229       String16(RETURN_FUNCTION_JS),
230       String16(RETURN_OBJECT_JS),
231       String16(RETURN_NULL_JS)
232   };
233 
234   for (size_t i = 0; i < 5; ++i) {
235     ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
236     int result = resolver.SetPacScript(files[i]);
237     EXPECT_EQ(OK, result);
238 
239     result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
240 
241     EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result);
242 
243     MockJSBindings* bindings = resolver.mock_js_bindings();
244     EXPECT_EQ(0U, bindings->alerts.size());
245     ASSERT_EQ(1U, bindings->errors.size());
246     EXPECT_EQ("FindProxyForURL() did not return a string.",
247               bindings->errors[0]);
248   }
249 }
250 
251 // Try using a PAC script which defines no "FindProxyForURL" function.
TEST(ProxyResolverV8Test,NoEntryPoint)252 TEST(ProxyResolverV8Test, NoEntryPoint) {
253   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
254   int result = resolver.SetPacScript(SCRIPT(NO_ENTRYPOINT_JS));
255   EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result);
256 
257   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
258 
259   EXPECT_EQ(ERR_FAILED, result);
260 }
261 
262 // Try loading a malformed PAC script.
TEST(ProxyResolverV8Test,ParseError)263 TEST(ProxyResolverV8Test, ParseError) {
264   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
265   int result = resolver.SetPacScript(SCRIPT(MISSING_CLOSE_BRACE_JS));
266   EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result);
267 
268   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
269 
270   EXPECT_EQ(ERR_FAILED, result);
271 
272   MockJSBindings* bindings = resolver.mock_js_bindings();
273   EXPECT_EQ(0U, bindings->alerts.size());
274 
275   // We get one error during compilation.
276   ASSERT_EQ(1U, bindings->errors.size());
277 
278   EXPECT_EQ("Uncaught SyntaxError: Unexpected end of input",
279             bindings->errors[0]);
280 }
281 
282 // Run a PAC script several times, which has side-effects.
TEST(ProxyResolverV8Test,SideEffects)283 TEST(ProxyResolverV8Test, SideEffects) {
284   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
285   int result = resolver.SetPacScript(SCRIPT(SIDE_EFFECTS_JS));
286 
287   // The PAC script increments a counter each time we invoke it.
288   for (int i = 0; i < 3; ++i) {
289     result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
290     EXPECT_EQ(OK, result);
291     std::vector<std::string> proxies = string16ToProxyList(kResults);
292     EXPECT_EQ(1U, proxies.size());
293     EXPECT_EQ(StringPrintf("sideffect_%d", i),
294               proxies[0]);
295   }
296 
297   // Reload the script -- the javascript environment should be reset, hence
298   // the counter starts over.
299   result = resolver.SetPacScript(SCRIPT(SIDE_EFFECTS_JS));
300   EXPECT_EQ(OK, result);
301 
302   for (int i = 0; i < 3; ++i) {
303     result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
304     EXPECT_EQ(OK, result);
305     std::vector<std::string> proxies = string16ToProxyList(kResults);
306     EXPECT_EQ(1U, proxies.size());
307     EXPECT_EQ(StringPrintf("sideffect_%d", i),
308               proxies[0]);
309   }
310 }
311 
312 // Execute a PAC script which throws an exception in FindProxyForURL.
TEST(ProxyResolverV8Test,UnhandledException)313 TEST(ProxyResolverV8Test, UnhandledException) {
314   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
315   int result = resolver.SetPacScript(SCRIPT(UNHANDLED_EXCEPTION_JS));
316   EXPECT_EQ(OK, result);
317 
318   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
319 
320   EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result);
321 
322   MockJSBindings* bindings = resolver.mock_js_bindings();
323   EXPECT_EQ(0U, bindings->alerts.size());
324   ASSERT_EQ(1U, bindings->errors.size());
325   EXPECT_EQ("Uncaught ReferenceError: undefined_variable is not defined",
326             bindings->errors[0]);
327 }
328 
TEST(ProxyResolverV8Test,ReturnUnicode)329 TEST(ProxyResolverV8Test, ReturnUnicode) {
330   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
331   int result = resolver.SetPacScript(SCRIPT(RETURN_UNICODE_JS));
332   EXPECT_EQ(OK, result);
333 
334   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
335 
336   // The result from this resolve was unparseable, because it
337   // wasn't ASCII.
338   EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result);
339 }
340 
341 // Test the PAC library functions that we expose in the JS environmnet.
TEST(ProxyResolverV8Test,JavascriptLibrary)342 TEST(ProxyResolverV8Test, JavascriptLibrary) {
343   ALOGE("Javascript start");
344   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
345   int result = resolver.SetPacScript(SCRIPT(PAC_LIBRARY_UNITTEST_JS));
346   EXPECT_EQ(OK, result);
347 
348   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
349 
350   // If the javascript side of this unit-test fails, it will throw a javascript
351   // exception. Otherwise it will return "PROXY success:80".
352   EXPECT_EQ(OK, result);
353   std::vector<std::string> proxies = string16ToProxyList(kResults);
354   EXPECT_EQ(1U, proxies.size());
355   EXPECT_EQ("success:80", proxies[0]);
356 
357   EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size());
358   EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size());
359 }
360 
361 // Try resolving when SetPacScriptByData() has not been called.
TEST(ProxyResolverV8Test,NoSetPacScript)362 TEST(ProxyResolverV8Test, NoSetPacScript) {
363   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
364 
365 
366   // Resolve should fail, as we are not yet initialized with a script.
367   int result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
368   EXPECT_EQ(ERR_FAILED, result);
369 
370   // Initialize it.
371   result = resolver.SetPacScript(SCRIPT(DIRECT_JS));
372   EXPECT_EQ(OK, result);
373 
374   // Resolve should now succeed.
375   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
376   EXPECT_EQ(OK, result);
377 
378   // Clear it, by initializing with an empty string.
379   resolver.SetPacScript(SCRIPT());
380 
381   // Resolve should fail again now.
382   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
383   EXPECT_EQ(ERR_FAILED, result);
384 
385   // Load a good script once more.
386   result = resolver.SetPacScript(SCRIPT(DIRECT_JS));
387   EXPECT_EQ(OK, result);
388   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
389   EXPECT_EQ(OK, result);
390 
391   EXPECT_EQ(0U, resolver.mock_js_bindings()->alerts.size());
392   EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size());
393 }
394 
395 // Test marshalling/un-marshalling of values between C++/V8.
TEST(ProxyResolverV8Test,V8Bindings)396 TEST(ProxyResolverV8Test, V8Bindings) {
397   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
398   MockJSBindings* bindings = resolver.mock_js_bindings();
399   bindings->dns_resolve_result = "127.0.0.1";
400   int result = resolver.SetPacScript(SCRIPT(BINDINGS_JS));
401   EXPECT_EQ(OK, result);
402 
403   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
404 
405   EXPECT_EQ(OK, result);
406   std::vector<std::string> proxies = string16ToProxyList(kResults);
407   EXPECT_EQ(1U, proxies.size());
408   EXPECT_EQ("DIRECT", proxies[0]);
409 
410   EXPECT_EQ(0U, resolver.mock_js_bindings()->errors.size());
411 
412   // Alert was called 5 times.
413   ASSERT_EQ(5U, bindings->alerts.size());
414   EXPECT_EQ("undefined", bindings->alerts[0]);
415   EXPECT_EQ("null", bindings->alerts[1]);
416   EXPECT_EQ("undefined", bindings->alerts[2]);
417   EXPECT_EQ("[object Object]", bindings->alerts[3]);
418   EXPECT_EQ("exception from calling toString()", bindings->alerts[4]);
419 
420   // DnsResolve was called 8 times, however only 2 of those were string
421   // parameters. (so 6 of them failed immediately).
422   ASSERT_EQ(2U, bindings->dns_resolves.size());
423   EXPECT_EQ("", bindings->dns_resolves[0]);
424   EXPECT_EQ("arg1", bindings->dns_resolves[1]);
425 
426   // MyIpAddress was called two times.
427   EXPECT_EQ(2, bindings->my_ip_address_count);
428 
429   // MyIpAddressEx was called once.
430   EXPECT_EQ(1, bindings->my_ip_address_ex_count);
431 
432   // DnsResolveEx was called 2 times.
433   ASSERT_EQ(2U, bindings->dns_resolves_ex.size());
434   EXPECT_EQ("is_resolvable", bindings->dns_resolves_ex[0]);
435   EXPECT_EQ("foobar", bindings->dns_resolves_ex[1]);
436 }
437 
438 // Test calling a binding (myIpAddress()) from the script's global scope.
439 // http://crbug.com/40026
TEST(ProxyResolverV8Test,BindingCalledDuringInitialization)440 TEST(ProxyResolverV8Test, BindingCalledDuringInitialization) {
441   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
442 
443   int result = resolver.SetPacScript(SCRIPT(BINDING_FROM_GLOBAL_JS));
444   EXPECT_EQ(OK, result);
445 
446   MockJSBindings* bindings = resolver.mock_js_bindings();
447 
448   // myIpAddress() got called during initialization of the script.
449   EXPECT_EQ(1, bindings->my_ip_address_count);
450 
451   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
452 
453   EXPECT_EQ(OK, result);
454   std::vector<std::string> proxies = string16ToProxyList(kResults);
455   EXPECT_EQ(1U, proxies.size());
456   EXPECT_NE("DIRECT", proxies[0]);
457   EXPECT_EQ("127.0.0.1:80", proxies[0]);
458 
459   // Check that no other bindings were called.
460   EXPECT_EQ(0U, bindings->errors.size());
461   ASSERT_EQ(0U, bindings->alerts.size());
462   ASSERT_EQ(0U, bindings->dns_resolves.size());
463   EXPECT_EQ(0, bindings->my_ip_address_ex_count);
464   ASSERT_EQ(0U, bindings->dns_resolves_ex.size());
465 }
466 
467 // Try loading a PAC script that ends with a comment and has no terminal
468 // newline. This should not cause problems with the PAC utility functions
469 // that we add to the script's environment.
470 // http://crbug.com/22864
TEST(ProxyResolverV8Test,EndsWithCommentNoNewline)471 TEST(ProxyResolverV8Test, EndsWithCommentNoNewline) {
472   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
473   int result = resolver.SetPacScript(SCRIPT(ENDS_WITH_COMMENT_JS));
474   EXPECT_EQ(OK, result);
475 
476   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
477 
478   EXPECT_EQ(OK, result);
479   std::vector<std::string> proxies = string16ToProxyList(kResults);
480   EXPECT_EQ(1U, proxies.size());
481   EXPECT_NE("DIRECT", proxies[0]);
482   EXPECT_EQ("success:80", proxies[0]);
483 }
484 
485 // Try loading a PAC script that ends with a statement and has no terminal
486 // newline. This should not cause problems with the PAC utility functions
487 // that we add to the script's environment.
488 // http://crbug.com/22864
TEST(ProxyResolverV8Test,EndsWithStatementNoNewline)489 TEST(ProxyResolverV8Test, EndsWithStatementNoNewline) {
490   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
491   int result = resolver.SetPacScript(
492       SCRIPT(ENDS_WITH_STATEMENT_NO_SEMICOLON_JS));
493   EXPECT_EQ(OK, result);
494 
495   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
496 
497   EXPECT_EQ(OK, result);
498   std::vector<std::string> proxies = string16ToProxyList(kResults);
499   EXPECT_EQ(1U, proxies.size());
500   EXPECT_NE("DIRECT", proxies[0]);
501   EXPECT_EQ("success:3", proxies[0]);
502 }
503 
504 // Test the return values from myIpAddress(), myIpAddressEx(), dnsResolve(),
505 // dnsResolveEx(), isResolvable(), isResolvableEx(), when the the binding
506 // returns empty string (failure). This simulates the return values from
507 // those functions when the underlying DNS resolution fails.
TEST(ProxyResolverV8Test,DNSResolutionFailure)508 TEST(ProxyResolverV8Test, DNSResolutionFailure) {
509   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
510   int result = resolver.SetPacScript(SCRIPT(DNS_FAIL_JS));
511   EXPECT_EQ(OK, result);
512 
513   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
514 
515   EXPECT_EQ(OK, result);
516   std::vector<std::string> proxies = string16ToProxyList(kResults);
517   EXPECT_EQ(1U, proxies.size());
518   EXPECT_NE("DIRECT", proxies[0]);
519   EXPECT_EQ("success:80", proxies[0]);
520 }
521 
TEST(ProxyResolverV8Test,DNSResolutionOfInternationDomainName)522 TEST(ProxyResolverV8Test, DNSResolutionOfInternationDomainName) {
523     return;
524   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
525   int result = resolver.SetPacScript(String16(INTERNATIONAL_DOMAIN_NAMES_JS));
526   EXPECT_EQ(OK, result);
527 
528   // Execute FindProxyForURL().
529   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
530 
531   EXPECT_EQ(OK, result);
532   std::vector<std::string> proxies = string16ToProxyList(kResults);
533   EXPECT_EQ(1U, proxies.size());
534   EXPECT_EQ("DIRECT", proxies[0]);
535 
536   // Check that the international domain name was converted to punycode
537   // before passing it onto the bindings layer.
538   MockJSBindings* bindings = resolver.mock_js_bindings();
539 
540   ASSERT_EQ(1u, bindings->dns_resolves.size());
541   EXPECT_EQ("xn--bcher-kva.ch", bindings->dns_resolves[0]);
542 
543   ASSERT_EQ(1u, bindings->dns_resolves_ex.size());
544   EXPECT_EQ("xn--bcher-kva.ch", bindings->dns_resolves_ex[0]);
545 }
546 
TEST(ProxyResolverV8Test,GetterChangesElementKind)547 TEST(ProxyResolverV8Test, GetterChangesElementKind) {
548   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
549   int result = resolver.SetPacScript(String16(CHANGE_ELEMENT_KIND_JS));
550   EXPECT_EQ(OK, result);
551 
552   // Execute FindProxyForURL().
553   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
554 
555   EXPECT_EQ(OK, result);
556   std::vector<std::string> proxies = string16ToProxyList(kResults);
557   EXPECT_EQ(1U, proxies.size());
558   EXPECT_EQ("DIRECT", proxies[0]);
559 }
560 
TEST(ProxyResolverV8Test,B_132073833)561 TEST(ProxyResolverV8Test, B_132073833) {
562   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
563   int result = resolver.SetPacScript(String16(B_132073833_JS));
564   EXPECT_EQ(OK, result);
565 
566   // Execute FindProxyForURL().
567   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
568 
569   EXPECT_EQ(OK, result);
570   std::vector<std::string> proxies = string16ToProxyList(kResults);
571   EXPECT_EQ(1U, proxies.size());
572   EXPECT_EQ("DIRECT", proxies[0]);
573 }
574 
TEST(ProxyResolverV8Test,B_139806216)575 TEST(ProxyResolverV8Test, B_139806216) {
576   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
577   int result = resolver.SetPacScript(String16(B_139806216_JS));
578   EXPECT_EQ(OK, result);
579 
580   // Execute FindProxyForURL().
581   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
582 
583   EXPECT_EQ(OK, result);
584   std::vector<std::string> proxies = string16ToProxyList(kResults);
585   EXPECT_EQ(1U, proxies.size());
586   EXPECT_EQ("DIRECT", proxies[0]);
587 }
588 
TEST(ProxyResolverV8Test,B_147664838)589 TEST(ProxyResolverV8Test, B_147664838) {
590   ProxyResolverV8WithMockBindings resolver(new MockJSBindings());
591   int result = resolver.SetPacScript(SCRIPT(B_147664838_JS));
592   EXPECT_EQ(OK, result);
593 
594   // Execute FindProxyForURL().
595   result = resolver.GetProxyForURL(kQueryUrl, kQueryHost, &kResults);
596 
597   EXPECT_EQ(OK, result);
598   std::vector<std::string> proxies = string16ToProxyList(kResults);
599   EXPECT_EQ(1U, proxies.size());
600   EXPECT_EQ("DIRECT", proxies[0]);
601 }
602 
603 }  // namespace
604 }  // namespace net
605