Signed Contextual Ads interface
Contextual Ads need to be signed to join auction by its buyer. See
go/rb-signatures-lld for more details.
Bug: 301520360
Test: atest SignedContextualAds
Change-Id: Ia940974100d75f86860105c32799c8108d710c1b
diff --git a/adservices/framework/java/android/adservices/adselection/AdSelectionConfig.java b/adservices/framework/java/android/adservices/adselection/AdSelectionConfig.java
index 3d6f1f1..7b0b1b5 100644
--- a/adservices/framework/java/android/adservices/adselection/AdSelectionConfig.java
+++ b/adservices/framework/java/android/adservices/adselection/AdSelectionConfig.java
@@ -52,7 +52,7 @@
@NonNull private final AdSelectionSignals mAdSelectionSignals;
@NonNull private final AdSelectionSignals mSellerSignals;
@NonNull private final Map<AdTechIdentifier, AdSelectionSignals> mPerBuyerSignals;
- @NonNull private final Map<AdTechIdentifier, ContextualAds> mBuyerContextualAds;
+ @NonNull private final Map<AdTechIdentifier, SignedContextualAds> mBuyerSignedContextualAds;
@NonNull private final Uri mTrustedScoringSignalsUri;
@NonNull
@@ -77,7 +77,7 @@
this.mAdSelectionSignals = AdSelectionSignals.EMPTY;
this.mSellerSignals = AdSelectionSignals.EMPTY;
this.mPerBuyerSignals = Collections.emptyMap();
- this.mBuyerContextualAds = Collections.emptyMap();
+ this.mBuyerSignedContextualAds = Collections.emptyMap();
this.mTrustedScoringSignalsUri = Uri.EMPTY;
}
@@ -88,7 +88,7 @@
@NonNull AdSelectionSignals adSelectionSignals,
@NonNull AdSelectionSignals sellerSignals,
@NonNull Map<AdTechIdentifier, AdSelectionSignals> perBuyerSignals,
- @NonNull Map<AdTechIdentifier, ContextualAds> perBuyerContextualAds,
+ @NonNull Map<AdTechIdentifier, SignedContextualAds> perBuyerSignedContextualAds,
@NonNull Uri trustedScoringSignalsUri) {
this.mSeller = seller;
this.mDecisionLogicUri = decisionLogicUri;
@@ -96,7 +96,7 @@
this.mAdSelectionSignals = adSelectionSignals;
this.mSellerSignals = sellerSignals;
this.mPerBuyerSignals = perBuyerSignals;
- this.mBuyerContextualAds = perBuyerContextualAds;
+ this.mBuyerSignedContextualAds = perBuyerSignedContextualAds;
this.mTrustedScoringSignalsUri = trustedScoringSignalsUri;
}
@@ -110,9 +110,9 @@
mPerBuyerSignals =
AdServicesParcelableUtil.readMapFromParcel(
in, AdTechIdentifier::fromString, AdSelectionSignals.class);
- mBuyerContextualAds =
+ mBuyerSignedContextualAds =
AdServicesParcelableUtil.readMapFromParcel(
- in, AdTechIdentifier::fromString, ContextualAds.class);
+ in, AdTechIdentifier::fromString, SignedContextualAds.class);
mTrustedScoringSignalsUri = Uri.CREATOR.createFromParcel(in);
}
@@ -131,7 +131,7 @@
mAdSelectionSignals.writeToParcel(dest, flags);
mSellerSignals.writeToParcel(dest, flags);
AdServicesParcelableUtil.writeMapToParcel(dest, mPerBuyerSignals);
- AdServicesParcelableUtil.writeMapToParcel(dest, mBuyerContextualAds);
+ AdServicesParcelableUtil.writeMapToParcel(dest, mBuyerSignedContextualAds);
mTrustedScoringSignalsUri.writeToParcel(dest, flags);
}
@@ -146,7 +146,7 @@
&& Objects.equals(mAdSelectionSignals, that.mAdSelectionSignals)
&& Objects.equals(mSellerSignals, that.mSellerSignals)
&& Objects.equals(mPerBuyerSignals, that.mPerBuyerSignals)
- && Objects.equals(mBuyerContextualAds, that.mBuyerContextualAds)
+ && Objects.equals(mBuyerSignedContextualAds, that.mBuyerSignedContextualAds)
&& Objects.equals(mTrustedScoringSignalsUri, that.mTrustedScoringSignalsUri);
}
@@ -159,7 +159,7 @@
mAdSelectionSignals,
mSellerSignals,
mPerBuyerSignals,
- mBuyerContextualAds,
+ mBuyerSignedContextualAds,
mTrustedScoringSignalsUri);
}
@@ -171,7 +171,7 @@
public AdSelectionConfig.Builder cloneToBuilder() {
return new AdSelectionConfig.Builder()
.setSeller(this.getSeller())
- .setBuyerContextualAds(this.getBuyerContextualAds())
+ .setBuyerSignedContextualAds(this.getBuyerSignedContextualAds())
.setAdSelectionSignals(this.getAdSelectionSignals())
.setCustomAudienceBuyers(this.getCustomAudienceBuyers())
.setDecisionLogicUri(this.getDecisionLogicUri())
@@ -242,8 +242,8 @@
* @hide
*/
@NonNull
- public Map<AdTechIdentifier, ContextualAds> getBuyerContextualAds() {
- return mBuyerContextualAds;
+ public Map<AdTechIdentifier, SignedContextualAds> getBuyerSignedContextualAds() {
+ return mBuyerSignedContextualAds;
}
/**
@@ -263,7 +263,8 @@
private AdSelectionSignals mAdSelectionSignals = AdSelectionSignals.EMPTY;
private AdSelectionSignals mSellerSignals = AdSelectionSignals.EMPTY;
private Map<AdTechIdentifier, AdSelectionSignals> mPerBuyerSignals = Collections.emptyMap();
- private Map<AdTechIdentifier, ContextualAds> mBuyerContextualAds = Collections.emptyMap();
+ private Map<AdTechIdentifier, SignedContextualAds> mBuyerSignedContextualAds =
+ Collections.emptyMap();
private Uri mTrustedScoringSignalsUri;
public Builder() {}
@@ -383,16 +384,16 @@
*
* <p>If not set, defaults to an empty map.
*
- * <p>See {@link #getBuyerContextualAds()} ()} for more details.
+ * <p>See {@link #getBuyerSignedContextualAds()} ()} for more details.
*
* @hide
*/
@NonNull
- public AdSelectionConfig.Builder setBuyerContextualAds(
- @NonNull Map<AdTechIdentifier, ContextualAds> buyerContextualAds) {
- Objects.requireNonNull(buyerContextualAds);
+ public AdSelectionConfig.Builder setBuyerSignedContextualAds(
+ @NonNull Map<AdTechIdentifier, SignedContextualAds> buyerSignedContextualAds) {
+ Objects.requireNonNull(buyerSignedContextualAds);
- this.mBuyerContextualAds = buyerContextualAds;
+ this.mBuyerSignedContextualAds = buyerSignedContextualAds;
return this;
}
@@ -427,7 +428,7 @@
Objects.requireNonNull(mAdSelectionSignals);
Objects.requireNonNull(mSellerSignals);
Objects.requireNonNull(mPerBuyerSignals);
- Objects.requireNonNull(mBuyerContextualAds);
+ Objects.requireNonNull(mBuyerSignedContextualAds);
Objects.requireNonNull(mTrustedScoringSignalsUri);
return new AdSelectionConfig(
mSeller,
@@ -436,7 +437,7 @@
mAdSelectionSignals,
mSellerSignals,
mPerBuyerSignals,
- mBuyerContextualAds,
+ mBuyerSignedContextualAds,
mTrustedScoringSignalsUri);
}
}
diff --git a/adservices/framework/java/android/adservices/adselection/ContextualAds.java b/adservices/framework/java/android/adservices/adselection/ContextualAds.java
deleted file mode 100644
index c34056d..0000000
--- a/adservices/framework/java/android/adservices/adselection/ContextualAds.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.adservices.adselection;
-
-import android.adservices.common.AdTechIdentifier;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Contains Ads supplied by Seller for the Contextual Path
- *
- * <p>Instances of this class are created by SDKs to be injected as part of {@link
- * AdSelectionConfig} and passed to {@link AdSelectionManager#selectAds}
- *
- * @hide
- */
-public final class ContextualAds implements Parcelable {
- @NonNull private final AdTechIdentifier mBuyer;
- @NonNull private final Uri mDecisionLogicUri;
- @NonNull private final List<AdWithBid> mAdsWithBid;
-
- @NonNull
- public static final Creator<ContextualAds> CREATOR =
- new Creator<ContextualAds>() {
- @Override
- public ContextualAds createFromParcel(@NonNull Parcel in) {
- Objects.requireNonNull(in);
- return new ContextualAds(in);
- }
-
- @Override
- public ContextualAds[] newArray(int size) {
- return new ContextualAds[0];
- }
- };
-
- private ContextualAds(
- @NonNull AdTechIdentifier buyer,
- @NonNull Uri decisionLogicUri,
- @NonNull List<AdWithBid> adsWithBid) {
- this.mBuyer = buyer;
- this.mDecisionLogicUri = decisionLogicUri;
- this.mAdsWithBid = adsWithBid;
- }
-
- private ContextualAds(@NonNull Parcel in) {
- Objects.requireNonNull(in);
- mBuyer = AdTechIdentifier.CREATOR.createFromParcel(in);
- mDecisionLogicUri = Uri.CREATOR.createFromParcel(in);
- mAdsWithBid = in.createTypedArrayList(AdWithBid.CREATOR);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel dest, int flags) {
- Objects.requireNonNull(dest);
-
- mBuyer.writeToParcel(dest, flags);
- mDecisionLogicUri.writeToParcel(dest, flags);
- dest.writeTypedList(mAdsWithBid);
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof ContextualAds)) return false;
- ContextualAds that = (ContextualAds) o;
- return Objects.equals(mBuyer, that.mBuyer)
- && Objects.equals(mDecisionLogicUri, that.mDecisionLogicUri)
- && Objects.equals(mAdsWithBid, that.mAdsWithBid);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mBuyer, mDecisionLogicUri, mAdsWithBid);
- }
-
- /** @return the Ad tech identifier from which this contextual Ad would have been downloaded */
- @NonNull
- public AdTechIdentifier getBuyer() {
- return mBuyer;
- }
-
- /**
- * @return the URI used for to retrieve the updateBid() and reportWin() function used during the
- * ad selection and reporting process
- */
- @NonNull
- public Uri getDecisionLogicUri() {
- return mDecisionLogicUri;
- }
-
- /** @return the Ad data with bid value associated with this ad */
- @NonNull
- public List<AdWithBid> getAdsWithBid() {
- return mAdsWithBid;
- }
-
- /** Builder for {@link ContextualAds} object */
- public static final class Builder {
- @Nullable private AdTechIdentifier mBuyer;
- @Nullable private Uri mDecisionLogicUri;
- @Nullable private List<AdWithBid> mAdsWithBid;
-
- public Builder() {}
-
- /**
- * Sets the buyer Ad tech Identifier
- *
- * <p>See {@link #getBuyer()} for more details
- */
- @NonNull
- public ContextualAds.Builder setBuyer(@NonNull AdTechIdentifier buyer) {
- Objects.requireNonNull(buyer);
-
- this.mBuyer = buyer;
- return this;
- }
-
- /**
- * Sets the URI to fetch the decision logic used in ad selection and reporting
- *
- * <p>See {@link #getDecisionLogicUri()} for more details
- */
- @NonNull
- public ContextualAds.Builder setDecisionLogicUri(@NonNull Uri decisionLogicUri) {
- Objects.requireNonNull(decisionLogicUri);
-
- this.mDecisionLogicUri = decisionLogicUri;
- return this;
- }
-
- /**
- * Sets the Ads with pre-defined bid values
- *
- * <p>See {@link #getAdsWithBid()} for more details
- */
- @NonNull
- public ContextualAds.Builder setAdsWithBid(@NonNull List<AdWithBid> adsWithBid) {
- Objects.requireNonNull(adsWithBid);
-
- this.mAdsWithBid = adsWithBid;
- return this;
- }
-
- /**
- * Builds a {@link ContextualAds} instance.
- *
- * @throws NullPointerException if any required params are null
- */
- @NonNull
- public ContextualAds build() {
- Objects.requireNonNull(mBuyer);
- Objects.requireNonNull(mDecisionLogicUri);
- Objects.requireNonNull(mAdsWithBid);
- return new ContextualAds(mBuyer, mDecisionLogicUri, mAdsWithBid);
- }
- }
-}
diff --git a/adservices/framework/java/android/adservices/adselection/ContextualAds.aidl b/adservices/framework/java/android/adservices/adselection/SignedContextualAds.aidl
similarity index 84%
rename from adservices/framework/java/android/adservices/adselection/ContextualAds.aidl
rename to adservices/framework/java/android/adservices/adselection/SignedContextualAds.aidl
index d96b1f1..0d61311 100644
--- a/adservices/framework/java/android/adservices/adselection/ContextualAds.aidl
+++ b/adservices/framework/java/android/adservices/adselection/SignedContextualAds.aidl
@@ -17,9 +17,7 @@
package android.adservices.adselection;
/**
- * This defines the ContextualAds class, ads that are used for the contextual auction path in
+ * This defines the SignedContextualAds class, ads that are used for the contextual auction path in
* ad selection and reporting
- *
- * @hide
*/
-parcelable ContextualAds;
+parcelable SignedContextualAds;
diff --git a/adservices/framework/java/android/adservices/adselection/SignedContextualAds.java b/adservices/framework/java/android/adservices/adselection/SignedContextualAds.java
new file mode 100644
index 0000000..0505520
--- /dev/null
+++ b/adservices/framework/java/android/adservices/adselection/SignedContextualAds.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.adservices.adselection;
+
+import android.adservices.common.AdTechIdentifier;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Contains a buyer supplied {@link ContextualAds} bundle and its signature.
+ *
+ * <p>Instances of this class are created by SDKs to be injected as part of {@link
+ * AdSelectionConfig} and passed to {@link AdSelectionManager#selectAds}
+ *
+ * <p>SignedContextualAds are signed using ECDSA algorithm with SHA256 hashing algorithm (aka
+ * SHA256withECDSA). Keys used should belong to P-256 curve (aka “secp256r1” or “prime256v1”).
+ *
+ * <p>Signature should include the buyer, decisionLogicUri and adsWithBid fields.
+ *
+ * <p>While creating the signature a specific serialization rules must be followed as it's outlined
+ * here:
+ *
+ * <ul>
+ * <li>{@code Objects} concatenate the serialized values of their fields with the {@code |} (pipe)
+ * in between each field
+ * <li>{@code All fields} are sorted by alphabetical order within the object
+ * <li>{@code Nullable fields} are serialized as ”null” if they are null
+ * <li>{@code Doubles} are converted to String preserving precision
+ * <li>{@code Integers} are converted to string values
+ * <li>{@code Sets} are sorted alphabetically
+ * <li>{@code Lists} keep the same order
+ * <li>{@code Strings} get encoded into byte[] using UTF-8 encoding
+ * </ul>
+ *
+ * @hide
+ */
+public final class SignedContextualAds implements Parcelable {
+ private static final String BUYER_CANNOT_BE_NULL = "Buyer cannot be null.";
+ private static final String DECISION_LOGIC_URI_CANNOT_BE_NULL =
+ "DecisionLogicUri cannot be null.";
+ private static final String ADS_WITH_BID_CANNOT_BE_NULL = "AdsWithBid cannot be null.";
+ private static final String SIGNATURE_CANNOT_BE_NULL = "Signature cannot be null.";
+ @NonNull private final AdTechIdentifier mBuyer;
+ @NonNull private final Uri mDecisionLogicUri;
+ @NonNull private final List<AdWithBid> mAdsWithBid;
+ @NonNull private final byte[] mSignature;
+
+ @NonNull
+ public static final Creator<SignedContextualAds> CREATOR =
+ new Creator<>() {
+ @Override
+ public SignedContextualAds createFromParcel(@NonNull Parcel in) {
+ Objects.requireNonNull(in);
+ return new SignedContextualAds(in);
+ }
+
+ @Override
+ public SignedContextualAds[] newArray(int size) {
+ return new SignedContextualAds[0];
+ }
+ };
+
+ private SignedContextualAds(
+ @NonNull AdTechIdentifier buyer,
+ @NonNull Uri decisionLogicUri,
+ @NonNull List<AdWithBid> adsWithBid,
+ @NonNull byte[] signature) {
+ this.mBuyer = buyer;
+ this.mDecisionLogicUri = decisionLogicUri;
+ this.mAdsWithBid = adsWithBid;
+ this.mSignature = signature;
+ }
+
+ private SignedContextualAds(@NonNull Parcel in) {
+ Objects.requireNonNull(in);
+ mBuyer = AdTechIdentifier.CREATOR.createFromParcel(in);
+ mDecisionLogicUri = Uri.CREATOR.createFromParcel(in);
+ mAdsWithBid = in.createTypedArrayList(AdWithBid.CREATOR);
+ mSignature = in.createByteArray();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ Objects.requireNonNull(dest);
+
+ mBuyer.writeToParcel(dest, flags);
+ mDecisionLogicUri.writeToParcel(dest, flags);
+ dest.writeTypedList(mAdsWithBid);
+ dest.writeByteArray(mSignature);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SignedContextualAds)) return false;
+ SignedContextualAds that = (SignedContextualAds) o;
+ return Objects.equals(mBuyer, that.mBuyer)
+ && Objects.equals(mDecisionLogicUri, that.mDecisionLogicUri)
+ && Objects.equals(mAdsWithBid, that.mAdsWithBid)
+ && Arrays.equals(mSignature, that.mSignature);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mBuyer, mDecisionLogicUri, mAdsWithBid, Arrays.hashCode(mSignature));
+ }
+
+ /**
+ * @return a new builder from this SignedContextualAds instance
+ * @hide
+ */
+ @NonNull
+ public SignedContextualAds.Builder cloneToBuilder() {
+ return new SignedContextualAds.Builder()
+ .setBuyer(mBuyer)
+ .setDecisionLogicUri(mDecisionLogicUri)
+ .setAdsWithBid(mAdsWithBid)
+ .setSignature(mSignature);
+ }
+
+ /**
+ * @return the Ad tech identifier from which this contextual Ad would have been downloaded
+ */
+ @NonNull
+ public AdTechIdentifier getBuyer() {
+ return mBuyer;
+ }
+
+ /**
+ * @return the URI used to retrieve the updateBid() and reportWin() function used during the ad
+ * selection and reporting process
+ */
+ @NonNull
+ public Uri getDecisionLogicUri() {
+ return mDecisionLogicUri;
+ }
+
+ /**
+ * @return the Ad data with bid value associated with this ad
+ */
+ @NonNull
+ public List<AdWithBid> getAdsWithBid() {
+ return mAdsWithBid;
+ }
+
+ /**
+ * Returns a copy of the signature for the contextual ads object.
+ *
+ * <p>See {@link SignedContextualAds} for more details.
+ *
+ * @return the signature
+ */
+ public byte[] getSignature() {
+ return Arrays.copyOf(mSignature, mSignature.length);
+ }
+
+ @Override
+ public String toString() {
+ return "SignedContextualAds{"
+ + "mBuyer="
+ + mBuyer
+ + ", mDecisionLogicUri="
+ + mDecisionLogicUri
+ + ", mAdsWithBid="
+ + mAdsWithBid
+ + ", mSignature="
+ + Arrays.toString(mSignature)
+ + '}';
+ }
+
+ /** Builder for {@link SignedContextualAds} object */
+ public static final class Builder {
+ @Nullable private AdTechIdentifier mBuyer;
+ @Nullable private Uri mDecisionLogicUri;
+ @Nullable private List<AdWithBid> mAdsWithBid;
+ @Nullable private byte[] mSignature;
+
+ public Builder() {}
+
+ /**
+ * Sets the buyer Ad tech Identifier
+ *
+ * <p>See {@link #getBuyer()} for more details
+ */
+ @NonNull
+ public SignedContextualAds.Builder setBuyer(@NonNull AdTechIdentifier buyer) {
+ Objects.requireNonNull(buyer, BUYER_CANNOT_BE_NULL);
+
+ this.mBuyer = buyer;
+ return this;
+ }
+
+ /**
+ * Sets the URI to fetch the decision logic used in ad selection and reporting
+ *
+ * <p>See {@link #getDecisionLogicUri()} for more details
+ */
+ @NonNull
+ public SignedContextualAds.Builder setDecisionLogicUri(@NonNull Uri decisionLogicUri) {
+ Objects.requireNonNull(decisionLogicUri, DECISION_LOGIC_URI_CANNOT_BE_NULL);
+
+ this.mDecisionLogicUri = decisionLogicUri;
+ return this;
+ }
+
+ /**
+ * Sets the Ads with pre-defined bid values
+ *
+ * <p>See {@link #getAdsWithBid()} for more details
+ */
+ @NonNull
+ public SignedContextualAds.Builder setAdsWithBid(@NonNull List<AdWithBid> adsWithBid) {
+ Objects.requireNonNull(adsWithBid, ADS_WITH_BID_CANNOT_BE_NULL);
+
+ this.mAdsWithBid = adsWithBid;
+ return this;
+ }
+
+ /** Sets the copied signature */
+ @NonNull
+ public SignedContextualAds.Builder setSignature(@NonNull byte[] signature) {
+ Objects.requireNonNull(signature, SIGNATURE_CANNOT_BE_NULL);
+
+ this.mSignature = Arrays.copyOf(signature, signature.length);
+ return this;
+ }
+
+ /**
+ * Builds a {@link SignedContextualAds} instance.
+ *
+ * @throws NullPointerException if any required params are null
+ */
+ @NonNull
+ public SignedContextualAds build() {
+ Objects.requireNonNull(mBuyer, BUYER_CANNOT_BE_NULL);
+ Objects.requireNonNull(mDecisionLogicUri, DECISION_LOGIC_URI_CANNOT_BE_NULL);
+ Objects.requireNonNull(mAdsWithBid, ADS_WITH_BID_CANNOT_BE_NULL);
+ Objects.requireNonNull(mSignature, SIGNATURE_CANNOT_BE_NULL);
+
+ return new SignedContextualAds(mBuyer, mDecisionLogicUri, mAdsWithBid, mSignature);
+ }
+ }
+}
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdFilterer.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdFilterer.java
index 06dfe81..8ea8367 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdFilterer.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdFilterer.java
@@ -16,7 +16,7 @@
package com.android.adservices.service.adselection;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
import com.android.adservices.data.customaudience.DBCustomAudience;
@@ -37,11 +37,11 @@
*/
List<DBCustomAudience> filterCustomAudiences(List<DBCustomAudience> cas);
/**
- * Takes in a {@link ContextualAds} object and filters out ads from it that should not be in the
- * auction
+ * Takes in a {@link SignedContextualAds} object and filters out ads from it that should not be
+ * in the auction
*
* @param contextualAds An object containing contextual ads corresponding to a buyer
* @return A list of object identical to the input, but without any ads that should be filtered
*/
- ContextualAds filterContextualAds(ContextualAds contextualAds);
+ SignedContextualAds filterContextualAds(SignedContextualAds contextualAds);
}
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererImpl.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererImpl.java
index c262df1..199b313 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererImpl.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererImpl.java
@@ -17,7 +17,7 @@
package com.android.adservices.service.adselection;
import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
import android.adservices.common.AdTechIdentifier;
import android.adservices.common.FrequencyCapFilters;
import android.adservices.common.KeyedFrequencyCap;
@@ -101,14 +101,14 @@
}
/**
- * Takes in a {@link ContextualAds} object and filters out ads from it that should not be in the
- * auction
+ * Takes in a {@link SignedContextualAds} object and filters out ads from it that should not be
+ * in the auction
*
* @param contextualAds An object containing contextual ads corresponding to a buyer
* @return A list of object identical to the input, but without any ads that should be filtered
*/
@Override
- public ContextualAds filterContextualAds(ContextualAds contextualAds) {
+ public SignedContextualAds filterContextualAds(SignedContextualAds contextualAds) {
final int traceCookie = Tracing.beginAsyncSection(Tracing.FILTER_CONTEXTUAL);
try {
List<AdWithBid> adsList = new ArrayList<>();
@@ -126,14 +126,8 @@
sLogger.v(
"Filtering finished. %d contextual ads of the original %d remain.",
adsList.size(), contextualAds.getAdsWithBid().size());
- ContextualAds toReturn =
- new ContextualAds.Builder()
- .setAdsWithBid(adsList)
- .setDecisionLogicUri(contextualAds.getDecisionLogicUri())
- .setBuyer(contextualAds.getBuyer())
- .build();
- return toReturn;
+ return contextualAds.cloneToBuilder().setAdsWithBid(adsList).build();
} finally {
Tracing.endAsyncSection(Tracing.FILTER_CONTEXTUAL, traceCookie);
}
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererNoOpImpl.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererNoOpImpl.java
index ff58729..08f0043 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererNoOpImpl.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdFiltererNoOpImpl.java
@@ -16,7 +16,7 @@
package com.android.adservices.service.adselection;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
import com.android.adservices.LoggerFactory;
import com.android.adservices.data.customaudience.DBCustomAudience;
@@ -47,7 +47,7 @@
* @return contextual ads
*/
@Override
- public ContextualAds filterContextualAds(ContextualAds contextualAds) {
+ public SignedContextualAds filterContextualAds(SignedContextualAds contextualAds) {
logSkip();
return contextualAds;
}
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionConfigValidator.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionConfigValidator.java
index ce0d279..fc0f163 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionConfigValidator.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionConfigValidator.java
@@ -18,7 +18,7 @@
import android.adservices.adselection.AdSelectionConfig;
import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
import android.adservices.common.AdTechIdentifier;
import android.annotation.NonNull;
import android.net.Uri;
@@ -110,20 +110,22 @@
adSelectionConfig.getTrustedScoringSignalsUri(), violations);
}
- violations.addAll(validateContextualAds(adSelectionConfig.getBuyerContextualAds()));
+ violations.addAll(
+ validateSignedContextualAds(adSelectionConfig.getBuyerSignedContextualAds()));
}
- private ImmutableList<String> validateContextualAds(
- Map<AdTechIdentifier, ContextualAds> contextualAdsMap) {
+ private ImmutableList<String> validateSignedContextualAds(
+ Map<AdTechIdentifier, SignedContextualAds> signedContextualAdsMap) {
ImmutableList.Builder<String> violations = new ImmutableList.Builder<>();
- for (Map.Entry<AdTechIdentifier, ContextualAds> entry : contextualAdsMap.entrySet()) {
+ for (Map.Entry<AdTechIdentifier, SignedContextualAds> entry :
+ signedContextualAdsMap.entrySet()) {
// Validate that the buyer decision logic for Contextual Ads satisfies buyer eTLD+1
AdTechUriValidator buyerUriValidator =
new AdTechUriValidator(
ValidatorUtil.AD_TECH_ROLE_BUYER,
entry.getValue().getBuyer().toString(),
- ContextualAds.class.getName(),
+ SignedContextualAds.class.getName(),
CONTEXTUAL_ADS_DECISION_LOGIC_FIELD_NAME);
buyerUriValidator.addValidation(entry.getValue().getDecisionLogicUri(), violations);
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionRunner.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionRunner.java
index 0e99d26..c337bf1 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionRunner.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdSelectionRunner.java
@@ -23,7 +23,7 @@
import android.adservices.adselection.AdSelectionConfig;
import android.adservices.adselection.AdSelectionInput;
import android.adservices.adselection.AdSelectionResponse;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
import android.adservices.common.AdServicesStatusUtils;
import android.adservices.common.AdTechIdentifier;
import android.adservices.common.FledgeErrorResponse;
@@ -564,7 +564,7 @@
() -> {
boolean atLeastOnePresent =
!(adSelectionConfig.getCustomAudienceBuyers().isEmpty()
- && adSelectionConfig.getBuyerContextualAds().isEmpty());
+ && adSelectionConfig.getBuyerSignedContextualAds().isEmpty());
Preconditions.checkArgument(
atLeastOnePresent, ERROR_NO_BUYERS_OR_CONTEXTUAL_ADS_AVAILABLE);
@@ -577,7 +577,7 @@
mClock.instant(),
mFlags.getFledgeCustomAudienceActiveTimeWindowInMs());
if ((buyerCustomAudience == null || buyerCustomAudience.isEmpty())
- && adSelectionConfig.getBuyerContextualAds().isEmpty()) {
+ && adSelectionConfig.getBuyerSignedContextualAds().isEmpty()) {
IllegalStateException exception =
new IllegalStateException(ERROR_NO_CA_AND_CONTEXTUAL_ADS_AVAILABLE);
mAdSelectionExecutionLogger.endBiddingProcess(
@@ -726,16 +726,16 @@
private AdSelectionConfig getAdSelectionConfigFilterContextualAds(
AdSelectionConfig adSelectionConfig) {
- Map<AdTechIdentifier, ContextualAds> filteredContextualAdsMap = new HashMap<>();
+ Map<AdTechIdentifier, SignedContextualAds> filteredContextualAdsMap = new HashMap<>();
sLogger.v("Filtering contextual ads in Ad Selection Config");
- for (Map.Entry<AdTechIdentifier, ContextualAds> entry :
- adSelectionConfig.getBuyerContextualAds().entrySet()) {
+ for (Map.Entry<AdTechIdentifier, SignedContextualAds> entry :
+ adSelectionConfig.getBuyerSignedContextualAds().entrySet()) {
filteredContextualAdsMap.put(
entry.getKey(), mAdFilterer.filterContextualAds(entry.getValue()));
}
return adSelectionConfig
.cloneToBuilder()
- .setBuyerContextualAds(filteredContextualAdsMap)
+ .setBuyerSignedContextualAds(filteredContextualAdsMap)
.build();
}
@@ -744,7 +744,7 @@
sLogger.v("Emptying contextual ads in Ad Selection Config");
return adSelectionConfig
.cloneToBuilder()
- .setBuyerContextualAds(Collections.EMPTY_MAP)
+ .setBuyerSignedContextualAds(Collections.EMPTY_MAP)
.build();
}
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/AdsScoreGeneratorImpl.java b/adservices/service-core/java/com/android/adservices/service/adselection/AdsScoreGeneratorImpl.java
index 48008ba..6759b38 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/AdsScoreGeneratorImpl.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/AdsScoreGeneratorImpl.java
@@ -24,7 +24,7 @@
import android.adservices.adselection.AdSelectionConfig;
import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
+import android.adservices.adselection.SignedContextualAds;
import android.adservices.common.AdSelectionSignals;
import android.adservices.common.AdTechIdentifier;
import android.adservices.exceptions.AdServicesException;
@@ -159,8 +159,8 @@
mAdSelectionExecutionLogger.startRunAdScoring(adBiddingOutcomes);
int traceCookie = Tracing.beginAsyncSection(Tracing.RUN_AD_SCORING);
- final List<ContextualAds> contextualAds =
- new ArrayList<>(adSelectionConfig.getBuyerContextualAds().values());
+ final List<SignedContextualAds> contextualAds =
+ new ArrayList<>(adSelectionConfig.getBuyerSignedContextualAds().values());
AdServicesHttpClientRequest scoringLogicUriHttpRequest =
AdServicesHttpClientRequest.builder()
@@ -262,7 +262,7 @@
private ListenableFuture<Pair<List<ScoreAdResult>, SellerContextualSignals>> getAdScores(
@NonNull String scoringLogic,
@NonNull List<AdBiddingOutcome> adBiddingOutcomes,
- @NonNull List<ContextualAds> contextualAds,
+ @NonNull List<SignedContextualAds> contextualAds,
@NonNull final AdSelectionConfig adSelectionConfig) {
mAdSelectionExecutionLogger.startGetAdScores();
final AdSelectionSignals sellerSignals = adSelectionConfig.getSellerSignals();
@@ -276,7 +276,7 @@
sLogger.v("Total Remarketing AdsWithBid count: %d", adsWithBid.size());
List<AdWithBid> contextualBidAds = new ArrayList<>();
- for (ContextualAds ctx : contextualAds) {
+ for (SignedContextualAds ctx : contextualAds) {
contextualBidAds.addAll(ctx.getAdsWithBid());
}
sLogger.v("Total Contextual Ads count: %d", contextualBidAds.size());
@@ -459,7 +459,7 @@
*/
private List<AdScoringOutcome> mapAdsToScore(
List<AdBiddingOutcome> adBiddingOutcomes,
- List<ContextualAds> contextualAds,
+ List<SignedContextualAds> contextualAds,
List<ScoreAdResult> adScores,
AdSelectionConfig adSelectionConfig,
SellerContextualSignals sellerContextualSignals) {
@@ -501,7 +501,7 @@
}
int i = contextualAdsIdx;
- for (ContextualAds ctx : contextualAds) {
+ for (SignedContextualAds ctx : contextualAds) {
for (AdWithBid adWithBid : ctx.getAdsWithBid()) {
if (i >= adScores.size()) {
throw new IllegalStateException(SCORES_COUNT_LESS_THAN_EXPECTED);
diff --git a/adservices/service-core/java/com/android/adservices/service/adselection/OnDeviceAdSelectionRunner.java b/adservices/service-core/java/com/android/adservices/service/adselection/OnDeviceAdSelectionRunner.java
index dd4f530..4c5b280 100644
--- a/adservices/service-core/java/com/android/adservices/service/adselection/OnDeviceAdSelectionRunner.java
+++ b/adservices/service-core/java/com/android/adservices/service/adselection/OnDeviceAdSelectionRunner.java
@@ -347,7 +347,8 @@
adBiddingOutcomes.stream().filter(Objects::nonNull).collect(Collectors.toList());
sLogger.v("Got %d valid bidding outcomes", validBiddingOutcomes.size());
- if (validBiddingOutcomes.isEmpty() && adSelectionConfig.getBuyerContextualAds().isEmpty()) {
+ if (validBiddingOutcomes.isEmpty()
+ && adSelectionConfig.getBuyerSignedContextualAds().isEmpty()) {
sLogger.w("Received empty list of successful bidding outcomes and contextual ads");
throw new IllegalStateException(ERROR_NO_VALID_BIDS_OR_CONTEXTUAL_ADS_FOR_SCORING);
}
diff --git a/adservices/tests/unittest/fixtures/java/android/adservices/adselection/AdSelectionConfigFixture.java b/adservices/tests/unittest/fixtures/java/android/adservices/adselection/AdSelectionConfigFixture.java
index 948c8a7..0f1b385 100644
--- a/adservices/tests/unittest/fixtures/java/android/adservices/adselection/AdSelectionConfigFixture.java
+++ b/adservices/tests/unittest/fixtures/java/android/adservices/adselection/AdSelectionConfigFixture.java
@@ -29,7 +29,6 @@
/** This is a static class meant to help with tests that involve creating an AdSelectionConfig. */
public class AdSelectionConfigFixture {
-
public static final AdTechIdentifier SELLER = AdTechIdentifier.fromString("test.com");
public static final AdTechIdentifier SELLER_1 = AdTechIdentifier.fromString("test2.com");
@@ -128,6 +127,6 @@
*/
public static AdSelectionConfig.Builder anAdSelectionConfigWithContextualAdsBuilder() {
return anAdSelectionConfigBuilder()
- .setBuyerContextualAds(ContextualAdsFixture.getBuyerContextualAdsMap());
+ .setBuyerSignedContextualAds(SignedContextualAdsFixture.getBuyerContextualAdsMap());
}
}
diff --git a/adservices/tests/unittest/fixtures/java/android/adservices/adselection/ContextualAdsFixture.java b/adservices/tests/unittest/fixtures/java/android/adservices/adselection/SignedContextualAdsFixture.java
similarity index 71%
rename from adservices/tests/unittest/fixtures/java/android/adservices/adselection/ContextualAdsFixture.java
rename to adservices/tests/unittest/fixtures/java/android/adservices/adselection/SignedContextualAdsFixture.java
index 00b16c5..d1a9a4f 100644
--- a/adservices/tests/unittest/fixtures/java/android/adservices/adselection/ContextualAdsFixture.java
+++ b/adservices/tests/unittest/fixtures/java/android/adservices/adselection/SignedContextualAdsFixture.java
@@ -29,10 +29,11 @@
import java.util.stream.Collectors;
/**
- * This is a static class meant to help with tests that involve creating an {@link ContextualAds}.
+ * This is a static class meant to help with tests that involve creating an {@link
+ * SignedContextualAds}.
*/
-public class ContextualAdsFixture {
-
+public class SignedContextualAdsFixture {
+ public static final byte[] PLACEHOLDER_SIGNATURE = new byte[] {0, 0};
public static final AdTechIdentifier BUYER = CommonFixture.VALID_BUYER_1;
public static final AdTechIdentifier BUYER_2 = CommonFixture.VALID_BUYER_2;
@@ -50,16 +51,17 @@
public static final List<AdWithBid> ADS_WITH_BID =
ImmutableList.of(AD_WITH_BID_1, AD_WITH_BID_2);
- public static ContextualAds.Builder aContextualAdBuilder() {
- return new ContextualAds.Builder()
+ public static SignedContextualAds.Builder aSignedContextualAdBuilder() {
+ return new SignedContextualAds.Builder()
.setBuyer(BUYER)
.setDecisionLogicUri(DECISION_LOGIC_URI)
- .setAdsWithBid(ADS_WITH_BID);
+ .setAdsWithBid(ADS_WITH_BID)
+ .setSignature(PLACEHOLDER_SIGNATURE);
}
- public static ContextualAds.Builder generateContextualAds(
+ public static SignedContextualAds.Builder generateSignedContextualAds(
AdTechIdentifier buyer, List<Double> bids) {
- return new ContextualAds.Builder()
+ return new SignedContextualAds.Builder()
.setBuyer(buyer)
.setDecisionLogicUri(CommonFixture.getUri(buyer, DECISION_LOGIC_FRAGMENT))
.setAdsWithBid(
@@ -70,22 +72,23 @@
AdDataFixture.getValidFilterAdDataByBuyer(
buyer, bid.intValue()),
bid))
- .collect(Collectors.toList()));
+ .collect(Collectors.toList()))
+ .setSignature(PLACEHOLDER_SIGNATURE);
}
- public static ContextualAds aContextualAd() {
- return aContextualAdBuilder().build();
+ public static SignedContextualAds aSignedContextualAd() {
+ return aSignedContextualAdBuilder().build();
}
- public static ContextualAds aContextualAd(AdTechIdentifier buyer) {
- return aContextualAdBuilder().setBuyer(buyer).build();
+ public static SignedContextualAds aSignedContextualAd(AdTechIdentifier buyer) {
+ return aSignedContextualAdBuilder().setBuyer(buyer).build();
}
- public static ImmutableMap<AdTechIdentifier, ContextualAds> getBuyerContextualAdsMap() {
+ public static ImmutableMap<AdTechIdentifier, SignedContextualAds> getBuyerContextualAdsMap() {
return ImmutableMap.of(
CommonFixture.VALID_BUYER_1,
- aContextualAd(CommonFixture.VALID_BUYER_1),
+ aSignedContextualAd(CommonFixture.VALID_BUYER_1),
CommonFixture.VALID_BUYER_2,
- aContextualAd(CommonFixture.VALID_BUYER_2));
+ aSignedContextualAd(CommonFixture.VALID_BUYER_2));
}
}
diff --git a/adservices/tests/unittest/framework/src/android/adservices/adselection/ContextualAdsTest.java b/adservices/tests/unittest/framework/src/android/adservices/adselection/ContextualAdsTest.java
deleted file mode 100644
index 403d9a9..0000000
--- a/adservices/tests/unittest/framework/src/android/adservices/adselection/ContextualAdsTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.adservices.adselection;
-
-import static org.junit.Assert.assertThrows;
-
-import android.adservices.common.CommonFixture;
-import android.os.Parcel;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ContextualAdsTest {
-
- @Test
- public void testBuildContextualAdsSuccess() {
- ContextualAds contextualAds =
- new ContextualAds.Builder()
- .setBuyer(ContextualAdsFixture.BUYER)
- .setDecisionLogicUri(ContextualAdsFixture.DECISION_LOGIC_URI)
- .setAdsWithBid(ContextualAdsFixture.ADS_WITH_BID)
- .build();
-
- Assert.assertEquals(contextualAds.getBuyer(), ContextualAdsFixture.BUYER);
- Assert.assertEquals(
- contextualAds.getDecisionLogicUri(), ContextualAdsFixture.DECISION_LOGIC_URI);
- Assert.assertEquals(contextualAds.getAdsWithBid(), ContextualAdsFixture.ADS_WITH_BID);
- }
-
- @Test
- public void testParcelValidContextualAdsSuccess() {
- ContextualAds contextualAds = ContextualAdsFixture.aContextualAd();
-
- Parcel p = Parcel.obtain();
- contextualAds.writeToParcel(p, 0);
- p.setDataPosition(0);
- ContextualAds fromParcel = ContextualAds.CREATOR.createFromParcel(p);
-
- Assert.assertEquals(contextualAds.getBuyer(), fromParcel.getBuyer());
- Assert.assertEquals(contextualAds.getDecisionLogicUri(), fromParcel.getDecisionLogicUri());
- Assert.assertEquals(contextualAds.getAdsWithBid(), fromParcel.getAdsWithBid());
- }
-
- @Test
- public void testSetContextualAdsNullBuyerFailure() {
- assertThrows(
- NullPointerException.class,
- () -> {
- new ContextualAds.Builder().setBuyer(null);
- });
- }
-
- @Test
- public void testSetContextualAdsNullDecisionLogicUriFailure() {
- assertThrows(
- NullPointerException.class,
- () -> {
- new ContextualAds.Builder().setDecisionLogicUri(null);
- });
- }
-
- @Test
- public void testSetContextualAdsNullAdWithBidFailure() {
- assertThrows(
- NullPointerException.class,
- () -> {
- new ContextualAds.Builder().setAdsWithBid(null);
- });
- }
-
- @Test
- public void testParcelNullDestFailure() {
- ContextualAds contextualAds = ContextualAdsFixture.aContextualAd();
- Parcel nullDest = null;
- assertThrows(
- NullPointerException.class,
- () -> {
- contextualAds.writeToParcel(nullDest, 0);
- });
- }
-
- @Test
- public void testBuildContextualAdsUnsetBuyerFailure() {
- assertThrows(
- NullPointerException.class,
- () -> {
- new ContextualAds.Builder()
- .setDecisionLogicUri(ContextualAdsFixture.DECISION_LOGIC_URI)
- .setAdsWithBid(ContextualAdsFixture.ADS_WITH_BID)
- .build();
- });
- }
-
- @Test
- public void testBuildContextualAdsUnsetDecisionLogicUriFailure() {
- assertThrows(
- NullPointerException.class,
- () -> {
- new ContextualAds.Builder()
- .setBuyer(ContextualAdsFixture.BUYER)
- .setAdsWithBid(ContextualAdsFixture.ADS_WITH_BID)
- .build();
- });
- }
-
- @Test
- public void testBuildContextualAdsUnsetAdWithBidFailure() {
- assertThrows(
- NullPointerException.class,
- () -> {
- new ContextualAds.Builder()
- .setBuyer(ContextualAdsFixture.BUYER)
- .setDecisionLogicUri(ContextualAdsFixture.DECISION_LOGIC_URI)
- .build();
- });
- }
-
- @Test
- public void testContextualAdsDescribeContents() {
- ContextualAds obj = ContextualAdsFixture.aContextualAd();
-
- Assert.assertEquals(obj.describeContents(), 0);
- }
-
- @Test
- public void testContextualAdsHaveSameHashCode() {
- ContextualAds obj1 = ContextualAdsFixture.aContextualAd();
- ContextualAds obj2 = ContextualAdsFixture.aContextualAd();
-
- CommonFixture.assertHaveSameHashCode(obj1, obj2);
- }
-
- @Test
- public void testContextualAdsHaveDifferentHashCode() {
- ContextualAds obj1 = ContextualAdsFixture.aContextualAd();
- ContextualAds obj2 =
- ContextualAdsFixture.aContextualAdBuilder()
- .setBuyer(ContextualAdsFixture.BUYER_2)
- .build();
-
- CommonFixture.assertDifferentHashCode(obj1, obj2);
- }
-}
diff --git a/adservices/tests/unittest/framework/src/android/adservices/adselection/SignedContextualAdsTest.java b/adservices/tests/unittest/framework/src/android/adservices/adselection/SignedContextualAdsTest.java
new file mode 100644
index 0000000..f46a51c
--- /dev/null
+++ b/adservices/tests/unittest/framework/src/android/adservices/adselection/SignedContextualAdsTest.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.adservices.adselection;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertThrows;
+
+import android.adservices.common.CommonFixture;
+import android.os.Parcel;
+
+import org.junit.Test;
+
+/** Unit tests for {@link SignedContextualAds} */
+public class SignedContextualAdsTest {
+
+ @Test
+ public void testBuildContextualAdsSuccess() {
+ SignedContextualAds contextualAds =
+ new SignedContextualAds.Builder()
+ .setBuyer(SignedContextualAdsFixture.BUYER)
+ .setDecisionLogicUri(SignedContextualAdsFixture.DECISION_LOGIC_URI)
+ .setAdsWithBid(SignedContextualAdsFixture.ADS_WITH_BID)
+ .setSignature(SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE)
+ .build();
+
+ assertEquals(contextualAds.getBuyer(), SignedContextualAdsFixture.BUYER);
+ assertEquals(
+ contextualAds.getDecisionLogicUri(), SignedContextualAdsFixture.DECISION_LOGIC_URI);
+ assertEquals(contextualAds.getAdsWithBid(), SignedContextualAdsFixture.ADS_WITH_BID);
+ assertArrayEquals(
+ contextualAds.getSignature(), SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE);
+ }
+
+ @Test
+ public void testParcelValidContextualAdsSuccess() {
+ SignedContextualAds contextualAds = SignedContextualAdsFixture.aSignedContextualAd();
+
+ Parcel p = Parcel.obtain();
+ contextualAds.writeToParcel(p, 0);
+ p.setDataPosition(0);
+ SignedContextualAds fromParcel = SignedContextualAds.CREATOR.createFromParcel(p);
+
+ assertEquals(contextualAds.getBuyer(), fromParcel.getBuyer());
+ assertEquals(contextualAds.getDecisionLogicUri(), fromParcel.getDecisionLogicUri());
+ assertEquals(contextualAds.getAdsWithBid(), fromParcel.getAdsWithBid());
+ assertArrayEquals(contextualAds.getSignature(), fromParcel.getSignature());
+ }
+
+ @Test
+ public void testSetContextualAdsNullBuyerFailure() {
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ new SignedContextualAds.Builder().setBuyer(null);
+ });
+ }
+
+ @Test
+ public void testSetContextualAdsNullDecisionLogicUriFailure() {
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ new SignedContextualAds.Builder().setDecisionLogicUri(null);
+ });
+ }
+
+ @Test
+ public void testSetContextualAdsNullAdWithBidFailure() {
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ new SignedContextualAds.Builder().setAdsWithBid(null);
+ });
+ }
+
+ @Test
+ public void testSetContextualAdsNullSignatureFailure() {
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ new SignedContextualAds.Builder().setSignature(null);
+ });
+ }
+
+ @Test
+ public void testParcelNullDestFailure() {
+ SignedContextualAds contextualAds = SignedContextualAdsFixture.aSignedContextualAd();
+ Parcel nullDest = null;
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ contextualAds.writeToParcel(nullDest, 0);
+ });
+ }
+
+ @Test
+ public void testBuildContextualAdsUnsetBuyerFailure() {
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ new SignedContextualAds.Builder()
+ .setDecisionLogicUri(SignedContextualAdsFixture.DECISION_LOGIC_URI)
+ .setAdsWithBid(SignedContextualAdsFixture.ADS_WITH_BID)
+ .setSignature(SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE)
+ .build();
+ });
+ }
+
+ @Test
+ public void testBuildContextualAdsUnsetDecisionLogicUriFailure() {
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ new SignedContextualAds.Builder()
+ .setBuyer(SignedContextualAdsFixture.BUYER)
+ .setAdsWithBid(SignedContextualAdsFixture.ADS_WITH_BID)
+ .setSignature(SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE)
+ .build();
+ });
+ }
+
+ @Test
+ public void testBuildContextualAdsUnsetAdWithBidFailure() {
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ new SignedContextualAds.Builder()
+ .setBuyer(SignedContextualAdsFixture.BUYER)
+ .setDecisionLogicUri(SignedContextualAdsFixture.DECISION_LOGIC_URI)
+ .setSignature(SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE)
+ .build();
+ });
+ }
+
+ @Test
+ public void testBuildContextualAdsUnsetSignatureFailure() {
+ assertThrows(
+ NullPointerException.class,
+ () -> {
+ new SignedContextualAds.Builder()
+ .setBuyer(SignedContextualAdsFixture.BUYER)
+ .setDecisionLogicUri(SignedContextualAdsFixture.DECISION_LOGIC_URI)
+ .setAdsWithBid(SignedContextualAdsFixture.ADS_WITH_BID)
+ .build();
+ });
+ }
+
+ @Test
+ public void testContextualAdsDescribeContents() {
+ SignedContextualAds obj = SignedContextualAdsFixture.aSignedContextualAd();
+
+ assertEquals(obj.describeContents(), 0);
+ }
+
+ @Test
+ public void testContextualAdsHaveSameHashCode() {
+ SignedContextualAds obj1 = SignedContextualAdsFixture.aSignedContextualAd();
+ SignedContextualAds obj2 = SignedContextualAdsFixture.aSignedContextualAd();
+
+ CommonFixture.assertHaveSameHashCode(obj1, obj2);
+ }
+
+ @Test
+ public void testContextualAdsHaveDifferentHashCode() {
+ SignedContextualAds obj1 = SignedContextualAdsFixture.aSignedContextualAd();
+ SignedContextualAds obj2 =
+ SignedContextualAdsFixture.aSignedContextualAdBuilder()
+ .setBuyer(SignedContextualAdsFixture.BUYER_2)
+ .build();
+ SignedContextualAds obj3 =
+ SignedContextualAdsFixture.aSignedContextualAdBuilder()
+ .setSignature(new byte[] {1, 2, 3})
+ .build();
+
+ CommonFixture.assertDifferentHashCode(obj1, obj2, obj3);
+ }
+}
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java
index 15e4cb6..490e585 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererImplTest.java
@@ -29,8 +29,8 @@
import static org.mockito.Mockito.when;
import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
import android.adservices.common.AdData;
import android.adservices.common.AdDataFixture;
import android.adservices.common.AdFilters;
@@ -91,8 +91,8 @@
.setMetadata(AD_DATA.getMetadata())
.build();
- private static final ContextualAds.Builder CONTEXTUAL_ADS_BUILDER =
- ContextualAdsFixture.aContextualAdBuilder()
+ private static final SignedContextualAds.Builder CONTEXTUAL_ADS_BUILDER =
+ SignedContextualAdsFixture.aSignedContextualAdBuilder()
.setAdsWithBid(ImmutableList.of(new AdWithBid(AD_DATA, 1.0)))
.setBuyer(CommonFixture.VALID_BUYER_1)
.setDecisionLogicUri(
@@ -114,7 +114,7 @@
@Test
public void testFilterContextualAdsDoesNotFilterNullAdFilters() {
final AdData adData = AD_DATA_BUILDER.setAdFilters(null).build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -132,7 +132,7 @@
.setFrequencyCapFilters(null)
.build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -153,7 +153,7 @@
.setAdFilters(
new AdFilters.Builder().setAppInstallFilters(appFilters).build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -177,7 +177,7 @@
.setAdFilters(
new AdFilters.Builder().setAppInstallFilters(appFilters).build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -209,7 +209,7 @@
.setAdFilters(
new AdFilters.Builder().setAppInstallFilters(appFilters).build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -248,7 +248,7 @@
.setAdFilters(
new AdFilters.Builder().setAppInstallFilters(appFilters2).build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(
ImmutableList.of(
@@ -285,7 +285,7 @@
ImmutableList.of(
new AdWithBid(adDataNotFiltered, 1.0), new AdWithBid(dataNoFilters, 2.0));
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER.setAdsWithBid(adsWithBid).build();
assertThat(mAdFilterer.filterContextualAds(contextualAds).getAdsWithBid())
@@ -313,7 +313,7 @@
List<AdWithBid> adsWithBid =
ImmutableList.of(new AdWithBid(adData, 1.0), new AdWithBid(dataNoFilters, 2.0));
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER.setAdsWithBid(adsWithBid).build();
assertThat(mAdFilterer.filterContextualAds(contextualAds).getAdsWithBid())
@@ -355,7 +355,7 @@
final AdData dataNoFilters = AD_DATA_NO_FILTER;
List<AdWithBid> adsWithBid =
ImmutableList.of(new AdWithBid(adData, 1.0), new AdWithBid(dataNoFilters, 2.0));
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER.setAdsWithBid(adsWithBid).build();
assertThat(mAdFilterer.filterContextualAds(contextualAds).getAdsWithBid())
@@ -381,7 +381,7 @@
ImmutableList.of(
new AdWithBid(adDataOnlyWinFilters, 1.0),
new AdWithBid(dataNoFilters, 2.0));
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER.setAdsWithBid(adsWithBid).build();
assertThat(mAdFilterer.filterContextualAds(contextualAds).getAdsWithBid())
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java
index b8e36d4..7e3e358 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdFiltererNoOpImplTest.java
@@ -19,8 +19,8 @@
import static org.junit.Assert.assertEquals;
import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
import android.adservices.common.AdData;
import android.adservices.common.AdDataFixture;
import android.adservices.common.AdFilters;
@@ -47,8 +47,8 @@
private static final AdData.Builder AD_DATA_BUILDER =
AdDataFixture.getValidFilterAdDataBuilderByBuyer(CommonFixture.VALID_BUYER_1, 0);
- private static final ContextualAds.Builder CONTEXTUAL_ADS_BUILDER =
- ContextualAdsFixture.aContextualAdBuilder()
+ private static final SignedContextualAds.Builder CONTEXTUAL_ADS_BUILDER =
+ SignedContextualAdsFixture.aSignedContextualAdBuilder()
.setAdsWithBid(ImmutableList.of(new AdWithBid(AD_DATA_BUILDER.build(), 1.0)))
.setBuyer(CommonFixture.VALID_BUYER_1)
.setDecisionLogicUri(
@@ -64,7 +64,7 @@
@Test
public void testFilterNullAdFilters() {
final AdData adData = AD_DATA_BUILDER.setAdFilters(null).build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -82,7 +82,7 @@
.setFrequencyCapFilters(null)
.build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -100,7 +100,7 @@
.setAdFilters(
new AdFilters.Builder().setAppInstallFilters(appFilters).build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -122,7 +122,7 @@
.setAdFilters(
new AdFilters.Builder().setAppInstallFilters(appFilters).build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(ImmutableList.of(new AdWithBid(adData, 1.0)))
.build();
@@ -151,7 +151,7 @@
.setAdFilters(
new AdFilters.Builder().setAppInstallFilters(appFilters2).build())
.build();
- final ContextualAds contextualAds =
+ final SignedContextualAds contextualAds =
CONTEXTUAL_ADS_BUILDER
.setAdsWithBid(
ImmutableList.of(
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java
index 30bdf9b..a66caec 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionConfigValidatorTest.java
@@ -16,6 +16,8 @@
package com.android.adservices.service.adselection;
+import static android.adservices.adselection.SignedContextualAdsFixture.PLACEHOLDER_SIGNATURE;
+
import static com.android.adservices.service.adselection.AdSelectionConfigValidator.DECISION_LOGIC_URI_TYPE;
import static com.android.adservices.service.adselection.AdSelectionConfigValidator.TRUSTED_SCORING_SIGNALS_URI_TYPE;
@@ -26,8 +28,8 @@
import android.adservices.adselection.AdSelectionConfig;
import android.adservices.adselection.AdSelectionConfigFixture;
import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
import android.adservices.common.AdData;
import android.adservices.common.AdDataFixture;
import android.adservices.common.AdTechIdentifier;
@@ -346,17 +348,18 @@
@Test
public void testContextualAdsDecisionLogicEtldMismatch() {
- Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+ Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2;
- ContextualAds contextualAds2 =
- ContextualAdsFixture.generateContextualAds(buyer2, ImmutableList.of(100.0, 200.0))
+ SignedContextualAds contextualAds2 =
+ SignedContextualAdsFixture.generateSignedContextualAds(
+ buyer2, ImmutableList.of(100.0, 200.0))
.setDecisionLogicUri(
CommonFixture.getUri(
CommonFixture.VALID_BUYER_1, BUYER_BIDDING_LOGIC_URI_PATH))
.build();
buyerContextualAds.put(buyer2, contextualAds2);
AdSelectionConfig adSelectionConfig =
- mAdSelectionConfigBuilder.setBuyerContextualAds(buyerContextualAds).build();
+ mAdSelectionConfigBuilder.setBuyerSignedContextualAds(buyerContextualAds).build();
AdSelectionConfigValidator adSelectionConfigValidator =
new AdSelectionConfigValidator(
mPrebuiltLogicGenerator, new FrequencyCapAdDataValidatorImpl());
@@ -373,11 +376,11 @@
@Test
public void testContextualAdsRenderUriEtldMismatch() {
- Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+ Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2;
ImmutableList<Double> bids = ImmutableList.of(100.0, 200.0);
- ContextualAds contextualAds2 =
- ContextualAdsFixture.generateContextualAds(buyer2, bids)
+ SignedContextualAds contextualAds2 =
+ SignedContextualAdsFixture.generateSignedContextualAds(buyer2, bids)
.setDecisionLogicUri(
CommonFixture.getUri(buyer2, BUYER_BIDDING_LOGIC_URI_PATH))
.setAdsWithBid(
@@ -394,7 +397,7 @@
// Creating ads which have a render Uri with a different buyer
buyerContextualAds.put(buyer2, contextualAds2);
AdSelectionConfig adSelectionConfig =
- mAdSelectionConfigBuilder.setBuyerContextualAds(buyerContextualAds).build();
+ mAdSelectionConfigBuilder.setBuyerSignedContextualAds(buyerContextualAds).build();
AdSelectionConfigValidator adSelectionConfigValidator =
new AdSelectionConfigValidator(
mPrebuiltLogicGenerator, new FrequencyCapAdDataValidatorImpl());
@@ -440,20 +443,21 @@
List<AdWithBid> adsWithBids =
List.of(new AdWithBid(adDataWithExceededFrequencyCapLimits, 100.0));
- Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+ Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
buyerContextualAds.put(
CommonFixture.VALID_BUYER_1,
- new ContextualAds.Builder()
+ new SignedContextualAds.Builder()
.setBuyer(CommonFixture.VALID_BUYER_1)
.setDecisionLogicUri(
CommonFixture.getUri(
CommonFixture.VALID_BUYER_1,
- ContextualAdsFixture.DECISION_LOGIC_FRAGMENT))
+ SignedContextualAdsFixture.DECISION_LOGIC_FRAGMENT))
.setAdsWithBid(adsWithBids)
+ .setSignature(PLACEHOLDER_SIGNATURE)
.build());
AdSelectionConfig adSelectionConfig =
- mAdSelectionConfigBuilder.setBuyerContextualAds(buyerContextualAds).build();
+ mAdSelectionConfigBuilder.setBuyerSignedContextualAds(buyerContextualAds).build();
AdSelectionConfigValidator adSelectionConfigValidator =
new AdSelectionConfigValidator(
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java
index b5bacd8..5657dc5 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionE2ETest.java
@@ -81,10 +81,10 @@
import android.adservices.adselection.AdSelectionConfigFixture;
import android.adservices.adselection.AdSelectionInput;
import android.adservices.adselection.AdSelectionResponse;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
import android.adservices.adselection.ReportImpressionCallback;
import android.adservices.adselection.ReportImpressionInput;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
import android.adservices.common.AdDataFixture;
import android.adservices.common.AdSelectionSignals;
import android.adservices.common.AdServicesStatusUtils;
@@ -2877,7 +2877,7 @@
mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.build();
mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -2971,7 +2971,7 @@
mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.build();
MockWebServer server = mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -3145,7 +3145,7 @@
mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.build();
mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -3261,7 +3261,7 @@
mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.build();
mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -3330,7 +3330,7 @@
mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.build();
mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -3418,7 +3418,7 @@
.setCustomAudienceBuyers(Collections.emptyList())
.setSeller(mSeller)
.setDecisionLogicUri(prebuiltUri)
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.setTrustedScoringSignalsUri(Uri.EMPTY)
.build();
@@ -3497,7 +3497,7 @@
mMockWebServerRule.uriForPath(SELLER_DECISION_LOGIC_URI_PATH))
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(SELLER_TRUSTED_SIGNAL_URI_PATH))
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.build();
mMockWebServerRule.startMockWebServer(mDispatcher);
@@ -7681,8 +7681,8 @@
adCost);
}
- private Map<AdTechIdentifier, ContextualAds> createContextualAds() {
- Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+ private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() {
+ Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
// In order to meet ETLd+1 requirements creating Contextual ads with MockWebserver's host
AdTechIdentifier buyer2 =
@@ -7690,8 +7690,8 @@
mMockWebServerRule
.uriForPath(BUYER_BIDDING_LOGIC_URI_PATH + BUYER_2)
.getHost());
- ContextualAds contextualAds2 =
- ContextualAdsFixture.generateContextualAds(
+ SignedContextualAds contextualAds2 =
+ SignedContextualAdsFixture.generateSignedContextualAds(
buyer2, ImmutableList.of(100.0, 200.0, 300.0, 400.0, 500.0))
.setDecisionLogicUri(
mMockWebServerRule.uriForPath(
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java
index 18ffa31..7a4088a 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdsScoreGeneratorImplTest.java
@@ -62,8 +62,8 @@
import android.adservices.adselection.AdSelectionConfig;
import android.adservices.adselection.AdSelectionConfigFixture;
import android.adservices.adselection.AdWithBid;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
import android.adservices.common.AdSelectionSignals;
import android.adservices.common.AdTechIdentifier;
import android.adservices.common.CommonFixture;
@@ -815,24 +815,24 @@
Uri decisionLogicUri = mMockWebServerRule.uriForPath(mFetchJavaScriptPath);
- Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+ Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
mAdSelectionConfig =
AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder()
.setDecisionLogicUri(decisionLogicUri)
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath))
- .setBuyerContextualAds(contextualAdsMap)
+ .setBuyerSignedContextualAds(contextualAdsMap)
.build();
List<AdWithBid> adsWithBid =
mAdBiddingOutcomeList.stream()
.map(a -> a.getAdWithBid())
.collect(Collectors.toList());
- List<ContextualAds> contextualAds =
- mAdSelectionConfig.getBuyerContextualAds().values().stream()
+ List<SignedContextualAds> signedContextualAds =
+ mAdSelectionConfig.getBuyerSignedContextualAds().values().stream()
.collect(Collectors.toList());
List<AdWithBid> contextualBidAds = new ArrayList<>();
- for (ContextualAds ctx : contextualAds) {
+ for (SignedContextualAds ctx : signedContextualAds) {
contextualBidAds.addAll(ctx.getAdsWithBid());
}
@@ -936,24 +936,24 @@
Uri decisionLogicUri = mMockWebServerRule.uriForPath(mFetchJavaScriptPath);
- Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+ Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
mAdSelectionConfig =
AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder()
.setDecisionLogicUri(decisionLogicUri)
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath))
- .setBuyerContextualAds(contextualAdsMap)
+ .setBuyerSignedContextualAds(contextualAdsMap)
.build();
List<AdWithBid> adsWithBid =
mAdBiddingOutcomeList.stream()
.map(a -> a.getAdWithBid())
.collect(Collectors.toList());
- List<ContextualAds> contextualAds =
- mAdSelectionConfig.getBuyerContextualAds().values().stream()
+ List<SignedContextualAds> signedContextualAds =
+ mAdSelectionConfig.getBuyerSignedContextualAds().values().stream()
.collect(Collectors.toList());
List<AdWithBid> contextualBidAds = new ArrayList<>();
- for (ContextualAds ctx : contextualAds) {
+ for (SignedContextualAds ctx : signedContextualAds) {
contextualBidAds.addAll(ctx.getAdsWithBid());
}
@@ -1084,24 +1084,24 @@
Uri decisionLogicUri = mMockWebServerRule.uriForPath(mFetchJavaScriptPath);
- Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+ Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
mAdSelectionConfig =
AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder()
.setDecisionLogicUri(decisionLogicUri)
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath))
- .setBuyerContextualAds(contextualAdsMap)
+ .setBuyerSignedContextualAds(contextualAdsMap)
.build();
List<AdWithBid> adsWithBid =
mAdBiddingOutcomeList.stream()
.map(a -> a.getAdWithBid())
.collect(Collectors.toList());
- List<ContextualAds> contextualAds =
- mAdSelectionConfig.getBuyerContextualAds().values().stream()
+ List<SignedContextualAds> signedContextualAds =
+ mAdSelectionConfig.getBuyerSignedContextualAds().values().stream()
.collect(Collectors.toList());
List<AdWithBid> contextualBidAds = new ArrayList<>();
- for (ContextualAds ctx : contextualAds) {
+ for (SignedContextualAds ctx : signedContextualAds) {
contextualBidAds.addAll(ctx.getAdsWithBid());
}
@@ -1255,24 +1255,24 @@
Uri decisionLogicUri = mMockWebServerRule.uriForPath(mFetchJavaScriptPath);
- Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+ Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
mAdSelectionConfig =
AdSelectionConfigFixture.anAdSelectionConfigWithContextualAdsBuilder()
.setDecisionLogicUri(decisionLogicUri)
.setTrustedScoringSignalsUri(
mMockWebServerRule.uriForPath(mTrustedScoringSignalsPath))
- .setBuyerContextualAds(contextualAdsMap)
+ .setBuyerSignedContextualAds(contextualAdsMap)
.build();
List<AdWithBid> adsWithBid =
mAdBiddingOutcomeList.stream()
.map(a -> a.getAdWithBid())
.collect(Collectors.toList());
- List<ContextualAds> contextualAds =
- mAdSelectionConfig.getBuyerContextualAds().values().stream()
+ List<SignedContextualAds> signedContextualAds =
+ mAdSelectionConfig.getBuyerSignedContextualAds().values().stream()
.collect(Collectors.toList());
List<AdWithBid> contextualBidAds = new ArrayList<>();
- for (ContextualAds ctx : contextualAds) {
+ for (SignedContextualAds ctx : signedContextualAds) {
contextualBidAds.addAll(ctx.getAdsWithBid());
}
@@ -1899,18 +1899,19 @@
assertEquals(AdSelectionSignals.EMPTY, signals.getUserBiddingSignals());
}
- private Map<AdTechIdentifier, ContextualAds> createContextualAds() {
- Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+ private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() {
+ Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
AdTechIdentifier buyer1 = BUYER_1;
- ContextualAds contextualAds1 =
- ContextualAdsFixture.generateContextualAds(
+ SignedContextualAds contextualAds1 =
+ SignedContextualAdsFixture.generateSignedContextualAds(
buyer1, ImmutableList.of(100.0, 200.0, 300.0))
.build();
AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2;
- ContextualAds contextualAds2 =
- ContextualAdsFixture.generateContextualAds(buyer2, ImmutableList.of(400.0, 500.0))
+ SignedContextualAds contextualAds2 =
+ SignedContextualAdsFixture.generateSignedContextualAds(
+ buyer2, ImmutableList.of(400.0, 500.0))
.build();
buyerContextualAds.put(buyer1, contextualAds1);
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java
index 3b0bee3..ae38208 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/OnDeviceAdSelectionRunnerTest.java
@@ -89,8 +89,8 @@
import android.adservices.adselection.AdSelectionConfigFixture;
import android.adservices.adselection.AdSelectionInput;
import android.adservices.adselection.AdSelectionResponse;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
import android.adservices.common.AdDataFixture;
import android.adservices.common.AdFilters;
import android.adservices.common.AdSelectionSignals;
@@ -2973,12 +2973,13 @@
@Test
public void testCreateAdSelectionResult_Contextual_Enabled() throws AdServicesException {
+ Map<AdTechIdentifier, SignedContextualAds> signedContextualAdsMap = createContextualAds();
AdSelectionConfig adSelectionConfig =
mAdSelectionConfigBuilder
.build()
.cloneToBuilder()
.setCustomAudienceBuyers(Collections.EMPTY_LIST)
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(signedContextualAdsMap)
.build();
final Flags flags =
@@ -3037,13 +3038,12 @@
eq(Collections.EMPTY_LIST), mAdSelectionConfigArgumentCaptor.capture());
assertEquals(
"The contextual ads should have reached scoring as is",
- createContextualAds(),
- mAdSelectionConfigArgumentCaptor.getValue().getBuyerContextualAds());
+ signedContextualAdsMap,
+ mAdSelectionConfigArgumentCaptor.getValue().getBuyerSignedContextualAds());
}
@Test
- public void testCreateAdSelectionResult_Contextual_DisabledAndSkipped()
- throws ExecutionException, InterruptedException, TimeoutException, AdServicesException {
+ public void testCreateAdSelectionResult_Contextual_DisabledAndSkipped() {
when(mClockSpy.instant()).thenReturn(Clock.systemUTC().instant());
AdSelectionConfig adSelectionConfig =
mAdSelectionConfigBuilder
@@ -3051,7 +3051,7 @@
.cloneToBuilder()
.setCustomAudienceBuyers(Collections.EMPTY_LIST)
// Despite populating Contextual Ads, they will be removed
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.build();
final Flags flags =
new OnDeviceAdSelectionRunnerTestFlags() {
@@ -3113,14 +3113,14 @@
@Test
public void testCreateAdSelectionResult_Contextual_AppInstallFiltered()
throws AdServicesException {
- Map<AdTechIdentifier, ContextualAds> contextualAdsMap = createContextualAds();
+ Map<AdTechIdentifier, SignedContextualAds> contextualAdsMap = createContextualAds();
AdSelectionConfig adSelectionConfig =
mAdSelectionConfigBuilder
.build()
.cloneToBuilder()
.setCustomAudienceBuyers(Collections.EMPTY_LIST)
- .setBuyerContextualAds(contextualAdsMap)
+ .setBuyerSignedContextualAds(contextualAdsMap)
.build();
final Flags flags =
@@ -3171,7 +3171,7 @@
.thenReturn(contextualAdsMap.get(CommonFixture.VALID_BUYER_1));
when(mMockAdFilterer.filterContextualAds(contextualAdsMap.get(CommonFixture.VALID_BUYER_2)))
.thenReturn(
- new ContextualAds.Builder()
+ SignedContextualAdsFixture.aSignedContextualAdBuilder()
.setBuyer(CommonFixture.VALID_BUYER_2)
.setDecisionLogicUri(
contextualAdsMap
@@ -3188,7 +3188,7 @@
contextualAdsMap.get(CommonFixture.VALID_BUYER_1).getAdsWithBid(),
mAdSelectionConfigArgumentCaptor
.getValue()
- .getBuyerContextualAds()
+ .getBuyerSignedContextualAds()
.get(CommonFixture.VALID_BUYER_1)
.getAdsWithBid());
assertEquals(
@@ -3196,7 +3196,7 @@
Collections.EMPTY_LIST,
mAdSelectionConfigArgumentCaptor
.getValue()
- .getBuyerContextualAds()
+ .getBuyerSignedContextualAds()
.get(CommonFixture.VALID_BUYER_2)
.getAdsWithBid());
}
@@ -3826,20 +3826,21 @@
}
}
- private Map<AdTechIdentifier, ContextualAds> createContextualAds() {
- Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+ private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() {
+ Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
AdTechIdentifier buyer1 = CommonFixture.VALID_BUYER_1;
- ContextualAds contextualAds1 =
- ContextualAdsFixture.generateContextualAds(
+ SignedContextualAds contextualAds1 =
+ SignedContextualAdsFixture.generateSignedContextualAds(
buyer1, ImmutableList.of(100.0, 200.0, 300.0))
.setDecisionLogicUri(
CommonFixture.getUri(BUYER_1, BUYER_BIDDING_LOGIC_URI_PATH))
.build();
AdTechIdentifier buyer2 = CommonFixture.VALID_BUYER_2;
- ContextualAds contextualAds2 =
- ContextualAdsFixture.generateContextualAds(buyer2, ImmutableList.of(400.0, 500.0))
+ SignedContextualAds contextualAds2 =
+ SignedContextualAdsFixture.generateSignedContextualAds(
+ buyer2, ImmutableList.of(400.0, 500.0))
.setDecisionLogicUri(
CommonFixture.getUri(BUYER_2, BUYER_BIDDING_LOGIC_URI_PATH))
.build();
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java
index 9892411..bb6a740 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/common/FledgeE2ETest.java
@@ -65,8 +65,6 @@
import android.adservices.adselection.AdSelectionOverrideCallback;
import android.adservices.adselection.AdSelectionResponse;
import android.adservices.adselection.BuyersDecisionLogic;
-import android.adservices.adselection.ContextualAds;
-import android.adservices.adselection.ContextualAdsFixture;
import android.adservices.adselection.DecisionLogic;
import android.adservices.adselection.ReportEventRequest;
import android.adservices.adselection.ReportImpressionCallback;
@@ -75,6 +73,8 @@
import android.adservices.adselection.ReportInteractionInput;
import android.adservices.adselection.SetAppInstallAdvertisersCallback;
import android.adservices.adselection.SetAppInstallAdvertisersInput;
+import android.adservices.adselection.SignedContextualAds;
+import android.adservices.adselection.SignedContextualAdsFixture;
import android.adservices.adselection.UpdateAdCounterHistogramInput;
import android.adservices.common.AdData;
import android.adservices.common.AdDataFixture;
@@ -3081,7 +3081,7 @@
AdTechIdentifier.fromString(
mLocalhostBuyerDomain.getHost()),
AdSelectionSignals.fromString("{\"buyer_signals\":0}")))
- .setBuyerContextualAds(createContextualAds())
+ .setBuyerSignedContextualAds(createContextualAds())
.build();
String decisionLogicJs =
@@ -4882,21 +4882,20 @@
}
}
- private Map<AdTechIdentifier, ContextualAds> createContextualAds() {
- Map<AdTechIdentifier, ContextualAds> buyerContextualAds = new HashMap<>();
+ private Map<AdTechIdentifier, SignedContextualAds> createContextualAds() {
+ Map<AdTechIdentifier, SignedContextualAds> buyerContextualAds = new HashMap<>();
// In order to meet ETLd+1 requirements creating Contextual ads with MockWebserver's host
AdTechIdentifier buyer =
AdTechIdentifier.fromString(
mockWebServerRule.uriForPath(BUYER_BIDDING_LOGIC_URI_PATH).getHost());
- ContextualAds contextualAds =
- ContextualAdsFixture.generateContextualAds(
+ SignedContextualAds contextualAds =
+ SignedContextualAdsFixture.generateSignedContextualAds(
buyer, ImmutableList.of(100.0, 200.0, 300.0, 400.0, 500.0))
.setDecisionLogicUri(
mockWebServerRule.uriForPath(BUYER_BIDDING_LOGIC_URI_PATH))
.build();
buyerContextualAds.put(buyer, contextualAds);
-
return buyerContextualAds;
}