// META: script=/resources/testdriver.js // META: script=/common/utils.js // META: script=resources/fledge-util.js "use strict;" // The tests in this file focus on calls to runAdAuction with various // auctionConfigs. const makeTest = ({ // Test name name, // Expectation function (EXPECT_NULL, etc.) expect, // Overrides to the auction config. auctionConfigOverrides = {}, }) => { promise_test(async test => { const uuid = generateUuid(test); // Join an interest group so the auction actually runs. await joinInterestGroup(test, uuid); let auctionResult; try { auctionResult = await runBasicFledgeAuction(test, uuid, auctionConfigOverrides); } catch (e) { auctionResult = e; } expect(auctionResult); }, name); }; // Expect an unsuccessful auction (yielding null). const EXPECT_NO_WINNER = auctionResult => { assert_equals(auctionResult, null, 'Auction unexpected had a winner'); }; // Expect an exception of the given type. const EXPECT_EXCEPTION = exceptionType => auctionResult => { assert_not_equals(auctionResult, null, "got null instead of expected error"); assert_true(auctionResult instanceof Error, "did not get expected error: " + auctionResult); assert_throws_js(exceptionType, () => { throw auctionResult; }); }; makeTest({ name: 'no buyers => no winners', expect: EXPECT_NO_WINNER, auctionConfigOverrides: {interestGroupBuyers: []}, }); makeTest({ name: 'seller is not an https URL', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: {seller: "ftp://not-https"}, }); makeTest({ name: 'decisionLogicUrl is invalid', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { decisionLogicUrl: "https://foo:99999999999" }, }); makeTest({ name: 'decisionLogicUrl is cross-origin with seller', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { decisionLogicUrl: "https://example.com" }, }); makeTest({ name: 'trustedScoringSignalsUrl is invalid', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { trustedScoringSignalsUrl: "https://foo:99999999999" }, }); makeTest({ name: 'trustedScoringSignalsUrl is cross-origin with seller', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { trustedScoringSignalsUrl: "https://example.com" }, }); makeTest({ name: 'interestGroupBuyer is invalid', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { interestGroupBuyers: ["https://foo:99999999999"] }, }); makeTest({ name: 'interestGroupBuyer is not https', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { interestGroupBuyers: ["http://example.com"] }, }); makeTest({ name: 'only one interestGroupBuyer is invalid', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { interestGroupBuyers: ["https://example.com", "https://foo:99999999999"], }, }); makeTest({ name: 'only one interestGroupBuyer is not https', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { interestGroupBuyers: ["https://example.com", "http://example.com"], }, }); makeTest({ name: 'auctionSignals is invalid as JSON', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { auctionSignals: { sig: BigInt(13) } }, }); makeTest({ name: 'sellerSignals is invalid as JSON', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { sellerSignals: { sig: BigInt(13) } }, }); makeTest({ name: 'directFromSellerSignals is invalid', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { directFromSellerSignals: "https://foo:99999999999" }, }); makeTest({ name: 'directFromSellerSignals is cross-origin with seller', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { directFromSellerSignals: "https://example.com" }, }); makeTest({ name: 'directFromSellerSignals has nonempty query', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { directFromSellerSignals: window.location.origin + "?foo=bar" }, }); makeTest({ name: 'perBuyerSignals has invalid URL in a key', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { perBuyerSignals: { "https://foo:99999999999" : {} }}, }); makeTest({ name: 'perBuyerSignals value is invalid as JSON', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { perBuyerSignals: { "https://example.com" : { sig: BigInt(1) }, }}, }); makeTest({ name: 'perBuyerGroupLimits has invalid URL in a key', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { perBuyerGroupLimits: { "https://foo:99999999999" : 5 }}, }); makeTest({ name: 'perBuyerExperimentGroupIds has invalid URL in a key', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { perBuyerExperimentGroupIds: { "https://foo:99999999999" : 11 }}, }); makeTest({ name: 'perBuyerPrioritySignals has invalid URL in a key', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { perBuyerPrioritySignals: { "https://foo:99999999999" : { sig: 2.5} }, }, }); makeTest({ name: 'perBuyerPrioritySignals has a value with a key with prefix "browserSignals"', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { perBuyerPrioritySignals: { "https://example.com" : { "browserSignals.foo" : true } }, }, }); makeTest({ name: 'component auctions are not allowed within component auctions', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { interestGroupBuyers: undefined, componentAuctions: [ { seller: window.location.origin, decisionLogicUrl: window.location.origin, interestGroupBuyers: undefined, componentAuctions: [ { seller: window.location.origin, decisionLogicUrl: window.location.origin, } ], }, ], }, }); makeTest({ name: 'component auctions are not allowed with interestGroupBuyers', expect: EXPECT_EXCEPTION(TypeError), auctionConfigOverrides: { interestGroupBuyers: ["https://example.com"], componentAuctions: [ { seller: window.location.origin, decisionLogicUrl: window.location.origin, interestGroupBuyers: [], }, ], }, });