diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-11-04 00:41:00 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-11-04 00:41:00 +0000 |
commit | 725bf3e2372b8ab29e521e864d28770fdf2c0443 (patch) | |
tree | d094f43841ac9dc9c54fd96ffd940b6f71f8ba39 /adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java | |
parent | 190c25efdbd5a5bdbb41a2818cf39a05d0ea9be0 (diff) | |
parent | 7b99dc653ed133fef81d0423fee87d45299097e2 (diff) | |
download | AdServices-725bf3e2372b8ab29e521e864d28770fdf2c0443.tar.gz |
Snap for 9254005 from 7b99dc653ed133fef81d0423fee87d45299097e2 to mainline-ipsec-releaseaml_ips_331910010aml_ips_331312000aml_ips_331310000android13-mainline-ipsec-release
Change-Id: Id77860bb313cd5104abdea4a778d197a1db28861
Diffstat (limited to 'adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java')
-rw-r--r-- | adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java | 933 |
1 files changed, 598 insertions, 335 deletions
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java index abdb5e6f36..4de41741a4 100644 --- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java +++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/adselection/AdSelectionServiceImplTest.java @@ -31,12 +31,13 @@ import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICE import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__REMOVE_AD_SELECTION_CONFIG_REMOTE_INFO_OVERRIDE; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION; import static com.android.adservices.service.stats.AdServicesStatsLog.AD_SERVICES_API_CALLED__API_NAME__RESET_ALL_AD_SELECTION_CONFIG_REMOTE_OVERRIDES; -import static com.android.adservices.stats.FledgeApiCallStatsMatcher.aCallStatForFledgeApiWithStatus; import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doThrow; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; @@ -71,6 +72,7 @@ import androidx.test.core.app.ApplicationProvider; import com.android.adservices.MockWebServerRuleFactory; import com.android.adservices.concurrency.AdServicesExecutors; +import com.android.adservices.data.DbTestUtil; import com.android.adservices.data.adselection.AdSelectionDatabase; import com.android.adservices.data.adselection.AdSelectionEntryDao; import com.android.adservices.data.adselection.CustomAudienceSignals; @@ -79,6 +81,7 @@ import com.android.adservices.data.adselection.DBAdSelectionOverride; import com.android.adservices.data.adselection.DBBuyerDecisionLogic; import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.data.customaudience.CustomAudienceDatabase; +import com.android.adservices.data.enrollment.EnrollmentDao; import com.android.adservices.service.Flags; import com.android.adservices.service.common.AdServicesHttpsClient; import com.android.adservices.service.common.AppImportanceFilter; @@ -121,8 +124,10 @@ import java.time.ZoneOffset; import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class AdSelectionServiceImplTest { @@ -152,47 +157,58 @@ public class AdSelectionServiceImplTest { AD_SERVICES_API_CALLED__API_NAME__REMOVE_AD_SELECTION_CONFIG_REMOTE_INFO_OVERRIDE; private static final int SHORT_API_NAME_RESET_ALL_OVERRIDES = AD_SERVICES_API_CALLED__API_NAME__RESET_ALL_AD_SELECTION_CONFIG_REMOTE_OVERRIDES; + private static final String TIMEOUT_MESSAGE = "Timed out:"; private final ExecutorService mLightweightExecutorService = AdServicesExecutors.getLightWeightExecutor(); private final ExecutorService mBackgroundExecutorService = AdServicesExecutors.getBackgroundExecutor(); + private final ScheduledThreadPoolExecutor mScheduledExecutor = + AdServicesExecutors.getScheduler(); private final String mSellerReportingPath = "/reporting/seller"; private final String mBuyerReportingPath = "/reporting/buyer"; - private final String mFetchJavaScriptPath = "/fetchJavascript/"; + private final String mFetchJavaScriptPathSeller = "/fetchJavascript/seller"; + private final String mFetchJavaScriptPathBuyer = "/fetchJavascript/buyer"; private final String mFetchTrustedScoringSignalsPath = "/fetchTrustedSignals/"; private final AdTechIdentifier mContextualSignals = AdTechIdentifier.fromString("{\"contextual_signals\":1}"); - private static final String TIMEOUT_MESSAGE = "Timed out:"; private final int mBytesPerPeriod = 1; private final AdServicesHttpsClient mClient = new AdServicesHttpsClient(AdServicesExecutors.getBlockingExecutor()); - private Flags mFlags = new FlagsWithEnrollmentCheckEnabledSwitch(false); - private MockitoSession mStaticMockSession = null; - @Spy private final AdServicesLogger mAdServicesLoggerSpy = AdServicesLoggerImpl.getInstance(); + private final AdServicesLogger mAdServicesLoggerMock = + ExtendedMockito.mock(AdServicesLoggerImpl.class); + @Rule public MockWebServerRule mMockWebServerRule = MockWebServerRuleFactory.createForHttps(); + // This object access some system APIs + @Mock public DevContextFilter mDevContextFilter; + @Mock public AppImportanceFilter mAppImportanceFilter; @Spy FledgeAuthorizationFilter mFledgeAuthorizationFilterSpy = - FledgeAuthorizationFilter.create(CONTEXT, mAdServicesLoggerSpy); + new FledgeAuthorizationFilter( + CONTEXT.getPackageManager(), + new EnrollmentDao(CONTEXT, DbTestUtil.getDbHelperForTest()), + mAdServicesLoggerMock); + + private Flags mFlags = new FlagsWithEnrollmentCheckEnabledSwitch(false); @Spy FledgeAllowListsFilter mFledgeAllowListsFilterSpy = - new FledgeAllowListsFilter(mFlags, mAdServicesLoggerSpy); + new FledgeAllowListsFilter(mFlags, mAdServicesLoggerMock); - @Rule public MockWebServerRule mMockWebServerRule = MockWebServerRuleFactory.createForHttps(); - // This object access some system APIs - @Mock public DevContextFilter mDevContextFilter; - @Mock public AppImportanceFilter mAppImportanceFilter; + private MockitoSession mStaticMockSession = null; @Mock private ConsentManager mConsentManagerMock; private CustomAudienceDao mCustomAudienceDao; private AdSelectionEntryDao mAdSelectionEntryDao; private AdSelectionConfig.Builder mAdSelectionConfigBuilder; + private Uri mBiddingLogicUri; + private CustomAudienceSignals mCustomAudienceSignals; + @Before public void setUp() { mStaticMockSession = ExtendedMockito.mockitoSession() .spyStatic(JSScriptEngine.class) - // mAdServicesLoggerSpy is not referenced in many tests + // mAdServicesLoggerMock is not referenced in many tests .strictness(Strictness.LENIENT) .initMocks(this) .startMocking(); @@ -208,16 +224,36 @@ public class AdSelectionServiceImplTest { .build() .adSelectionEntryDao(); + mBiddingLogicUri = (mMockWebServerRule.uriForPath(mFetchJavaScriptPathBuyer)); + + mCustomAudienceSignals = + CustomAudienceSignalsFixture.aCustomAudienceSignalsBuilder() + .setBuyer(AdTechIdentifier.fromString(mBiddingLogicUri.getHost())) + .build(); + + Map<AdTechIdentifier, AdSelectionSignals> perBuyerSignals = + Map.of( + AdTechIdentifier.fromString("test.com"), + AdSelectionSignals.fromString("{\"buyer_signals\":1}"), + AdTechIdentifier.fromString("test2.com"), + AdSelectionSignals.fromString("{\"buyer_signals\":2}"), + AdTechIdentifier.fromString("test3.com"), + AdSelectionSignals.fromString("{\"buyer_signals\":3}"), + AdTechIdentifier.fromString(mBiddingLogicUri.getHost()), + AdSelectionSignals.fromString("{\"buyer_signals\":0}")); + mAdSelectionConfigBuilder = AdSelectionConfigFixture.anAdSelectionConfigBuilder() .setSeller( AdTechIdentifier.fromString( mMockWebServerRule - .uriForPath(mFetchJavaScriptPath) + .uriForPath(mFetchJavaScriptPathSeller) .getHost())) - .setDecisionLogicUri(mMockWebServerRule.uriForPath(mFetchJavaScriptPath)) + .setDecisionLogicUri( + mMockWebServerRule.uriForPath(mFetchJavaScriptPathSeller)) .setTrustedScoringSignalsUri( - mMockWebServerRule.uriForPath(mFetchTrustedScoringSignalsPath)); + mMockWebServerRule.uriForPath(mFetchTrustedScoringSignalsPath)) + .setPerBuyerSignals(perBuyerSignals); } @After @@ -229,11 +265,13 @@ public class AdSelectionServiceImplTest { @Test public void testReportImpressionSuccess() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); + Uri biddingLogicUri = (mMockWebServerRule.uriForPath(mFetchJavaScriptPathBuyer)); + String sellerDecisionLogicJs = "function reportResult(ad_selection_config, render_uri, bid, contextual_signals) {" + " \n" @@ -260,19 +298,16 @@ public class AdSelectionServiceImplTest { DBBuyerDecisionLogic dbBuyerDecisionLogic = new DBBuyerDecisionLogic.Builder() - .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) + .setBiddingLogicUri(biddingLogicUri) .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) - .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) + .setBiddingLogicUri(biddingLogicUri) .setWinningAdRenderUri(RENDER_URI) .setWinningAdBid(BID) .setCreationTimestamp(ACTIVATION_TIME) @@ -296,9 +331,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -314,26 +350,23 @@ public class AdSelectionServiceImplTest { assertTrue(callback.mIsSuccess); RecordedRequest fetchRequest = server.takeRequest(); - assertEquals(mFetchJavaScriptPath, fetchRequest.getPath()); + assertEquals(mFetchJavaScriptPathSeller, fetchRequest.getPath()); List<String> notifications = ImmutableList.of(server.takeRequest().getPath(), server.takeRequest().getPath()); assertThat(notifications).containsExactly(mSellerReportingPath, mBuyerReportingPath); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_SUCCESS)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_SUCCESS), + anyInt()); } @Test public void testReportImpressionWithRevokedUserConsentSuccess() throws Exception { - doReturn(AdServicesApiConsent.REVOKED).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.REVOKED).when(mConsentManagerMock).getConsent(); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -361,13 +394,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -393,9 +423,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -412,20 +443,16 @@ public class AdSelectionServiceImplTest { assertTrue(callback.mIsSuccess); assertEquals(0, server.getRequestCount()); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_USER_CONSENT_REVOKED); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_USER_CONSENT_REVOKED)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_USER_CONSENT_REVOKED), + anyInt()); } @Test public void testReportImpressionFailsWhenReportResultTakesTooLong() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -463,13 +490,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -495,9 +519,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -515,19 +540,16 @@ public class AdSelectionServiceImplTest { assertEquals(callback.mFledgeErrorResponse.getStatusCode(), STATUS_INTERNAL_ERROR); assertTrue(callback.mFledgeErrorResponse.getErrorMessage().contains(TIMEOUT_MESSAGE)); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INTERNAL_ERROR)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_INTERNAL_ERROR), + anyInt()); } @Test public void testReportImpressionFailsWhenReportWinTakesTooLong() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -565,13 +587,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -597,9 +616,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -617,19 +637,16 @@ public class AdSelectionServiceImplTest { assertEquals(callback.mFledgeErrorResponse.getStatusCode(), STATUS_INTERNAL_ERROR); assertTrue(callback.mFledgeErrorResponse.getErrorMessage().contains(TIMEOUT_MESSAGE)); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INTERNAL_ERROR)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_INTERNAL_ERROR), + anyInt()); } @Test public void testReportImpressionFailsWhenOverallJSTimesOut() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -673,13 +690,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -705,9 +719,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -725,19 +740,16 @@ public class AdSelectionServiceImplTest { assertEquals(callback.mFledgeErrorResponse.getStatusCode(), STATUS_INTERNAL_ERROR); assertTrue(callback.mFledgeErrorResponse.getErrorMessage().contains(TIMEOUT_MESSAGE)); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INTERNAL_ERROR)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_INTERNAL_ERROR), + anyInt()); } @Test public void testReportImpressionFailsWhenJSFetchTakesTooLong() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -776,13 +788,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -808,9 +817,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -828,19 +838,16 @@ public class AdSelectionServiceImplTest { assertEquals(callback.mFledgeErrorResponse.getStatusCode(), STATUS_INTERNAL_ERROR); assertTrue(callback.mFledgeErrorResponse.getErrorMessage().contains(TIMEOUT_MESSAGE)); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INTERNAL_ERROR)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_INTERNAL_ERROR), + anyInt()); } @Test public void testReportImpressionFailsWithInvalidAdSelectionId() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -874,13 +881,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -906,9 +910,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -926,20 +931,16 @@ public class AdSelectionServiceImplTest { assertFalse(callback.mIsSuccess); assertEquals(callback.mFledgeErrorResponse.getStatusCode(), STATUS_INVALID_ARGUMENT); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INVALID_ARGUMENT); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INVALID_ARGUMENT)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_INVALID_ARGUMENT), + anyInt()); } @Test public void testReportImpressionBadSellerJavascriptFailsWithInternalError() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -973,13 +974,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -1004,9 +1002,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1024,19 +1023,16 @@ public class AdSelectionServiceImplTest { assertFalse(callback.mIsSuccess); assertEquals(callback.mFledgeErrorResponse.getStatusCode(), STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INTERNAL_ERROR)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_INTERNAL_ERROR), + anyInt()); } @Test public void testReportImpressionBadBuyerJavascriptFailsWithInternalError() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -1070,13 +1066,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(inValidBuyerDecisionLogicJsMissingCurlyBracket) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -1102,9 +1095,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1122,19 +1116,16 @@ public class AdSelectionServiceImplTest { assertFalse(callback.mIsSuccess); assertEquals(callback.mFledgeErrorResponse.getStatusCode(), STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INTERNAL_ERROR)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_INTERNAL_ERROR), + anyInt()); } @Test public void testReportImpressionUseDevOverrideForSellerJS() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -1168,13 +1159,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -1220,9 +1208,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1241,19 +1230,16 @@ public class AdSelectionServiceImplTest { assertThat(notifications).containsExactly(mSellerReportingPath, mBuyerReportingPath); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_SUCCESS)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_SUCCESS), + anyInt()); } @Test public void testOverrideAdSelectionConfigRemoteInfoSuccess() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( DevContext.builder() @@ -1270,9 +1256,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1294,16 +1281,14 @@ public class AdSelectionServiceImplTest { adSelectionConfig), TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy).logFledgeApiCallStats(SHORT_API_NAME_OVERRIDE, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus(SHORT_API_NAME_OVERRIDE, STATUS_SUCCESS)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats(eq(SHORT_API_NAME_OVERRIDE), eq(STATUS_SUCCESS), anyInt()); } @Test public void testOverrideAdSelectionConfigRemoteInfoWithRevokedUserConsentSuccess() throws Exception { - doReturn(AdServicesApiConsent.REVOKED).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.REVOKED).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -1321,9 +1306,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1345,17 +1331,14 @@ public class AdSelectionServiceImplTest { adSelectionConfig), TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_OVERRIDE, STATUS_USER_CONSENT_REVOKED); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_OVERRIDE, STATUS_USER_CONSENT_REVOKED)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_OVERRIDE), eq(STATUS_USER_CONSENT_REVOKED), anyInt()); } @Test public void testOverrideAdSelectionConfigRemoteInfoFailsWithDevOptionsDisabled() { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn(DevContext.createForDevOptionsDisabled()); @@ -1368,9 +1351,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1393,17 +1377,14 @@ public class AdSelectionServiceImplTest { adSelectionConfig), TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_OVERRIDE, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_OVERRIDE, STATUS_INTERNAL_ERROR)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_OVERRIDE), eq(STATUS_INTERNAL_ERROR), anyInt()); } @Test public void testRemoveAdSelectionConfigRemoteInfoOverrideSuccess() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( DevContext.builder() @@ -1420,9 +1401,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1455,18 +1437,15 @@ public class AdSelectionServiceImplTest { mAdSelectionEntryDao.doesAdSelectionOverrideExistForPackageName( adSelectionConfigId, TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_REMOVE_OVERRIDE, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_REMOVE_OVERRIDE, STATUS_SUCCESS)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_REMOVE_OVERRIDE), eq(STATUS_SUCCESS), anyInt()); } @Test public void testRemoveAdSelectionConfigRemoteInfoOverrideWithRevokedUserConsentSuccess() throws Exception { - doReturn(AdServicesApiConsent.REVOKED).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.REVOKED).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -1484,9 +1463,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1519,17 +1499,16 @@ public class AdSelectionServiceImplTest { mAdSelectionEntryDao.doesAdSelectionOverrideExistForPackageName( adSelectionConfigId, TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_REMOVE_OVERRIDE, STATUS_USER_CONSENT_REVOKED); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_REMOVE_OVERRIDE, STATUS_USER_CONSENT_REVOKED)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_REMOVE_OVERRIDE), + eq(STATUS_USER_CONSENT_REVOKED), + anyInt()); } @Test public void testRemoveAdSelectionConfigRemoteInfoOverrideFailsWithDevOptionsDisabled() { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn(DevContext.createForDevOptionsDisabled()); @@ -1542,9 +1521,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1576,18 +1556,15 @@ public class AdSelectionServiceImplTest { mAdSelectionEntryDao.doesAdSelectionOverrideExistForPackageName( adSelectionConfigId, TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_REMOVE_OVERRIDE, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_REMOVE_OVERRIDE, STATUS_INTERNAL_ERROR)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_REMOVE_OVERRIDE), eq(STATUS_INTERNAL_ERROR), anyInt()); } @Test public void testRemoveAdSelectionConfigRemoteInfoOverrideDoesNotDeleteWithIncorrectPackageName() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); String incorrectPackageName = "com.google.ppapi.test.incorrect"; when(mDevContextFilter.createDevContext()) @@ -1606,9 +1583,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1641,18 +1619,15 @@ public class AdSelectionServiceImplTest { mAdSelectionEntryDao.doesAdSelectionOverrideExistForPackageName( adSelectionConfigId, TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_REMOVE_OVERRIDE, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_REMOVE_OVERRIDE, STATUS_SUCCESS)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_REMOVE_OVERRIDE), eq(STATUS_SUCCESS), anyInt()); } @Test public void testResetAllAdSelectionConfigRemoteOverridesDoesNotDeleteWithIncorrectPackageName() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); String incorrectPackageName = "com.google.ppapi.test.incorrect"; when(mDevContextFilter.createDevContext()) @@ -1671,9 +1646,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1750,17 +1726,14 @@ public class AdSelectionServiceImplTest { mAdSelectionEntryDao.doesAdSelectionOverrideExistForPackageName( adSelectionConfigId3, TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_RESET_ALL_OVERRIDES, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_RESET_ALL_OVERRIDES, STATUS_SUCCESS)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_RESET_ALL_OVERRIDES), eq(STATUS_SUCCESS), anyInt()); } @Test public void testResetAllAdSelectionConfigRemoteOverridesSuccess() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( DevContext.builder() @@ -1777,9 +1750,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1856,18 +1830,15 @@ public class AdSelectionServiceImplTest { mAdSelectionEntryDao.doesAdSelectionOverrideExistForPackageName( adSelectionConfigId3, TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_RESET_ALL_OVERRIDES, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_RESET_ALL_OVERRIDES, STATUS_SUCCESS)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_RESET_ALL_OVERRIDES), eq(STATUS_SUCCESS), anyInt()); } @Test public void testResetAllAdSelectionConfigRemoteOverridesWithRevokedUserConsentSuccess() throws Exception { - doReturn(AdServicesApiConsent.REVOKED).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.REVOKED).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -1885,9 +1856,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -1964,18 +1936,16 @@ public class AdSelectionServiceImplTest { mAdSelectionEntryDao.doesAdSelectionOverrideExistForPackageName( adSelectionConfigId3, TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - SHORT_API_NAME_RESET_ALL_OVERRIDES, STATUS_USER_CONSENT_REVOKED); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_RESET_ALL_OVERRIDES, STATUS_USER_CONSENT_REVOKED)); + eq(SHORT_API_NAME_RESET_ALL_OVERRIDES), + eq(STATUS_USER_CONSENT_REVOKED), + anyInt()); } @Test public void testResetAllAdSelectionConfigRemoteOverridesFailsWithDevOptionsDisabled() { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn(DevContext.createForDevOptionsDisabled()); @@ -1988,9 +1958,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2065,12 +2036,11 @@ public class AdSelectionServiceImplTest { mAdSelectionEntryDao.doesAdSelectionOverrideExistForPackageName( adSelectionConfigId3, TEST_PACKAGE_NAME)); - verify(mAdServicesLoggerSpy) - .logFledgeApiCallStats(SHORT_API_NAME_RESET_ALL_OVERRIDES, STATUS_INTERNAL_ERROR); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - SHORT_API_NAME_RESET_ALL_OVERRIDES, STATUS_INTERNAL_ERROR)); + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(SHORT_API_NAME_RESET_ALL_OVERRIDES), + eq(STATUS_INTERNAL_ERROR), + anyInt()); } @Test @@ -2087,9 +2057,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2101,7 +2072,7 @@ public class AdSelectionServiceImplTest { @Test public void testReportImpressionForegroundCheckEnabledFails_throwsException() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn(DevContext.createForDevOptionsDisabled()); @@ -2122,9 +2093,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2151,7 +2123,7 @@ public class AdSelectionServiceImplTest { @Test public void testReportImpressionForegroundCheckDisabled_acceptBackgroundApp() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn(DevContext.createForDevOptionsDisabled()); @@ -2178,9 +2150,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, FlagsWithOverriddenFledgeChecks.createFlagsWithFledgeChecksDisabled(), CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2205,7 +2178,7 @@ public class AdSelectionServiceImplTest { @Test public void testOverrideAdSelectionForegroundCheckEnabledFails_throwsException() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -2230,9 +2203,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2260,9 +2234,9 @@ public class AdSelectionServiceImplTest { @Test public void testOverrideAdSelectionForegroundCheckDisabled_acceptBackgroundApp() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -2287,9 +2261,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, FlagsWithOverriddenFledgeChecks.createFlagsWithFledgeChecksDisabled(), CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2309,7 +2284,7 @@ public class AdSelectionServiceImplTest { @Test public void testRemoveOverrideForegroundCheckEnabledFails_throwsException() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -2333,9 +2308,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2358,7 +2334,7 @@ public class AdSelectionServiceImplTest { @Test public void testRemoveOverrideForegroundCheckDisabled_acceptBackgroundApp() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -2382,9 +2358,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, FlagsWithOverriddenFledgeChecks.createFlagsWithFledgeChecksDisabled(), CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2401,7 +2378,7 @@ public class AdSelectionServiceImplTest { @Test public void testResetAllOverridesForegroundCheckEnabledFails_throwsException() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -2425,9 +2402,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2448,7 +2426,7 @@ public class AdSelectionServiceImplTest { @Test public void testResetAllOverridesForegroundCheckDisabled_acceptBackgroundApp() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); when(mDevContextFilter.createDevContext()) .thenReturn( @@ -2472,9 +2450,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, FlagsWithOverriddenFledgeChecks.createFlagsWithFledgeChecksDisabled(), CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2487,7 +2466,7 @@ public class AdSelectionServiceImplTest { @Test public void testReportImpressionFailsWithInvalidPackageName() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); String otherPackageName = CommonFixture.TEST_PACKAGE_NAME + "incorrectPackage"; @@ -2523,13 +2502,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -2555,9 +2531,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2582,7 +2559,7 @@ public class AdSelectionServiceImplTest { @Test public void testReportImpressionFailsWhenAppCannotUsePPApi() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); doThrow(new FledgeAuthorizationFilter.AdTechNotAllowedException()) .when(mFledgeAllowListsFilterSpy) .assertAppCanUsePpapi( @@ -2621,13 +2598,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -2653,9 +2627,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2676,20 +2651,16 @@ public class AdSelectionServiceImplTest { callback.mFledgeErrorResponse.getErrorMessage()); // TODO(b/242139312): Remove atLeastOnce once this the double logging is addressed - Mockito.verify(mAdServicesLoggerSpy, Mockito.atLeastOnce()) + Mockito.verify(mAdServicesLoggerMock, Mockito.atLeastOnce()) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_CALLER_NOT_ALLOWED); - verify(mAdServicesLoggerSpy, Mockito.atLeastOnce()) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_CALLER_NOT_ALLOWED)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_CALLER_NOT_ALLOWED), + anyInt()); } @Test public void testReportImpressionFailsWhenAdTechFailsEnrollmentCheck() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); // Reset flags to perform enrollment check mFlags = new FlagsWithEnrollmentCheckEnabledSwitch(true); @@ -2727,13 +2698,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -2759,9 +2727,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2782,20 +2751,16 @@ public class AdSelectionServiceImplTest { callback.mFledgeErrorResponse.getErrorMessage()); // TODO(b/242139312): Remove atLeastOnce once this the double logging is addressed - Mockito.verify(mAdServicesLoggerSpy, Mockito.atLeastOnce()) + Mockito.verify(mAdServicesLoggerMock, Mockito.atLeastOnce()) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_CALLER_NOT_ALLOWED); - verify(mAdServicesLoggerSpy, Mockito.atLeastOnce()) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_CALLER_NOT_ALLOWED)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_CALLER_NOT_ALLOWED), + anyInt()); } @Test public void testReportImpressionSucceedsWhenAdTechPassesEnrollmentCheck() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); // Reset flags to perform enrollment check mFlags = new FlagsWithEnrollmentCheckEnabledSwitch(true); @@ -2833,13 +2798,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -2873,9 +2835,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -2891,21 +2854,18 @@ public class AdSelectionServiceImplTest { assertTrue(callback.mIsSuccess); RecordedRequest fetchRequest = server.takeRequest(); - assertEquals(mFetchJavaScriptPath, fetchRequest.getPath()); + assertEquals(mFetchJavaScriptPathSeller, fetchRequest.getPath()); List<String> notifications = ImmutableList.of(server.takeRequest().getPath(), server.takeRequest().getPath()); assertThat(notifications).containsExactly(mSellerReportingPath, mBuyerReportingPath); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_SUCCESS)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_SUCCESS), + anyInt()); } private AdSelectionOverrideTestCallback callAddOverride( @@ -2924,7 +2884,9 @@ public class AdSelectionServiceImplTest { resultLatch.countDown(); return null; }; - doAnswer(countDownAnswer).when(mAdServicesLoggerSpy).logApiCallStats(any()); + doAnswer(countDownAnswer) + .when(mAdServicesLoggerMock) + .logFledgeApiCallStats(anyInt(), anyInt(), anyInt()); adSelectionService.overrideAdSelectionConfigRemoteInfo( adSelectionConfig, decisionLogicJS, trustedScoringSignals, callback); @@ -2945,7 +2907,9 @@ public class AdSelectionServiceImplTest { resultLatch.countDown(); return null; }; - doAnswer(countDownAnswer).when(mAdServicesLoggerSpy).logApiCallStats(any()); + doAnswer(countDownAnswer) + .when(mAdServicesLoggerMock) + .logFledgeApiCallStats(anyInt(), anyInt(), anyInt()); adSelectionService.removeAdSelectionConfigRemoteInfoOverride(adSelectionConfig, callback); resultLatch.await(); @@ -2954,7 +2918,7 @@ public class AdSelectionServiceImplTest { @Test public void testAdSelectionConfigInvalidSellerAndSellerUris() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -2982,13 +2946,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -3016,9 +2977,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, mFlags, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -3038,20 +3000,16 @@ public class AdSelectionServiceImplTest { assertEquals( "Error response code mismatch", STATUS_INVALID_ARGUMENT, response.getStatusCode()); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INVALID_ARGUMENT); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_INVALID_ARGUMENT)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_INVALID_ARGUMENT), + anyInt()); } @Test public void testReportImpressionSuccessThrottledSubsequentCallFailure() throws Exception { - doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(any()); + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); @@ -3086,13 +3044,10 @@ public class AdSelectionServiceImplTest { .setBuyerDecisionLogicJs(buyerDecisionLogicJs) .build(); - CustomAudienceSignals customAudienceSignals = - CustomAudienceSignalsFixture.aCustomAudienceSignals(); - DBAdSelection dbAdSelection = new DBAdSelection.Builder() .setAdSelectionId(AD_SELECTION_ID) - .setCustomAudienceSignals(customAudienceSignals) + .setCustomAudienceSignals(mCustomAudienceSignals) .setContextualSignals(mContextualSignals.toString()) .setBiddingLogicUri(BUYER_BIDDING_LOGIC_URI) .setWinningAdRenderUri(RENDER_URI) @@ -3157,9 +3112,10 @@ public class AdSelectionServiceImplTest { mAppImportanceFilter, mLightweightExecutorService, mBackgroundExecutorService, + mScheduledExecutor, CONTEXT, mConsentManagerMock, - mAdServicesLoggerSpy, + mAdServicesLoggerMock, flagsWithThrottling, CallingAppUidSupplierProcessImpl.create(), mFledgeAuthorizationFilterSpy, @@ -3182,16 +3138,13 @@ public class AdSelectionServiceImplTest { assertTrue(callbackFirstCall.mIsSuccess); RecordedRequest fetchRequest = server.takeRequest(); - assertEquals(mFetchJavaScriptPath, fetchRequest.getPath()); + assertEquals(mFetchJavaScriptPathSeller, fetchRequest.getPath()); - verify(mAdServicesLoggerSpy) + verify(mAdServicesLoggerMock) .logFledgeApiCallStats( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, STATUS_SUCCESS); - verify(mAdServicesLoggerSpy) - .logApiCallStats( - aCallStatForFledgeApiWithStatus( - AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION, - STATUS_SUCCESS)); + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_SUCCESS), + anyInt()); assertFalse(callbackSubsequentCall.mIsSuccess); assertEquals( @@ -3203,6 +3156,312 @@ public class AdSelectionServiceImplTest { resetThrottlerToNoRateLimits(); } + @Test + public void testReportImpressionDoestNotReportWhenUrisDoNotMatchDomain() throws Exception { + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); + + // Instantiate a server with different domain from buyer and seller for reporting + MockWebServer reportingServer = new MockWebServer(); + reportingServer.play(); + Uri sellerReportingUri = Uri.parse(reportingServer.getUrl(mSellerReportingPath).toString()); + Uri buyerReportingUri = Uri.parse(reportingServer.getUrl(mBuyerReportingPath).toString()); + + Uri biddingLogicUri = (mMockWebServerRule.uriForPath(mFetchJavaScriptPathBuyer)); + + String sellerDecisionLogicJs = + "function reportResult(ad_selection_config, render_uri, bid, contextual_signals) {" + + " \n" + + " return {'status': 0, 'results': {'signals_for_buyer':" + + " '{\"signals_for_buyer\":1}', 'reporting_uri': '" + + sellerReportingUri + + "' } };\n" + + "}"; + + String buyerDecisionLogicJs = + "function reportWin(ad_selection_signals, per_buyer_signals, signals_for_buyer," + + " contextual_signals, custom_audience_signals) { \n" + + " return {'status': 0, 'results': {'reporting_uri': '" + + buyerReportingUri + + "' } };\n" + + "}"; + + MockWebServer server = + mMockWebServerRule.startMockWebServer( + List.of(new MockResponse().setBody(sellerDecisionLogicJs))); + + DBBuyerDecisionLogic dbBuyerDecisionLogic = + new DBBuyerDecisionLogic.Builder() + .setBiddingLogicUri(biddingLogicUri) + .setBuyerDecisionLogicJs(buyerDecisionLogicJs) + .build(); + + DBAdSelection dbAdSelection = + new DBAdSelection.Builder() + .setAdSelectionId(AD_SELECTION_ID) + .setCustomAudienceSignals(mCustomAudienceSignals) + .setContextualSignals(mContextualSignals.toString()) + .setBiddingLogicUri(biddingLogicUri) + .setWinningAdRenderUri(RENDER_URI) + .setWinningAdBid(BID) + .setCreationTimestamp(ACTIVATION_TIME) + .setCallerPackageName(CommonFixture.TEST_PACKAGE_NAME) + .build(); + + mAdSelectionEntryDao.persistAdSelection(dbAdSelection); + mAdSelectionEntryDao.persistBuyerDecisionLogic(dbBuyerDecisionLogic); + + AdSelectionConfig adSelectionConfig = mAdSelectionConfigBuilder.build(); + + when(mDevContextFilter.createDevContext()) + .thenReturn(DevContext.createForDevOptionsDisabled()); + + AdSelectionServiceImpl adSelectionService = + new AdSelectionServiceImpl( + mAdSelectionEntryDao, + mCustomAudienceDao, + mClient, + mDevContextFilter, + mAppImportanceFilter, + mLightweightExecutorService, + mBackgroundExecutorService, + mScheduledExecutor, + CONTEXT, + mConsentManagerMock, + mAdServicesLoggerMock, + mFlags, + CallingAppUidSupplierProcessImpl.create(), + mFledgeAuthorizationFilterSpy, + mFledgeAllowListsFilterSpy); + + ReportImpressionInput input = + new ReportImpressionInput.Builder() + .setAdSelectionId(AD_SELECTION_ID) + .setAdSelectionConfig(adSelectionConfig) + .setCallerPackageName(TEST_PACKAGE_NAME) + .build(); + ReportImpressionTestCallback callback = callReportImpression(adSelectionService, input); + assertTrue(callback.mIsSuccess); + RecordedRequest fetchRequest = server.takeRequest(); + assertEquals(mFetchJavaScriptPathSeller, fetchRequest.getPath()); + + // Assert that reporting didn't happen + assertEquals(reportingServer.getRequestCount(), 0); + + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_SUCCESS), + anyInt()); + } + + @Test + public void testReportImpressionOnlyReportsBuyerWhenSellerReportingUriDoesNotMatchDomain() + throws Exception { + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); + + Uri buyerReportingUri = mMockWebServerRule.uriForPath(mBuyerReportingPath); + + // Instantiate a server with a different domain than seller + MockWebServer sellerServer = new MockWebServer(); + sellerServer.play(); + Uri sellerReportingUri = Uri.parse(sellerServer.getUrl(mSellerReportingPath).toString()); + + Uri biddingLogicUri = (mMockWebServerRule.uriForPath(mFetchJavaScriptPathBuyer)); + + String sellerDecisionLogicJs = + "function reportResult(ad_selection_config, render_uri, bid, contextual_signals) {" + + " \n" + + " return {'status': 0, 'results': {'signals_for_buyer':" + + " '{\"signals_for_buyer\":1}', 'reporting_uri': '" + + sellerReportingUri + + "' } };\n" + + "}"; + + String buyerDecisionLogicJs = + "function reportWin(ad_selection_signals, per_buyer_signals, signals_for_buyer," + + " contextual_signals, custom_audience_signals) { \n" + + " return {'status': 0, 'results': {'reporting_uri': '" + + buyerReportingUri + + "' } };\n" + + "}"; + + MockWebServer server = + mMockWebServerRule.startMockWebServer( + List.of( + new MockResponse().setBody(sellerDecisionLogicJs), + new MockResponse())); + + DBBuyerDecisionLogic dbBuyerDecisionLogic = + new DBBuyerDecisionLogic.Builder() + .setBiddingLogicUri(biddingLogicUri) + .setBuyerDecisionLogicJs(buyerDecisionLogicJs) + .build(); + + DBAdSelection dbAdSelection = + new DBAdSelection.Builder() + .setAdSelectionId(AD_SELECTION_ID) + .setCustomAudienceSignals(mCustomAudienceSignals) + .setContextualSignals(mContextualSignals.toString()) + .setBiddingLogicUri(biddingLogicUri) + .setWinningAdRenderUri(RENDER_URI) + .setWinningAdBid(BID) + .setCreationTimestamp(ACTIVATION_TIME) + .setCallerPackageName(CommonFixture.TEST_PACKAGE_NAME) + .build(); + + mAdSelectionEntryDao.persistAdSelection(dbAdSelection); + mAdSelectionEntryDao.persistBuyerDecisionLogic(dbBuyerDecisionLogic); + + AdSelectionConfig adSelectionConfig = mAdSelectionConfigBuilder.build(); + + when(mDevContextFilter.createDevContext()) + .thenReturn(DevContext.createForDevOptionsDisabled()); + + AdSelectionServiceImpl adSelectionService = + new AdSelectionServiceImpl( + mAdSelectionEntryDao, + mCustomAudienceDao, + mClient, + mDevContextFilter, + mAppImportanceFilter, + mLightweightExecutorService, + mBackgroundExecutorService, + mScheduledExecutor, + CONTEXT, + mConsentManagerMock, + mAdServicesLoggerMock, + mFlags, + CallingAppUidSupplierProcessImpl.create(), + mFledgeAuthorizationFilterSpy, + mFledgeAllowListsFilterSpy); + + ReportImpressionInput input = + new ReportImpressionInput.Builder() + .setAdSelectionId(AD_SELECTION_ID) + .setAdSelectionConfig(adSelectionConfig) + .setCallerPackageName(TEST_PACKAGE_NAME) + .build(); + ReportImpressionTestCallback callback = callReportImpression(adSelectionService, input); + assertTrue(callback.mIsSuccess); + RecordedRequest fetchRequest = server.takeRequest(); + assertEquals(mFetchJavaScriptPathSeller, fetchRequest.getPath()); + + assertEquals(mBuyerReportingPath, server.takeRequest().getPath()); + + // Assert that buyer reporting didn't happen + assertEquals(sellerServer.getRequestCount(), 0); + + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_SUCCESS), + anyInt()); + } + + @Test + public void testReportImpressionOnlyReportsSellerWhenBuyerReportingUriDoesNotMatchDomain() + throws Exception { + doReturn(AdServicesApiConsent.GIVEN).when(mConsentManagerMock).getConsent(); + + Uri sellerReportingUri = mMockWebServerRule.uriForPath(mSellerReportingPath); + + // Instantiate a server with a different domain than buyer + MockWebServer buyerServer = new MockWebServer(); + buyerServer.play(); + Uri buyerReportingUri = Uri.parse(buyerServer.getUrl(mBuyerReportingPath).toString()); + + Uri biddingLogicUri = (mMockWebServerRule.uriForPath(mFetchJavaScriptPathBuyer)); + + String sellerDecisionLogicJs = + "function reportResult(ad_selection_config, render_uri, bid, contextual_signals) {" + + " \n" + + " return {'status': 0, 'results': {'signals_for_buyer':" + + " '{\"signals_for_buyer\":1}', 'reporting_uri': '" + + sellerReportingUri + + "' } };\n" + + "}"; + + String buyerDecisionLogicJs = + "function reportWin(ad_selection_signals, per_buyer_signals, signals_for_buyer," + + " contextual_signals, custom_audience_signals) { \n" + + " return {'status': 0, 'results': {'reporting_uri': '" + + buyerReportingUri + + "' } };\n" + + "}"; + + MockWebServer server = + mMockWebServerRule.startMockWebServer( + List.of( + new MockResponse().setBody(sellerDecisionLogicJs), + new MockResponse())); + + DBBuyerDecisionLogic dbBuyerDecisionLogic = + new DBBuyerDecisionLogic.Builder() + .setBiddingLogicUri(biddingLogicUri) + .setBuyerDecisionLogicJs(buyerDecisionLogicJs) + .build(); + + DBAdSelection dbAdSelection = + new DBAdSelection.Builder() + .setAdSelectionId(AD_SELECTION_ID) + .setCustomAudienceSignals(mCustomAudienceSignals) + .setContextualSignals(mContextualSignals.toString()) + .setBiddingLogicUri(biddingLogicUri) + .setWinningAdRenderUri(RENDER_URI) + .setWinningAdBid(BID) + .setCreationTimestamp(ACTIVATION_TIME) + .setCallerPackageName(CommonFixture.TEST_PACKAGE_NAME) + .build(); + + mAdSelectionEntryDao.persistAdSelection(dbAdSelection); + mAdSelectionEntryDao.persistBuyerDecisionLogic(dbBuyerDecisionLogic); + + AdSelectionConfig adSelectionConfig = mAdSelectionConfigBuilder.build(); + + when(mDevContextFilter.createDevContext()) + .thenReturn(DevContext.createForDevOptionsDisabled()); + + AdSelectionServiceImpl adSelectionService = + new AdSelectionServiceImpl( + mAdSelectionEntryDao, + mCustomAudienceDao, + mClient, + mDevContextFilter, + mAppImportanceFilter, + mLightweightExecutorService, + mBackgroundExecutorService, + mScheduledExecutor, + CONTEXT, + mConsentManagerMock, + mAdServicesLoggerMock, + mFlags, + CallingAppUidSupplierProcessImpl.create(), + mFledgeAuthorizationFilterSpy, + mFledgeAllowListsFilterSpy); + + ReportImpressionInput input = + new ReportImpressionInput.Builder() + .setAdSelectionId(AD_SELECTION_ID) + .setAdSelectionConfig(adSelectionConfig) + .setCallerPackageName(TEST_PACKAGE_NAME) + .build(); + ReportImpressionTestCallback callback = callReportImpression(adSelectionService, input); + assertTrue(callback.mIsSuccess); + RecordedRequest fetchRequest = server.takeRequest(); + assertEquals(mFetchJavaScriptPathSeller, fetchRequest.getPath()); + + assertEquals(mSellerReportingPath, server.takeRequest().getPath()); + + // Assert that buyer reporting didn't happen + assertEquals(buyerServer.getRequestCount(), 0); + + verify(mAdServicesLoggerMock) + .logFledgeApiCallStats( + eq(AD_SERVICES_API_CALLED__API_NAME__REPORT_IMPRESSION), + eq(STATUS_SUCCESS), + anyInt()); + } + /** * Given Throttler is singleton, & shared across tests, this method should be invoked after * tests that impose restrictive rate limits. @@ -3225,7 +3484,9 @@ public class AdSelectionServiceImplTest { resultLatch.countDown(); return null; }; - doAnswer(countDownAnswer).when(mAdServicesLoggerSpy).logApiCallStats(any()); + doAnswer(countDownAnswer) + .when(mAdServicesLoggerMock) + .logFledgeApiCallStats(anyInt(), anyInt(), anyInt()); adSelectionService.resetAllAdSelectionConfigRemoteOverrides(callback); resultLatch.await(); @@ -3245,7 +3506,9 @@ public class AdSelectionServiceImplTest { resultLatch.countDown(); return null; }; - doAnswer(countDownAnswer).when(mAdServicesLoggerSpy).logApiCallStats(any()); + doAnswer(countDownAnswer) + .when(mAdServicesLoggerMock) + .logFledgeApiCallStats(anyInt(), anyInt(), anyInt()); adSelectionService.reportImpression(requestParams, callback); resultLatch.await(); |