12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_resolver_v8_tracing.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/file_util.h"
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
125e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/platform_thread.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_errors.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_log.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_log_unittest.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/test_completion_callback.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/dns/host_cache.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_info.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_resolver_error_observer.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProxyResolverV8TracingTest : public testing::Test {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Drain any pending messages, which may be left over from cancellation.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This way they get reliably run as part of the current test, rather than
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // spilling into the next test's execution.
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<ProxyResolverScriptData> LoadScriptData(const char* filename) {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &path);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = path.AppendASCII("net");
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = path.AppendASCII("data");
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = path.AppendASCII("proxy_resolver_v8_tracing_unittest");
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = path.AppendASCII(filename);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try to read the file from disk.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string file_contents;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ok = file_util::ReadFileToString(path, &file_contents);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we can't load the file from disk, something is misconfigured.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ok) << "Failed to read file: " << path.value();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load the PAC script into the ProxyResolver.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ProxyResolverScriptData::FromUTF8(file_contents);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InitResolver(ProxyResolverV8Tracing* resolver, const char* filename) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv =
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resolver->SetPacScript(LoadScriptData(filename), callback.callback());
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockErrorObserver : public ProxyResolverErrorObserver {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver() : event_(true, false) {}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPACScriptError(int line_number,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const base::string16& error) OVERRIDE {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::AutoLock l(lock_);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      output += base::StringPrintf("Error: line %d: %s\n", line_number,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   UTF16ToASCII(error).c_str());
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event_.Signal();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string GetOutput() {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::AutoLock l(lock_);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return output;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void WaitForOutput() {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event_.Wait();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Lock lock_;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string output;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WaitableEvent event_;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, Simple) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "simple.js");
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info, callback.callback(),
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL, request_log.bound());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foo:99", proxy_info.proxy_server().ToURI());
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, host_resolver.num_resolve());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There were no errors.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- nothing was logged.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, log.GetSize());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, request_log.GetSize());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, JavascriptError) {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "error.js");
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://throw-an-error/"), &proxy_info, callback.callback(), NULL,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, callback.WaitForResult());
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, host_resolver.num_resolve());
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("Error: line 5: Uncaught TypeError: Cannot call method 'split' "
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "of null\n", error_observer->GetOutput());
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- there was 1 alert and 1 javascript error, and they
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // were output to both the global log, and per-request log.
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog::CapturedEntryList entries_list[2];
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  log.GetEntries(&entries_list[0]);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  request_log.GetEntries(&entries_list[1]);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i];
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2u, entries.size());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogContainsEvent(entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         NetLog::PHASE_NONE));
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogContainsEvent(entries, 1, NetLog::TYPE_PAC_JAVASCRIPT_ERROR,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         NetLog::PHASE_NONE));
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("{\"message\":\"Prepare to DIE!\"}", entries[0].GetParamsJson());
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("{\"line_number\":5,\"message\":\"Uncaught TypeError: Cannot "
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "call method 'split' of null\"}", entries[1].GetParamsJson());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, TooManyAlerts) {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "too_many_alerts.js");
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"),
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &proxy_info,
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.callback(),
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Iteration1 does a DNS resolve
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Iteration2 exceeds the alert buffer
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Iteration3 runs in blocking mode and completes
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI());
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, host_resolver.num_resolve());
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- the script generated 50 alerts, which were mirrored
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to both the global and per-request logs.
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog::CapturedEntryList entries_list[2];
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  log.GetEntries(&entries_list[0]);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  request_log.GetEntries(&entries_list[1]);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i];
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(50u, entries.size());
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < entries.size(); ++i) {
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASSERT_TRUE(
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          LogContainsEvent(entries, i, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           NetLog::PHASE_NONE));
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that buffered alerts cannot grow unboundedly, even when the message is
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// empty string.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, TooManyEmptyAlerts) {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "too_many_empty_alerts.js");
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"),
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &proxy_info,
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.callback(),
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foo:3", proxy_info.proxy_server().ToURI());
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, host_resolver.num_resolve());
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- the script generated 50 alerts, which were mirrored
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to both the global and per-request logs.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog::CapturedEntryList entries_list[2];
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  log.GetEntries(&entries_list[0]);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  request_log.GetEntries(&entries_list[1]);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i];
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1000u, entries.size());
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < entries.size(); ++i) {
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ASSERT_TRUE(
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          LogContainsEvent(entries, i, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           NetLog::PHASE_NONE));
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a PAC script that issues a sequence of DNS resolves. The test
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// verifies the final result, and that the underlying DNS resolver received
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the correct set of queries.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, Dns) {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRuleForAddressFamily(
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "host1", ADDRESS_FAMILY_IPV4, "166.155.144.44");
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_resolver.rules()
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ->AddIPLiteralRule("host1", "::1,192.168.1.1", std::string());
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddSimulatedFailure("host2");
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host3", "166.155.144.33");
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host5", "166.155.144.55");
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddSimulatedFailure("host6");
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRuleForAddressFamily(
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "*", ADDRESS_FAMILY_IPV4, "122.133.144.155");
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("*", "133.122.100.200");
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "dns.js");
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"),
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &proxy_info,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.callback(),
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The test does 13 DNS resolution, however only 7 of them are unique.
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(7u, host_resolver.num_resolve());
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kExpectedResult =
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "122.133.144.155-"  // myIpAddress()
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "null-"  // dnsResolve('')
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "__1_192.168.1.1-"  // dnsResolveEx('host1')
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "null-"  // dnsResolve('host2')
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "166.155.144.33-"  // dnsResolve('host3')
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "122.133.144.155-"  // myIpAddress()
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "166.155.144.33-"  // dnsResolve('host3')
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "__1_192.168.1.1-"  // dnsResolveEx('host1')
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "122.133.144.155-"  // myIpAddress()
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "null-"  // dnsResolve('host2')
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "-"  // dnsResolveEx('host6')
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "133.122.100.200-"  // myIpAddressEx()
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "166.155.144.44"  // dnsResolve('host1')
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ":99";
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kExpectedResult, proxy_info.proxy_server().ToURI());
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- the script generated 1 alert, mirrored to both
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the per-request and global logs.
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog::CapturedEntryList entries_list[2];
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  log.GetEntries(&entries_list[0]);
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  request_log.GetEntries(&entries_list[1]);
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) {
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i];
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, entries.size());
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogContainsEvent(entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         NetLog::PHASE_NONE));
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("{\"message\":\"iteration: 7\"}", entries[0].GetParamsJson());
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a PAC script that does "myIpAddress()" followed by
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// "dnsResolve()". This requires 2 restarts. However once the HostResolver's
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// cache is warmed, subsequent calls should take 0 restarts.
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, DnsChecksCache) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("foopy", "166.155.144.11");
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("*", "122.133.144.155");
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "simple_dns.js");
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback1;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback2;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foopy/req1"),
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &proxy_info,
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback1.callback(),
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback1.WaitForResult());
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The test does 2 DNS resolutions.
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, host_resolver.num_resolve());
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first request took 2 restarts, hence on g_iteration=3.
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("166.155.144.11:3", proxy_info.proxy_server().ToURI());
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = resolver.GetProxyForURL(
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foopy/req2"),
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &proxy_info,
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback2.callback(),
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback2.WaitForResult());
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, host_resolver.num_resolve());
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This time no restarts were required, so g_iteration incremented by 1.
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("166.155.144.11:4", proxy_info.proxy_server().ToURI());
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, log.GetSize());
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, request_log.GetSize());
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a weird PAC script that was designed to defeat the DNS tracing
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// optimization. The proxy resolver should detect the inconsistency and
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fall-back to synchronous mode execution.
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, FallBackToSynchronous1) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host1", "166.155.144.11");
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("crazy4", "133.199.111.4");
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("*", "122.133.144.155");
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "global_sideffects1.js");
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info, callback.callback(), NULL,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The script itself only does 2 DNS resolves per execution, however it
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // constructs the hostname using a global counter which changes on each
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // invocation.
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, host_resolver.num_resolve());
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("166.155.144.11-133.199.111.4:100",
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            proxy_info.proxy_server().ToURI());
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- the script generated 1 alert, mirrored to both
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the per-request and global logs.
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog::CapturedEntryList entries_list[2];
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  log.GetEntries(&entries_list[0]);
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  request_log.GetEntries(&entries_list[1]);
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t list_i = 0; list_i < arraysize(entries_list); list_i++) {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const CapturingNetLog::CapturedEntryList& entries = entries_list[list_i];
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, entries.size());
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LogContainsEvent(entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         NetLog::PHASE_NONE));
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ("{\"message\":\"iteration: 4\"}", entries[0].GetParamsJson());
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a weird PAC script that was designed to defeat the DNS tracing
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// optimization. The proxy resolver should detect the inconsistency and
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fall-back to synchronous mode execution.
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, FallBackToSynchronous2) {
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host1", "166.155.144.11");
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host2", "166.155.144.22");
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host3", "166.155.144.33");
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host4", "166.155.144.44");
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("*", "122.133.144.155");
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "global_sideffects2.js");
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info, callback.callback(), NULL,
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, host_resolver.num_resolve());
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("166.155.144.44:100", proxy_info.proxy_server().ToURI());
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- nothing was logged.
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, log.GetSize());
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, request_log.GetSize());
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a weird PAC script that yields a never ending sequence
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of DNS resolves when restarting. Running it will hit the maximum
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DNS resolves per request limit (20) after which every DNS resolve will
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fail.
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, InfiniteDNSSequence) {
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host*", "166.155.144.11");
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("*", "122.133.144.155");
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "global_sideffects3.js");
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info, callback.callback(), NULL,
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20u, host_resolver.num_resolve());
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-"
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-"
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-"
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-"
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "166.155.144.11-166.155.144.11-166.155.144.11-166.155.144.11-"
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "null:21", proxy_info.proxy_server().ToURI());
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- 1 alert was logged.
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, log.GetSize());
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, request_log.GetSize());
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test runs a weird PAC script that yields a never ending sequence
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of DNS resolves when restarting. Running it will hit the maximum
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DNS resolves per request limit (20) after which every DNS resolve will
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// fail.
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, InfiniteDNSSequence2) {
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host*", "166.155.144.11");
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("*", "122.133.144.155");
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "global_sideffects4.js");
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info, callback.callback(), NULL,
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20u, host_resolver.num_resolve());
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("null21:34", proxy_info.proxy_server().ToURI());
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- 1 alert was logged.
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, log.GetSize());
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, request_log.GetSize());
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DnsDuringInitHelper(bool synchronous_host_resolver) {
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.set_synchronous_mode(synchronous_host_resolver);
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host1", "91.13.12.1");
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host2", "91.13.12.2");
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "dns_during_init.js");
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initialization did 2 dnsResolves.
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, host_resolver.num_resolve());
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->ClearRules();
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.GetHostCache()->clear();
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host1", "145.88.13.3");
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host2", "137.89.8.45");
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info, callback.callback(), NULL,
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fetched host1 and host2 again, since the ones done during initialization
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should not have been cached.
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, host_resolver.num_resolve());
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("91.13.12.1-91.13.12.2-145.88.13.3-137.89.8.45:99",
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            proxy_info.proxy_server().ToURI());
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the NetLogs -- the script generated 2 alerts during initialization.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, request_log.GetSize());
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog::CapturedEntryList entries;
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  log.GetEntries(&entries);
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, entries.size());
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LogContainsEvent(entries, 0, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       NetLog::PHASE_NONE));
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LogContainsEvent(entries, 1, NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       NetLog::PHASE_NONE));
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("{\"message\":\"Watsup\"}", entries[0].GetParamsJson());
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("{\"message\":\"Watsup2\"}", entries[1].GetParamsJson());
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests a PAC script which does DNS resolves during initialization.
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, DnsDuringInit) {
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test with both both a host resolver that always completes asynchronously,
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and then again with one that completes synchronously.
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DnsDuringInitHelper(false);
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DnsDuringInitHelper(true);
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CrashCallback(int) {
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Be extra sure that if the callback ever gets invoked, the test will fail.
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(false);
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Start some requests, cancel them all, and then destroy the resolver.
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note the execution order for this test can vary. Since multiple
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// threads are involved, the cancellation may be received a different
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// times.
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelAll) {
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL);
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddSimulatedFailure("*");
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "dns.js");
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t kNumRequests = 5;
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info[kNumRequests];
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request[kNumRequests];
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < kNumRequests; ++i) {
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int rv = resolver.GetProxyForURL(
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GURL("http://foo/"), &proxy_info[i],
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&CrashCallback), &request[i], BoundNetLog());
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, rv);
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < kNumRequests; ++i) {
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resolver.CancelRequest(request[i]);
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Note the execution order for this test can vary. Since multiple
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// threads are involved, the cancellation may be received a different
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// times.
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelSome) {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddSimulatedFailure("*");
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "dns.js");
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info1;
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info2;
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request1;
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request2;
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info1,
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CrashCallback), &request1, BoundNetLog());
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = resolver.GetProxyForURL(
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info2,
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.callback(), &request2, BoundNetLog());
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resolver.CancelRequest(request1);
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancel a request after it has finished running on the worker thread, and has
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// posted a task the completion task back to origin thread.
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelWhilePendingCompletionTask) {
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL);
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddSimulatedFailure("*");
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "error.js");
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info1;
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info2;
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info3;
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request1;
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request2;
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request3;
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info1,
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CrashCallback), &request1, BoundNetLog());
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = resolver.GetProxyForURL(
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://throw-an-error/"), &proxy_info2,
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.callback(), &request2, BoundNetLog());
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait until the first request has finished running on the worker thread.
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (The second request will output an error).
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  error_observer->WaitForOutput();
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cancel the first request, while it has a pending completion task on
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the origin thread.
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resolver.CancelRequest(request1);
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_PAC_SCRIPT_FAILED, callback.WaitForResult());
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start another request, to make sure it is able to complete.
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = resolver.GetProxyForURL(
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://i-have-no-idea-what-im-doing/"), &proxy_info3,
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.callback(), &request3, BoundNetLog());
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("i-approve-this-message:42",
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            proxy_info3.proxy_server().ToURI());
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This implementation of HostResolver allows blocking until a resolve request
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// has been received. The resolve requests it receives will never be completed.
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BlockableHostResolver : public HostResolver {
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BlockableHostResolver()
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : num_cancelled_requests_(0), waiting_for_resolve_(false) {}
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int Resolve(const RequestInfo& info,
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      AddressList* addresses,
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const CompletionCallback& callback,
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      RequestHandle* out_req,
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const BoundNetLog& net_log) OVERRIDE {
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(callback.is_null());
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(out_req);
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!action_.is_null())
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      action_.Run();
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Indicate to the caller that a request was received.
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(waiting_for_resolve_);
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Quit();
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This line is intentionally after action_.Run(), since one of the
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // tests does a cancellation inside of Resolve(), and it is more
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // interesting if *out_req hasn't been written yet at that point.
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *out_req = reinterpret_cast<RequestHandle*>(1);  // Magic value.
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Return ERR_IO_PENDING as this request will NEVER be completed.
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Expectation is for the caller to later cancel the request.
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ERR_IO_PENDING;
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int ResolveFromCache(const RequestInfo& info,
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               AddressList* addresses,
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const BoundNetLog& net_log) OVERRIDE {
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ERR_DNS_CACHE_MISS;
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void CancelRequest(RequestHandle req) OVERRIDE {
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(reinterpret_cast<RequestHandle*>(1), req);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    num_cancelled_requests_++;
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetAction(const base::Callback<void(void)>& action) {
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    action_ = action;
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Waits until Resolve() has been called.
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void WaitUntilRequestIsReceived() {
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_for_resolve_ = true;
81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(waiting_for_resolve_);
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    waiting_for_resolve_ = false;
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_cancelled_requests() const {
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return num_cancelled_requests_;
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_cancelled_requests_;
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool waiting_for_resolve_;
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Callback<void(void)> action_;
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This cancellation test exercises a more predictable cancellation codepath --
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when the request has an outstanding DNS request in flight.
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelWhileOutstandingNonBlockingDns) {
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BlockableHostResolver host_resolver;
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL);
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "dns.js");
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info1;
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info2;
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request1;
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request2;
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/req1"), &proxy_info1,
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CrashCallback), &request1, BoundNetLog());
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.WaitUntilRequestIsReceived();
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rv = resolver.GetProxyForURL(
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/req2"), &proxy_info2,
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CrashCallback), &request2, BoundNetLog());
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.WaitUntilRequestIsReceived();
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resolver.CancelRequest(request1);
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resolver.CancelRequest(request2);
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, host_resolver.num_cancelled_requests());
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // After leaving this scope, the ProxyResolver is destroyed.
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This should not cause any problems, as the outstanding work
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should have been cancelled.
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CancelRequestAndPause(ProxyResolverV8Tracing* resolver,
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ProxyResolver::RequestHandle request) {
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resolver->CancelRequest(request);
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sleep for a little bit. This makes it more likely for the worker
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // thread to have returned from its call, and serves as a regression
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // test for http://crbug.com/173373.
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(30));
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// In non-blocking mode, the worker thread actually does block for
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a short time to see if the result is in the DNS cache. Test
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// cancellation while the worker thread is waiting on this event.
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelWhileBlockedInNonBlockingDns) {
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BlockableHostResolver host_resolver;
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL);
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "dns.js");
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request;
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info,
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CrashCallback), &request, BoundNetLog());
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.SetAction(
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(CancelRequestAndPause, &resolver, request));
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.WaitUntilRequestIsReceived();
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // At this point the host resolver ran Resolve(), and should have cancelled
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the request.
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, host_resolver.num_cancelled_requests());
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Cancel the request while there is a pending DNS request, however before
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the request is sent to the host resolver.
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelWhileBlockedInNonBlockingDns2) {
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL);
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "dns.js");
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolver::RequestHandle request;
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foo/"), &proxy_info,
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CrashCallback), &request, BoundNetLog());
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait a bit, so the DNS task has hopefully been posted. The test will
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // work whatever the delay is here, but it is most useful if the delay
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is large enough to allow a task to be posted back.
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resolver.CancelRequest(request);
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, host_resolver.num_resolve());
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, CancelSetPacWhileOutstandingBlockingDns) {
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BlockableHostResolver host_resolver;
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, NULL);
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv =
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resolver.SetPacScript(LoadScriptData("dns_during_init.js"),
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CrashCallback));
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.WaitUntilRequestIsReceived();
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resolver.CancelSetPacScript();
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, host_resolver.num_cancelled_requests());
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This tests that the execution of a PAC script is terminated when the DNS
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// dependencies are missing. If the test fails, then it will hang.
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, Terminate) {
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingNetLog log;
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CapturingBoundNetLog request_log;
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCachingHostResolver host_resolver;
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockErrorObserver* error_observer = new MockErrorObserver;
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver(&host_resolver, error_observer, &log);
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host1", "182.111.0.222");
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver.rules()->AddRule("host2", "111.33.44.55");
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver, "terminate.js");
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback;
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info;
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int rv = resolver.GetProxyForURL(
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://foopy/req1"),
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &proxy_info,
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.callback(),
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      request_log.bound());
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ERR_IO_PENDING, rv);
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(OK, callback.WaitForResult());
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The test does 2 DNS resolutions.
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, host_resolver.num_resolve());
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("foopy:3", proxy_info.proxy_server().ToURI());
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // No errors.
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("", error_observer->GetOutput());
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, log.GetSize());
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, request_log.GetSize());
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that multiple instances of ProxyResolverV8Tracing can coexist and run
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// correctly at the same time. This is relevant because at the moment (time
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this test was written) each ProxyResolverV8Tracing creates its own thread to
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// run V8 on, however each thread is operating on the same v8::Isolate.
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ProxyResolverV8TracingTest, MultipleResolvers) {
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setup resolver0
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockHostResolver host_resolver0;
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver0.rules()->AddRuleForAddressFamily(
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "host1", ADDRESS_FAMILY_IPV4, "166.155.144.44");
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_resolver0.rules()
1000c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ->AddIPLiteralRule("host1", "::1,192.168.1.1", std::string());
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver0.rules()->AddSimulatedFailure("host2");
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver0.rules()->AddRule("host3", "166.155.144.33");
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver0.rules()->AddRule("host5", "166.155.144.55");
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver0.rules()->AddSimulatedFailure("host6");
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver0.rules()->AddRuleForAddressFamily(
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "*", ADDRESS_FAMILY_IPV4, "122.133.144.155");
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver0.rules()->AddRule("*", "133.122.100.200");
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver0(
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &host_resolver0, new MockErrorObserver, NULL);
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver0, "dns.js");
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setup resolver1
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver1(
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &host_resolver0, new MockErrorObserver, NULL);
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver1, "dns.js");
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setup resolver2
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver2(
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &host_resolver0, new MockErrorObserver, NULL);
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver2, "simple.js");
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setup resolver3
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockHostResolver host_resolver3;
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_resolver3.rules()->AddRule("foo", "166.155.144.33");
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing resolver3(
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &host_resolver3, new MockErrorObserver, NULL);
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitResolver(&resolver3, "simple_dns.js");
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Queue up work for each resolver (which will be running in parallel).
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyResolverV8Tracing* resolver[] = {
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    &resolver0, &resolver1, &resolver2, &resolver3,
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t kNumResolvers = arraysize(resolver);
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t kNumIterations = 20;
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const size_t kNumResults = kNumResolvers * kNumIterations;
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback[kNumResults];
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProxyInfo proxy_info[kNumResults];
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < kNumResults; ++i) {
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t resolver_i = i % kNumResolvers;
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int rv = resolver[resolver_i]->GetProxyForURL(
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GURL("http://foo/"), &proxy_info[i], callback[i].callback(), NULL,
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        BoundNetLog());
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(ERR_IO_PENDING, rv);
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Verify all of the results.
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ------------------------
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kExpectedForDnsJs =
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "122.133.144.155-"  // myIpAddress()
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "null-"  // dnsResolve('')
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "__1_192.168.1.1-"  // dnsResolveEx('host1')
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "null-"  // dnsResolve('host2')
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "166.155.144.33-"  // dnsResolve('host3')
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "122.133.144.155-"  // myIpAddress()
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "166.155.144.33-"  // dnsResolve('host3')
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "__1_192.168.1.1-"  // dnsResolveEx('host1')
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "122.133.144.155-"  // myIpAddress()
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "null-"  // dnsResolve('host2')
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "-"  // dnsResolveEx('host6')
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "133.122.100.200-"  // myIpAddressEx()
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "166.155.144.44"  // dnsResolve('host1')
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ":99";
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < kNumResults; ++i) {
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_t resolver_i = i % kNumResolvers;
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(OK, callback[i].WaitForResult());
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string proxy_uri = proxy_info[i].proxy_server().ToURI();
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (resolver_i == 0 || resolver_i == 1) {
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(kExpectedForDnsJs, proxy_uri);
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (resolver_i == 2) {
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ("foo:99", proxy_uri);
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (resolver_i == 3) {
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ("166.155.144.33:",
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                proxy_uri.substr(0, proxy_uri.find(':') + 1));
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace net
1099