Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test runs only with pattern: os == 'win'
- Manifest: browser/components/shell/test/unit/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
"use strict";
ChromeUtils.defineESModuleGetters(this, {
MockRegistrar: "resource://testing-common/MockRegistrar.sys.mjs",
ShellService: "moz-src:///browser/components/shell/ShellService.sys.mjs",
sinon: "resource://testing-common/Sinon.sys.mjs",
});
let gMockService = {
QueryInterface: ChromeUtils.generateQI([Ci.nsISecondaryTileService]),
requestCreateAndPin: () =>
ok(false, "requestCreate called when not stubbed out!"),
requestDelete: () => ok(false, "requestDelete called when not stubbed out!"),
};
add_setup(function setup() {
MockRegistrar.register(
"@mozilla.org/browser/secondary-tile-service;1",
gMockService
);
});
function validateRequestCreateThen(sandbox, callback) {
let args = ["tileid", "name", "iconpath", ["a", "b", "c"]];
let fakeCalled = false;
sandbox
.stub(gMockService, "requestCreateAndPin")
.callsFake(
function fakeCreate(aTileId, aName, aIconPath, aArguments, aListener) {
equal(aTileId, args[0], "Tile ID matches");
equal(aName, args[1], "Tile name matches");
equal(aIconPath, args[2], "Icon path matches");
deepEqual(aArguments, args[3], "Arguments match");
ok(
aListener instanceof Ci.nsISecondaryTileListener,
"Listener is valid"
);
fakeCalled = true;
callback(aListener);
}
);
return ShellService.requestCreateAndPinSecondaryTile(...args).finally(() => {
ok(fakeCalled, "The fake was actually used");
});
}
add_task(async function requestCreateSuccess() {
let sandbox = sinon.createSandbox();
equal(
await validateRequestCreateThen(sandbox, listener =>
listener.succeeded(true)
),
true,
"Promise resolved to 'true' without exception"
);
sandbox.restore();
});
add_task(async function requestCreateRejected() {
let sandbox = sinon.createSandbox();
equal(
await validateRequestCreateThen(sandbox, listener =>
listener.succeeded(false)
),
false,
"Promise resolved to 'false' without exception"
);
sandbox.restore();
});
add_task(async function requestCreateFailure() {
let sandbox = sinon.createSandbox();
await Assert.rejects(
validateRequestCreateThen(sandbox, listener => listener.failed(1234)),
/Secondary tile pinning failed \(HRESULT 000004d2\)/,
"Pinning should fail with the expected result"
);
sandbox.restore();
});
function validateRequestDeleteThen(sandbox, callback) {
let fakeCalled = false;
sandbox
.stub(gMockService, "requestDelete")
.callsFake(function fakeDelete(aTileId, aListener) {
equal(aTileId, "idtile", "Tile ID matches");
ok(aListener instanceof Ci.nsISecondaryTileListener, "Listener is valid");
fakeCalled = true;
callback(aListener);
});
return ShellService.requestDeleteSecondaryTile("idtile").finally(() => {
ok(fakeCalled, "The fake was actually used");
});
}
add_task(async function requestDeleteSuccess() {
let sandbox = sinon.createSandbox();
equal(
await validateRequestDeleteThen(sandbox, listener =>
listener.succeeded(true)
),
true,
"Promise resolved to 'true' without exception"
);
sandbox.restore();
});
add_task(async function requestDeleteRejected() {
let sandbox = sinon.createSandbox();
equal(
await validateRequestDeleteThen(sandbox, listener =>
listener.succeeded(false)
),
false,
"Promise resolved to 'false' without exception"
);
sandbox.restore();
});
add_task(async function requestDeleteFailure() {
let sandbox = sinon.createSandbox();
await Assert.rejects(
validateRequestDeleteThen(sandbox, listener => listener.failed(4321)),
/Secondary tile unpinning failed \(HRESULT 000010e1\)/,
"Unpinning should fail with the expected result"
);
sandbox.restore();
});