Bug 1407082 - Handle more kinds of errors in SyncTelemetry.transformError. r=kitcambridge

MozReview-Commit-ID: CjwY7w7vUqs

--HG--
extra : rebase_source : 4030ab88c3eccd755272499ff0527e9e316998b1
This commit is contained in:
Thom Chiovoloni 2017-10-10 12:31:42 -04:00
Родитель 44b6375075
Коммит 7555b605f1
2 изменённых файлов: 47 добавлений и 4 удалений

Просмотреть файл

@ -416,8 +416,9 @@ function cleanErrorMessage(error) {
} }
// Try to filter things that look somewhat like a URL (in that they contain a // Try to filter things that look somewhat like a URL (in that they contain a
// colon in the middle of non-whitespace), in case anything else is including // colon in the middle of non-whitespace), in case anything else is including
// these in error messages. // these in error messages. Note that JSON.stringified stuff comes through
error = error.replace(/\S+:\S+/g, "<URL>"); // here, so we explicitly ignore double-quotes as well.
error = error.replace(/[^\s"]+:[^\s"]+/g, "<URL>");
return error; return error;
} }
@ -713,10 +714,22 @@ class SyncTelemetryImpl {
if (error.result) { if (error.result) {
return { name: "nserror", code: error.result }; return { name: "nserror", code: error.result };
} }
// It's probably an Error object, but it also could be some
// other object that may or may not override toString to do
// something useful.
let msg = String(error);
if (msg.startsWith("[object")) {
// Nothing useful in the default, check for a string "message" property.
if (typeof error.message == "string") {
msg = String(error.message);
} else {
// Hopefully it won't come to this...
msg = JSON.stringify(error);
}
}
return { return {
name: "unexpectederror", name: "unexpectederror",
error: cleanErrorMessage(String(error)) error: cleanErrorMessage(msg)
}; };
} }

Просмотреть файл

@ -360,6 +360,36 @@ add_task(async function test_generic_engine_fail() {
} }
}); });
add_task(async function test_engine_fail_weird_errors() {
enableValidationPrefs();
await Service.engineManager.register(SteamEngine);
let engine = Service.engineManager.get("steam");
engine.enabled = true;
let server = await serverForFoo(engine);
await SyncTestingInfrastructure(server);
try {
let msg = "Bad things happened!"
engine._errToThrow = { message: msg };
let ping = await sync_and_validate_telem(true);
equal(ping.status.service, SYNC_FAILED_PARTIAL);
deepEqual(ping.engines.find(err => err.name === "steam").failureReason, {
name: "unexpectederror",
error: "Bad things happened!"
});
let e = { msg };
engine._errToThrow = e;
ping = await sync_and_validate_telem(true);
deepEqual(ping.engines.find(err => err.name === "steam").failureReason, {
name: "unexpectederror",
error: JSON.stringify(e)
});
} finally {
await cleanAndGo(engine, server);
Service.engineManager.unregister(engine);
}
});
add_task(async function test_engine_fail_ioerror() { add_task(async function test_engine_fail_ioerror() {
enableValidationPrefs(); enableValidationPrefs();