Fix CacheOomRankerTest.
These tests were using `assertThat(x).containsExactly(y)`, which does
not check for order. We need to append `.inOrder()`. This exposes a
couple of other issues in the tests (but fortunately none in the actual
code!).
Test: atest CacheOomRankerTest
Bug: 191357172
Change-Id: I9facbdaf3b1fe7c91f5e387e7c44a9b1e9be2d6f
Merged-In: I9facbdaf3b1fe7c91f5e387e7c44a9b1e9be2d6f
(cherry picked from commit 44993614de)
This commit is contained in:
@@ -21,12 +21,15 @@ import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
|
|||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
|
|
||||||
|
import android.app.IApplicationThread;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageManagerInternal;
|
import android.content.pm.PackageManagerInternal;
|
||||||
|
import android.os.Environment;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
@@ -48,7 +51,10 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.junit.MockitoJUnitRunner;
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.time.Duration;
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.ZoneOffset;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
@@ -62,6 +68,8 @@ import java.util.concurrent.TimeUnit;
|
|||||||
*/
|
*/
|
||||||
@RunWith(MockitoJUnitRunner.class)
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
public class CacheOomRankerTest {
|
public class CacheOomRankerTest {
|
||||||
|
private static final Instant NOW = LocalDate.of(2021, 1, 1).atStartOfDay(
|
||||||
|
ZoneOffset.UTC).toInstant();
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private AppOpsService mAppOpsService;
|
private AppOpsService mAppOpsService;
|
||||||
@@ -172,31 +180,32 @@ public class CacheOomRankerTest {
|
|||||||
ProcessList list = new ProcessList();
|
ProcessList list = new ProcessList();
|
||||||
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
||||||
ProcessRecord lastUsed40MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord lastUsed40MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000);
|
NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000);
|
||||||
processList.add(lastUsed40MinutesAgo);
|
processList.add(lastUsed40MinutesAgo);
|
||||||
ProcessRecord lastUsed42MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord lastUsed42MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000);
|
NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000);
|
||||||
processList.add(lastUsed42MinutesAgo);
|
processList.add(lastUsed42MinutesAgo);
|
||||||
ProcessRecord lastUsed60MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord lastUsed60MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(60).toMillis(), 1024L, 10000);
|
NOW.minus(60, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 10000);
|
||||||
processList.add(lastUsed60MinutesAgo);
|
processList.add(lastUsed60MinutesAgo);
|
||||||
ProcessRecord lastUsed15MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord lastUsed15MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10);
|
NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10);
|
||||||
processList.add(lastUsed15MinutesAgo);
|
processList.add(lastUsed15MinutesAgo);
|
||||||
ProcessRecord lastUsed17MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord lastUsed17MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(17).toMillis(), 1024L, 20);
|
NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 20);
|
||||||
processList.add(lastUsed17MinutesAgo);
|
processList.add(lastUsed17MinutesAgo);
|
||||||
// Only re-ranking 5 entries so this should stay in most recent position.
|
// Only re-ranking 5 entries so this should stay in most recent position.
|
||||||
ProcessRecord lastUsed30MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord lastUsed30MinutesAgo = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 1024L, 20);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 20);
|
||||||
processList.add(lastUsed30MinutesAgo);
|
processList.add(lastUsed30MinutesAgo);
|
||||||
|
list.setLruProcessServiceStartLSP(processList.size());
|
||||||
|
|
||||||
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
||||||
|
|
||||||
// First 5 ordered by least recently used first, then last processes position unchanged.
|
// First 5 ordered by least recently used first, then last processes position unchanged.
|
||||||
assertThat(processList).containsExactly(lastUsed60MinutesAgo, lastUsed42MinutesAgo,
|
assertThat(processList).containsExactly(lastUsed60MinutesAgo, lastUsed42MinutesAgo,
|
||||||
lastUsed40MinutesAgo, lastUsed17MinutesAgo, lastUsed15MinutesAgo,
|
lastUsed40MinutesAgo, lastUsed17MinutesAgo, lastUsed15MinutesAgo,
|
||||||
lastUsed30MinutesAgo);
|
lastUsed30MinutesAgo).inOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -209,33 +218,34 @@ public class CacheOomRankerTest {
|
|||||||
ProcessList list = new ProcessList();
|
ProcessList list = new ProcessList();
|
||||||
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
||||||
ProcessRecord rss10k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord rss10k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000);
|
NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000);
|
||||||
processList.add(rss10k);
|
processList.add(rss10k);
|
||||||
ProcessRecord rss20k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord rss20k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000);
|
NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000);
|
||||||
processList.add(rss20k);
|
processList.add(rss20k);
|
||||||
ProcessRecord rss1k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord rss1k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(60).toMillis(), 1024L, 10000);
|
NOW.minus(60, ChronoUnit.MINUTES).toEpochMilli(), 1024L, 10000);
|
||||||
processList.add(rss1k);
|
processList.add(rss1k);
|
||||||
ProcessRecord rss100k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord rss100k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10);
|
NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10);
|
||||||
processList.add(rss100k);
|
processList.add(rss100k);
|
||||||
ProcessRecord rss2k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord rss2k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(17).toMillis(), 2 * 1024L, 20);
|
NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20);
|
||||||
processList.add(rss2k);
|
processList.add(rss2k);
|
||||||
ProcessRecord rss15k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord rss15k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 15 * 1024L, 20);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 20);
|
||||||
processList.add(rss15k);
|
processList.add(rss15k);
|
||||||
// Only re-ranking 6 entries so this should stay in most recent position.
|
// Only re-ranking 6 entries so this should stay in most recent position.
|
||||||
ProcessRecord rss16k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord rss16k = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 16 * 1024L, 20);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 20);
|
||||||
processList.add(rss16k);
|
processList.add(rss16k);
|
||||||
|
list.setLruProcessServiceStartLSP(processList.size());
|
||||||
|
|
||||||
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
||||||
|
|
||||||
// First 6 ordered by largest pss, then last processes position unchanged.
|
// First 6 ordered by largest pss, then last processes position unchanged.
|
||||||
assertThat(processList).containsExactly(rss100k, rss20k, rss15k, rss10k, rss2k, rss1k,
|
assertThat(processList).containsExactly(rss100k, rss20k, rss15k, rss10k, rss2k, rss1k,
|
||||||
rss16k);
|
rss16k).inOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -246,69 +256,70 @@ public class CacheOomRankerTest {
|
|||||||
/* lruWeight= */ 0.0f);
|
/* lruWeight= */ 0.0f);
|
||||||
|
|
||||||
ProcessList list = new ProcessList();
|
ProcessList list = new ProcessList();
|
||||||
list.setLruProcessServiceStartLSP(1);
|
|
||||||
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
||||||
ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000);
|
NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000);
|
||||||
processList.add(used1000);
|
processList.add(used1000);
|
||||||
ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000);
|
NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000);
|
||||||
processList.add(used2000);
|
processList.add(used2000);
|
||||||
ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10);
|
NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10);
|
||||||
processList.add(used10);
|
processList.add(used10);
|
||||||
ProcessRecord used20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(17).toMillis(), 2 * 1024L, 20);
|
NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20);
|
||||||
processList.add(used20);
|
processList.add(used20);
|
||||||
// Only re-ranking 6 entries so last two should stay in most recent position.
|
// Only re-ranking 6 entries so last two should stay in most recent position.
|
||||||
ProcessRecord used500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 15 * 1024L, 500);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500);
|
||||||
processList.add(used500);
|
processList.add(used500);
|
||||||
ProcessRecord used200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 16 * 1024L, 200);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200);
|
||||||
processList.add(used200);
|
processList.add(used200);
|
||||||
|
list.setLruProcessServiceStartLSP(processList.size());
|
||||||
|
|
||||||
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
||||||
|
|
||||||
// First 4 ordered by uses, then last processes position unchanged.
|
// First 4 ordered by uses, then last processes position unchanged.
|
||||||
assertThat(processList).containsExactly(used10, used20, used1000, used2000, used500,
|
assertThat(processList).containsExactly(used10, used20, used1000, used2000, used500,
|
||||||
used200);
|
used200).inOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void reRankLruCachedApps_notEnoughProcesses() throws InterruptedException {
|
public void reRankLruCachedApps_notEnoughProcesses() throws InterruptedException {
|
||||||
setConfig(/* numberToReRank= */ 4,
|
setConfig(/* numberToReRank= */ 4,
|
||||||
/* usesWeight= */ 0.5f,
|
/* usesWeight= */ 1.0f,
|
||||||
/* pssWeight= */ 0.2f,
|
/* pssWeight= */ 0.0f,
|
||||||
/* lruWeight= */ 0.3f);
|
/* lruWeight= */ 0.0f);
|
||||||
|
|
||||||
ProcessList list = new ProcessList();
|
ProcessList list = new ProcessList();
|
||||||
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
||||||
ProcessRecord unknownAdj1 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord unknownAdj1 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000);
|
NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000);
|
||||||
processList.add(unknownAdj1);
|
processList.add(unknownAdj1);
|
||||||
ProcessRecord unknownAdj2 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord unknownAdj2 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000);
|
NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000);
|
||||||
processList.add(unknownAdj2);
|
processList.add(unknownAdj2);
|
||||||
ProcessRecord unknownAdj3 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord unknownAdj3 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10);
|
NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10);
|
||||||
processList.add(unknownAdj3);
|
processList.add(unknownAdj3);
|
||||||
ProcessRecord foregroundAdj = nextProcessRecord(ProcessList.FOREGROUND_APP_ADJ,
|
ProcessRecord foregroundAdj = nextProcessRecord(ProcessList.FOREGROUND_APP_ADJ,
|
||||||
Duration.ofMinutes(17).toMillis(), 2 * 1024L, 20);
|
NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20);
|
||||||
processList.add(foregroundAdj);
|
processList.add(foregroundAdj);
|
||||||
ProcessRecord serviceAdj = nextProcessRecord(ProcessList.SERVICE_ADJ,
|
ProcessRecord serviceAdj = nextProcessRecord(ProcessList.SERVICE_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 15 * 1024L, 500);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500);
|
||||||
processList.add(serviceAdj);
|
processList.add(serviceAdj);
|
||||||
ProcessRecord systemAdj = nextProcessRecord(ProcessList.SYSTEM_ADJ,
|
ProcessRecord systemAdj = nextProcessRecord(ProcessList.SYSTEM_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 16 * 1024L, 200);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200);
|
||||||
processList.add(systemAdj);
|
processList.add(systemAdj);
|
||||||
|
list.setLruProcessServiceStartLSP(processList.size());
|
||||||
|
|
||||||
// 6 Processes but only 3 in eligible for cache so no re-ranking.
|
// 6 Processes but only 3 in eligible for cache so no re-ranking.
|
||||||
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
||||||
|
|
||||||
// All positions unchanged.
|
// All positions unchanged.
|
||||||
assertThat(processList).containsExactly(unknownAdj1, unknownAdj2, unknownAdj3,
|
assertThat(processList).containsExactly(unknownAdj1, unknownAdj2, unknownAdj3,
|
||||||
foregroundAdj, serviceAdj, systemAdj);
|
foregroundAdj, serviceAdj, systemAdj).inOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -319,35 +330,35 @@ public class CacheOomRankerTest {
|
|||||||
/* lruWeight= */ 0.0f);
|
/* lruWeight= */ 0.0f);
|
||||||
|
|
||||||
ProcessList list = new ProcessList();
|
ProcessList list = new ProcessList();
|
||||||
list.setLruProcessServiceStartLSP(4);
|
|
||||||
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
ArrayList<ProcessRecord> processList = list.getLruProcessesLSP();
|
||||||
ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used1000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(40).toMillis(), 10 * 1024L, 1000);
|
NOW.minus(40, ChronoUnit.MINUTES).toEpochMilli(), 10 * 1024L, 1000);
|
||||||
processList.add(used1000);
|
processList.add(used1000);
|
||||||
ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used2000 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(42).toMillis(), 20 * 1024L, 2000);
|
NOW.minus(42, ChronoUnit.MINUTES).toEpochMilli(), 20 * 1024L, 2000);
|
||||||
processList.add(used2000);
|
processList.add(used2000);
|
||||||
ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used10 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(15).toMillis(), 100 * 1024L, 10);
|
NOW.minus(15, ChronoUnit.MINUTES).toEpochMilli(), 100 * 1024L, 10);
|
||||||
processList.add(used10);
|
processList.add(used10);
|
||||||
ProcessRecord used20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used20 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(17).toMillis(), 2 * 1024L, 20);
|
NOW.minus(17, ChronoUnit.MINUTES).toEpochMilli(), 2 * 1024L, 20);
|
||||||
processList.add(used20);
|
processList.add(used20);
|
||||||
ProcessRecord used500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used500 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 15 * 1024L, 500);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 15 * 1024L, 500);
|
||||||
processList.add(used500);
|
processList.add(used500);
|
||||||
ProcessRecord used200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
ProcessRecord used200 = nextProcessRecord(ProcessList.UNKNOWN_ADJ,
|
||||||
Duration.ofMinutes(30).toMillis(), 16 * 1024L, 200);
|
NOW.minus(30, ChronoUnit.MINUTES).toEpochMilli(), 16 * 1024L, 200);
|
||||||
processList.add(used200);
|
processList.add(used200);
|
||||||
|
list.setLruProcessServiceStartLSP(3);
|
||||||
|
|
||||||
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
mCacheOomRanker.reRankLruCachedAppsLSP(processList, list.getLruProcessServiceStartLOSP());
|
||||||
|
|
||||||
// All positions unchanged.
|
// All positions unchanged.
|
||||||
assertThat(processList).containsExactly(used1000, used2000, used10, used20, used500,
|
assertThat(processList).containsExactly(used1000, used2000, used10, used20, used500,
|
||||||
used200);
|
used200).inOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setConfig(int numberToReRank, float useWeight, float pssWeight, float lruWeight)
|
private void setConfig(int numberToReRank, float usesWeight, float pssWeight, float lruWeight)
|
||||||
throws InterruptedException {
|
throws InterruptedException {
|
||||||
mExecutor.init(4);
|
mExecutor.init(4);
|
||||||
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
|
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
|
||||||
@@ -364,12 +375,12 @@ public class CacheOomRankerTest {
|
|||||||
false);
|
false);
|
||||||
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
|
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
|
||||||
CacheOomRanker.KEY_OOM_RE_RANKING_USES_WEIGHT,
|
CacheOomRanker.KEY_OOM_RE_RANKING_USES_WEIGHT,
|
||||||
Float.toString(useWeight),
|
Float.toString(usesWeight),
|
||||||
false);
|
false);
|
||||||
mExecutor.waitForLatch();
|
mExecutor.waitForLatch();
|
||||||
assertThat(mCacheOomRanker.getNumberToReRank()).isEqualTo(numberToReRank);
|
assertThat(mCacheOomRanker.getNumberToReRank()).isEqualTo(numberToReRank);
|
||||||
assertThat(mCacheOomRanker.mRssWeight).isEqualTo(pssWeight);
|
assertThat(mCacheOomRanker.mRssWeight).isEqualTo(pssWeight);
|
||||||
assertThat(mCacheOomRanker.mUsesWeight).isEqualTo(useWeight);
|
assertThat(mCacheOomRanker.mUsesWeight).isEqualTo(usesWeight);
|
||||||
assertThat(mCacheOomRanker.mLruWeight).isEqualTo(lruWeight);
|
assertThat(mCacheOomRanker.mLruWeight).isEqualTo(lruWeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -382,7 +393,7 @@ public class CacheOomRankerTest {
|
|||||||
app.info.uid = mNextPackageUid++;
|
app.info.uid = mNextPackageUid++;
|
||||||
// Exact value does not mater, it can be any state for which compaction is allowed.
|
// Exact value does not mater, it can be any state for which compaction is allowed.
|
||||||
app.mState.setSetProcState(PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
|
app.mState.setSetProcState(PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
|
||||||
app.mState.setSetAdj(setAdj);
|
app.mState.setCurAdj(setAdj);
|
||||||
app.setLastActivityTime(lastActivityTime);
|
app.setLastActivityTime(lastActivityTime);
|
||||||
app.mProfile.setLastRss(lastRss);
|
app.mProfile.setLastRss(lastRss);
|
||||||
app.mState.setCached(false);
|
app.mState.setCached(false);
|
||||||
@@ -390,6 +401,12 @@ public class CacheOomRankerTest {
|
|||||||
app.mState.setCached(false);
|
app.mState.setCached(false);
|
||||||
app.mState.setCached(true);
|
app.mState.setCached(true);
|
||||||
}
|
}
|
||||||
|
// Sets the thread returned by ProcessRecord#getThread, which we use to check whether the
|
||||||
|
// app is currently launching.
|
||||||
|
ProcessStatsService processStatsService = new ProcessStatsService(
|
||||||
|
mock(ActivityManagerService.class), new File(Environment.getDataSystemCeDirectory(),
|
||||||
|
"procstats"));
|
||||||
|
app.makeActive(mock(IApplicationThread.class), processStatsService);
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user