Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
const {
invokeTestCallbackInterfaceNoop,
invokeTestCallbackInterfaceGetValue,
invokeTestCallbackInterfaceSetValue,
TestCallbackInterface,
UniffiSkipJsTypeCheck,
UnitTestObjs,
} = ChromeUtils.importESModule(
"moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTests.sys.mjs"
);
/**
*
*/
class Callback extends TestCallbackInterface {
constructor(value) {
super();
this.value = value;
}
noop() {}
getValue() {
return this.value;
}
setValue(value) {
this.value = value;
}
}
// Construct a callback interface to pass to rust
const cbi = new Callback(42);
// Before we pass it to Rust `hasRegisteredCallbacks` should return fals
Assert.equal(
UnitTestObjs.uniffiCallbackHandlerUniffiBindingsTestsTestCallbackInterface.hasRegisteredCallbacks(),
false
);
// Test calling callback interface methods, which we can only do indirectly.
// Each of these Rust functions inputs a callback interface, calls a method on it, then returns the result.
invokeTestCallbackInterfaceNoop(cbi);
Assert.equal(invokeTestCallbackInterfaceGetValue(cbi), 42);
invokeTestCallbackInterfaceSetValue(cbi, 43);
Assert.equal(invokeTestCallbackInterfaceGetValue(cbi), 43);
// Test lowering failures when invoking the callback interfaces.
// The main test is that we don't leak a callback interface handle when doing this.
// Even though the Rust call doesn't go through, `hasRegisteredCallbacks` should still return false
// at the end of this test.
const invalidU32Value = 2 ** 48;
try {
invokeTestCallbackInterfaceSetValue(cbi, invalidU32Value);
} catch {
// Errors are expected
}
// Test a trickier case of lower failing.
// This one uses `UniffiSkipJsTypeCheck` to force the JS type checking to pass and make the failure
// happen in the C++ layer.
try {
invokeTestCallbackInterfaceSetValue(
cbi,
new UniffiSkipJsTypeCheck(invalidU32Value)
);
} catch {
// Errors are expected
}
// eslint-disable-next-line no-delete-var
delete cbi;
// Wait a bit, then check that all callbacks have been cleaned up.
// Cleanup happens in a scheduled call, so wait a bit before checking
do_test_pending();
do_timeout(100, () => {
Assert.equal(
UnitTestObjs.uniffiCallbackHandlerUniffiBindingsTestsTestCallbackInterface.hasRegisteredCallbacks(),
false
);
do_test_finished();
});