зеркало из https://github.com/mozilla/gecko-dev.git
Bug 633062 p2 - Make getTokenFromBrowserIDAssertion async. r=markh
Also move promiseStopServer to the common/ head_helpers.js MozReview-Commit-ID: B3Idnj6rPAZ --HG-- extra : rebase_source : adb07d381aca118b9b49971f87e68a239dbcfb70
This commit is contained in:
Родитель
81b643a035
Коммит
01342b993b
|
@ -105,6 +105,10 @@ function httpd_handler(statusCode, status, body) {
|
|||
};
|
||||
}
|
||||
|
||||
function promiseStopServer(server) {
|
||||
return new Promise(resolve => server.stop(resolve));
|
||||
}
|
||||
|
||||
/*
|
||||
* Read bytes string from an nsIInputStream. If 'count' is omitted,
|
||||
* all available input is read.
|
||||
|
|
|
@ -62,7 +62,7 @@ add_task(async function test_authenticated_get_request() {
|
|||
|
||||
Assert.equal("Great Success!", result.msg);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
async function check_authenticated_request(method) {
|
||||
|
@ -82,7 +82,7 @@ async function check_authenticated_request(method) {
|
|||
|
||||
Assert.equal("bar", result.foo);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
}
|
||||
|
||||
add_task(function test_authenticated_post_request() {
|
||||
|
@ -117,7 +117,7 @@ add_task(async function test_extra_headers() {
|
|||
|
||||
Assert.equal("bar", result.foo);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_credentials_optional() {
|
||||
|
@ -137,7 +137,7 @@ add_task(async function test_credentials_optional() {
|
|||
let result = await client.request("/foo", method); // credentials undefined
|
||||
Assert.equal(JSON.parse(result.body).msg, "you're in the friend zone");
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_server_error() {
|
||||
|
@ -160,7 +160,7 @@ add_task(async function test_server_error() {
|
|||
Assert.equal("I am a Teapot", err.message);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_server_error_json() {
|
||||
|
@ -182,7 +182,7 @@ add_task(async function test_server_error_json() {
|
|||
Assert.equal("Cannot get ye flask.", err.error);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_offset_after_request() {
|
||||
|
@ -205,7 +205,7 @@ add_task(async function test_offset_after_request() {
|
|||
// Should be about an hour off
|
||||
Assert.ok(Math.abs(client.localtimeOffsetMsec + HOUR_MS) < SECOND_MS);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_offset_in_hawk_header() {
|
||||
|
@ -248,7 +248,7 @@ add_task(async function test_offset_in_hawk_header() {
|
|||
Assert.ok(Math.abs(client.localtimeOffsetMsec + 12 * HOUR_MS) < MINUTE_MS);
|
||||
await client.request("/second", method, TEST_CREDS);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_2xx_success() {
|
||||
|
@ -272,7 +272,7 @@ add_task(async function test_2xx_success() {
|
|||
// Shouldn't be any content in a 202
|
||||
Assert.equal(response.body, "");
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_retry_request_on_fail() {
|
||||
|
@ -323,7 +323,7 @@ add_task(async function test_retry_request_on_fail() {
|
|||
let response = await client.request("/maybe", method, credentials);
|
||||
Assert.equal(response.body, "i love you!!!");
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_multiple_401_retry_once() {
|
||||
|
@ -369,7 +369,7 @@ add_task(async function test_multiple_401_retry_once() {
|
|||
}
|
||||
Assert.equal(attempts, 2);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_500_no_retry() {
|
||||
|
@ -406,7 +406,7 @@ add_task(async function test_500_no_retry() {
|
|||
Assert.equal(err.code, 500);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_401_then_500() {
|
||||
|
@ -466,7 +466,7 @@ add_task(async function test_401_then_500() {
|
|||
}
|
||||
Assert.equal(attempts, 2);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function throw_if_not_json_body() {
|
||||
|
@ -488,12 +488,6 @@ function getTimestampDelta(authHeader, now = Date.now()) {
|
|||
return Math.abs(tsMS - now);
|
||||
}
|
||||
|
||||
function deferredStop(server) {
|
||||
return new Promise(resolve => {
|
||||
server.stop(resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function run_test() {
|
||||
initTestLogging("Trace");
|
||||
run_next_test();
|
||||
|
|
|
@ -4,13 +4,9 @@
|
|||
ChromeUtils.import("resource://services-common/async.js");
|
||||
ChromeUtils.import("resource://services-common/tokenserverclient.js");
|
||||
|
||||
function run_test() {
|
||||
initTestLogging("Trace");
|
||||
initTestLogging("Trace");
|
||||
|
||||
run_next_test();
|
||||
}
|
||||
|
||||
add_test(function test_working_bid_exchange() {
|
||||
add_task(async function test_working_bid_exchange() {
|
||||
_("Ensure that working BrowserID token exchange works as expected.");
|
||||
|
||||
let service = "http://example.com/foo";
|
||||
|
@ -37,10 +33,8 @@ add_test(function test_working_bid_exchange() {
|
|||
});
|
||||
|
||||
let client = new TokenServerClient();
|
||||
let cb = Async.makeSpinningCallback();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", cb);
|
||||
let result = cb.wait();
|
||||
let result = await client.getTokenFromBrowserIDAssertion(url, "assertion");
|
||||
Assert.equal("object", typeof(result));
|
||||
do_check_attribute_count(result, 6);
|
||||
Assert.equal(service, result.endpoint);
|
||||
|
@ -48,32 +42,27 @@ add_test(function test_working_bid_exchange() {
|
|||
Assert.equal("key", result.key);
|
||||
Assert.equal("uid", result.uid);
|
||||
Assert.equal(duration, result.duration);
|
||||
server.stop(run_next_test);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_invalid_arguments() {
|
||||
add_task(async function test_invalid_arguments() {
|
||||
_("Ensure invalid arguments to APIs are rejected.");
|
||||
|
||||
let args = [
|
||||
[null, "assertion", function() {}],
|
||||
["http://example.com/", null, function() {}],
|
||||
["http://example.com/", "assertion", null]
|
||||
[null, "assertion"],
|
||||
["http://example.com/", null]
|
||||
];
|
||||
|
||||
for (let arg of args) {
|
||||
try {
|
||||
let client = new TokenServerClient();
|
||||
client.getTokenFromBrowserIDAssertion(arg[0], arg[1], arg[2]);
|
||||
do_throw("Should never get here.");
|
||||
} catch (ex) {
|
||||
let client = new TokenServerClient();
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(arg[0], arg[1]), ex => {
|
||||
Assert.ok(ex instanceof TokenServerClientError);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
|
||||
add_test(function test_conditions_required_response_handling() {
|
||||
add_task(async function test_conditions_required_response_handling() {
|
||||
_("Ensure that a conditions required response is handled properly.");
|
||||
|
||||
let description = "Need to accept conditions";
|
||||
|
@ -97,22 +86,20 @@ add_test(function test_conditions_required_response_handling() {
|
|||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
|
||||
function onResponse(error, token) {
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.ok(error instanceof TokenServerClientServerError);
|
||||
Assert.equal(error.cause, "conditions-required");
|
||||
// Check a JSON.stringify works on our errors as our logging will try and use it.
|
||||
Assert.ok(JSON.stringify(error), "JSON.stringify worked");
|
||||
Assert.equal(null, token);
|
||||
|
||||
Assert.equal(error.urls.tos, tosURL);
|
||||
return true;
|
||||
});
|
||||
|
||||
server.stop(run_next_test);
|
||||
}
|
||||
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", onResponse);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_invalid_403_no_content_type() {
|
||||
add_task(async function test_invalid_403_no_content_type() {
|
||||
_("Ensure that a 403 without content-type is handled properly.");
|
||||
|
||||
let server = httpd_setup({
|
||||
|
@ -131,20 +118,18 @@ add_test(function test_invalid_403_no_content_type() {
|
|||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
|
||||
function onResponse(error, token) {
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.ok(error instanceof TokenServerClientServerError);
|
||||
Assert.equal(error.cause, "malformed-response");
|
||||
Assert.equal(null, token);
|
||||
|
||||
Assert.equal(null, error.urls);
|
||||
return true;
|
||||
});
|
||||
|
||||
server.stop(run_next_test);
|
||||
}
|
||||
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", onResponse);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_invalid_403_bad_json() {
|
||||
add_task(async function test_invalid_403_bad_json() {
|
||||
_("Ensure that a 403 with JSON that isn't proper is handled properly.");
|
||||
|
||||
let server = httpd_setup({
|
||||
|
@ -162,19 +147,17 @@ add_test(function test_invalid_403_bad_json() {
|
|||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
|
||||
function onResponse(error, token) {
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.ok(error instanceof TokenServerClientServerError);
|
||||
Assert.equal(error.cause, "malformed-response");
|
||||
Assert.equal(null, token);
|
||||
Assert.equal(null, error.urls);
|
||||
return true;
|
||||
});
|
||||
|
||||
server.stop(run_next_test);
|
||||
}
|
||||
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", onResponse);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_403_no_urls() {
|
||||
add_task(async function test_403_no_urls() {
|
||||
_("Ensure that a 403 without a urls field is handled properly.");
|
||||
|
||||
let server = httpd_setup({
|
||||
|
@ -190,18 +173,16 @@ add_test(function test_403_no_urls() {
|
|||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion",
|
||||
function onResponse(error, result) {
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.ok(error instanceof TokenServerClientServerError);
|
||||
Assert.equal(error.cause, "malformed-response");
|
||||
Assert.equal(null, result);
|
||||
|
||||
server.stop(run_next_test);
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_send_extra_headers() {
|
||||
add_task(async function test_send_extra_headers() {
|
||||
_("Ensures that the condition acceptance header is sent when asked.");
|
||||
|
||||
let duration = 300;
|
||||
|
@ -230,40 +211,37 @@ add_test(function test_send_extra_headers() {
|
|||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
|
||||
function onResponse(error, token) {
|
||||
Assert.equal(null, error);
|
||||
|
||||
// Other tests validate other things.
|
||||
|
||||
server.stop(run_next_test);
|
||||
}
|
||||
|
||||
let extra = {
|
||||
"X-Foo": 42,
|
||||
"X-Bar": 17
|
||||
};
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", onResponse, extra);
|
||||
|
||||
await client.getTokenFromBrowserIDAssertion(url, "assertion", extra);
|
||||
// Other tests validate other things.
|
||||
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_error_404_empty() {
|
||||
add_task(async function test_error_404_empty() {
|
||||
_("Ensure that 404 responses without proper response are handled properly.");
|
||||
|
||||
let server = httpd_setup();
|
||||
|
||||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/foo";
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", function(error, r) {
|
||||
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.ok(error instanceof TokenServerClientServerError);
|
||||
Assert.equal(error.cause, "malformed-response");
|
||||
|
||||
Assert.notEqual(null, error.response);
|
||||
Assert.equal(null, r);
|
||||
|
||||
server.stop(run_next_test);
|
||||
return true;
|
||||
});
|
||||
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_error_404_proper_response() {
|
||||
add_task(async function test_error_404_proper_response() {
|
||||
_("Ensure that a Cornice error report for 404 is handled properly.");
|
||||
|
||||
let server = httpd_setup({
|
||||
|
@ -280,20 +258,19 @@ add_test(function test_error_404_proper_response() {
|
|||
}
|
||||
});
|
||||
|
||||
function onResponse(error, token) {
|
||||
Assert.ok(error instanceof TokenServerClientServerError);
|
||||
Assert.equal(error.cause, "unknown-service");
|
||||
Assert.equal(null, token);
|
||||
|
||||
server.stop(run_next_test);
|
||||
}
|
||||
|
||||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", onResponse);
|
||||
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.ok(error instanceof TokenServerClientServerError);
|
||||
Assert.equal(error.cause, "unknown-service");
|
||||
return true;
|
||||
});
|
||||
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_bad_json() {
|
||||
add_task(async function test_bad_json() {
|
||||
_("Ensure that malformed JSON is handled properly.");
|
||||
|
||||
let server = httpd_setup({
|
||||
|
@ -308,18 +285,19 @@ add_test(function test_bad_json() {
|
|||
|
||||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", function(error, r) {
|
||||
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.notEqual(null, error);
|
||||
Assert.equal("TokenServerClientServerError", error.name);
|
||||
Assert.equal(error.cause, "malformed-response");
|
||||
Assert.notEqual(null, error.response);
|
||||
Assert.equal(null, r);
|
||||
|
||||
server.stop(run_next_test);
|
||||
return true;
|
||||
});
|
||||
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_400_response() {
|
||||
add_task(async function test_400_response() {
|
||||
_("Ensure HTTP 400 is converted to malformed-request.");
|
||||
|
||||
let server = httpd_setup({
|
||||
|
@ -334,17 +312,19 @@ add_test(function test_400_response() {
|
|||
|
||||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", function(error, r) {
|
||||
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.notEqual(null, error);
|
||||
Assert.equal("TokenServerClientServerError", error.name);
|
||||
Assert.notEqual(null, error.response);
|
||||
Assert.equal(error.cause, "malformed-request");
|
||||
|
||||
server.stop(run_next_test);
|
||||
return true;
|
||||
});
|
||||
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_401_with_error_cause() {
|
||||
add_task(async function test_401_with_error_cause() {
|
||||
_("Ensure 401 cause is specified in body.status");
|
||||
|
||||
let server = httpd_setup({
|
||||
|
@ -359,17 +339,19 @@ add_test(function test_401_with_error_cause() {
|
|||
|
||||
let client = new TokenServerClient();
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", function(error, r) {
|
||||
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.notEqual(null, error);
|
||||
Assert.equal("TokenServerClientServerError", error.name);
|
||||
Assert.notEqual(null, error.response);
|
||||
Assert.equal(error.cause, "no-soup-for-you");
|
||||
|
||||
server.stop(run_next_test);
|
||||
return true;
|
||||
});
|
||||
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_unhandled_media_type() {
|
||||
add_task(async function test_unhandled_media_type() {
|
||||
_("Ensure that unhandled media types throw an error.");
|
||||
|
||||
let server = httpd_setup({
|
||||
|
@ -384,17 +366,18 @@ add_test(function test_unhandled_media_type() {
|
|||
|
||||
let url = server.baseURI + "/1.0/foo/1.0";
|
||||
let client = new TokenServerClient();
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", function(error, r) {
|
||||
|
||||
await Assert.rejects(client.getTokenFromBrowserIDAssertion(url, "assertion"), error => {
|
||||
Assert.notEqual(null, error);
|
||||
Assert.equal("TokenServerClientServerError", error.name);
|
||||
Assert.notEqual(null, error.response);
|
||||
Assert.equal(null, r);
|
||||
|
||||
server.stop(run_next_test);
|
||||
return true;
|
||||
});
|
||||
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_test(function test_rich_media_types() {
|
||||
add_task(async function test_rich_media_types() {
|
||||
_("Ensure that extra tokens in the media type aren't rejected.");
|
||||
|
||||
let duration = 300;
|
||||
|
@ -416,51 +399,7 @@ add_test(function test_rich_media_types() {
|
|||
|
||||
let url = server.baseURI + "/foo";
|
||||
let client = new TokenServerClient();
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", function(error, r) {
|
||||
Assert.equal(null, error);
|
||||
|
||||
server.stop(run_next_test);
|
||||
});
|
||||
});
|
||||
|
||||
add_test(function test_exception_during_callback() {
|
||||
_("Ensure that exceptions thrown during callback handling are handled.");
|
||||
|
||||
let duration = 300;
|
||||
let server = httpd_setup({
|
||||
"/foo": function(request, response) {
|
||||
response.setStatusLine(request.httpVersion, 200, "OK");
|
||||
response.setHeader("Content-Type", "application/json");
|
||||
|
||||
let body = JSON.stringify({
|
||||
id: "id",
|
||||
key: "key",
|
||||
api_endpoint: "foo",
|
||||
uid: "uid",
|
||||
duration,
|
||||
});
|
||||
response.bodyOutputStream.write(body, body.length);
|
||||
}
|
||||
});
|
||||
|
||||
let url = server.baseURI + "/foo";
|
||||
let client = new TokenServerClient();
|
||||
let cb = Async.makeSpinningCallback();
|
||||
let callbackCount = 0;
|
||||
|
||||
client.getTokenFromBrowserIDAssertion(url, "assertion", function(error, r) {
|
||||
Assert.equal(null, error);
|
||||
|
||||
cb();
|
||||
|
||||
callbackCount += 1;
|
||||
throw new Error("I am a bad function!");
|
||||
});
|
||||
|
||||
cb.wait();
|
||||
// This relies on some heavy event loop magic. The error in the main
|
||||
// callback should already have been raised at this point.
|
||||
Assert.equal(callbackCount, 1);
|
||||
|
||||
server.stop(run_next_test);
|
||||
await client.getTokenFromBrowserIDAssertion(url, "assertion");
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
|
|
@ -209,38 +209,22 @@ TokenServerClient.prototype = {
|
|||
* let assertion = getBrowserIDAssertionFromSomewhere();
|
||||
* let url = "https://token.services.mozilla.com/1.0/sync/2.0";
|
||||
*
|
||||
* client.getTokenFromBrowserIDAssertion(url, assertion,
|
||||
* function onResponse(error, result) {
|
||||
* if (error) {
|
||||
* if (error.cause == "conditions-required") {
|
||||
* promptConditionsAcceptance(error.urls, function onAccept() {
|
||||
* client.getTokenFromBrowserIDAssertion(url, assertion,
|
||||
* onResponse, true);
|
||||
* }
|
||||
* return;
|
||||
* }
|
||||
*
|
||||
* // Do other error handling.
|
||||
* return;
|
||||
* }
|
||||
*
|
||||
* let {
|
||||
* id: id, key: key, uid: uid, endpoint: endpoint, duration: duration
|
||||
* } = result;
|
||||
* try {
|
||||
* const result = await client.getTokenFromBrowserIDAssertion(url, assertion);
|
||||
* let {id, key, uid, endpoint, duration} = result;
|
||||
* // Do stuff with data and carry on.
|
||||
* });
|
||||
* } catch (error) {
|
||||
* // Handle errors.
|
||||
* }
|
||||
*
|
||||
* @param url
|
||||
* (string) URL to fetch token from.
|
||||
* @param assertion
|
||||
* (string) BrowserID assertion to exchange token for.
|
||||
* @param cb
|
||||
* (function) Callback to be invoked with result of operation.
|
||||
* @param conditionsAccepted
|
||||
* (bool) Whether to send acceptance to service conditions.
|
||||
*/
|
||||
getTokenFromBrowserIDAssertion:
|
||||
function getTokenFromBrowserIDAssertion(url, assertion, cb, addHeaders = {}) {
|
||||
async getTokenFromBrowserIDAssertion(url, assertion, addHeaders = {}) {
|
||||
if (!url) {
|
||||
throw new TokenServerClientError("url argument is not valid.");
|
||||
}
|
||||
|
@ -249,10 +233,6 @@ TokenServerClient.prototype = {
|
|||
throw new TokenServerClientError("assertion argument is not valid.");
|
||||
}
|
||||
|
||||
if (!cb) {
|
||||
throw new TokenServerClientError("cb argument is not valid.");
|
||||
}
|
||||
|
||||
this._log.debug("Beginning BID assertion exchange: " + url);
|
||||
|
||||
let req = this.newRESTRequest(url);
|
||||
|
@ -263,39 +243,25 @@ TokenServerClient.prototype = {
|
|||
req.setHeader(header, addHeaders[header]);
|
||||
}
|
||||
|
||||
let client = this;
|
||||
req.get(function onResponse(error) {
|
||||
if (error) {
|
||||
cb(new TokenServerClientNetworkError(error), null);
|
||||
return;
|
||||
}
|
||||
|
||||
let self = this;
|
||||
function callCallback(error, result) {
|
||||
if (!cb) {
|
||||
self._log.warn("Callback already called! Did it throw?");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
cb(error, result);
|
||||
} catch (ex) {
|
||||
self._log.warn("Exception when calling user-supplied callback", ex);
|
||||
}
|
||||
|
||||
cb = null;
|
||||
}
|
||||
|
||||
try {
|
||||
client._processTokenResponse(this.response, callCallback);
|
||||
} catch (ex) {
|
||||
this._log.warn("Error processing token server response", ex);
|
||||
|
||||
let error = new TokenServerClientError(ex);
|
||||
error.response = this.response;
|
||||
callCallback(error, null);
|
||||
}
|
||||
let response = await new Promise((resolve, reject) => {
|
||||
req.get(function(err) {
|
||||
// Yes this is weird, the callback's |this| gets bound to the RESTRequest object.
|
||||
err ? reject(new TokenServerClientNetworkError(err)) :
|
||||
resolve(this.response);
|
||||
});
|
||||
});
|
||||
|
||||
try {
|
||||
return this._processTokenResponse(response);
|
||||
} catch (ex) {
|
||||
if (ex instanceof TokenServerClientServerError) {
|
||||
throw ex;
|
||||
}
|
||||
this._log.warn("Error processing token server response", ex);
|
||||
let error = new TokenServerClientError(ex);
|
||||
error.response = response;
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -303,10 +269,8 @@ TokenServerClient.prototype = {
|
|||
*
|
||||
* @param response
|
||||
* RESTResponse from token HTTP request.
|
||||
* @param cb
|
||||
* The original callback passed to the public API.
|
||||
*/
|
||||
_processTokenResponse: function processTokenResponse(response, cb) {
|
||||
_processTokenResponse(response) {
|
||||
this._log.debug("Got token response: " + response.status);
|
||||
|
||||
// Responses should *always* be JSON, even in the case of 4xx and 5xx
|
||||
|
@ -320,8 +284,7 @@ TokenServerClient.prototype = {
|
|||
let error = new TokenServerClientServerError("Non-JSON response.",
|
||||
"malformed-response");
|
||||
error.response = response;
|
||||
cb(error, null);
|
||||
return;
|
||||
throw error;
|
||||
}
|
||||
|
||||
let result;
|
||||
|
@ -332,8 +295,7 @@ TokenServerClient.prototype = {
|
|||
let error = new TokenServerClientServerError("Malformed JSON.",
|
||||
"malformed-response");
|
||||
error.response = response;
|
||||
cb(error, null);
|
||||
return;
|
||||
throw error;
|
||||
}
|
||||
|
||||
// Any response status can have X-Backoff or X-Weave-Backoff headers.
|
||||
|
@ -393,8 +355,7 @@ TokenServerClient.prototype = {
|
|||
// we'll look for it on any error response.
|
||||
this._maybeNotifyBackoff(response, "retry-after");
|
||||
|
||||
cb(error, null);
|
||||
return;
|
||||
throw error;
|
||||
}
|
||||
|
||||
for (let k of ["id", "key", "api_endpoint", "uid", "duration"]) {
|
||||
|
@ -404,20 +365,19 @@ TokenServerClient.prototype = {
|
|||
k);
|
||||
error.cause = "malformed-response";
|
||||
error.response = response;
|
||||
cb(error, null);
|
||||
return;
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
this._log.debug("Successful token response");
|
||||
cb(null, {
|
||||
return {
|
||||
id: result.id,
|
||||
key: result.key,
|
||||
endpoint: result.api_endpoint,
|
||||
uid: result.uid,
|
||||
duration: result.duration,
|
||||
hashed_fxa_uid: result.hashed_fxa_uid,
|
||||
});
|
||||
};
|
||||
},
|
||||
|
||||
/*
|
||||
|
|
|
@ -29,12 +29,6 @@ var ACCOUNT_KEYS = {
|
|||
"5051525354555657 58595a5b5c5d5e5f"),
|
||||
};
|
||||
|
||||
function deferredStop(server) {
|
||||
return new Promise(resolve => {
|
||||
server.stop(resolve);
|
||||
});
|
||||
}
|
||||
|
||||
add_task(async function test_authenticated_get_request() {
|
||||
let message = "{\"msg\": \"Great Success!\"}";
|
||||
let credentials = {
|
||||
|
@ -57,7 +51,7 @@ add_task(async function test_authenticated_get_request() {
|
|||
let result = await client._request("/foo", method, credentials);
|
||||
Assert.equal("Great Success!", result.msg);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_authenticated_post_request() {
|
||||
|
@ -82,7 +76,7 @@ add_task(async function test_authenticated_post_request() {
|
|||
let result = await client._request("/foo", method, credentials, {foo: "bar"});
|
||||
Assert.equal("bar", result.foo);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_500_error() {
|
||||
|
@ -105,7 +99,7 @@ add_task(async function test_500_error() {
|
|||
Assert.equal("Internal Server Error", e.message);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_backoffError() {
|
||||
|
@ -152,7 +146,7 @@ add_task(async function test_backoffError() {
|
|||
Assert.equal(client.backoffError, null);
|
||||
Assert.equal(result.working, "yes");
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_signUp() {
|
||||
|
@ -237,7 +231,7 @@ add_task(async function test_signUp() {
|
|||
Assert.equal(101, expectedError.errno);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_signIn() {
|
||||
|
@ -324,7 +318,7 @@ add_task(async function test_signIn() {
|
|||
Assert.equal(102, expectedError.errno);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_signOut() {
|
||||
|
@ -360,7 +354,7 @@ add_task(async function test_signOut() {
|
|||
Assert.equal(102, expectedError.errno);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_recoveryEmailStatus() {
|
||||
|
@ -398,7 +392,7 @@ add_task(async function test_recoveryEmailStatus() {
|
|||
Assert.equal(102, expectedError.errno);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_recoveryEmailStatusWithReason() {
|
||||
|
@ -419,7 +413,7 @@ add_task(async function test_recoveryEmailStatusWithReason() {
|
|||
reason: "push",
|
||||
});
|
||||
Assert.equal(result.verified, true);
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_resendVerificationEmail() {
|
||||
|
@ -455,7 +449,7 @@ add_task(async function test_resendVerificationEmail() {
|
|||
Assert.equal(102, expectedError.errno);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_accountKeys() {
|
||||
|
@ -536,7 +530,7 @@ add_task(async function test_accountKeys() {
|
|||
Assert.equal(102, expectedError.errno);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_signCertificate() {
|
||||
|
@ -577,7 +571,7 @@ add_task(async function test_signCertificate() {
|
|||
Assert.equal(102, expectedError.errno);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_accountExists() {
|
||||
|
@ -636,7 +630,7 @@ add_task(async function test_accountExists() {
|
|||
Assert.equal(unexpectedError.code, 500);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_registerDevice() {
|
||||
|
@ -689,7 +683,7 @@ add_task(async function test_registerDevice() {
|
|||
Assert.equal(unexpectedError.code, 500);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_updateDevice() {
|
||||
|
@ -735,7 +729,7 @@ add_task(async function test_updateDevice() {
|
|||
Assert.equal(unexpectedError.code, 500);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_signOutAndDestroyDevice() {
|
||||
|
@ -777,7 +771,7 @@ add_task(async function test_signOutAndDestroyDevice() {
|
|||
Assert.equal(unexpectedError.code, 500);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_getDeviceList() {
|
||||
|
@ -810,7 +804,7 @@ add_task(async function test_getDeviceList() {
|
|||
Assert.equal(unexpectedError.code, 500);
|
||||
}
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_client_metrics() {
|
||||
|
@ -843,7 +837,7 @@ add_task(async function test_client_metrics() {
|
|||
return err.errno == 111;
|
||||
});
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
add_task(async function test_email_case() {
|
||||
|
@ -896,7 +890,7 @@ add_task(async function test_email_case() {
|
|||
Assert.equal(result.areWeHappy, "yes");
|
||||
Assert.equal(attempts, 2);
|
||||
|
||||
await deferredStop(server);
|
||||
await promiseStopServer(server);
|
||||
});
|
||||
|
||||
// turn formatted test vectors into normal hex strings
|
||||
|
|
|
@ -45,12 +45,6 @@ function startServer() {
|
|||
return srv;
|
||||
}
|
||||
|
||||
function promiseStopServer(server) {
|
||||
return new Promise(resolve => {
|
||||
server.stop(resolve);
|
||||
});
|
||||
}
|
||||
|
||||
add_task(async function getAndRevokeToken() {
|
||||
Services.prefs.setBoolPref("identity.fxaccounts.allowHttp", true);
|
||||
let server = startServer();
|
||||
|
|
|
@ -193,9 +193,9 @@ this.configureFxAccountIdentity = function(authService,
|
|||
fxa.internal._fxAccountsClient = mockFxAClient;
|
||||
|
||||
let mockTSC = { // TokenServerClient
|
||||
getTokenFromBrowserIDAssertion(uri, assertion, cb) {
|
||||
async getTokenFromBrowserIDAssertion(uri, assertion) {
|
||||
config.fxaccount.token.uid = config.username;
|
||||
cb(null, config.fxaccount.token);
|
||||
return config.fxaccount.token;
|
||||
},
|
||||
};
|
||||
authService._fxaService = fxa;
|
||||
|
|
|
@ -608,20 +608,13 @@ this.BrowserIDManager.prototype = {
|
|||
);
|
||||
};
|
||||
|
||||
let getToken = assertion => {
|
||||
let getToken = async (assertion) => {
|
||||
log.debug("Getting a token");
|
||||
let deferred = PromiseUtils.defer();
|
||||
let cb = function(err, token) {
|
||||
if (err) {
|
||||
return deferred.reject(err);
|
||||
}
|
||||
log.debug("Successfully got a sync token");
|
||||
return deferred.resolve(token);
|
||||
};
|
||||
|
||||
let headers = {"X-Client-State": userData.kXCS};
|
||||
client.getTokenFromBrowserIDAssertion(tokenServerURI, assertion, cb, headers);
|
||||
return deferred.promise;
|
||||
// Exceptions will be handled by the caller.
|
||||
const token = await client.getTokenFromBrowserIDAssertion(tokenServerURI, assertion, headers);
|
||||
log.debug("Successfully got a sync token");
|
||||
return token;
|
||||
};
|
||||
|
||||
let getAssertion = () => {
|
||||
|
|
|
@ -487,9 +487,6 @@ function promiseOneObserver(topic, callback) {
|
|||
});
|
||||
}
|
||||
|
||||
function promiseStopServer(server) {
|
||||
return new Promise(resolve => server.stop(resolve));
|
||||
}
|
||||
// Avoid an issue where `client.name2` containing unicode characters causes
|
||||
// a number of tests to fail, due to them assuming that we do not need to utf-8
|
||||
// encode or decode data sent through the mocked server (see bug 1268912).
|
||||
|
|
|
@ -16,8 +16,7 @@ var fakeServer = new SyncServer();
|
|||
fakeServer.start();
|
||||
|
||||
registerCleanupFunction(function() {
|
||||
return new Promise(resolve => {
|
||||
fakeServer.stop(resolve);
|
||||
return promiseStopServer(fakeServer).finally(() => {
|
||||
Svc.Prefs.resetBranch("");
|
||||
});
|
||||
});
|
||||
|
|
|
@ -16,9 +16,7 @@ var fakeServer = new SyncServer();
|
|||
fakeServer.start();
|
||||
|
||||
registerCleanupFunction(function() {
|
||||
return new Promise(resolve => {
|
||||
fakeServer.stop(resolve);
|
||||
});
|
||||
return promiseStopServer(fakeServer);
|
||||
});
|
||||
|
||||
var fakeServerUrl = "http://localhost:" + fakeServer.port;
|
||||
|
|
|
@ -71,20 +71,22 @@ function prepareServer(cbAfterTokenFetch) {
|
|||
let numReassigns = 0;
|
||||
return configureIdentity(config).then(() => {
|
||||
Service.identity._tokenServerClient = {
|
||||
getTokenFromBrowserIDAssertion(uri, assertion, cb) {
|
||||
// Build a new URL with trailing zeros for the SYNC_VERSION part - this
|
||||
// will still be seen as equivalent by the test server, but different
|
||||
// by sync itself.
|
||||
numReassigns += 1;
|
||||
let trailingZeros = new Array(numReassigns + 1).join("0");
|
||||
let token = config.fxaccount.token;
|
||||
token.endpoint = server.baseURI + "1.1" + trailingZeros + "/johndoe";
|
||||
token.uid = config.username;
|
||||
numTokenRequests += 1;
|
||||
cb(null, token);
|
||||
if (cbAfterTokenFetch) {
|
||||
cbAfterTokenFetch();
|
||||
}
|
||||
getTokenFromBrowserIDAssertion(uri, assertion) {
|
||||
return new Promise(res => {
|
||||
// Build a new URL with trailing zeros for the SYNC_VERSION part - this
|
||||
// will still be seen as equivalent by the test server, but different
|
||||
// by sync itself.
|
||||
numReassigns += 1;
|
||||
let trailingZeros = new Array(numReassigns + 1).join("0");
|
||||
let token = config.fxaccount.token;
|
||||
token.endpoint = server.baseURI + "1.1" + trailingZeros + "/johndoe";
|
||||
token.uid = config.username;
|
||||
numTokenRequests += 1;
|
||||
res(token);
|
||||
if (cbAfterTokenFetch) {
|
||||
cbAfterTokenFetch();
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
return server;
|
||||
|
|
|
@ -78,11 +78,9 @@ async function syncAndExpectNodeReassignment(server, firstNotification, between,
|
|||
|
||||
let getTokenCount = 0;
|
||||
let mockTSC = { // TokenServerClient
|
||||
getTokenFromBrowserIDAssertion(uri, assertion, cb) {
|
||||
async getTokenFromBrowserIDAssertion(uri, assertion) {
|
||||
getTokenCount++;
|
||||
cb(null, {
|
||||
endpoint: server.baseURI + "1.1/johndoe/"
|
||||
});
|
||||
return {endpoint: server.baseURI + "1.1/johndoe/"};
|
||||
},
|
||||
};
|
||||
Service.identity._tokenServerClient = mockTSC;
|
||||
|
@ -280,11 +278,9 @@ add_task(async function test_loop_avoidance_storage() {
|
|||
|
||||
let getTokenCount = 0;
|
||||
let mockTSC = { // TokenServerClient
|
||||
getTokenFromBrowserIDAssertion(uri, assertion, cb) {
|
||||
async getTokenFromBrowserIDAssertion(uri, assertion) {
|
||||
getTokenCount++;
|
||||
cb(null, {
|
||||
endpoint: server.baseURI + "1.1/johndoe/"
|
||||
});
|
||||
return {endpoint: server.baseURI + "1.1/johndoe/"};
|
||||
},
|
||||
};
|
||||
Service.identity._tokenServerClient = mockTSC;
|
||||
|
@ -376,11 +372,9 @@ add_task(async function test_loop_avoidance_engine() {
|
|||
|
||||
let getTokenCount = 0;
|
||||
let mockTSC = { // TokenServerClient
|
||||
getTokenFromBrowserIDAssertion(uri, assertion, cb) {
|
||||
getTokenFromBrowserIDAssertion(uri, assertion) {
|
||||
getTokenCount++;
|
||||
cb(null, {
|
||||
endpoint: server.baseURI + "1.1/johndoe/"
|
||||
});
|
||||
return {endpoint: server.baseURI + "1.1/johndoe/"};
|
||||
},
|
||||
};
|
||||
Service.identity._tokenServerClient = mockTSC;
|
||||
|
|
Загрузка…
Ссылка в новой задаче