Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

"use strict";
/**
* This test is used to ensure that Glean probe 'media::error' and
* 'mediaPlayback::decodeError` can be recorded correctly.
*/
const testCases = [
// Will fail on reading metadata
{
fileName: "bogus.wav",
mediaError: {
error_type: "SrcNotSupportedErr",
},
},
{
fileName: "404.webm",
mediaError: {
error_type: "SrcNotSupportedErr",
},
},
// Failed with the key system
{
fileName: "404.mp4",
mediaError: {
error_type: "SrcNotSupportedErr",
key_system: "org.w3.clearkey",
error_name: "NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR",
},
},
// Failed during decoding
{
fileName: "decode_error_vp9.webm",
mediaError: {
error_type: "DecodeErr",
error_name: "NS_ERROR_DOM_MEDIA_DECODE_ERR",
},
decodeError: {
mime_type: "video/vp9",
error_name: "NS_ERROR_DOM_MEDIA_DECODE_ERR",
},
},
];
add_task(async function testGleanMediaErrorProbe() {
const tab = await openTab();
for (let test of testCases) {
// always reset FOG to clean up all previous probes
Services.fog.testResetFOG();
info(`running test for '${test.fileName}'`);
await PlayMediaAndWaitForError(tab, test);
info(`waiting until glean probe is ready on the parent process`);
await Services.fog.testFlushAllChildren();
info(`checking the collected results for '${test.fileName}'`);
await CheckMediaErrorProbe(test.mediaError);
if (test.decodeError !== undefined) {
await CheckDecodeErrorProbe(test.decodeError);
}
}
BrowserTestUtils.removeTab(tab);
});
// Following are helper functions
async function PlayMediaAndWaitForError(tab, testInfo) {
await SpecialPowers.spawn(tab.linkedBrowser, [testInfo], async testInfo => {
const video = content.document.createElement("video");
if (testInfo.mediaError.key_system) {
let keySystemAccess = await content.navigator.requestMediaKeySystemAccess(
testInfo.mediaError.key_system,
[{ "": [{ "": "" }] }]
);
let mediaKeys = await keySystemAccess.createMediaKeys();
await video.setMediaKeys(mediaKeys);
}
video.src = testInfo.fileName;
video.play();
info(`waiting for an error`);
ok(
await new Promise(r => (video.onerror = r)).then(
_ => true,
_ => false
),
"Got a media error"
);
});
}
async function CheckMediaErrorProbe(expected) {
const extra = await Glean.media.error.testGetValue()[0].extra;
is(
extra.error_type,
expected.error_type,
`'${extra.error_type}' is equal to expected '${expected.error_type}'`
);
if (expected.error_name !== undefined) {
is(
extra.error_name,
expected.error_name,
`'${extra.error_name}' is equal to expected '${expected.error_name}'`
);
}
if (expected.key_system !== undefined) {
is(
extra.key_system,
expected.key_system,
`'${extra.key_system}' is equal to expected '${expected.key_system}'`
);
}
}
async function CheckDecodeErrorProbe(expected) {
const extra = await Glean.mediaPlayback.decodeError.testGetValue()[0].extra;
is(
extra.mime_type,
expected.mime_type,
`'${extra.mime_type}' is equal to expected '${expected.mime_type}'`
);
is(
extra.error_name,
expected.error_name,
`'${extra.error_name}' is equal to expected '${expected.error_name}'`
);
}