// META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js // META: script=/common/utils.js // META: script=resources/ba-fledge-util.sub.js // META: script=resources/fledge-util.sub.js // META: script=third_party/cbor-js/cbor.js // META: script=/common/subset-tests.js // META: timeout=long "use strict"; // These tests focus on the navigator.getInterestGroupAdAuctionData() method. subsetTest(promise_test, async test => { const result = await navigator.getInterestGroupAdAuctionData({ coordinatorOrigin: await BA.configureCoordinator(), seller: window.location.origin }); assert_true(result.requestId !== null); assert_true(result.request.length === 0); }, 'getInterestGroupAdAuctionData() with no interest groups returns a zero length result.'); async function testInvalidConfig(test, configObj, desc) { if (!configObj.coordinatorOrigin) { configObj.coordinatorOrigin = await BA.configureCoordinator(); } await promise_rejects_js( test, TypeError, navigator.getInterestGroupAdAuctionData(configObj), desc); } subsetTest(promise_test, async test => { await testInvalidConfig(test, {}, 'no seller'); await testInvalidConfig(test, {seller: 'example'}, 'invalid seller 1'); await testInvalidConfig( test, {seller: 'http://example.org'}, 'invalid seller 2'); await testInvalidConfig( test, {seller: 'https://example.org', coordinatorOrigin: 'example'}, 'invalid coordinator 1'); await testInvalidConfig( test, {seller: 'https://example.org', coordinatorOrigin: 'example.org'}, 'invalid coordinator 2'); await testInvalidConfig( test, {seller: 'https://example.org', perBuyerConfig: {'a': {}}}, 'invalid buyer 1'); await testInvalidConfig( test, {seller: 'https://example.org', perBuyerConfig: {'http://a.com': {}}}, 'invalid buyer 2'); await testInvalidConfig( test, { seller: 'https://example.org', perBuyerConfig: {'https://a.com': {}, 'http://b.com': {}} }, 'invalid buyer 3'); await testInvalidConfig( test, { seller: 'https://example.org', perBuyerConfig: {'https://a.com': {}, 'https://b.com': {}} }, 'missing size info w/per-buyer config 1'); await testInvalidConfig( test, { seller: 'https://example.org', perBuyerConfig: {'https://a.com': {targetSize: 400}, 'https://b.com': {}} }, 'missing size info w/per-buyer config 2'); }, 'getInterestGroupAdAuctionData() config checks'); // Returns an AuctionAdInterestGroup that sets all fields that can be exported // via getInterestGroupAdAuctionData(). function makeTemplateIgConfig(uuid) { const adsArray = [ { renderURL: createRenderURL(uuid) + '&a', adRenderId: 'a', metadata: 'ada', sizeGroup: 'small' }, { renderURL: createRenderURL(uuid) + '&b', adRenderId: 'b', metadata: 'adb', sizeGroup: 'big' } ]; const adComponentsArray = [ { renderURL: 'https://example.org/ca', adRenderId: 'ca', metadata: 'compa', sizeGroup: 'big' }, { renderURL: 'https://example.org/cb', adRenderId: 'cb', metadata: 'compb', sizeGroup: 'small' }, { renderURL: 'https://example.org/cc', adRenderId: 'cc', metadata: 'compc', sizeGroup: 'big' }, ]; return { ads: adsArray, adComponents: adComponentsArray, adSizes: { 's': {width: '100px', height: '30px'}, 'xl': {width: '1000px', height: '300px'} }, sizeGroups: {'small': ['s'], 'big': ['xl']}, trustedBiddingSignalsKeys: ['alpha', 'beta'], userBiddingSignals: 14 }; } /************************************************************************* * Tests for the multi-seller variant of the API *************************************************************************/ subsetTest(promise_test, async test => { const uuid = generateUuid(test); const igConfig = makeTemplateIgConfig(uuid); await joinInterestGroup(test, uuid, igConfig); await promise_rejects_js(test, TypeError, navigator.getInterestGroupAdAuctionData({ sellers: [{ coordinatorOrigin: await BA.configureCoordinator(), seller: window.location.origin, }, { coordinatorOrigin: await BA.configureCoordinator(), seller: "http://not.secure.test/", }] })); }, 'getInterestGroupAdAuctionData() multi-seller with multiple sellers - one invalid seller'); subsetTest(promise_test, async test => { const uuid = generateUuid(test); const igConfig = makeTemplateIgConfig(uuid); await joinInterestGroup(test, uuid, igConfig); await promise_rejects_js(test, TypeError, navigator.getInterestGroupAdAuctionData({ })); }, 'getInterestGroupAdAuctionData() one of "seller" and "sellers" is required'); subsetTest(promise_test, async test => { const uuid = generateUuid(test); const igConfig = makeTemplateIgConfig(uuid); await joinInterestGroup(test, uuid, igConfig); await promise_rejects_js(test, TypeError, navigator.getInterestGroupAdAuctionData({ seller: window.location.origin, sellers: [{ coordinatorOrigin: await BA.configureCoordinator(), seller: window.location.origin, }] })); }, 'getInterestGroupAdAuctionData() doesn\'t allow "seller" and "sellers" fields'); subsetTest(promise_test, async test => { const uuid = generateUuid(test); const igConfig = makeTemplateIgConfig(uuid); await joinInterestGroup(test, uuid, igConfig); await promise_rejects_js(test, TypeError, navigator.getInterestGroupAdAuctionData({ coordinatorOrigin: window.location.origin, sellers: [{ coordinatorOrigin: await BA.configureCoordinator(), seller: window.location.origin, }] })); }, 'getInterestGroupAdAuctionData() doesn\'t allow "coordinatorOrigin" and "sellers" fields'); subsetTest(promise_test, async test => { const uuid = generateUuid(test); const igConfig = makeTemplateIgConfig(uuid); await joinInterestGroup(test, uuid, igConfig); await promise_rejects_js(test, TypeError, navigator.getInterestGroupAdAuctionData({ sellers: [{ coordinatorOrigin: await BA.configureCoordinator(), seller: window.location.origin, }, { coordinatorOrigin: await BA.configureCoordinator(), seller: window.location.origin, } ] })); }, 'getInterestGroupAdAuctionData() doesn\'t allow duplicate sellers in "sellers" field'); subsetTest(promise_test, async test => { const uuid = generateUuid(test); const igConfig = makeTemplateIgConfig(uuid); await joinInterestGroup(test, uuid, igConfig); const result = await navigator.getInterestGroupAdAuctionData({ sellers: [] }); assert_equals(result.requestId, ""); assert_array_equals(result.requests, []); }, 'getInterestGroupAdAuctionData() with no sellers');