Use the real DB instead of mocking in CacheManagerTest
Test: atest com.android.adservices.service.topics.CacheManagerTest
Bug: 229297182
Change-Id: Ic90aa15f9e3acede0413ea20245e9e4db305fe9e
diff --git a/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/CacheManagerTest.java b/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/CacheManagerTest.java
index 0623ab8..f871c7d 100644
--- a/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/CacheManagerTest.java
+++ b/adservices/tests/unittest/service-core/src/com/android/adservices/service/topics/CacheManagerTest.java
@@ -17,17 +17,18 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.content.Context;
import android.util.Pair;
+import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.SmallTest;
import com.android.adservices.data.topics.Topic;
import com.android.adservices.data.topics.TopicsDao;
import com.android.adservices.service.Flags;
-import com.android.adservices.service.FlagsFactory;
import org.junit.Before;
import org.junit.Test;
@@ -43,21 +44,24 @@
@SmallTest
public final class CacheManagerTest {
private static final String TAG = "CacheManagerTest";
+ private final Context mContext = ApplicationProvider.getApplicationContext();
- private final Flags mFlags = FlagsFactory.getFlagsForTest();
+ private TopicsDao mTopicsDao;
- @Mock TopicsDao mMockTopicsDao;
+ @Mock Flags mMockFlags;
@Mock EpochManager mMockEpochManager;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
+
+ mTopicsDao = TopicsDao.getInstanceForTest(mContext);
}
@Test
public void testGetTopics_emptyCache() {
// The cache is empty when first created.
- CacheManager cacheManager = new CacheManager(mMockEpochManager, mMockTopicsDao, mFlags);
+ CacheManager cacheManager = new CacheManager(mMockEpochManager, mTopicsDao, mMockFlags);
List<Topic> topics = cacheManager.getTopics(
/* numberOfLookBackEpochs = */ 3,
@@ -69,15 +73,63 @@
@Test
public void testGetTopics() {
// The cache is empty.
- CacheManager cacheManager = new CacheManager(mMockEpochManager, mMockTopicsDao, mFlags);
+ CacheManager cacheManager = new CacheManager(mMockEpochManager, mTopicsDao, mMockFlags);
// Assume the current epochId is 4L, we will load cache for returned topics in the last 3
// epochs: epochId in {3, 2, 1}.
long currentEpochId = 4L;
when(mMockEpochManager.getCurrentEpochId()).thenReturn(currentEpochId);
+ // Mock Flags to make it independent of configuration
+ when(mMockFlags.getTopicsNumberOfLookBackEpochs()).thenReturn(3);
// EpochId 1
- Map<Pair<String, String>, Topic> returnedAppSdkTopicsForEpoch1 = new HashMap<>();
+ Map<Pair<String, String>, String> returnedAppSdkTopicsMap1 = new HashMap<>();
+ returnedAppSdkTopicsMap1.put(Pair.create("app1", ""), "topic1");
+ returnedAppSdkTopicsMap1.put(Pair.create("app1", "sdk1"), "topic1");
+ returnedAppSdkTopicsMap1.put(Pair.create("app1", "sdk2"), "topic1");
+
+ returnedAppSdkTopicsMap1.put(Pair.create("app2", "sdk1"), "topic2");
+ returnedAppSdkTopicsMap1.put(Pair.create("app2", "sdk3"), "topic2");
+ returnedAppSdkTopicsMap1.put(Pair.create("app2", "sdk4"), "topic2");
+
+ returnedAppSdkTopicsMap1.put(Pair.create("app3", "sdk1"), "topic3");
+
+ returnedAppSdkTopicsMap1.put(Pair.create("app5", "sdk1"), "topic5");
+ returnedAppSdkTopicsMap1.put(Pair.create("app5", "sdk5"), "topic5");
+
+ mTopicsDao.persistReturnedAppTopicsMap(/* epochId */ 1L,
+ /* taxonomyVersion */ 1L,
+ /* modelVersion */ 1L, returnedAppSdkTopicsMap1);
+
+ // EpochId 2
+ Map<Pair<String, String>, String> returnedAppSdkTopicsMap2 = new HashMap<>();
+
+ returnedAppSdkTopicsMap2.put(Pair.create("app1", ""), "topic2");
+ returnedAppSdkTopicsMap2.put(Pair.create("app1", "sdk1"), "topic2");
+ returnedAppSdkTopicsMap2.put(Pair.create("app1", "sdk2"), "topic2");
+
+ returnedAppSdkTopicsMap2.put(Pair.create("app2", "sdk1"), "topic3");
+ returnedAppSdkTopicsMap2.put(Pair.create("app2", "sdk3"), "topic3");
+ returnedAppSdkTopicsMap2.put(Pair.create("app2", "sdk4"), "topic3");
+
+ returnedAppSdkTopicsMap2.put(Pair.create("app3", "sdk1"), "topic4");
+
+ returnedAppSdkTopicsMap2.put(Pair.create("app5", "sdk1"), "topic1");
+ returnedAppSdkTopicsMap2.put(Pair.create("app5", "sdk5"), "topic1");
+
+ mTopicsDao.persistReturnedAppTopicsMap(/* epochId */ 2L,
+ /* taxonomyVersion */ 1L,
+ /* modelVersion */ 1L, returnedAppSdkTopicsMap2);
+
+ // EpochId 3
+ // epochId == 3 does not have any topics. This could happen if the epoch computation failed
+ // or the device was offline and no epoch computation was done.
+
+ cacheManager.loadCache();
+
+ verify(mMockEpochManager).getCurrentEpochId();
+ verify(mMockFlags).getTopicsNumberOfLookBackEpochs();
+
Topic topic1 = new Topic("topic1", /* taxonomyVersion = */ 1L,
/* modelVersion = */ 1L);
Topic topic2 = new Topic("topic2", /* taxonomyVersion = */ 1L,
@@ -89,50 +141,6 @@
Topic topic5 = new Topic("topic5", /* taxonomyVersion = */ 1L,
/* modelVersion = */ 1L);
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app1", ""), topic1);
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app1", "sdk1"), topic1);
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app1", "sdk2"), topic1);
-
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app2", "sdk1"), topic2);
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app2", "sdk3"), topic2);
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app2", "sdk4"), topic2);
-
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app3", "sdk1"), topic3);
-
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app5", "sdk1"), topic5);
- returnedAppSdkTopicsForEpoch1.put(Pair.create("app5", "sdk5"), topic5);
-
- // EpochId 2
- Map<Pair<String, String>, Topic> returnedAppSdkTopicsForEpoch2 = new HashMap<>();
-
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app1", ""), topic2);
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app1", "sdk1"), topic2);
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app1", "sdk2"), topic2);
-
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app2", "sdk1"), topic3);
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app2", "sdk3"), topic3);
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app2", "sdk4"), topic3);
-
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app3", "sdk1"), topic4);
-
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app5", "sdk1"), topic1);
- returnedAppSdkTopicsForEpoch2.put(Pair.create("app5", "sdk5"), topic1);
-
- // EpochId 3
- // epochId == 3 does not have any topics. This could happen if the epoch computation failed
- // or the device was offline and no epoch computation was done.
- Map<Pair<String, String>, Topic> returnedAppSdkTopicsForEpoch3 = new HashMap<>();
-
- Map<Long, Map<Pair<String, String>, Topic>> cache = new HashMap<>();
- cache.put(/* epochId = */ 1L, returnedAppSdkTopicsForEpoch1);
- cache.put(/* epochId = */ 2L, returnedAppSdkTopicsForEpoch2);
- cache.put(/* epochId = */ 3L, returnedAppSdkTopicsForEpoch3);
-
- when(mMockTopicsDao.retrieveReturnedTopics(eq(currentEpochId),
- eq(mFlags.getTopicsNumberOfLookBackEpochs() + 1))).thenReturn(cache);
-
- cacheManager.loadCache();
-
// Now look at epochId == 3 only by setting numberOfLookBackEpochs == 1.
// Since the epochId 3 has empty cache, the results are always empty.
assertThat(cacheManager.getTopics(/* numberOfLookBackEpochs = */ 1,
@@ -195,16 +203,15 @@
"app5", "sdk1")).isEqualTo(Arrays.asList(topic1, topic5));
}
+ // Currently SQLException is not thrown. This test needs to be uplifted after SQLException gets
+ // handled.
+ // TODO(b/230669931): Handle SQLException.
@Test
public void testGetTopics_failToLoadFromDb() {
// The cache is empty when first created.
- CacheManager cacheManager = new CacheManager(mMockEpochManager, mMockTopicsDao, mFlags);
+ CacheManager cacheManager = new CacheManager(mMockEpochManager, mTopicsDao, mMockFlags);
- long currentEpochId = 4L;
// Fail to load from DB will have empty cache.
- Map<Long, Map<Pair<String, String>, Topic>> emptyCache = new HashMap<>();
- when(mMockTopicsDao.retrieveReturnedTopics(eq(currentEpochId),
- eq(mFlags.getTopicsNumberOfLookBackEpochs() + 1))).thenReturn(emptyCache);
List<Topic> topics = cacheManager.getTopics(
/* numberOfLookBackEpochs = */ 3,