Bug 693341 - Test arrays of iid_is params. r=khuey

This commit is contained in:
Bobby Holley 2011-10-27 12:43:38 -07:00
parent 14ddb21b51
commit 1eb6706bda
4 changed files with 72 additions and 1 deletions

View File

@ -59,6 +59,16 @@ function f_is(aIs, a, bIs, b, rvIs) {
return rv;
}
function f_size_and_iid(aSize, aIID, a, bSize, bIID, b, rvSize, rvIID) {
// Copy the iids.
rvIID.value = bIID.value;
bIID.value = aIID;
// Now that we've reduced the problem to one dependent variable, use f_is.
return f_is(aSize, a, bSize, b, rvSize);
}
TestParams.prototype = {
/* Boilerplate */
@ -94,6 +104,7 @@ TestParams.prototype = {
testSizedString: f_is,
testSizedWstring: f_is,
testInterfaceIs: f_is,
testInterfaceIsArray: f_size_and_iid,
};
var NSGetFactory = XPCOMUtils.generateNSGetFactory([TestParams]);

View File

@ -60,7 +60,7 @@ nsXPCTestParams::~nsXPCTestParams()
}
#define TAKE_OWNERSHIP_NOOP(val) {}
#define TAKE_OWNERSHIP_INTERFACE(val) {(val)->AddRef();}
#define TAKE_OWNERSHIP_INTERFACE(val) {static_cast<nsISupports*>(val)->AddRef();}
#define TAKE_OWNERSHIP_STRING(val) { \
nsDependentCString vprime(val); \
val = ToNewCString(vprime); \
@ -341,3 +341,30 @@ NS_IMETHODIMP nsXPCTestParams::TestInterfaceIs(const nsIID *aIID, void *a,
return NS_OK;
}
/* void testInterfaceIsArray (in unsigned long aLength, in nsIIDPtr aIID,
* [array, size_is (aLength), iid_is (aIID)] in nsQIResult a,
* inout unsigned long bLength, inout nsIIDPtr bIID,
* [array, size_is (bLength), iid_is (bIID)] inout nsQIResult b,
* out unsigned long rvLength, out nsIIDPtr rvIID,
* [retval, array, size_is (rvLength), iid_is (rvIID)] out nsQIResult rv); */
NS_IMETHODIMP nsXPCTestParams::TestInterfaceIsArray(PRUint32 aLength, const nsIID *aIID,
void **a,
PRUint32 *bLength NS_INOUTPARAM, nsIID **bIID NS_INOUTPARAM,
void ***b NS_INOUTPARAM,
PRUint32 *rvLength NS_OUTPARAM, nsIID **rvIID NS_OUTPARAM,
void ***rv NS_OUTPARAM)
{
// Transfer the IIDs. See the comments in TestInterfaceIs (above) for an
// explanation of what we're doing.
*rvIID = static_cast<nsIID*>(NS_Alloc(sizeof(nsID)));
if (!*rvIID)
return NS_ERROR_OUT_OF_MEMORY;
**rvIID = **bIID;
**bIID = *aIID;
// The macro is agnostic to the actual interface types, so we can re-use code here.
//
// Do this second, since the macro returns.
BUFFER_METHOD_IMPL(void*, 0, TAKE_OWNERSHIP_INTERFACE);
}

View File

@ -104,4 +104,13 @@ interface nsIXPCTestParams : nsISupports {
void testInterfaceIs(in nsIIDPtr aIID, [iid_is(aIID)] in nsQIResult a,
inout nsIIDPtr bIID, [iid_is(bIID)] inout nsQIResult b,
out nsIIDPtr rvIID, [retval, iid_is(rvIID)] out nsQIResult rv);
// Test arrays of iid_is. According to khuey we don't use it for anything
// in mozilla-central, but calendar stuff depends on it.
void testInterfaceIsArray(in unsigned long aLength, in nsIIDPtr aIID,
[array, size_is(aLength), iid_is(aIID)] in nsQIResult a,
inout unsigned long bLength, inout nsIIDPtr bIID,
[array, size_is(bLength), iid_is(bIID)] inout nsQIResult b,
out unsigned long rvLength, out nsIIDPtr rvIID,
[retval, array, size_is(rvLength), iid_is(rvIID)] out nsQIResult rv);
};

View File

@ -99,6 +99,26 @@ function test_component(contractid) {
do_check_true(isComparator(val1Is, bIs.value));
}
// Special-purpose function for testing arrays of iid_is interfaces, where we
// have 2 distinct sets of dependent parameters.
function doIs2Test(name, val1, val1Size, val1IID, val2, val2Size, val2IID) {
var a = val1;
var aSize = val1Size;
var aIID = val1IID;
var b = {value: val2};
var bSize = {value: val2Size};
var bIID = {value: val2IID};
var rvSize = {};
var rvIID = {};
var rv = o[name].call(o, aSize, aIID, a, bSize, bIID, b, rvSize, rvIID);
do_check_true(arrayComparator(interfaceComparator)(rv, val2));
do_check_true(standardComparator(rvSize.value, val2Size));
do_check_true(dotEqualsComparator(rvIID.value, val2IID));
do_check_true(arrayComparator(interfaceComparator)(val1, b.value));
do_check_true(standardComparator(val1Size, bSize.value));
do_check_true(dotEqualsComparator(val1IID, bIID.value));
}
// Workaround for bug 687612 (inout parameters broken for dipper types).
// We do a simple test of copying a into b, and ignore the rv.
function doTestWorkaround(name, val1) {
@ -162,4 +182,8 @@ function test_component(contractid) {
doIsTest("testInterfaceIs", makeA(), Ci['nsIXPCTestInterfaceA'],
makeB(), Ci['nsIXPCTestInterfaceB'],
interfaceComparator, dotEqualsComparator);
// Test arrays of iids.
doIs2Test("testInterfaceIsArray", [makeA(), makeA(), makeA(), makeA(), makeA()], 5, Ci['nsIXPCTestInterfaceA'],
[makeB(), makeB(), makeB()], 3, Ci['nsIXPCTestInterfaceB']);
}