/* * Copyright (C) 2022 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 com.android.adservices.service.customaudience; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import android.adservices.common.CommonFixture; import android.adservices.customaudience.CustomAudienceFixture; import com.android.adservices.data.customaudience.CustomAudienceDao; import com.android.adservices.service.Flags; import com.android.adservices.service.FlagsFactory; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.util.List; @RunWith(MockitoJUnitRunner.class) public class CustomAudienceQuantityCheckerTest { private static final Flags FLAGS = FlagsFactory.getFlagsForTest(); @Mock private CustomAudienceDao mCustomAudienceDao; private CustomAudienceQuantityChecker mChecker; @Before public void setup() { mChecker = new CustomAudienceQuantityChecker(mCustomAudienceDao, FLAGS); } @Test public void testNullCustomAudience_throwNPE() { assertThrows( NullPointerException.class, () -> mChecker.check(null, CustomAudienceFixture.VALID_OWNER)); verifyNoMoreInteractions(mCustomAudienceDao); } @Test public void testNullCallerPackageName_throwNPE() { assertThrows( NullPointerException.class, () -> mChecker.check( CustomAudienceFixture.getValidBuilderForBuyer( CommonFixture.VALID_BUYER_1) .build(), null)); verifyNoMoreInteractions(mCustomAudienceDao); } @Test public void testExistOwnerAndOwnerReachMax_success() { when(mCustomAudienceDao.getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER)) .thenReturn( new CustomAudienceDao.CustomAudienceStats( CustomAudienceFixture.VALID_OWNER, 20L, 1L, FLAGS.getFledgeCustomAudienceMaxOwnerCount())); mChecker.check( CustomAudienceFixture.getValidBuilderForBuyer(CommonFixture.VALID_BUYER_1).build(), CustomAudienceFixture.VALID_OWNER); verify(mCustomAudienceDao).getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER); verifyNoMoreInteractions(mCustomAudienceDao); } @Test public void testOwnerExceedMax() { when(mCustomAudienceDao.getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER)) .thenReturn( new CustomAudienceDao.CustomAudienceStats( CustomAudienceFixture.VALID_OWNER, 20L, 0L, FLAGS.getFledgeCustomAudienceMaxOwnerCount())); assertViolations( assertThrows( IllegalArgumentException.class, () -> mChecker.check( CustomAudienceFixture.getValidBuilderForBuyer( CommonFixture.VALID_BUYER_1) .build(), CustomAudienceFixture.VALID_OWNER)), CustomAudienceQuantityChecker .THE_MAX_NUMBER_OF_OWNER_ALLOWED_FOR_THE_DEVICE_HAD_REACHED); verify(mCustomAudienceDao).getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER); verifyNoMoreInteractions(mCustomAudienceDao); } @Test public void testTotalCountExceedMax() { when(mCustomAudienceDao.getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER)) .thenReturn( new CustomAudienceDao.CustomAudienceStats( CustomAudienceFixture.VALID_OWNER, FLAGS.getFledgeCustomAudienceMaxCount(), 0L, 1L)); assertViolations( assertThrows( IllegalArgumentException.class, () -> mChecker.check( CustomAudienceFixture.getValidBuilderForBuyer( CommonFixture.VALID_BUYER_1) .build(), CustomAudienceFixture.VALID_OWNER)), CustomAudienceQuantityChecker .THE_MAX_NUMBER_OF_CUSTOM_AUDIENCE_FOR_THE_DEVICE_HAD_REACHED); verify(mCustomAudienceDao).getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER); verifyNoMoreInteractions(mCustomAudienceDao); } @Test public void testPerOwnerCountExceedMax() { when(mCustomAudienceDao.getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER)) .thenReturn( new CustomAudienceDao.CustomAudienceStats( CustomAudienceFixture.VALID_OWNER, 20L, FLAGS.getFledgeCustomAudiencePerAppMaxCount(), 1L)); assertViolations( assertThrows( IllegalArgumentException.class, () -> mChecker.check( CustomAudienceFixture.getValidBuilderForBuyer( CommonFixture.VALID_BUYER_1) .build(), CustomAudienceFixture.VALID_OWNER)), CustomAudienceQuantityChecker .THE_MAX_NUMBER_OF_CUSTOM_AUDIENCE_FOR_THE_OWNER_HAD_REACHED); verify(mCustomAudienceDao).getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER); verifyNoMoreInteractions(mCustomAudienceDao); } @Test public void testAllGood() { when(mCustomAudienceDao.getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER)) .thenReturn( new CustomAudienceDao.CustomAudienceStats( CustomAudienceFixture.VALID_OWNER, 0L, 0L, 0L)); mChecker.check( CustomAudienceFixture.getValidBuilderForBuyer(CommonFixture.VALID_BUYER_1).build(), CustomAudienceFixture.VALID_OWNER); verify(mCustomAudienceDao).getCustomAudienceStats(CustomAudienceFixture.VALID_OWNER); verifyNoMoreInteractions(mCustomAudienceDao); } private void assertViolations(Exception exception, String... violations) { assertEquals( String.format( CustomAudienceQuantityChecker.CUSTOM_AUDIENCE_QUANTITY_CHECK_FAILED, List.of(violations)), exception.getMessage()); } }