gecko-dev/netwerk/test/unit/test_pac_generator.js

239 lines
8.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
Cu.import("resource://gre/modules/Services.jsm");
var ios = Cc["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var pps = Cc["@mozilla.org/network/protocol-proxy-service;1"].getService();
var prefs = Cc["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var pgen = Cc["@mozilla.org/pac-generator;1"]
.getService(Components.interfaces.nsIPACGenerator);
const TARGET_HOST ="www.mozilla.org";
const HTTP_HOST = "httpHost";
const HTTP_PORT = 1111;
const HTTPS_HOST = "httpsHost";
const HTTPS_PORT = 2222;
const FTP_HOST= "ftpHost";
const FTP_PORT = 3333;
const MY_APP_ID = 10;
const MY_APP_ORIGIN = "apps://browser.gaiamobile.com";
const APP_ORIGINS_LIST = "apps://test1.com, apps://browser.gaiamobile.com";
const BROWSING_HOST = "browsingHost";
const BROWSING_PORT = 4444;
const PROXY_TYPE_PAC = Ci.nsIProtocolProxyService.PROXYCONFIG_PAC;
const proxyTypes = {
"http": {"pref": "http", "host": HTTP_HOST, "port": HTTP_PORT},
"https": {"pref": "ssl", "host": HTTPS_HOST, "port": HTTPS_PORT},
"ftp": {"pref": "ftp", "host": FTP_HOST, "port": FTP_PORT}
};
function default_proxy_settings() {
prefs.setBoolPref("network.proxy.pac_generator", true);
prefs.setIntPref("network.proxy.type", 0);
prefs.setCharPref("network.proxy.autoconfig_url", "");
for (let i in proxyTypes) {
let p = proxyTypes[i];
prefs.setCharPref("network.proxy." + p["pref"], p["host"]);
prefs.setIntPref("network.proxy." + p["pref"] + "_port", p["port"]);
}
}
function TestResolveCallback(type, host, callback) {
this.type = type;
this.host = host;
this.callback = callback;
}
TestResolveCallback.prototype = {
QueryInterface:
function TestResolveCallback_QueryInterface(iid) {
if (iid.equals(Components.interfaces.nsIProtocolProxyCallback) ||
iid.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_ERROR_NO_INTERFACE;
},
onProxyAvailable:
function TestResolveCallback_onProxyAvailable(req, channel, pi, status) {
if (this.type) {
// Check for localhost.
if (this.host == "localhost" || this.host == "127.0.0.1") {
do_check_eq(pi, null);
this.callback();
return;
}
// Check for browsing proxy.
let browsingEnabled;
try {
browsingEnabled = prefs.getBoolPref("network.proxy.browsing.enabled");
} catch (ex) {}
if (browsingEnabled) {
let proxyHost, proxyPort;
try {
proxyHost = prefs.getCharPref("network.proxy.browsing.host");
proxyPort = prefs.getIntPref("network.proxy.browsing.port");
} catch (ex) {}
if (proxyHost) {
do_check_eq(pi.host, proxyHost);
do_check_eq(pi.port, proxyPort);
this.callback();
return;
}
}
// Check for system proxy.
let share;
try {
share = prefs.getBoolPref("network.proxy.share_proxy_settings");
} catch (ex) {}
let p = share ? proxyTypes["http"] : proxyTypes[this.type];
if (p) {
let proxyHost, proxyPort;
try {
proxyHost = prefs.getCharPref("network.proxy." + p["pref"]);
proxyPort = prefs.getIntPref("network.proxy." + p["pref"] + "_port");
} catch (ex) {}
if (proxyHost) {
// Connection through proxy.
do_check_neq(pi, null);
do_check_eq(pi.host, proxyHost);
do_check_eq(pi.port, proxyPort);
} else {
// Direct connection.
do_check_eq(pi, null);
}
}
}
this.callback();
}
};
function test_resolve_type(type, host, callback) {
// We have to setup a profile, otherwise indexed db used by webapps
// will throw random exception when trying to get profile folder.
do_get_profile();
// We also need a valid nsIXulAppInfo service as Webapps.jsm is querying it.
Cu.import("resource://testing-common/AppInfo.jsm");
updateAppInfo();
// Mock getAppByLocalId() to return testing app origin.
Cu.import("resource://gre/modules/AppsUtils.jsm");
AppsUtils.getAppByLocalId = function(aAppId) {
let app = { origin: MY_APP_ORIGIN};
return app;
};
let channel = ios.newChannel2(type + "://" + host + "/",
null,
null,
null, // aLoadingNode
Services.scriptSecurityManager.getSystemPrincipal(),
null, // aTriggeringPrincipal
Ci.nsILoadInfo.SEC_NORMAL,
Ci.nsIContentPolicy.TYPE_OTHER);
channel.notificationCallbacks =
AppsUtils.createLoadContext(MY_APP_ID, true);
let req = pps.asyncResolve(channel, 0, new TestResolveCallback(type, host, callback));
}
function test_resolve(host, callback) {
test_resolve_type("http", host, function() {
test_resolve_type("https", host, function() {
test_resolve_type("ftp", host, run_next_test);
});
});
}
add_test(function test_localhost() {
default_proxy_settings();
prefs.setBoolPref("network.proxy.share_proxy_settings", true);
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
test_resolve("localhost", run_next_test);
});
add_test(function test_share_on_proxy() {
default_proxy_settings();
prefs.setBoolPref("network.proxy.share_proxy_settings", true);
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
test_resolve(TARGET_HOST, run_next_test);
});
add_test(function test_share_on_direct() {
default_proxy_settings();
prefs.setBoolPref("network.proxy.share_proxy_settings", true);
prefs.setCharPref("network.proxy.http", "");
prefs.setCharPref("network.proxy.ssl", "");
prefs.setCharPref("network.proxy.ftp", "");
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
test_resolve(TARGET_HOST, run_next_test);
});
add_test(function test_share_off_proxy() {
default_proxy_settings();
prefs.setBoolPref("network.proxy.share_proxy_settings", false);
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
test_resolve(TARGET_HOST, run_next_test);
});
add_test(function test_share_off_direct() {
default_proxy_settings();
prefs.setBoolPref("network.proxy.share_proxy_settings", false);
prefs.setCharPref("network.proxy.http", "");
prefs.setCharPref("network.proxy.ssl", "");
prefs.setCharPref("network.proxy.ftp", "");
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
test_resolve(TARGET_HOST, run_next_test);
});
add_test(function test_browsing_proxy() {
default_proxy_settings();
prefs.setBoolPref("network.proxy.browsing.enabled", true);
prefs.setCharPref("network.proxy.browsing.host", BROWSING_HOST);
prefs.setIntPref("network.proxy.browsing.port", BROWSING_PORT);
prefs.setCharPref("network.proxy.browsing.app_origins", APP_ORIGINS_LIST);
Services.prefs.setCharPref("network.proxy.autoconfig_url", pgen.generate());
Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
test_resolve(TARGET_HOST, run_next_test);
});
function run_test(){
do_register_cleanup(() => {
prefs.clearUserPref("network.proxy.pac_generator");
prefs.clearUserPref("network.proxy.type");
prefs.clearUserPref("network.proxy.autoconfig_url");
prefs.clearUserPref("network.proxy.share_proxy_settings");
prefs.clearUserPref("network.proxy.http");
prefs.clearUserPref("network.proxy.http_port");
prefs.clearUserPref("network.proxy.ssl");
prefs.clearUserPref("network.proxy.ssl_port");
prefs.clearUserPref("network.proxy.ftp");
prefs.clearUserPref("network.proxy.ftp_port");
prefs.clearUserPref("network.proxy.browsing.enabled");
prefs.clearUserPref("network.proxy.browsing.host");
prefs.clearUserPref("network.proxy.browsing.port");
prefs.clearUserPref("network.proxy.browsing.app_origins");
});
run_next_test();
}