15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stub out the `chrome.proxy`, `chrome.i18n`, and `chrome.extension` APIs
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome = chrome || {
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proxy: {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings: {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get: function() {},
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clear: function() {},
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set: function() {}
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i18n: {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    getMessage: function(x) { return x; }
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension: {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sendRequest: function() {},
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    isAllowedIncognitoAccess: function(funk) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      funk(true);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var fixture = document.getElementById('fixture');
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var baselineHTML = fixture.innerHTML;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var groupIDs = [ProxyFormController.ProxyTypes.DIRECT,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ProxyFormController.ProxyTypes.SYSTEM,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ProxyFormController.ProxyTypes.PAC,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ProxyFormController.ProxyTypes.FIXED];
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var mockFunctionFactory = function(returnValue, logging) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var called = [];
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  returnValue = returnValue || null;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var funky = function() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    called.push(arguments);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (arguments[1] && typeof(arguments[1]) === 'function') {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var funk = arguments[1];
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      funk(returnValue);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return returnValue;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  funky.getCallList = function() { return called; };
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  funky.getValue = function() { return returnValue; };
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return funky;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var proxyform = new Test.Unit.Runner({
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setup: function() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fixture.innerHTML = baselineHTML;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_ = new ProxyFormController('proxyForm');
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.clickEvent_ = document.createEvent('MouseEvents');
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.clickEvent_.initMouseEvent('click', true, true, window,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, 0, 0, 0, 0, false, false, false, false, 0, null);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reset mock functions.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.proxy = {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings: {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        get: mockFunctionFactory({
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               value: {mode: 'system' },
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               levelOfControl: 'controllable_by_this_extension' }),
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clear: mockFunctionFactory({
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 value: {mode: 'system' },
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 levelOfControl: 'controllable_by_this_extension' }),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        set: mockFunctionFactory({
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               value: {mode: 'system' },
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               levelOfControl: 'controllable_by_this_extension' })
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  teardown: function() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fixture.removeChild(fixture.childNodes[0]);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete(this.controller_);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clicking on various bits of the interface should set correct classes,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and select correct radio buttons.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testActivationClicks: function() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var self = this;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var i;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    groupIDs.forEach(function(id) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var group = document.getElementById(id);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var all = group.querySelectorAll('*');
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < all.length; i++) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        group.classList.remove('active');
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        all[i].dispatchEvent(self.clickEvent_);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.assert(group.classList.contains('active'));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Elements inside an active group should not be disabled, and vice versa
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testDisabledElements: function() {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var self = this;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var i, j;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    groupIDs.forEach(function(id) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var group = document.getElementById(id);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var all = group.querySelectorAll('*');
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // First, check that activating a group enables its form elements
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < all.length; i++) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        group.classList.remove('active');
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var inputs = group.querySelectorAll('input:not([type="radio"]),select');
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (j = 0; j < inputs.length; j++) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          inputs[j].setAttribute('disabled', 'disabled');
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        all[i].dispatchEvent(self.clickEvent_);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (j = 0; j < inputs.length; j++) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          self.assert(!inputs[j].hasAttribute('disabled'));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clicking the "Use single proxy" checkbox should set the correct
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // classes on the form.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testSingleProxyToggle: function() {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var group = document.getElementById(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ProxyFormController.ProxyTypes.FIXED);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var checkbox = document.getElementById('singleProxyForEverything');
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var section = checkbox.parentNode.parentNode;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Checkbox only works in active group, `testActivationClicks` tests
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the inactive click behavior.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    group.classList.add('active');
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checkbox.checked = false;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checkbox.dispatchEvent(this.clickEvent_);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(section.classList.contains('single'));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    checkbox.dispatchEvent(this.clickEvent_);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(!section.classList.contains('single'));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On instantiation, ProxyFormController should read the current state
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from `chrome.proxy.settings.get`, and react accordingly.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's see if that happens with the next four sets of assertions.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testSetupFormSystem: function() {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.proxy.settings.get = mockFunctionFactory({
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value: {mode: 'system'},
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      levelOfControl: 'controllable_by_this_extension'
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fixture.innerHTML = baselineHTML;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_ = new ProxyFormController('proxyForm');
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait for async calls to fire
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.wait(100, function() {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.assertEqual(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          6,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome.proxy.settings.get.getCallList().length);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.assert(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          document.getElementById(ProxyFormController.ProxyTypes.SYSTEM)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              .classList.contains('active'));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testSetupFormDirect: function() {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.proxy.settings.get =
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mockFunctionFactory({value: {mode: 'direct'},
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             levelOfControl: 'controllable_by_this_extension'}, true);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fixture.innerHTML = baselineHTML;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_ = new ProxyFormController('proxyForm');
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait for async calls to fire
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.wait(100, function() {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.assertEqual(
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          2,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome.proxy.settings.get.getCallList().length);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.assert(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          document.getElementById(ProxyFormController.ProxyTypes.DIRECT)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              .classList.contains('active'));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testSetupFormPac: function() {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.proxy.settings.get =
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mockFunctionFactory({value: {mode: 'pac_script' },
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             levelOfControl: 'controllable_by_this_extension'});
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fixture.innerHTML = baselineHTML;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_ = new ProxyFormController('proxyForm');
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait for async calls to fire
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.wait(100, function() {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.assertEqual(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          2,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome.proxy.settings.get.getCallList().length);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.assert(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          document.getElementById(ProxyFormController.ProxyTypes.PAC)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              .classList.contains('active'));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testSetupFormFixed: function() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.proxy.settings.get =
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mockFunctionFactory({value: {mode: 'fixed_servers' },
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             levelOfControl: 'controllable_by_this_extension'});
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fixture.innerHTML = baselineHTML;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_ = new ProxyFormController('proxyForm');
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wait for async calls to fire
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.wait(100, function() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.assertEqual(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          2,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome.proxy.settings.get.getCallList().length);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.assert(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          document.getElementById(ProxyFormController.ProxyTypes.FIXED)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              .classList.contains('active'));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that `recalcFormValues_` correctly sets DOM field values when
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // given a `ProxyConfig` structure
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testRecalcFormValuesGroups: function() {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test `AUTO` normalization to `PAC`
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode: ProxyFormController.ProxyTypes.AUTO,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rules: {},
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pacScript: ''
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.PAC)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .classList.contains('active'));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // DIRECT
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode: ProxyFormController.ProxyTypes.DIRECT,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rules: {},
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pacScript: ''
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.DIRECT)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .classList.contains('active'));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FIXED
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode: ProxyFormController.ProxyTypes.FIXED,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rules: {},
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pacScript: ''
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.FIXED)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            .classList.contains('active'));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // PAC
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode: ProxyFormController.ProxyTypes.PAC,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rules: {},
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pacScript: ''
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.PAC)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .classList.contains('active'));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // SYSTEM
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode: ProxyFormController.ProxyTypes.SYSTEM,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rules: {},
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pacScript: ''
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.SYSTEM)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .classList.contains('active'));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testRecalcFormValuesFixedSingle: function() {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode: ProxyFormController.ProxyTypes.FIXED,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rules: {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         singleProxy: {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           scheme: 'socks5',
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           host: 'singleproxy.example.com',
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           port: '1234'
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var single = this.controller_.singleProxy;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('socks5', single.scheme);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('singleproxy.example.com', single.host);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(1234, single.port);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testRecalcFormValuesPacScript: function() {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mode: ProxyFormController.ProxyTypes.PAC,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rules: {},
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pacScript: {url: 'http://example.com/this/is/a/pac.script'}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'http://example.com/this/is/a/pac.script',
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById('autoconfigURL').value);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testRecalcFormValuesSingle: function() {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       mode: ProxyFormController.ProxyTypes.FIXED,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       rules: {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         singleProxy: {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           scheme: 'https',
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           host: 'example.com',
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           port: 80
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Single!
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      document.querySelector('#' + ProxyFormController.ProxyTypes.FIXED +
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ' > section').classList.contains('single'));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var single = this.controller_.singleProxy;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('https', single.scheme);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('example.com', single.host);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(80, single.port);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testRecalcFormValuesMultiple: function() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.recalcFormValues_({
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       mode: ProxyFormController.ProxyTypes.FIXED,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       rules: {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         proxyForHttp: {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           scheme: 'http',
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           host: 'http.example.com',
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           port: 1
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         proxyForHttps: {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           scheme: 'https',
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           host: 'https.example.com',
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           port: 2
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         proxyForFtp: {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           scheme: 'socks4',
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           host: 'socks4.example.com',
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           port: 3
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        },
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         fallbackProxy: {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           scheme: 'socks5',
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           host: 'socks5.example.com',
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           port: 4
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Not Single!
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assert(
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !document.querySelector('#' + ProxyFormController.ProxyTypes.FIXED
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          + ' > section').classList.contains('single'));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var server = this.controller_.singleProxy;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertNull(server);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    server = this.controller_.httpProxy;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('http', server.scheme);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('http.example.com', server.host);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(1, server.port);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    server = this.controller_.httpsProxy;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('https', server.scheme);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('https.example.com', server.host);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(2, server.port);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    server = this.controller_.ftpProxy;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('socks4', server.scheme);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('socks4.example.com', server.host);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(3, server.port);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    server = this.controller_.fallbackProxy;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('socks5', server.scheme);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('socks5.example.com', server.host);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(4, server.port);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testBypassList: function() {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.bypassList = ['1.example.com',
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   '2.example.com',
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   '3.example.com'];
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEnumEqual(
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById('bypassList').value,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '1.example.com, 2.example.com, 3.example.com');
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEnumEqual(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.controller_.bypassList,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ['1.example.com', '2.example.com', '3.example.com']);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that "system" rules are correctly generated
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testProxyRulesGenerationSystem: function() {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.changeActive_(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.SYSTEM));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertHashEqual(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {mode: 'system'},
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.controller_.generateProxyConfig_());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that "direct" rules are correctly generated
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testProxyRulesGenerationDirect: function() {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.changeActive_(
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.DIRECT));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertHashEqual(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {mode: 'direct'},
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.controller_.generateProxyConfig_());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that auto detection rules are correctly generated when "automatic"
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is selected, and no PAC file URL is given
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testProxyRulesGenerationAuto: function() {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.changeActive_(
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.PAC));
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertHashEqual(
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {mode: 'auto_detect'},
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        this.controller_.generateProxyConfig_());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that PAC URL rules are correctly generated when "automatic"
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is selected, and a PAC file URL is given
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testProxyRulesGenerationPacURL: function() {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.changeActive_(
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.PAC));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.pacURL = 'http://example.com/pac.pac';
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var result = this.controller_.generateProxyConfig_();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('pac_script', result.mode);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('http://example.com/pac.pac', result.pacScript.url);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Manual PAC definitions
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testProxyRulesGenerationPacData: function() {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var pacData = 'function FindProxyForURL(url,host) { return "DIRECT"; }';
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.changeActive_(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.PAC));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.manualPac = pacData;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var result = this.controller_.generateProxyConfig_();
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('pac_script', result.mode);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(pacData, result.pacScript.data);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PAC URLs override manual PAC definitions
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testProxyRulesGenerationPacURLOverridesData: function() {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.changeActive_(
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.PAC));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.pacURL = 'http://example.com/pac.pac';
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.manualPac =
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'function FindProxyForURL(url,host) { return "DIRECT"; }';
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var result = this.controller_.generateProxyConfig_();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('pac_script', result.mode);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('http://example.com/pac.pac', result.pacScript.url);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that fixed, manual servers are correctly transformed into a
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // `ProxyRules` structure.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testProxyRulesGenerationSingle: function() {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.changeActive_(
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.FIXED));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.singleProxy = {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scheme: 'http',
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host: 'example.com',
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      port: '80'
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var result = this.controller_.generateProxyConfig_();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('fixed_servers', result.mode);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('http', result.rules.singleProxy.scheme);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('example.com', result.rules.singleProxy.host);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(80, result.rules.singleProxy.port);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(undefined, result.rules.proxyForHttp);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(undefined, result.rules.proxyForHttps);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(undefined, result.rules.proxyForFtp);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(undefined, result.rules.fallbackProxy);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that proxy configuration rules are correctly generated
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for separate manually entered servers.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testProxyRulesGenerationSeparate: function() {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.changeActive_(
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(ProxyFormController.ProxyTypes.FIXED));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.singleProxy = false;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.httpProxy = {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scheme: 'http',
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host: 'http.example.com',
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      port: 80
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.httpsProxy = {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scheme: 'https',
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host: 'https.example.com',
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      port: 443
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.ftpProxy = {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scheme: 'socks4',
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host: 'ftp.example.com',
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      port: 80
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.controller_.fallbackProxy = {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scheme: 'socks5',
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host: 'fallback.example.com',
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      port: 80
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var result = this.controller_.generateProxyConfig_();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('fixed_servers', result.mode);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual(undefined, result.rules.singleProxy);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('http', result.rules.proxyForHttp.scheme);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('http.example.com', result.rules.proxyForHttp.host);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('80', result.rules.proxyForHttp.port);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('https', result.rules.proxyForHttps.scheme);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('https.example.com', result.rules.proxyForHttps.host);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('443', result.rules.proxyForHttps.port);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('socks4', result.rules.proxyForFtp.scheme);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('ftp.example.com', result.rules.proxyForFtp.host);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('80', result.rules.proxyForFtp.port);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('socks5', result.rules.fallbackProxy.scheme);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('fallback.example.com', result.rules.fallbackProxy.host);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.assertEqual('80', result.rules.fallbackProxy.port);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}, { testLog: 'proxyformcontrollerlog' });
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var c = new ProxyFormController('proxyForm');
514