Fix flaky IpMemoryStoreServiceTest.testFullMaintenance/testInterruptMaintenance
These two tests failed due to running over than 60s. The reason
is too many fake data that need to insert into database. It will
take long time and cause test time out. So preload the data base
with fake data to save the I/O operation time which can reduce
testing time for these tests.
Fix: 140538459
Test: atest NetworkStackTests on both CF and P3
Change-Id: Iac30a2be933ed10450f0704075f08d10c1886986
diff --git a/tests/unit/res/raw/test.db b/tests/unit/res/raw/test.db
new file mode 100644
index 0000000..05cc77b
--- /dev/null
+++ b/tests/unit/res/raw/test.db
Binary files differ
diff --git a/tests/unit/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java b/tests/unit/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java
index ba86fcf..4e34969 100644
--- a/tests/unit/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java
+++ b/tests/unit/src/com/android/server/connectivity/ipmemorystore/IpMemoryStoreServiceTest.java
@@ -48,6 +48,10 @@
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.server.networkstack.tests.R;
+
+import libcore.io.Streams;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -56,6 +60,9 @@
import org.mockito.MockitoAnnotations;
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.lang.reflect.Modifier;
import java.net.Inet4Address;
import java.net.Inet6Address;
@@ -73,12 +80,15 @@
public class IpMemoryStoreServiceTest {
private static final String TEST_CLIENT_ID = "testClientId";
private static final String TEST_DATA_NAME = "testData";
+ private static final String TEST_DATABASE_NAME = "test.db";
private static final int TEST_DATABASE_SIZE_THRESHOLD = 100 * 1024; //100KB
private static final int DEFAULT_TIMEOUT_MS = 5000;
private static final int LONG_TIMEOUT_MS = 30000;
private static final int FAKE_KEY_COUNT = 20;
private static final long LEASE_EXPIRY_NULL = -1L;
+ private static final long UNIX_TIME_MS_2000_01_01 = 946652400000L;
+ private static final long UNIX_TIME_MS_2100_01_01 = 4102412400000L;
private static final int MTU_NULL = -1;
private static final String[] FAKE_KEYS;
private static final byte[] TEST_BLOB_DATA = new byte[] { -3, 6, 8, -9, 12,
@@ -103,7 +113,7 @@
MockitoAnnotations.initMocks(this);
final Context context = InstrumentationRegistry.getContext();
final File dir = context.getFilesDir();
- mDbFile = new File(dir, "test.db");
+ mDbFile = new File(dir, TEST_DATABASE_NAME);
doReturn(mDbFile).when(mMockContext).getDatabasePath(anyString());
doReturn(mMockJobScheduler).when(mMockContext)
.getSystemService(Context.JOB_SCHEDULER_SERVICE);
@@ -129,6 +139,16 @@
mDbFile.delete();
}
+ private void copyTestData(final File file) throws Exception {
+ try (
+ InputStream in = InstrumentationRegistry.getContext()
+ .getResources().openRawResource(R.raw.test);
+ OutputStream out = new FileOutputStream(file)
+ ) {
+ Streams.copy(in, out);
+ }
+ }
+
/** Helper method to build test network attributes */
private static NetworkAttributes.Builder buildTestNetworkAttributes(
final Inet4Address ipAddress, final long expiry, final String hint,
@@ -321,20 +341,32 @@
})));
}
- /** Insert large data that db size will be over threshold for maintenance test usage. */
- private void insertFakeDataAndOverThreshold() {
+ /**
+ * This method is used to generate test.db file.
+ *
+ * Here are the steps to update the test.db file if you need to change value in DB.
+ * 1. Create a new test like "testGenerateDB" and have only one line code "generateFakeData()".
+ * 2. Comment out "mDbFile.delete()" in tearDown() method.
+ * 3. Run "atest IpMemoryStoreServiceTest#testGenerateDB".
+ * 4. Run "adb root; adb pull /data/data/com.android.server.networkstack.tests/files/test.db
+ * $YOUR_CODE_BASE/package/module/NetworkStack/tests/unit/res/raw/test.db".
+ *
+ */
+ private void generateFakeData() {
+ final int fakeDataCount = 1000;
+ final int expiredRecordsCount = 100;
try {
final NetworkAttributes.Builder na = buildTestNetworkAttributes(
(Inet4Address) Inet4Address.getByName("1.2.3.4"), LEASE_EXPIRY_NULL,
"hint1", Arrays.asList(Inet6Address.getByName("0A1C:2E40:480A::1CA6")),
219);
final long time = System.currentTimeMillis() - 1;
- for (int i = 0; i < 1000; i++) {
+ for (int i = 0; i < fakeDataCount; i++) {
int errorCode = IpMemoryStoreDatabase.storeNetworkAttributes(
mService.mDb,
"fakeKey" + i,
- // Let first 100 records get expiry.
- i < 100 ? time : time + TimeUnit.HOURS.toMillis(i),
+ i < expiredRecordsCount
+ ? UNIX_TIME_MS_2000_01_01 : UNIX_TIME_MS_2100_01_01 + i,
na.build());
assertEquals(errorCode, Status.SUCCESS);
@@ -344,7 +376,7 @@
assertEquals(errorCode, Status.SUCCESS);
}
- // After added 5000 records, db size is larger than fake threshold(100KB).
+ // After inserted fake data, db size should be larger than threshold.
assertTrue(mService.isDbSizeOverThreshold());
} catch (final UnknownHostException e) {
fail("Insert fake data fail");
@@ -634,8 +666,10 @@
}
@Test
- public void testFullMaintenance() {
- insertFakeDataAndOverThreshold();
+ public void testFullMaintenance() throws Exception {
+ copyTestData(mDbFile);
+ // After inserted test data, db size should be larger than threshold.
+ assertTrue(mService.isDbSizeOverThreshold());
final InterruptMaintenance im = new InterruptMaintenance(0/* Fake JobId */);
// Do full maintenance and then db size should go down and meet the threshold.
@@ -651,8 +685,10 @@
}
@Test
- public void testInterruptMaintenance() {
- insertFakeDataAndOverThreshold();
+ public void testInterruptMaintenance() throws Exception {
+ copyTestData(mDbFile);
+ // After inserted test data, db size should be larger than threshold.
+ assertTrue(mService.isDbSizeOverThreshold());
final InterruptMaintenance im = new InterruptMaintenance(0/* Fake JobId */);