| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/compiler_specific.h" | 5 #include "base/compiler_specific.h" |
| 6 #include "base/files/file_util.h" | 6 #include "base/files/file_util.h" |
| 7 #include "base/path_service.h" | 7 #include "base/path_service.h" |
| 8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
| 9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| 11 #include "net/base/completion_callback.h" | 11 #include "net/base/completion_callback.h" |
| 12 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
| 13 #include "net/proxy/proxy_info.h" | 13 #include "net/proxy/proxy_info.h" |
| 14 #include "net/proxy/proxy_resolver_script_data.h" | 14 #include "net/proxy/proxy_resolver_script_data.h" |
| 15 #include "net/proxy/proxy_resolver_v8.h" | 15 #include "net/proxy/proxy_resolver_v8.h" |
| 16 #include "net/test/gtest_util.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "url/gurl.h" | 19 #include "url/gurl.h" |
| 18 | 20 |
| 21 using net::test::IsError; |
| 22 using net::test::IsOk; |
| 23 |
| 19 namespace net { | 24 namespace net { |
| 20 namespace { | 25 namespace { |
| 21 | 26 |
| 22 // Javascript bindings for ProxyResolverV8, which returns mock values. | 27 // Javascript bindings for ProxyResolverV8, which returns mock values. |
| 23 // Each time one of the bindings is called into, we push the input into a | 28 // Each time one of the bindings is called into, we push the input into a |
| 24 // list, for later verification. | 29 // list, for later verification. |
| 25 class MockJSBindings : public ProxyResolverV8::JSBindings { | 30 class MockJSBindings : public ProxyResolverV8::JSBindings { |
| 26 public: | 31 public: |
| 27 MockJSBindings() | 32 MockJSBindings() |
| 28 : my_ip_address_count(0), | 33 : my_ip_address_count(0), |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 private: | 138 private: |
| 134 MockJSBindings js_bindings_; | 139 MockJSBindings js_bindings_; |
| 135 std::unique_ptr<ProxyResolverV8> resolver_; | 140 std::unique_ptr<ProxyResolverV8> resolver_; |
| 136 }; | 141 }; |
| 137 | 142 |
| 138 // Doesn't really matter what these values are for many of the tests. | 143 // Doesn't really matter what these values are for many of the tests. |
| 139 const GURL kQueryUrl("http://www.google.com"); | 144 const GURL kQueryUrl("http://www.google.com"); |
| 140 const GURL kPacUrl; | 145 const GURL kPacUrl; |
| 141 | 146 |
| 142 TEST_F(ProxyResolverV8Test, Direct) { | 147 TEST_F(ProxyResolverV8Test, Direct) { |
| 143 ASSERT_EQ(OK, CreateResolver("direct.js")); | 148 ASSERT_THAT(CreateResolver("direct.js"), IsOk()); |
| 144 | 149 |
| 145 ProxyInfo proxy_info; | 150 ProxyInfo proxy_info; |
| 146 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 151 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 147 | 152 |
| 148 EXPECT_EQ(OK, result); | 153 EXPECT_THAT(result, IsOk()); |
| 149 EXPECT_TRUE(proxy_info.is_direct()); | 154 EXPECT_TRUE(proxy_info.is_direct()); |
| 150 | 155 |
| 151 EXPECT_EQ(0U, bindings()->alerts.size()); | 156 EXPECT_EQ(0U, bindings()->alerts.size()); |
| 152 EXPECT_EQ(0U, bindings()->errors.size()); | 157 EXPECT_EQ(0U, bindings()->errors.size()); |
| 153 } | 158 } |
| 154 | 159 |
| 155 TEST_F(ProxyResolverV8Test, ReturnEmptyString) { | 160 TEST_F(ProxyResolverV8Test, ReturnEmptyString) { |
| 156 ASSERT_EQ(OK, CreateResolver("return_empty_string.js")); | 161 ASSERT_THAT(CreateResolver("return_empty_string.js"), IsOk()); |
| 157 | 162 |
| 158 ProxyInfo proxy_info; | 163 ProxyInfo proxy_info; |
| 159 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 164 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 160 | 165 |
| 161 EXPECT_EQ(OK, result); | 166 EXPECT_THAT(result, IsOk()); |
| 162 EXPECT_TRUE(proxy_info.is_direct()); | 167 EXPECT_TRUE(proxy_info.is_direct()); |
| 163 | 168 |
| 164 EXPECT_EQ(0U, bindings()->alerts.size()); | 169 EXPECT_EQ(0U, bindings()->alerts.size()); |
| 165 EXPECT_EQ(0U, bindings()->errors.size()); | 170 EXPECT_EQ(0U, bindings()->errors.size()); |
| 166 } | 171 } |
| 167 | 172 |
| 168 TEST_F(ProxyResolverV8Test, Basic) { | 173 TEST_F(ProxyResolverV8Test, Basic) { |
| 169 ASSERT_EQ(OK, CreateResolver("passthrough.js")); | 174 ASSERT_THAT(CreateResolver("passthrough.js"), IsOk()); |
| 170 | 175 |
| 171 // The "FindProxyForURL" of this PAC script simply concatenates all of the | 176 // The "FindProxyForURL" of this PAC script simply concatenates all of the |
| 172 // arguments into a pseudo-host. The purpose of this test is to verify that | 177 // arguments into a pseudo-host. The purpose of this test is to verify that |
| 173 // the correct arguments are being passed to FindProxyForURL(). | 178 // the correct arguments are being passed to FindProxyForURL(). |
| 174 { | 179 { |
| 175 ProxyInfo proxy_info; | 180 ProxyInfo proxy_info; |
| 176 int result = resolver().GetProxyForURL(GURL("http://query.com/path"), | 181 int result = resolver().GetProxyForURL(GURL("http://query.com/path"), |
| 177 &proxy_info, bindings()); | 182 &proxy_info, bindings()); |
| 178 EXPECT_EQ(OK, result); | 183 EXPECT_THAT(result, IsOk()); |
| 179 EXPECT_EQ("http.query.com.path.query.com:80", | 184 EXPECT_EQ("http.query.com.path.query.com:80", |
| 180 proxy_info.proxy_server().ToURI()); | 185 proxy_info.proxy_server().ToURI()); |
| 181 } | 186 } |
| 182 { | 187 { |
| 183 ProxyInfo proxy_info; | 188 ProxyInfo proxy_info; |
| 184 int result = resolver().GetProxyForURL(GURL("ftp://query.com:90/path"), | 189 int result = resolver().GetProxyForURL(GURL("ftp://query.com:90/path"), |
| 185 &proxy_info, bindings()); | 190 &proxy_info, bindings()); |
| 186 EXPECT_EQ(OK, result); | 191 EXPECT_THAT(result, IsOk()); |
| 187 // Note that FindProxyForURL(url, host) does not expect |host| to contain | 192 // Note that FindProxyForURL(url, host) does not expect |host| to contain |
| 188 // the port number. | 193 // the port number. |
| 189 EXPECT_EQ("ftp.query.com.90.path.query.com:80", | 194 EXPECT_EQ("ftp.query.com.90.path.query.com:80", |
| 190 proxy_info.proxy_server().ToURI()); | 195 proxy_info.proxy_server().ToURI()); |
| 191 | 196 |
| 192 EXPECT_EQ(0U, bindings()->alerts.size()); | 197 EXPECT_EQ(0U, bindings()->alerts.size()); |
| 193 EXPECT_EQ(0U, bindings()->errors.size()); | 198 EXPECT_EQ(0U, bindings()->errors.size()); |
| 194 } | 199 } |
| 195 } | 200 } |
| 196 | 201 |
| 197 TEST_F(ProxyResolverV8Test, BadReturnType) { | 202 TEST_F(ProxyResolverV8Test, BadReturnType) { |
| 198 // These are the filenames of PAC scripts which each return a non-string | 203 // These are the filenames of PAC scripts which each return a non-string |
| 199 // types for FindProxyForURL(). They should all fail with | 204 // types for FindProxyForURL(). They should all fail with |
| 200 // ERR_PAC_SCRIPT_FAILED. | 205 // ERR_PAC_SCRIPT_FAILED. |
| 201 static const char* const filenames[] = { | 206 static const char* const filenames[] = { |
| 202 "return_undefined.js", | 207 "return_undefined.js", |
| 203 "return_integer.js", | 208 "return_integer.js", |
| 204 "return_function.js", | 209 "return_function.js", |
| 205 "return_object.js", | 210 "return_object.js", |
| 206 // TODO(eroman): Should 'null' be considered equivalent to "DIRECT" ? | 211 // TODO(eroman): Should 'null' be considered equivalent to "DIRECT" ? |
| 207 "return_null.js"}; | 212 "return_null.js"}; |
| 208 | 213 |
| 209 for (size_t i = 0; i < arraysize(filenames); ++i) { | 214 for (size_t i = 0; i < arraysize(filenames); ++i) { |
| 210 ASSERT_EQ(OK, CreateResolver(filenames[i])); | 215 ASSERT_THAT(CreateResolver(filenames[i]), IsOk()); |
| 211 | 216 |
| 212 MockJSBindings bindings; | 217 MockJSBindings bindings; |
| 213 ProxyInfo proxy_info; | 218 ProxyInfo proxy_info; |
| 214 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, &bindings); | 219 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, &bindings); |
| 215 | 220 |
| 216 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); | 221 EXPECT_THAT(result, IsError(ERR_PAC_SCRIPT_FAILED)); |
| 217 | 222 |
| 218 EXPECT_EQ(0U, bindings.alerts.size()); | 223 EXPECT_EQ(0U, bindings.alerts.size()); |
| 219 ASSERT_EQ(1U, bindings.errors.size()); | 224 ASSERT_EQ(1U, bindings.errors.size()); |
| 220 EXPECT_EQ("FindProxyForURL() did not return a string.", bindings.errors[0]); | 225 EXPECT_EQ("FindProxyForURL() did not return a string.", bindings.errors[0]); |
| 221 EXPECT_EQ(-1, bindings.errors_line_number[0]); | 226 EXPECT_EQ(-1, bindings.errors_line_number[0]); |
| 222 } | 227 } |
| 223 } | 228 } |
| 224 | 229 |
| 225 // Try using a PAC script which defines no "FindProxyForURL" function. | 230 // Try using a PAC script which defines no "FindProxyForURL" function. |
| 226 TEST_F(ProxyResolverV8Test, NoEntryPoint) { | 231 TEST_F(ProxyResolverV8Test, NoEntryPoint) { |
| 227 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, CreateResolver("no_entrypoint.js")); | 232 EXPECT_THAT(CreateResolver("no_entrypoint.js"), |
| 233 IsError(ERR_PAC_SCRIPT_FAILED)); |
| 228 | 234 |
| 229 ASSERT_EQ(1U, bindings()->errors.size()); | 235 ASSERT_EQ(1U, bindings()->errors.size()); |
| 230 EXPECT_EQ("FindProxyForURL is undefined or not a function.", | 236 EXPECT_EQ("FindProxyForURL is undefined or not a function.", |
| 231 bindings()->errors[0]); | 237 bindings()->errors[0]); |
| 232 EXPECT_EQ(-1, bindings()->errors_line_number[0]); | 238 EXPECT_EQ(-1, bindings()->errors_line_number[0]); |
| 233 } | 239 } |
| 234 | 240 |
| 235 // Try loading a malformed PAC script. | 241 // Try loading a malformed PAC script. |
| 236 TEST_F(ProxyResolverV8Test, ParseError) { | 242 TEST_F(ProxyResolverV8Test, ParseError) { |
| 237 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, CreateResolver("missing_close_brace.js")); | 243 EXPECT_THAT(CreateResolver("missing_close_brace.js"), |
| 244 IsError(ERR_PAC_SCRIPT_FAILED)); |
| 238 | 245 |
| 239 EXPECT_EQ(0U, bindings()->alerts.size()); | 246 EXPECT_EQ(0U, bindings()->alerts.size()); |
| 240 | 247 |
| 241 // We get one error during compilation. | 248 // We get one error during compilation. |
| 242 ASSERT_EQ(1U, bindings()->errors.size()); | 249 ASSERT_EQ(1U, bindings()->errors.size()); |
| 243 | 250 |
| 244 EXPECT_EQ("Uncaught SyntaxError: Unexpected end of input", | 251 EXPECT_EQ("Uncaught SyntaxError: Unexpected end of input", |
| 245 bindings()->errors[0]); | 252 bindings()->errors[0]); |
| 246 EXPECT_EQ(5, bindings()->errors_line_number[0]); | 253 EXPECT_EQ(5, bindings()->errors_line_number[0]); |
| 247 } | 254 } |
| 248 | 255 |
| 249 // Run a PAC script several times, which has side-effects. | 256 // Run a PAC script several times, which has side-effects. |
| 250 TEST_F(ProxyResolverV8Test, SideEffects) { | 257 TEST_F(ProxyResolverV8Test, SideEffects) { |
| 251 ASSERT_EQ(OK, CreateResolver("side_effects.js")); | 258 ASSERT_THAT(CreateResolver("side_effects.js"), IsOk()); |
| 252 | 259 |
| 253 // The PAC script increments a counter each time we invoke it. | 260 // The PAC script increments a counter each time we invoke it. |
| 254 for (int i = 0; i < 3; ++i) { | 261 for (int i = 0; i < 3; ++i) { |
| 255 ProxyInfo proxy_info; | 262 ProxyInfo proxy_info; |
| 256 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 263 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 257 EXPECT_EQ(OK, result); | 264 EXPECT_THAT(result, IsOk()); |
| 258 EXPECT_EQ(base::StringPrintf("sideffect_%d:80", i), | 265 EXPECT_EQ(base::StringPrintf("sideffect_%d:80", i), |
| 259 proxy_info.proxy_server().ToURI()); | 266 proxy_info.proxy_server().ToURI()); |
| 260 } | 267 } |
| 261 | 268 |
| 262 // Reload the script -- the javascript environment should be reset, hence | 269 // Reload the script -- the javascript environment should be reset, hence |
| 263 // the counter starts over. | 270 // the counter starts over. |
| 264 ASSERT_EQ(OK, CreateResolver("side_effects.js")); | 271 ASSERT_THAT(CreateResolver("side_effects.js"), IsOk()); |
| 265 | 272 |
| 266 for (int i = 0; i < 3; ++i) { | 273 for (int i = 0; i < 3; ++i) { |
| 267 ProxyInfo proxy_info; | 274 ProxyInfo proxy_info; |
| 268 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 275 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 269 EXPECT_EQ(OK, result); | 276 EXPECT_THAT(result, IsOk()); |
| 270 EXPECT_EQ(base::StringPrintf("sideffect_%d:80", i), | 277 EXPECT_EQ(base::StringPrintf("sideffect_%d:80", i), |
| 271 proxy_info.proxy_server().ToURI()); | 278 proxy_info.proxy_server().ToURI()); |
| 272 } | 279 } |
| 273 } | 280 } |
| 274 | 281 |
| 275 // Execute a PAC script which throws an exception in FindProxyForURL. | 282 // Execute a PAC script which throws an exception in FindProxyForURL. |
| 276 TEST_F(ProxyResolverV8Test, UnhandledException) { | 283 TEST_F(ProxyResolverV8Test, UnhandledException) { |
| 277 ASSERT_EQ(OK, CreateResolver("unhandled_exception.js")); | 284 ASSERT_THAT(CreateResolver("unhandled_exception.js"), IsOk()); |
| 278 | 285 |
| 279 ProxyInfo proxy_info; | 286 ProxyInfo proxy_info; |
| 280 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 287 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 281 | 288 |
| 282 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); | 289 EXPECT_THAT(result, IsError(ERR_PAC_SCRIPT_FAILED)); |
| 283 | 290 |
| 284 EXPECT_EQ(0U, bindings()->alerts.size()); | 291 EXPECT_EQ(0U, bindings()->alerts.size()); |
| 285 ASSERT_EQ(1U, bindings()->errors.size()); | 292 ASSERT_EQ(1U, bindings()->errors.size()); |
| 286 EXPECT_EQ("Uncaught ReferenceError: undefined_variable is not defined", | 293 EXPECT_EQ("Uncaught ReferenceError: undefined_variable is not defined", |
| 287 bindings()->errors[0]); | 294 bindings()->errors[0]); |
| 288 EXPECT_EQ(3, bindings()->errors_line_number[0]); | 295 EXPECT_EQ(3, bindings()->errors_line_number[0]); |
| 289 } | 296 } |
| 290 | 297 |
| 291 // Execute a PAC script which throws an exception when first accessing | 298 // Execute a PAC script which throws an exception when first accessing |
| 292 // FindProxyForURL | 299 // FindProxyForURL |
| 293 TEST_F(ProxyResolverV8Test, ExceptionAccessingFindProxyForURLDuringInit) { | 300 TEST_F(ProxyResolverV8Test, ExceptionAccessingFindProxyForURLDuringInit) { |
| 294 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, | 301 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, |
| 295 CreateResolver("exception_findproxyforurl_during_init.js")); | 302 CreateResolver("exception_findproxyforurl_during_init.js")); |
| 296 | 303 |
| 297 ASSERT_EQ(2U, bindings()->errors.size()); | 304 ASSERT_EQ(2U, bindings()->errors.size()); |
| 298 EXPECT_EQ("Uncaught crash!", bindings()->errors[0]); | 305 EXPECT_EQ("Uncaught crash!", bindings()->errors[0]); |
| 299 EXPECT_EQ(9, bindings()->errors_line_number[0]); | 306 EXPECT_EQ(9, bindings()->errors_line_number[0]); |
| 300 EXPECT_EQ("Accessing FindProxyForURL threw an exception.", | 307 EXPECT_EQ("Accessing FindProxyForURL threw an exception.", |
| 301 bindings()->errors[1]); | 308 bindings()->errors[1]); |
| 302 EXPECT_EQ(-1, bindings()->errors_line_number[1]); | 309 EXPECT_EQ(-1, bindings()->errors_line_number[1]); |
| 303 } | 310 } |
| 304 | 311 |
| 305 // Execute a PAC script which throws an exception during the second access to | 312 // Execute a PAC script which throws an exception during the second access to |
| 306 // FindProxyForURL | 313 // FindProxyForURL |
| 307 TEST_F(ProxyResolverV8Test, ExceptionAccessingFindProxyForURLDuringResolve) { | 314 TEST_F(ProxyResolverV8Test, ExceptionAccessingFindProxyForURLDuringResolve) { |
| 308 ASSERT_EQ(OK, CreateResolver("exception_findproxyforurl_during_resolve.js")); | 315 ASSERT_THAT(CreateResolver("exception_findproxyforurl_during_resolve.js"), |
| 316 IsOk()); |
| 309 | 317 |
| 310 ProxyInfo proxy_info; | 318 ProxyInfo proxy_info; |
| 311 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 319 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 312 | 320 |
| 313 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); | 321 EXPECT_THAT(result, IsError(ERR_PAC_SCRIPT_FAILED)); |
| 314 | 322 |
| 315 ASSERT_EQ(2U, bindings()->errors.size()); | 323 ASSERT_EQ(2U, bindings()->errors.size()); |
| 316 EXPECT_EQ("Uncaught crash!", bindings()->errors[0]); | 324 EXPECT_EQ("Uncaught crash!", bindings()->errors[0]); |
| 317 EXPECT_EQ(17, bindings()->errors_line_number[0]); | 325 EXPECT_EQ(17, bindings()->errors_line_number[0]); |
| 318 EXPECT_EQ("Accessing FindProxyForURL threw an exception.", | 326 EXPECT_EQ("Accessing FindProxyForURL threw an exception.", |
| 319 bindings()->errors[1]); | 327 bindings()->errors[1]); |
| 320 EXPECT_EQ(-1, bindings()->errors_line_number[1]); | 328 EXPECT_EQ(-1, bindings()->errors_line_number[1]); |
| 321 } | 329 } |
| 322 | 330 |
| 323 TEST_F(ProxyResolverV8Test, ReturnUnicode) { | 331 TEST_F(ProxyResolverV8Test, ReturnUnicode) { |
| 324 ASSERT_EQ(OK, CreateResolver("return_unicode.js")); | 332 ASSERT_THAT(CreateResolver("return_unicode.js"), IsOk()); |
| 325 | 333 |
| 326 ProxyInfo proxy_info; | 334 ProxyInfo proxy_info; |
| 327 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 335 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 328 | 336 |
| 329 // The result from this resolve was unparseable, because it | 337 // The result from this resolve was unparseable, because it |
| 330 // wasn't ASCII. | 338 // wasn't ASCII. |
| 331 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); | 339 EXPECT_THAT(result, IsError(ERR_PAC_SCRIPT_FAILED)); |
| 332 } | 340 } |
| 333 | 341 |
| 334 // Test the PAC library functions that we expose in the JS environment. | 342 // Test the PAC library functions that we expose in the JS environment. |
| 335 TEST_F(ProxyResolverV8Test, JavascriptLibrary) { | 343 TEST_F(ProxyResolverV8Test, JavascriptLibrary) { |
| 336 ASSERT_EQ(OK, CreateResolver("pac_library_unittest.js")); | 344 ASSERT_THAT(CreateResolver("pac_library_unittest.js"), IsOk()); |
| 337 | 345 |
| 338 ProxyInfo proxy_info; | 346 ProxyInfo proxy_info; |
| 339 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 347 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 340 | 348 |
| 341 // If the javascript side of this unit-test fails, it will throw a javascript | 349 // If the javascript side of this unit-test fails, it will throw a javascript |
| 342 // exception. Otherwise it will return "PROXY success:80". | 350 // exception. Otherwise it will return "PROXY success:80". |
| 343 EXPECT_EQ(OK, result); | 351 EXPECT_THAT(result, IsOk()); |
| 344 EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); | 352 EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); |
| 345 | 353 |
| 346 EXPECT_EQ(0U, bindings()->alerts.size()); | 354 EXPECT_EQ(0U, bindings()->alerts.size()); |
| 347 EXPECT_EQ(0U, bindings()->errors.size()); | 355 EXPECT_EQ(0U, bindings()->errors.size()); |
| 348 } | 356 } |
| 349 | 357 |
| 350 // Test marshalling/un-marshalling of values between C++/V8. | 358 // Test marshalling/un-marshalling of values between C++/V8. |
| 351 TEST_F(ProxyResolverV8Test, V8Bindings) { | 359 TEST_F(ProxyResolverV8Test, V8Bindings) { |
| 352 ASSERT_EQ(OK, CreateResolver("bindings.js")); | 360 ASSERT_THAT(CreateResolver("bindings.js"), IsOk()); |
| 353 bindings()->dns_resolve_result = "127.0.0.1"; | 361 bindings()->dns_resolve_result = "127.0.0.1"; |
| 354 | 362 |
| 355 ProxyInfo proxy_info; | 363 ProxyInfo proxy_info; |
| 356 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 364 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 357 | 365 |
| 358 EXPECT_EQ(OK, result); | 366 EXPECT_THAT(result, IsOk()); |
| 359 EXPECT_TRUE(proxy_info.is_direct()); | 367 EXPECT_TRUE(proxy_info.is_direct()); |
| 360 | 368 |
| 361 EXPECT_EQ(0U, bindings()->errors.size()); | 369 EXPECT_EQ(0U, bindings()->errors.size()); |
| 362 | 370 |
| 363 // Alert was called 5 times. | 371 // Alert was called 5 times. |
| 364 ASSERT_EQ(5U, bindings()->alerts.size()); | 372 ASSERT_EQ(5U, bindings()->alerts.size()); |
| 365 EXPECT_EQ("undefined", bindings()->alerts[0]); | 373 EXPECT_EQ("undefined", bindings()->alerts[0]); |
| 366 EXPECT_EQ("null", bindings()->alerts[1]); | 374 EXPECT_EQ("null", bindings()->alerts[1]); |
| 367 EXPECT_EQ("undefined", bindings()->alerts[2]); | 375 EXPECT_EQ("undefined", bindings()->alerts[2]); |
| 368 EXPECT_EQ("[object Object]", bindings()->alerts[3]); | 376 EXPECT_EQ("[object Object]", bindings()->alerts[3]); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 382 | 390 |
| 383 // DnsResolveEx was called 2 times. | 391 // DnsResolveEx was called 2 times. |
| 384 ASSERT_EQ(2U, bindings()->dns_resolves_ex.size()); | 392 ASSERT_EQ(2U, bindings()->dns_resolves_ex.size()); |
| 385 EXPECT_EQ("is_resolvable", bindings()->dns_resolves_ex[0]); | 393 EXPECT_EQ("is_resolvable", bindings()->dns_resolves_ex[0]); |
| 386 EXPECT_EQ("foobar", bindings()->dns_resolves_ex[1]); | 394 EXPECT_EQ("foobar", bindings()->dns_resolves_ex[1]); |
| 387 } | 395 } |
| 388 | 396 |
| 389 // Test calling a binding (myIpAddress()) from the script's global scope. | 397 // Test calling a binding (myIpAddress()) from the script's global scope. |
| 390 // http://crbug.com/40026 | 398 // http://crbug.com/40026 |
| 391 TEST_F(ProxyResolverV8Test, BindingCalledDuringInitialization) { | 399 TEST_F(ProxyResolverV8Test, BindingCalledDuringInitialization) { |
| 392 ASSERT_EQ(OK, CreateResolver("binding_from_global.js")); | 400 ASSERT_THAT(CreateResolver("binding_from_global.js"), IsOk()); |
| 393 | 401 |
| 394 // myIpAddress() got called during initialization of the script. | 402 // myIpAddress() got called during initialization of the script. |
| 395 EXPECT_EQ(1, bindings()->my_ip_address_count); | 403 EXPECT_EQ(1, bindings()->my_ip_address_count); |
| 396 | 404 |
| 397 ProxyInfo proxy_info; | 405 ProxyInfo proxy_info; |
| 398 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 406 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 399 | 407 |
| 400 EXPECT_EQ(OK, result); | 408 EXPECT_THAT(result, IsOk()); |
| 401 EXPECT_FALSE(proxy_info.is_direct()); | 409 EXPECT_FALSE(proxy_info.is_direct()); |
| 402 EXPECT_EQ("127.0.0.1:80", proxy_info.proxy_server().ToURI()); | 410 EXPECT_EQ("127.0.0.1:80", proxy_info.proxy_server().ToURI()); |
| 403 | 411 |
| 404 // Check that no other bindings were called. | 412 // Check that no other bindings were called. |
| 405 EXPECT_EQ(0U, bindings()->errors.size()); | 413 EXPECT_EQ(0U, bindings()->errors.size()); |
| 406 ASSERT_EQ(0U, bindings()->alerts.size()); | 414 ASSERT_EQ(0U, bindings()->alerts.size()); |
| 407 ASSERT_EQ(0U, bindings()->dns_resolves.size()); | 415 ASSERT_EQ(0U, bindings()->dns_resolves.size()); |
| 408 EXPECT_EQ(0, bindings()->my_ip_address_ex_count); | 416 EXPECT_EQ(0, bindings()->my_ip_address_ex_count); |
| 409 ASSERT_EQ(0U, bindings()->dns_resolves_ex.size()); | 417 ASSERT_EQ(0U, bindings()->dns_resolves_ex.size()); |
| 410 } | 418 } |
| 411 | 419 |
| 412 // Try loading a PAC script that ends with a comment and has no terminal | 420 // Try loading a PAC script that ends with a comment and has no terminal |
| 413 // newline. This should not cause problems with the PAC utility functions | 421 // newline. This should not cause problems with the PAC utility functions |
| 414 // that we add to the script's environment. | 422 // that we add to the script's environment. |
| 415 // http://crbug.com/22864 | 423 // http://crbug.com/22864 |
| 416 TEST_F(ProxyResolverV8Test, EndsWithCommentNoNewline) { | 424 TEST_F(ProxyResolverV8Test, EndsWithCommentNoNewline) { |
| 417 ASSERT_EQ(OK, CreateResolver("ends_with_comment.js")); | 425 ASSERT_THAT(CreateResolver("ends_with_comment.js"), IsOk()); |
| 418 | 426 |
| 419 ProxyInfo proxy_info; | 427 ProxyInfo proxy_info; |
| 420 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 428 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 421 | 429 |
| 422 EXPECT_EQ(OK, result); | 430 EXPECT_THAT(result, IsOk()); |
| 423 EXPECT_FALSE(proxy_info.is_direct()); | 431 EXPECT_FALSE(proxy_info.is_direct()); |
| 424 EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); | 432 EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); |
| 425 } | 433 } |
| 426 | 434 |
| 427 // Try loading a PAC script that ends with a statement and has no terminal | 435 // Try loading a PAC script that ends with a statement and has no terminal |
| 428 // newline. This should not cause problems with the PAC utility functions | 436 // newline. This should not cause problems with the PAC utility functions |
| 429 // that we add to the script's environment. | 437 // that we add to the script's environment. |
| 430 // http://crbug.com/22864 | 438 // http://crbug.com/22864 |
| 431 TEST_F(ProxyResolverV8Test, EndsWithStatementNoNewline) { | 439 TEST_F(ProxyResolverV8Test, EndsWithStatementNoNewline) { |
| 432 ASSERT_EQ(OK, CreateResolver("ends_with_statement_no_semicolon.js")); | 440 ASSERT_THAT(CreateResolver("ends_with_statement_no_semicolon.js"), IsOk()); |
| 433 | 441 |
| 434 ProxyInfo proxy_info; | 442 ProxyInfo proxy_info; |
| 435 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 443 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 436 | 444 |
| 437 EXPECT_EQ(OK, result); | 445 EXPECT_THAT(result, IsOk()); |
| 438 EXPECT_FALSE(proxy_info.is_direct()); | 446 EXPECT_FALSE(proxy_info.is_direct()); |
| 439 EXPECT_EQ("success:3", proxy_info.proxy_server().ToURI()); | 447 EXPECT_EQ("success:3", proxy_info.proxy_server().ToURI()); |
| 440 } | 448 } |
| 441 | 449 |
| 442 // Test the return values from myIpAddress(), myIpAddressEx(), dnsResolve(), | 450 // Test the return values from myIpAddress(), myIpAddressEx(), dnsResolve(), |
| 443 // dnsResolveEx(), isResolvable(), isResolvableEx(), when the the binding | 451 // dnsResolveEx(), isResolvable(), isResolvableEx(), when the the binding |
| 444 // returns empty string (failure). This simulates the return values from | 452 // returns empty string (failure). This simulates the return values from |
| 445 // those functions when the underlying DNS resolution fails. | 453 // those functions when the underlying DNS resolution fails. |
| 446 TEST_F(ProxyResolverV8Test, DNSResolutionFailure) { | 454 TEST_F(ProxyResolverV8Test, DNSResolutionFailure) { |
| 447 ASSERT_EQ(OK, CreateResolver("dns_fail.js")); | 455 ASSERT_THAT(CreateResolver("dns_fail.js"), IsOk()); |
| 448 | 456 |
| 449 ProxyInfo proxy_info; | 457 ProxyInfo proxy_info; |
| 450 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 458 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 451 | 459 |
| 452 EXPECT_EQ(OK, result); | 460 EXPECT_THAT(result, IsOk()); |
| 453 EXPECT_FALSE(proxy_info.is_direct()); | 461 EXPECT_FALSE(proxy_info.is_direct()); |
| 454 EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); | 462 EXPECT_EQ("success:80", proxy_info.proxy_server().ToURI()); |
| 455 } | 463 } |
| 456 | 464 |
| 457 TEST_F(ProxyResolverV8Test, DNSResolutionOfInternationDomainName) { | 465 TEST_F(ProxyResolverV8Test, DNSResolutionOfInternationDomainName) { |
| 458 ASSERT_EQ(OK, CreateResolver("international_domain_names.js")); | 466 ASSERT_THAT(CreateResolver("international_domain_names.js"), IsOk()); |
| 459 | 467 |
| 460 // Execute FindProxyForURL(). | 468 // Execute FindProxyForURL(). |
| 461 ProxyInfo proxy_info; | 469 ProxyInfo proxy_info; |
| 462 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); | 470 int result = resolver().GetProxyForURL(kQueryUrl, &proxy_info, bindings()); |
| 463 | 471 |
| 464 EXPECT_EQ(OK, result); | 472 EXPECT_THAT(result, IsOk()); |
| 465 EXPECT_TRUE(proxy_info.is_direct()); | 473 EXPECT_TRUE(proxy_info.is_direct()); |
| 466 | 474 |
| 467 // Check that the international domain name was converted to punycode | 475 // Check that the international domain name was converted to punycode |
| 468 // before passing it onto the bindings layer. | 476 // before passing it onto the bindings layer. |
| 469 ASSERT_EQ(1u, bindings()->dns_resolves.size()); | 477 ASSERT_EQ(1u, bindings()->dns_resolves.size()); |
| 470 EXPECT_EQ("xn--bcher-kva.ch", bindings()->dns_resolves[0]); | 478 EXPECT_EQ("xn--bcher-kva.ch", bindings()->dns_resolves[0]); |
| 471 | 479 |
| 472 ASSERT_EQ(1u, bindings()->dns_resolves_ex.size()); | 480 ASSERT_EQ(1u, bindings()->dns_resolves_ex.size()); |
| 473 EXPECT_EQ("xn--bcher-kva.ch", bindings()->dns_resolves_ex[0]); | 481 EXPECT_EQ("xn--bcher-kva.ch", bindings()->dns_resolves_ex[0]); |
| 474 } | 482 } |
| 475 | 483 |
| 476 // Test that when resolving a URL which contains an IPv6 string literal, the | 484 // Test that when resolving a URL which contains an IPv6 string literal, the |
| 477 // brackets are removed from the host before passing it down to the PAC script. | 485 // brackets are removed from the host before passing it down to the PAC script. |
| 478 // If we don't do this, then subsequent calls to dnsResolveEx(host) will be | 486 // If we don't do this, then subsequent calls to dnsResolveEx(host) will be |
| 479 // doomed to fail since it won't correspond with a valid name. | 487 // doomed to fail since it won't correspond with a valid name. |
| 480 TEST_F(ProxyResolverV8Test, IPv6HostnamesNotBracketed) { | 488 TEST_F(ProxyResolverV8Test, IPv6HostnamesNotBracketed) { |
| 481 ASSERT_EQ(OK, CreateResolver("resolve_host.js")); | 489 ASSERT_THAT(CreateResolver("resolve_host.js"), IsOk()); |
| 482 | 490 |
| 483 ProxyInfo proxy_info; | 491 ProxyInfo proxy_info; |
| 484 int result = resolver().GetProxyForURL( | 492 int result = resolver().GetProxyForURL( |
| 485 GURL("http://[abcd::efff]:99/watsupdawg"), &proxy_info, bindings()); | 493 GURL("http://[abcd::efff]:99/watsupdawg"), &proxy_info, bindings()); |
| 486 | 494 |
| 487 EXPECT_EQ(OK, result); | 495 EXPECT_THAT(result, IsOk()); |
| 488 EXPECT_TRUE(proxy_info.is_direct()); | 496 EXPECT_TRUE(proxy_info.is_direct()); |
| 489 | 497 |
| 490 // We called dnsResolveEx() exactly once, by passing through the "host" | 498 // We called dnsResolveEx() exactly once, by passing through the "host" |
| 491 // argument to FindProxyForURL(). The brackets should have been stripped. | 499 // argument to FindProxyForURL(). The brackets should have been stripped. |
| 492 ASSERT_EQ(1U, bindings()->dns_resolves_ex.size()); | 500 ASSERT_EQ(1U, bindings()->dns_resolves_ex.size()); |
| 493 EXPECT_EQ("abcd::efff", bindings()->dns_resolves_ex[0]); | 501 EXPECT_EQ("abcd::efff", bindings()->dns_resolves_ex[0]); |
| 494 } | 502 } |
| 495 | 503 |
| 496 // Test that terminating a script within DnsResolve() leads to eventual | 504 // Test that terminating a script within DnsResolve() leads to eventual |
| 497 // termination of the script. Also test that repeatedly calling terminate is | 505 // termination of the script. Also test that repeatedly calling terminate is |
| 498 // safe, and running the script again after termination still works. | 506 // safe, and running the script again after termination still works. |
| 499 TEST_F(ProxyResolverV8Test, Terminate) { | 507 TEST_F(ProxyResolverV8Test, Terminate) { |
| 500 ASSERT_EQ(OK, CreateResolver("terminate.js")); | 508 ASSERT_THAT(CreateResolver("terminate.js"), IsOk()); |
| 501 | 509 |
| 502 // Terminate script execution upon reaching dnsResolve(). Note that | 510 // Terminate script execution upon reaching dnsResolve(). Note that |
| 503 // termination may not take effect right away (so the subsequent dnsResolve() | 511 // termination may not take effect right away (so the subsequent dnsResolve() |
| 504 // and alert() may be run). | 512 // and alert() may be run). |
| 505 bindings()->should_terminate = true; | 513 bindings()->should_terminate = true; |
| 506 | 514 |
| 507 ProxyInfo proxy_info; | 515 ProxyInfo proxy_info; |
| 508 int result = | 516 int result = |
| 509 resolver().GetProxyForURL(GURL("http://hang/"), &proxy_info, bindings()); | 517 resolver().GetProxyForURL(GURL("http://hang/"), &proxy_info, bindings()); |
| 510 | 518 |
| 511 // The script execution was terminated. | 519 // The script execution was terminated. |
| 512 EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, result); | 520 EXPECT_THAT(result, IsError(ERR_PAC_SCRIPT_FAILED)); |
| 513 | 521 |
| 514 EXPECT_EQ(1U, bindings()->dns_resolves.size()); | 522 EXPECT_EQ(1U, bindings()->dns_resolves.size()); |
| 515 EXPECT_GE(2U, bindings()->dns_resolves_ex.size()); | 523 EXPECT_GE(2U, bindings()->dns_resolves_ex.size()); |
| 516 EXPECT_GE(1U, bindings()->alerts.size()); | 524 EXPECT_GE(1U, bindings()->alerts.size()); |
| 517 | 525 |
| 518 EXPECT_EQ(1U, bindings()->errors.size()); | 526 EXPECT_EQ(1U, bindings()->errors.size()); |
| 519 | 527 |
| 520 // Termination shows up as an uncaught exception without any message. | 528 // Termination shows up as an uncaught exception without any message. |
| 521 EXPECT_EQ("", bindings()->errors[0]); | 529 EXPECT_EQ("", bindings()->errors[0]); |
| 522 | 530 |
| 523 bindings()->errors.clear(); | 531 bindings()->errors.clear(); |
| 524 | 532 |
| 525 // Try running the script again, this time with a different input which won't | 533 // Try running the script again, this time with a different input which won't |
| 526 // cause a termination+hang. | 534 // cause a termination+hang. |
| 527 result = resolver().GetProxyForURL(GURL("http://kittens/"), &proxy_info, | 535 result = resolver().GetProxyForURL(GURL("http://kittens/"), &proxy_info, |
| 528 bindings()); | 536 bindings()); |
| 529 | 537 |
| 530 EXPECT_EQ(OK, result); | 538 EXPECT_THAT(result, IsOk()); |
| 531 EXPECT_EQ(0u, bindings()->errors.size()); | 539 EXPECT_EQ(0u, bindings()->errors.size()); |
| 532 EXPECT_EQ("kittens:88", proxy_info.proxy_server().ToURI()); | 540 EXPECT_EQ("kittens:88", proxy_info.proxy_server().ToURI()); |
| 533 } | 541 } |
| 534 | 542 |
| 535 } // namespace | 543 } // namespace |
| 536 } // namespace net | 544 } // namespace net |
| OLD | NEW |