209 lines
6.5 KiB
JavaScript
209 lines
6.5 KiB
JavaScript
// META: script=/resources/testdriver.js
|
|
// META: script=/resources/testdriver-vendor.js
|
|
// META: script=/common/utils.js
|
|
// META: script=resources/fledge-util.sub.js
|
|
// META: script=/common/subset-tests.js
|
|
// META: timeout=long
|
|
// META: variant=?1-5
|
|
// META: variant=?6-10
|
|
// META: variant=?11-15
|
|
|
|
'use strict';
|
|
|
|
// These tests cover encodeUtf8 and decodeUtf8.
|
|
|
|
const helpers = `
|
|
function assertEq(l, r, label) {
|
|
if (l !== r)
|
|
throw 'Mismatch ' + label;
|
|
}
|
|
|
|
function assertByteArray(result, expect) {
|
|
if (!(result instanceof Uint8Array)) {
|
|
throw 'Not a Uint8Array!';
|
|
}
|
|
assertEq(result.length, expect.length, 'length');
|
|
for (var i = 0; i < result.length; ++i) {
|
|
assertEq(result[i], expect[i], i);
|
|
}
|
|
}
|
|
|
|
function assertString(result, expect) {
|
|
if (typeof result !== 'string') {
|
|
throw 'Not a string';
|
|
}
|
|
assertEq(result.length, expect.length, 'length');
|
|
for (var i = 0; i < result.length; ++i) {
|
|
assertEq(result.charCodeAt(i), expect.charCodeAt(i), i);
|
|
}
|
|
}
|
|
`
|
|
|
|
async function testConversion(test, conversionBody) {
|
|
const uuid = generateUuid(test);
|
|
let sellerReportURL = createSellerReportURL(uuid);
|
|
let bidderReportURL = createBidderReportURL(uuid);
|
|
|
|
let fullBody = `
|
|
${helpers}
|
|
${conversionBody}
|
|
`;
|
|
|
|
let biddingLogicURL = createBiddingScriptURL({
|
|
generateBid: fullBody,
|
|
reportWin: fullBody + `sendReportTo('${bidderReportURL}')`
|
|
});
|
|
|
|
let decisionLogicURL = createDecisionScriptURL(uuid, {
|
|
scoreAd: fullBody,
|
|
reportResult: fullBody + `sendReportTo('${sellerReportURL}')`
|
|
});
|
|
|
|
await joinInterestGroup(test, uuid, {biddingLogicURL: biddingLogicURL});
|
|
await runBasicFledgeAuctionAndNavigate(
|
|
test, uuid, {decisionLogicURL: decisionLogicURL});
|
|
await waitForObservedRequests(uuid, [sellerReportURL, bidderReportURL]);
|
|
}
|
|
|
|
async function testConversionException(test, conversionBody) {
|
|
const uuid = generateUuid(test);
|
|
let sellerReportURL = createSellerReportURL(uuid);
|
|
let bidderReportURL = createBidderReportURL(uuid);
|
|
|
|
let fullBody = `
|
|
${helpers}
|
|
try {
|
|
${conversionBody};
|
|
return -1;
|
|
} catch (e) {
|
|
}
|
|
`;
|
|
|
|
let biddingLogicURL = createBiddingScriptURL({
|
|
generateBid: fullBody,
|
|
reportWin: fullBody + `sendReportTo('${bidderReportURL}')`
|
|
});
|
|
|
|
let decisionLogicURL = createDecisionScriptURL(uuid, {
|
|
scoreAd: fullBody,
|
|
reportResult: fullBody + `sendReportTo('${sellerReportURL}')`
|
|
});
|
|
|
|
await joinInterestGroup(test, uuid, {biddingLogicURL: biddingLogicURL});
|
|
await runBasicFledgeAuctionAndNavigate(
|
|
test, uuid, {decisionLogicURL: decisionLogicURL});
|
|
await waitForObservedRequests(uuid, [sellerReportURL, bidderReportURL]);
|
|
}
|
|
|
|
subsetTest(promise_test, async test => {
|
|
await testConversion(
|
|
test, `let result = protectedAudience.encodeUtf8('ABC\u0490');
|
|
assertByteArray(result, [65, 66, 67, 0xD2, 0x90])`);
|
|
}, 'encodeUtf8 - basic');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
await testConversion(
|
|
test, `let result = protectedAudience.encodeUtf8('A\uD800C');
|
|
assertByteArray(result, [65, 0xEF, 0xBF, 0xBD, 67])`);
|
|
}, 'encodeUtf8 - mismatched surrogate gets replaced');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
await testConversion(
|
|
test, `let result = protectedAudience.encodeUtf8('A\uD83D\uDE02C');
|
|
assertByteArray(result, [65, 0xF0, 0x9F, 0x98, 0x82, 67])`);
|
|
}, 'encodeUtf8 - surrogate pair combined');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let obj = {
|
|
toString: () => "ABC"
|
|
};
|
|
let result = protectedAudience.encodeUtf8(obj);
|
|
assertByteArray(result, [65, 66, 67])
|
|
`;
|
|
await testConversion(test, conversionBody);
|
|
}, 'encodeUtf8 - custom string conversion');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let result = protectedAudience.encodeUtf8();
|
|
`;
|
|
await testConversionException(test, conversionBody);
|
|
}, 'encodeUtf8 - not enough arguments');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let obj = {
|
|
toString: () => { throw 'no go' }
|
|
};
|
|
let result = protectedAudience.encodeUtf8(obj);
|
|
`;
|
|
await testConversionException(test, conversionBody);
|
|
}, 'encodeUtf8 - custom string conversion failure');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let input = new Uint8Array([65, 66, 0xD2, 0x90, 67]);
|
|
let result = protectedAudience.decodeUtf8(input);
|
|
assertString(result, 'AB\u0490C');
|
|
`;
|
|
await testConversion(test, conversionBody);
|
|
}, 'decodeUtf8 - basic');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let input = new Uint8Array([65, 32, 0xD2]);
|
|
let result = protectedAudience.decodeUtf8(input);
|
|
if (result.indexOf('\uFFFD') === -1)
|
|
throw 'Should have replacement character';
|
|
`;
|
|
await testConversion(test, conversionBody);
|
|
}, 'decodeUtf8 - broken utf-8');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let input = new Uint8Array([65, 32, 0xED, 0xA0, 0x80, 66]);
|
|
let result = protectedAudience.decodeUtf8(input);
|
|
if (result.indexOf('\uFFFD') === -1)
|
|
throw 'Should have replacement character';
|
|
`;
|
|
await testConversion(test, conversionBody);
|
|
}, 'decodeUtf8 - mismatched surrogate');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let input = new Uint8Array([65, 0xF0, 0x9F, 0x98, 0x82, 67]);
|
|
let result = protectedAudience.decodeUtf8(input);
|
|
assertString(result, 'A\uD83D\uDE02C');
|
|
`;
|
|
await testConversion(test, conversionBody);
|
|
}, 'decodeUtf8 - non-BMP character');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let buffer = new ArrayBuffer(8);
|
|
let fullView = new Uint8Array(buffer);
|
|
for (let i = 0; i < fullView.length; ++i)
|
|
fullView[i] = 65 + i;
|
|
let partialView = new Uint8Array(buffer, 2, 3);
|
|
assertString(protectedAudience.decodeUtf8(fullView),
|
|
'ABCDEFGH');
|
|
assertString(protectedAudience.decodeUtf8(partialView),
|
|
'CDE');
|
|
`;
|
|
await testConversion(test, conversionBody);
|
|
}, 'decodeUtf8 - proper Uint8Array handling');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let result = protectedAudience.decodeUtf8();
|
|
`;
|
|
await testConversionException(test, conversionBody);
|
|
}, 'decodeUtf8 - not enough arguments');
|
|
|
|
subsetTest(promise_test, async test => {
|
|
const conversionBody = `
|
|
let result = protectedAudience.decodeUtf8([65, 32, 66]);
|
|
`;
|
|
await testConversionException(test, conversionBody);
|
|
}, 'decodeUtf8 - wrong type');
|