// This file is auto generated using the following command.
// Do not modify.
// ./jstocstring.pl js-unittest proxy_test_script.h
#ifndef PROXY_TEST_SCRIPT_H_
#define PROXY_TEST_SCRIPT_H_
#define BINDING_FROM_GLOBAL_JS \
"// Calls a bindings outside of FindProxyForURL(). This causes the code to\n" \
"// get exercised during initialization.\n" \
"\n" \
"var x = myIpAddress();\n" \
"\n" \
"function FindProxyForURL(url, host) {\n" \
" return \"PROXY \" + x + \":80\";\n" \
"}\n" \
#define BINDINGS_JS \
"// Try calling the browser-side bound functions with varying (invalid)\n" \
"// inputs. There is no notion of \"success\" for this test, other than\n" \
"// verifying the correct C++ bindings were reached with expected values.\n" \
"\n" \
"function MyObject() {\n" \
" this.x = \"3\";\n" \
"}\n" \
"\n" \
"MyObject.prototype.toString = function() {\n" \
" throw \"exception from calling toString()\";\n" \
"}\n" \
"\n" \
"function expectEquals(expectation, actual) {\n" \
" if (!(expectation === actual)) {\n" \
" throw \"FAIL: expected: \" + expectation + \", actual: \" + actual;\n" \
" }\n" \
"}\n" \
"\n" \
"function FindProxyForURL(url, host) {\n" \
" // Call dnsResolve with some wonky arguments.\n" \
" // Those expected to fail (because we have passed a non-string parameter)\n" \
" // will return |null|, whereas those that have called through to the C++\n" \
" // bindings will return '127.0.0.1'.\n" \
" expectEquals(undefined, dnsResolve());\n" \
" expectEquals(undefined, dnsResolve(null));\n" \
" expectEquals(undefined, dnsResolve(undefined));\n" \
" expectEquals('127.0.0.1', dnsResolve(\"\"));\n" \
" expectEquals(undefined, dnsResolve({foo: 'bar'}));\n" \
" expectEquals(undefined, dnsResolve(fn));\n" \
" expectEquals(undefined, dnsResolve(['3']));\n" \
" expectEquals('127.0.0.1', dnsResolve(\"arg1\", \"arg2\", \"arg3\", \"arg4\"));\n" \
"\n" \
" // Call alert with some wonky arguments.\n" \
" alert();\n" \
" alert(null);\n" \
" alert(undefined);\n" \
" alert({foo:'bar'});\n" \
"\n" \
" // This should throw an exception when we toString() the argument\n" \
" // to alert in the bindings.\n" \
" try {\n" \
" alert(new MyObject());\n" \
" } catch (e) {\n" \
" alert(e);\n" \
" }\n" \
"\n" \
" // Call myIpAddress() with wonky arguments\n" \
" myIpAddress(null);\n" \
" myIpAddress(null, null);\n" \
"\n" \
" // Call myIpAddressEx() correctly (no arguments).\n" \
" myIpAddressEx();\n" \
"\n" \
" // Call dnsResolveEx() (note that isResolvableEx() implicity calls it.)\n" \
" isResolvableEx(\"is_resolvable\");\n" \
" dnsResolveEx(\"foobar\");\n" \
"\n" \
" return \"DIRECT\";\n" \
"}\n" \
"\n" \
"function fn() {}\n" \
"\n" \
#define DIRECT_JS \
"function FindProxyForURL(url, host) {\n" \
" return \"DIRECT\";\n" \
"}\n" \
"\n" \
#define DNS_FAIL_JS \
"// This script should be run in an environment where all DNS resolution are\n" \
"// failing. It tests that functions return the expected values.\n" \
"//\n" \
"// Returns \"PROXY success:80\" on success.\n" \
"function FindProxyForURL(url, host) {\n" \
" try {\n" \
" expectEq(\"127.0.0.1\", myIpAddress());\n" \
" expectEq(\"\", myIpAddressEx());\n" \
"\n" \
" expectEq(null, dnsResolve(\"not-found\"));\n" \
" expectEq(\"\", dnsResolveEx(\"not-found\"));\n" \
"\n" \
" expectEq(false, isResolvable(\"not-found\"));\n" \
" expectEq(false, isResolvableEx(\"not-found\"));\n" \
"\n" \
" return \"PROXY success:80\";\n" \
" } catch(e) {\n" \
" alert(e);\n" \
" return \"PROXY failed:80\";\n" \
" }\n" \
"}\n" \
"\n" \
"function expectEq(expected, actual) {\n" \
" if (expected != actual)\n" \
" throw \"Expected \" + expected + \" but was \" + actual;\n" \
"}\n" \
"\n" \
#define ENDS_WITH_COMMENT_JS \
"function FindProxyForURL(url, host) {\n" \
" return \"PROXY success:80\";\n" \
"}\n" \
"\n" \
"// We end the script with a comment (and no trailing newline).\n" \
"// This used to cause problems, because internally ProxyResolverV8\n" \
"// would append some functions to the script; the first line of\n" \
"// those extra functions was being considered part of the comment.\n" \
#define ENDS_WITH_STATEMENT_NO_SEMICOLON_JS \
"// Ends with a statement, and no terminal newline.\n" \
"function FindProxyForURL(url, host) { return \"PROXY success:\" + x; }\n" \
"x = 3\n" \
#define INTERNATIONAL_DOMAIN_NAMES_JS \
"// Try resolving hostnames containing non-ASCII characters.\n" \
"\n" \
"function FindProxyForURL(url, host) {\n" \
" // This international hostname has a non-ASCII character. It is represented\n" \
" // in punycode as 'xn--bcher-kva.ch'\n" \
" var idn = 'B\u00fccher.ch';\n" \
"\n" \
" // We disregard the actual return value -- all we care about is that on\n" \
" // the C++ end the bindings were passed the punycode equivalent of this\n" \
" // unicode hostname.\n" \
" dnsResolve(idn);\n" \
" dnsResolveEx(idn);\n" \
"\n" \
" return \"DIRECT\";\n" \
"}\n" \
"\n" \
#define MISSING_CLOSE_BRACE_JS \
"// This PAC script is invalid, because there is a missing close brace\n" \
"// on the function FindProxyForURL().\n" \
"\n" \
"function FindProxyForURL(url, host) {\n" \
" return \"DIRECT\";\n" \
"\n" \
#define NO_ENTRYPOINT_JS \
"var x = \"This is an invalid PAC script because it lacks a \" +\n" \
" \"FindProxyForURL() function\";\n" \
#define PAC_LIBRARY_UNITTEST_JS \
"// This should output \"PROXY success:80\" if all the tests pass.\n" \
"// Otherwise it will output \"PROXY failure:<num-failures>\".\n" \
"//\n" \
"// This aims to unit-test the PAC library functions, which are\n" \
"// exposed in the PAC's execution environment. (Namely, dnsDomainLevels,\n" \
"// timeRange, etc.)\n" \
"\n" \
"function FindProxyForURL(url, host) {\n" \
" var numTestsFailed = 0;\n" \
"\n" \
" // Run all the tests\n" \
" for (var test in Tests) {\n" \
" var t = new TestContext(test);\n" \
"\n" \
" // Run the test.\n" \
" Tests[test](t);\n" \
"\n" \
" if (t.failed()) {\n" \
" numTestsFailed++;\n" \
" }\n" \
" }\n" \
"\n" \
" if (numTestsFailed == 0) {\n" \
" return \"PROXY success:80\";\n" \
" }\n" \
" return \"PROXY failure:\" + numTestsFailed;\n" \
"}\n" \
"\n" \
"// --------------------------\n" \
"// Tests\n" \
"// --------------------------\n" \
"\n" \
"var Tests = {};\n" \
"\n" \
"Tests.testDnsDomainIs = function(t) {\n" \
" t.expectTrue(dnsDomainIs(\"google.com\", \".com\"));\n" \
" t.expectTrue(dnsDomainIs(\"google.co.uk\", \".co.uk\"));\n" \
" t.expectFalse(dnsDomainIs(\"google.com\", \".co.uk\"));\n" \
" t.expectFalse(dnsDomainIs(\"www.adobe.com\", \".ad\"));\n" \
"};\n" \
"\n" \
"Tests.testDnsDomainLevels = function(t) {\n" \
" t.expectEquals(0, dnsDomainLevels(\"www\"));\n" \
" t.expectEquals(2, dnsDomainLevels(\"www.google.com\"));\n" \
" t.expectEquals(3, dnsDomainLevels(\"192.168.1.1\"));\n" \
"};\n" \
"\n" \
"Tests.testIsInNet = function(t) {\n" \
" t.expectTrue(\n" \
" isInNet(\"192.89.132.25\", \"192.89.132.25\", \"255.255.255.255\"));\n" \
" t.expectFalse(\n" \
" isInNet(\"193.89.132.25\", \"192.89.132.25\", \"255.255.255.255\"));\n" \
"\n" \
" t.expectTrue(isInNet(\"192.89.132.25\", \"192.89.0.0\", \"255.255.0.0\"));\n" \
" t.expectFalse(isInNet(\"193.89.132.25\", \"192.89.0.0\", \"255.255.0.0\"));\n" \
"\n" \
" t.expectFalse(\n" \
" isInNet(\"192.89.132.a\", \"192.89.0.0\", \"255.255.0.0\"));\n" \
"};\n" \
"\n" \
"Tests.testIsPlainHostName = function(t) {\n" \
" t.expectTrue(isPlainHostName(\"google\"));\n" \
" t.expectFalse(isPlainHostName(\"google.com\"));\n" \
"};\n" \
"\n" \
"Tests.testLocalHostOrDomainIs = function(t) {\n" \
" t.expectTrue(localHostOrDomainIs(\"www.google.com\", \"www.google.com\"));\n" \
" t.expectTrue(localHostOrDomainIs(\"www\", \"www.google.com\"));\n" \
" t.expectFalse(localHostOrDomainIs(\"maps.google.com\", \"www.google.com\"));\n" \
"};\n" \
"\n" \
"Tests.testShExpMatch = function(t) {\n" \
" t.expectTrue(shExpMatch(\"foo.jpg\", \"*.jpg\"));\n" \
" t.expectTrue(shExpMatch(\"foo5.jpg\", \"*o?.jpg\"));\n" \
" t.expectFalse(shExpMatch(\"foo.jpg\", \".jpg\"));\n" \
" t.expectFalse(shExpMatch(\"foo.jpg\", \"foo\"));\n" \
"};\n" \
"\n" \
"Tests.testSortIpAddressList = function(t) {\n" \
" t.expectEquals(\"::1;::2;::3\", sortIpAddressList(\"::2;::3;::1\"));\n" \
" t.expectEquals(\n" \
" \"2001:4898:28:3:201:2ff:feea:fc14;fe80::5efe:157:9d3b:8b16;157.59.139.22\",\n" \
" sortIpAddressList(\"157.59.139.22;\" +\n" \
" \"2001:4898:28:3:201:2ff:feea:fc14;\" +\n" \
" \"fe80::5efe:157:9d3b:8b16\"));\n" \
"\n" \
" // Single IP address (v4 and v6).\n" \
" t.expectEquals(\"127.0.0.1\", sortIpAddressList(\"127.0.0.1\"));\n" \
" t.expectEquals(\"::1\", sortIpAddressList(\"::1\"))\n" \
"\n" \
" // Verify that IPv6 address is not re-written (not reduced).\n" \
" t.expectEquals(\"0:0::1;192.168.1.1\", sortIpAddressList(\"192.168.1.1;0:0::1\"));\n" \
"\n" \
" // Input is already sorted.\n" \
" t.expectEquals(\"::1;192.168.1.3\", sortIpAddressList(\"::1;192.168.1.3\"));\n" \
"\n" \
" // Same-valued IP addresses (also tests stability).\n" \
" t.expectEquals(\"0::1;::1;0:0::1\", sortIpAddressList(\"0::1;::1;0:0::1\"));\n" \
"\n" \
" // Contains extra semi-colons.\n" \
" t.expectEquals(\"127.0.0.1\", sortIpAddressList(\";127.0.0.1;\"));\n" \
"\n" \
" // Contains whitespace (spaces and tabs).\n" \
" t.expectEquals(\"192.168.0.1;192.168.0.2\",\n" \
" sortIpAddressList(\"192.168.0.1; 192.168.0.2\"));\n" \
" t.expectEquals(\"127.0.0.0;127.0.0.1;127.0.0.2\",\n" \
" sortIpAddressList(\"127.0.0.1; 127.0.0.2; 127.0.0.0\"));\n" \
"\n" \
" // Empty lists.\n" \
" t.expectFalse(sortIpAddressList(\"\"));\n" \
" t.expectFalse(sortIpAddressList(\" \"));\n" \
" t.expectFalse(sortIpAddressList(\";\"));\n" \
" t.expectFalse(sortIpAddressList(\";;\"));\n" \
" t.expectFalse(sortIpAddressList(\" ; ; \"));\n" \
"\n" \
" // Invalid IP addresses.\n" \
" t.expectFalse(sortIpAddressList(\"256.0.0.1\"));\n" \
" t.expectFalse(sortIpAddressList(\"192.168.1.1;0:0:0:1;127.0.0.1\"));\n" \
"\n" \
" // Call sortIpAddressList() with wonky arguments.\n" \
" t.expectEquals(null, sortIpAddressList());\n" \
" t.expectEquals(null, sortIpAddressList(null));\n" \
" t.expectEquals(null, sortIpAddressList(null, null));\n" \
"};\n" \
"\n" \
"Tests.testIsInNetEx = function(t) {\n" \
" t.expectTrue(isInNetEx(\"198.95.249.79\", \"198.95.249.79/32\"));\n" \
" t.expectTrue(isInNetEx(\"198.95.115.10\", \"198.95.0.0/16\"));\n" \
" t.expectTrue(isInNetEx(\"198.95.1.1\", \"198.95.0.0/16\"));\n" \
" t.expectTrue(isInNetEx(\"198.95.1.1\", \"198.95.3.3/16\"));\n" \
" t.expectTrue(isInNetEx(\"0:0:0:0:0:0:7f00:1\", \"0:0:0:0:0:0:7f00:1/32\"));\n" \
" t.expectTrue(isInNetEx(\"3ffe:8311:ffff:abcd:1234:dead:beef:101\",\n" \
" \"3ffe:8311:ffff::/48\"));\n" \
"\n" \
" // IPv4 and IPv6 mix.\n" \
" t.expectFalse(isInNetEx(\"127.0.0.1\", \"0:0:0:0:0:0:7f00:1/16\"));\n" \
" t.expectFalse(isInNetEx(\"192.168.24.3\", \"fe80:0:0:0:0:0:c0a8:1803/32\"));\n" \
"\n" \
" t.expectFalse(isInNetEx(\"198.95.249.78\", \"198.95.249.79/32\"));\n" \
" t.expectFalse(isInNetEx(\"198.96.115.10\", \"198.95.0.0/16\"));\n" \
" t.expectFalse(isInNetEx(\"3fff:8311:ffff:abcd:1234:dead:beef:101\",\n" \
" \"3ffe:8311:ffff::/48\"));\n" \
"\n" \
" // Call isInNetEx with wonky arguments.\n" \
" t.expectEquals(null, isInNetEx());\n" \
" t.expectEquals(null, isInNetEx(null));\n" \
" t.expectEquals(null, isInNetEx(null, null));\n" \
" t.expectEquals(null, isInNetEx(null, null, null));\n" \
" t.expectEquals(null, isInNetEx(\"198.95.249.79\"));\n" \
"\n" \
" // Invalid IP address.\n" \
" t.expectFalse(isInNetEx(\"256.0.0.1\", \"198.95.249.79\"));\n" \
" t.expectFalse(isInNetEx(\"127.0.0.1 \", \"127.0.0.1/32\")); // Extra space.\n" \
"\n" \
" // Invalid prefix.\n" \
" t.expectFalse(isInNetEx(\"198.95.115.10\", \"198.95.0.0/34\"));\n" \
" t.expectFalse(isInNetEx(\"127.0.0.1\", \"127.0.0.1\")); // Missing '/' in prefix.\n" \
"};\n" \
"\n" \
"Tests.testWeekdayRange = function(t) {\n" \
" // Test with local time.\n" \
" MockDate.setCurrent(\"Tue Mar 03 2009\");\n" \
" t.expectEquals(true, weekdayRange(\"MON\", \"FRI\"));\n" \
" t.expectEquals(true, weekdayRange(\"TUE\", \"FRI\"));\n" \
" t.expectEquals(true, weekdayRange(\"TUE\", \"TUE\"));\n" \
" t.expectEquals(true, weekdayRange(\"TUE\"));\n" \
" t.expectEquals(false, weekdayRange(\"WED\", \"FRI\"));\n" \
" t.expectEquals(false, weekdayRange(\"SUN\", \"MON\"));\n" \
" t.expectEquals(false, weekdayRange(\"SAT\"));\n" \
" t.expectEquals(false, weekdayRange(\"FRI\", \"MON\"));\n" \
"\n" \
" // Test with GMT time.\n" \
" MockDate.setCurrent(\"Tue Mar 03 2009 GMT\");\n" \
" t.expectEquals(true, weekdayRange(\"MON\", \"FRI\", \"GMT\"));\n" \
" t.expectEquals(true, weekdayRange(\"TUE\", \"FRI\", \"GMT\"));\n" \
" t.expectEquals(true, weekdayRange(\"TUE\", \"TUE\", \"GMT\"));\n" \
" t.expectEquals(true, weekdayRange(\"TUE\", \"GMT\"));\n" \
" t.expectEquals(false, weekdayRange(\"WED\", \"FRI\", \"GMT\"));\n" \
" t.expectEquals(false, weekdayRange(\"SUN\", \"MON\", \"GMT\"));\n" \
" t.expectEquals(false, weekdayRange(\"SAT\", \"GMT\"));\n" \
"};\n" \
"\n" \
"Tests.testDateRange = function(t) {\n" \
" // dateRange(day)\n" \
" MockDate.setCurrent(\"Mar 03 2009\");\n" \
" t.expectEquals(true, dateRange(3));\n" \
" t.expectEquals(false, dateRange(1));\n" \
"\n" \
" // dateRange(day, \"GMT\")\n" \
" MockDate.setCurrent(\"Mar 03 2009 GMT\");\n" \
" t.expectEquals(true, dateRange(3, \"GMT\"));\n" \
" t.expectEquals(false, dateRange(1, \"GMT\"));\n" \
"\n" \
" // dateRange(day1, day2)\n" \
" MockDate.setCurrent(\"Mar 03 2009\");\n" \
" t.expectEquals(true, dateRange(1, 4));\n" \
" t.expectEquals(false, dateRange(4, 20));\n" \
"\n" \
" // dateRange(day, month)\n" \
" MockDate.setCurrent(\"Mar 03 2009\");\n" \
" t.expectEquals(true, dateRange(3, \"MAR\"));\n" \
" MockDate.setCurrent(\"Mar 03 2014\");\n" \
" t.expectEquals(true, dateRange(3, \"MAR\"));\n" \
" // TODO(eroman):\n" \
" //t.expectEquals(false, dateRange(2, \"MAR\"));\n" \
" //t.expectEquals(false, dateRange(3, \"JAN\"));\n" \
"\n" \
" // dateRange(day, month, year)\n" \
" MockDate.setCurrent(\"Mar 03 2009\");\n" \
" t.expectEquals(true, dateRange(3, \"MAR\", 2009));\n" \
" t.expectEquals(false, dateRange(4, \"MAR\", 2009));\n" \
" t.expectEquals(false, dateRange(3, \"FEB\", 2009));\n" \
" MockDate.setCurrent(\"Mar 03 2014\");\n" \
" t.expectEquals(false, dateRange(3, \"MAR\", 2009));\n" \
"\n" \
" // dateRange(month1, month2)\n" \
" MockDate.setCurrent(\"Mar 03 2009\");\n" \
" t.expectEquals(true, dateRange(\"JAN\", \"MAR\"));\n" \
" t.expectEquals(true, dateRange(\"MAR\", \"APR\"));\n" \
" t.expectEquals(false, dateRange(\"MAY\", \"SEP\"));\n" \
"\n" \
" // dateRange(day1, month1, day2, month2)\n" \
" MockDate.setCurrent(\"Mar 03 2009\");\n" \
" t.expectEquals(true, dateRange(1, \"JAN\", 3, \"MAR\"));\n" \
" t.expectEquals(true, dateRange(3, \"MAR\", 4, \"SEP\"));\n" \
" t.expectEquals(false, dateRange(4, \"MAR\", 4, \"SEP\"));\n" \
"\n" \
" // dateRange(month1, year1, month2, year2)\n" \
" MockDate.setCurrent(\"Mar 03 2009\");\n" \
" t.expectEquals(true, dateRange(\"FEB\", 2009, \"MAR\", 2009));\n" \
" MockDate.setCurrent(\"Apr 03 2009\");\n" \
" t.expectEquals(true, dateRange(\"FEB\", 2009, \"MAR\", 2010));\n" \
" t.expectEquals(false, dateRange(\"FEB\", 2009, \"MAR\", 2009));\n" \
"\n" \
" // dateRange(day1, month1, year1, day2, month2, year2)\n" \
" MockDate.setCurrent(\"Mar 03 2009\");\n" \
" t.expectEquals(true, dateRange(1, \"JAN\", 2009, 3, \"MAR\", 2009));\n" \
" t.expectEquals(true, dateRange(3, \"MAR\", 2009, 4, \"SEP\", 2009));\n" \
" t.expectEquals(true, dateRange(3, \"JAN\", 2009, 4, \"FEB\", 2010));\n" \
" t.expectEquals(false, dateRange(4, \"MAR\", 2009, 4, \"SEP\", 2009));\n" \
"};\n" \
"\n" \
"Tests.testTimeRange = function(t) {\n" \
" // timeRange(hour)\n" \
" MockDate.setCurrent(\"Mar 03, 2009 03:34:01\");\n" \
" t.expectEquals(true, timeRange(3));\n" \
" t.expectEquals(false, timeRange(2));\n" \
"\n" \
" // timeRange(hour1, hour2)\n" \
" MockDate.setCurrent(\"Mar 03, 2009 03:34:01\");\n" \
" t.expectEquals(true, timeRange(2, 3));\n" \
" t.expectEquals(true, timeRange(2, 4));\n" \
" t.expectEquals(true, timeRange(3, 5));\n" \
" t.expectEquals(false, timeRange(1, 2));\n" \
" t.expectEquals(false, timeRange(11, 12));\n" \
"\n" \
" // timeRange(hour1, min1, hour2, min2)\n" \
" MockDate.setCurrent(\"Mar 03, 2009 03:34:01\");\n" \
" t.expectEquals(true, timeRange(1, 0, 3, 34));\n" \
" t.expectEquals(true, timeRange(1, 0, 3, 35));\n" \
" t.expectEquals(true, timeRange(3, 34, 5, 0));\n" \
" t.expectEquals(false, timeRange(1, 0, 3, 0));\n" \
" t.expectEquals(false, timeRange(11, 0, 16, 0));\n" \
"\n" \
" // timeRange(hour1, min1, sec1, hour2, min2, sec2)\n" \
" MockDate.setCurrent(\"Mar 03, 2009 03:34:14\");\n" \
" t.expectEquals(true, timeRange(1, 0, 0, 3, 34, 14));\n" \
" t.expectEquals(false, timeRange(1, 0, 0, 3, 34, 0));\n" \
" t.expectEquals(true, timeRange(1, 0, 0, 3, 35, 0));\n" \
" t.expectEquals(true, timeRange(3, 34, 0, 5, 0, 0));\n" \
" t.expectEquals(false, timeRange(1, 0, 0, 3, 0, 0));\n" \
" t.expectEquals(false, timeRange(11, 0, 0, 16, 0, 0));\n" \
"};\n" \
"\n" \
"// --------------------------\n" \
"// TestContext\n" \
"// --------------------------\n" \
"\n" \
"// |name| is the name of the test being executed, it will be used when logging\n" \
"// errors.\n" \
"function TestContext(name) {\n" \
" this.numFailures_ = 0;\n" \
" this.name_ = name;\n" \
"};\n" \
"\n" \
"TestContext.prototype.failed = function() {\n" \
" return this.numFailures_ != 0;\n" \
"};\n" \
"\n" \
"TestContext.prototype.expectEquals = function(expectation, actual) {\n" \
" if (!(expectation === actual)) {\n" \
" this.numFailures_++;\n" \
" this.log(\"FAIL: expected: \" + expectation + \", actual: \" + actual);\n" \
" }\n" \
"};\n" \
"\n" \
"TestContext.prototype.expectTrue = function(x) {\n" \
" this.expectEquals(true, x);\n" \
"};\n" \
"\n" \
"TestContext.prototype.expectFalse = function(x) {\n" \
" this.expectEquals(false, x);\n" \
"};\n" \
"\n" \
"TestContext.prototype.log = function(x) {\n" \
" // Prefix with the test name that generated the log.\n" \
" try {\n" \
" alert(this.name_ + \": \" + x);\n" \
" } catch(e) {\n" \
" // In case alert() is not defined.\n" \
" }\n" \
"};\n" \
"\n" \
"// --------------------------\n" \
"// MockDate\n" \
"// --------------------------\n" \
"\n" \
"function MockDate() {\n" \
" this.wrappedDate_ = new MockDate.super_(MockDate.currentDateString_);\n" \
"};\n" \
"\n" \
"// Setup the MockDate so it forwards methods to \"this.wrappedDate_\" (which is a\n" \
"// real Date object). We can't simply chain the prototypes since Date() doesn't\n" \
"// allow it.\n" \
"MockDate.init = function() {\n" \
" MockDate.super_ = Date;\n" \
"\n" \
" function createProxyMethod(methodName) {\n" \
" return function() {\n" \
" return this.wrappedDate_[methodName]\n" \
" .apply(this.wrappedDate_, arguments);\n" \
" }\n" \
" };\n" \
"\n" \
" for (i in MockDate.methodNames_) {\n" \
" var methodName = MockDate.methodNames_[i];\n" \
" // Don't define the closure directly in the loop body, since Javascript's\n" \
" // crazy scoping rules mean |methodName| actually bleeds out of the loop!\n" \
" MockDate.prototype[methodName] = createProxyMethod(methodName);\n" \
" }\n" \
"\n" \
" // Replace the native Date() with our mock.\n" \
" Date = MockDate;\n" \
"};\n" \
"\n" \
"// Unfortunately Date()'s methods are non-enumerable, therefore list manually.\n" \
"MockDate.methodNames_ = [\n" \
" \"toString\", \"toDateString\", \"toTimeString\", \"toLocaleString\",\n" \
" \"toLocaleDateString\", \"toLocaleTimeString\", \"valueOf\", \"getTime\",\n" \
" \"getFullYear\", \"getUTCFullYear\", \"getMonth\", \"getUTCMonth\",\n" \
" \"getDate\", \"getUTCDate\", \"getDay\", \"getUTCDay\", \"getHours\", \"getUTCHours\",\n" \
" \"getMinutes\", \"getUTCMinutes\", \"getSeconds\", \"getUTCSeconds\",\n" \
" \"getMilliseconds\", \"getUTCMilliseconds\", \"getTimezoneOffset\", \"setTime\",\n" \
" \"setMilliseconds\", \"setUTCMilliseconds\", \"setSeconds\", \"setUTCSeconds\",\n" \
" \"setMinutes\", \"setUTCMinutes\", \"setHours\", \"setUTCHours\", \"setDate\",\n" \
" \"setUTCDate\", \"setMonth\", \"setUTCMonth\", \"setFullYear\", \"setUTCFullYear\",\n" \
" \"toGMTString\", \"toUTCString\", \"getYear\", \"setYear\"\n" \
"];\n" \
"\n" \
"MockDate.setCurrent = function(currentDateString) {\n" \
" MockDate.currentDateString_ = currentDateString;\n" \
"}\n" \
"\n" \
"// Bind the methods to proxy requests to the wrapped Date().\n" \
"MockDate.init();\n" \
"\n" \
#define PASSTHROUGH_JS \
"// Return a single-proxy result, which encodes ALL the arguments that were\n" \
"// passed to FindProxyForURL().\n" \
"\n" \
"function FindProxyForURL(url, host) {\n" \
" if (arguments.length != 2) {\n" \
" throw \"Wrong number of arguments passed to FindProxyForURL!\";\n" \
" return \"FAIL\";\n" \
" }\n" \
"\n" \
" return \"PROXY \" + makePseudoHost(url + \".\" + host);\n" \
"}\n" \
"\n" \
"// Form a string that kind-of resembles a host. We will replace any\n" \
"// non-alphanumeric character with a dot, then fix up the oddly placed dots.\n" \
"function makePseudoHost(str) {\n" \
" var result = \"\";\n" \
"\n" \
" for (var i = 0; i < str.length; ++i) {\n" \
" var c = str.charAt(i);\n" \
" if (!isValidPseudoHostChar(c)) {\n" \
" c = '.'; // Replace unsupported characters with a dot.\n" \
" }\n" \
"\n" \
" // Take care not to place multiple adjacent dots,\n" \
" // a dot at the beginning, or a dot at the end.\n" \
" if (c == '.' &&\n" \
" (result.length == 0 || \n" \
" i == str.length - 1 ||\n" \
" result.charAt(result.length - 1) == '.')) {\n" \
" continue;\n" \
" }\n" \
" result += c;\n" \
" }\n" \
" return result;\n" \
"}\n" \
"\n" \
"function isValidPseudoHostChar(c) {\n" \
" if (c >= '0' && c <= '9')\n" \
" return true;\n" \
" if (c >= 'a' && c <= 'z')\n" \
" return true;\n" \
" if (c >= 'A' && c <= 'Z')\n" \
" return true;\n" \
" return false;\n" \
"}\n" \
#define RETURN_EMPTY_STRING_JS \
"function FindProxyForURL(url, host) {\n" \
" return \"\";\n" \
"}\n" \
"\n" \
#define RETURN_FUNCTION_JS \
"function FindProxyForURL(url, host) {\n" \
" return FindProxyForURL;\n" \
"}\n" \
"\n" \
#define RETURN_INTEGER_JS \
"function FindProxyForURL(url, host) {\n" \
" return 0;\n" \
"}\n" \
"\n" \
#define RETURN_NULL_JS \
"function FindProxyForURL(url, host) {\n" \
" return null;\n" \
"}\n" \
"\n" \
#define RETURN_OBJECT_JS \
"function FindProxyForURL(url, host) {\n" \
" return {result: \"PROXY foo\"};\n" \
"}\n" \
"\n" \
#define RETURN_UNDEFINED_JS \
"function FindProxyForURL(url, host) {\n" \
" return undefined;\n" \
"}\n" \
"\n" \
#define RETURN_UNICODE_JS \
"// U+200B is the codepoint for zero-width-space.\n" \
"function FindProxyForURL(url, host) {\n" \
" return \"PROXY foo.com\u200B\";\n" \
"}\n" \
#define SIDE_EFFECTS_JS \
"if (!gCounter) {\n" \
" // We write it this way so if the script gets loaded twice,\n" \
" // gCounter remains dirty.\n" \
" var gCounter = 0;\n" \
"}\n" \
"\n" \
"function FindProxyForURL(url, host) {\n" \
" return \"PROXY sideffect_\" + gCounter++;\n" \
"}\n" \
"\n" \
#define SIMPLE_JS \
"// PAC script which uses isInNet on both IP addresses and hosts, and calls\n" \
"// isResolvable().\n" \
"\n" \
"function FindProxyForURL(url, host) {\n" \
" var my_ip = myIpAddress();\n" \
"\n" \
" if (isInNet(my_ip, \"172.16.0.0\", \"255.248.0.0\")) {\n" \
" return \"PROXY a:80\";\n" \
" }\n" \
"\n" \
" if (url.substring(0, 6) != \"https:\" &&\n" \
" isInNet(host, \"10.0.0.0\", \"255.0.0.0\")) {\n" \
" return \"PROXY b:80\";\n" \
" }\n" \
"\n" \
" if (dnsDomainIs(host, \"foo.bar.baz.com\") || !isResolvable(host)) {\n" \
" return \"PROXY c:100\";\n" \
" }\n" \
"\n" \
" return \"DIRECT\";\n" \
"}\n" \
#define UNHANDLED_EXCEPTION_JS \
"function FindProxyForURL(url, host) {\n" \
" // This will throw a runtime exception.\n" \
" return \"PROXY x\" + undefined_variable;\n" \
"}\n" \
"\n" \
#endif //PROXY_TEST_SCRIPT_H_