summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fledge/tentative/resources/bidding-logic.sub.py
blob: 707e37f36bb1423dfb168a88320e3be620249109 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from pathlib import Path

# General bidding logic script. Depending on query parameters, it can
# simulate a variety of network errors, and its generateBid() and
# reportWin() functions can have arbitrary Javascript code injected
# in them. generateBid() will by default return a bid of 9 for the
# first ad.
def main(request, response):
    error = request.GET.first(b"error", None)

    if error == b"close-connection":
        # Close connection without writing anything, to simulate a network
        # error. The write call is needed to avoid writing the default headers.
        response.writer.write("")
        response.close_connection = True
        return

    if error == b"http-error":
        response.status = (404, b"OK")
    else:
        response.status = (200, b"OK")

    if error == b"wrong-content-type":
        response.headers.set(b"Content-Type", b"application/json")
    elif error != b"no-content-type":
        response.headers.set(b"Content-Type", b"application/javascript")

    if error == b"bad-allow-fledge":
        response.headers.set(b"Ad-Auction-Allowed", b"sometimes")
    elif error == b"fledge-not-allowed":
        response.headers.set(b"Ad-Auction-Allowed", b"false")
    elif error != b"no-allow-fledge":
        response.headers.set(b"Ad-Auction-Allowed", b"true")

    if error == b"no-body":
        return b''

    body = (Path(__file__).parent.resolve() / 'worklet-helpers.js').read_text().encode("ASCII")
    if error != b"no-generateBid":
        # Use bid query param if present. Otherwise, use a bid of 9.
        bid = (request.GET.first(b"bid", None) or b"9").decode("ASCII")

        bidCurrency = ""
        bidCurrencyParam = request.GET.first(b"bidCurrency", None)
        if bidCurrencyParam != None:
            bidCurrency = "bidCurrency: '" + bidCurrencyParam.decode("ASCII") + "',"

        allowComponentAuction = ""
        allowComponentAuctionParam = request.GET.first(b"allowComponentAuction", None)
        if allowComponentAuctionParam != None:
            allowComponentAuction = f"allowComponentAuction: {allowComponentAuctionParam.decode('ASCII')},"

        body += f"""
            function generateBid(interestGroup, auctionSignals, perBuyerSignals,
                                trustedBiddingSignals, browserSignals,
                                directFromSellerSignals) {{
              {{{{GET[generateBid]}}}};
              return {{
                bid: {bid},
                {bidCurrency}
                {allowComponentAuction}
                render: interestGroup.ads[0].renderURL
              }};
            }}""".encode()
    if error != b"no-reportWin":
        body += b"""
            function reportWin(auctionSignals, perBuyerSignals, sellerSignals,
                              browserSignals, directFromSellerSignals) {
              {{GET[reportWin]}};
            }"""
    return body