Merge "Fix flaky tests in NetworkPolicyManagerServiceTest." into oc-dev

This commit is contained in:
Sudheer Shanka
2017-03-30 07:38:05 +00:00
committed by Android (Google) Code Review
2 changed files with 44 additions and 14 deletions

View File

@@ -432,7 +432,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mListeners = new RemoteCallbackList<>(); mListeners = new RemoteCallbackList<>();
final Handler mHandler; final Handler mHandler;
final Handler mUidEventHandler; @VisibleForTesting
public final Handler mUidEventHandler;
private final ServiceThread mUidEventThread; private final ServiceThread mUidEventThread;

View File

@@ -223,11 +223,16 @@ public class NetworkPolicyManagerServiceTest {
private IUidObserver mUidObserver; private IUidObserver mUidObserver;
private INetworkManagementEventObserver mNetworkObserver; private INetworkManagementEventObserver mNetworkObserver;
private PowerManagerInternal mPowerManagerInternal;
private NetworkPolicyListenerAnswer mPolicyListener; private NetworkPolicyListenerAnswer mPolicyListener;
private NetworkPolicyManagerService mService; private NetworkPolicyManagerService mService;
/**
* In some of the tests while initializing NetworkPolicyManagerService,
* ACTION_RESTRICT_BACKGROUND_CHANGED is broadcasted. This is for capturing that broadcast.
*/
private FutureIntent mFutureIntent;
private long mStartTime; private long mStartTime;
private long mElapsedRealtime; private long mElapsedRealtime;
@@ -257,14 +262,13 @@ public class NetworkPolicyManagerServiceTest {
public final @Rule NetPolicyMethodRule mNetPolicyXmlRule = new NetPolicyMethodRule(); public final @Rule NetPolicyMethodRule mNetPolicyXmlRule = new NetPolicyMethodRule();
@BeforeClass private void registerLocalServices() {
public static void registerLocalServices() {
final PowerManagerInternal powerManager = addLocalServiceMock(PowerManagerInternal.class);
when(powerManager.getLowPowerState(anyInt())).thenReturn(mock(PowerSaveState.class));
addLocalServiceMock(DeviceIdleController.LocalService.class); addLocalServiceMock(DeviceIdleController.LocalService.class);
final UsageStatsManagerInternal usageStats = final UsageStatsManagerInternal usageStats =
addLocalServiceMock(UsageStatsManagerInternal.class); addLocalServiceMock(UsageStatsManagerInternal.class);
when(usageStats.getIdleUidsForUser(anyInt())).thenReturn(new int[]{}); when(usageStats.getIdleUidsForUser(anyInt())).thenReturn(new int[]{});
mActivityManagerInternal = addLocalServiceMock(ActivityManagerInternal.class); mActivityManagerInternal = addLocalServiceMock(ActivityManagerInternal.class);
final PowerSaveState state = new PowerSaveState.Builder() final PowerSaveState state = new PowerSaveState.Builder()
@@ -281,6 +285,7 @@ public class NetworkPolicyManagerServiceTest {
setCurrentTimeMillis(TEST_START); setCurrentTimeMillis(TEST_START);
registerLocalServices();
// Intercept various broadcasts, and pretend that uids have packages. // Intercept various broadcasts, and pretend that uids have packages.
// Also return mock service instances for a few critical services. // Also return mock service instances for a few critical services.
mServiceContext = new BroadcastInterceptingContext(context) { mServiceContext = new BroadcastInterceptingContext(context) {
@@ -322,6 +327,7 @@ public class NetworkPolicyManagerServiceTest {
}).when(mActivityManager).registerUidObserver(any(), anyInt(), }).when(mActivityManager).registerUidObserver(any(), anyInt(),
eq(ActivityManager.PROCESS_STATE_UNKNOWN), isNull(String.class)); eq(ActivityManager.PROCESS_STATE_UNKNOWN), isNull(String.class));
mFutureIntent = newRestrictBackgroundChangedFuture();
mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mStatsService, mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mStatsService,
mNetworkManager, mIpm, mTime, mPolicyDir, true); mNetworkManager, mIpm, mTime, mPolicyDir, true);
mService.bindConnectivityManager(mConnManager); mService.bindConnectivityManager(mConnManager);
@@ -379,6 +385,12 @@ public class NetworkPolicyManagerServiceTest {
public void unregisterLocalServices() throws Exception { public void unregisterLocalServices() throws Exception {
// Registered by NetworkPolicyManagerService's constructor. // Registered by NetworkPolicyManagerService's constructor.
LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class); LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class);
// Added in registerLocalServices()
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
LocalServices.removeServiceForTest(PowerManagerInternal.class);
LocalServices.removeServiceForTest(DeviceIdleController.LocalService.class);
LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
} }
@Test @Test
@@ -393,6 +405,7 @@ public class NetworkPolicyManagerServiceTest {
@NetPolicyXml("restrict-background-on.xml") @NetPolicyXml("restrict-background-on.xml")
public void testTurnRestrictBackgroundOff() throws Exception { public void testTurnRestrictBackgroundOff() throws Exception {
assertRestrictBackgroundOn(); // Sanity check. assertRestrictBackgroundOn(); // Sanity check.
assertRestrictBackgroundChangedReceived(mFutureIntent, null);
final FutureIntent futureIntent = newRestrictBackgroundChangedFuture(); final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
setRestrictBackground(false); setRestrictBackground(false);
assertRestrictBackgroundChangedReceived(futureIntent, null); assertRestrictBackgroundChangedReceived(futureIntent, null);
@@ -405,6 +418,7 @@ public class NetworkPolicyManagerServiceTest {
@NetPolicyXml("restrict-background-on.xml") @NetPolicyXml("restrict-background-on.xml")
public void testAddRestrictBackgroundWhitelist_restrictBackgroundOn() throws Exception { public void testAddRestrictBackgroundWhitelist_restrictBackgroundOn() throws Exception {
assertRestrictBackgroundOn(); // Sanity check. assertRestrictBackgroundOn(); // Sanity check.
assertRestrictBackgroundChangedReceived(mFutureIntent, null);
addRestrictBackgroundWhitelist(true); addRestrictBackgroundWhitelist(true);
} }
@@ -445,6 +459,7 @@ public class NetworkPolicyManagerServiceTest {
@NetPolicyXml("uidA-whitelisted-restrict-background-on.xml") @NetPolicyXml("uidA-whitelisted-restrict-background-on.xml")
public void testRemoveRestrictBackgroundWhitelist_restrictBackgroundOn() throws Exception { public void testRemoveRestrictBackgroundWhitelist_restrictBackgroundOn() throws Exception {
assertRestrictBackgroundOn(); // Sanity check. assertRestrictBackgroundOn(); // Sanity check.
assertRestrictBackgroundChangedReceived(mFutureIntent, null);
removeRestrictBackgroundWhitelist(true); removeRestrictBackgroundWhitelist(true);
} }
@@ -564,6 +579,7 @@ public class NetworkPolicyManagerServiceTest {
@NetPolicyXml("restrict-background-on.xml") @NetPolicyXml("restrict-background-on.xml")
public void testAddRestrictBackgroundBlacklist_restrictBackgroundOn() throws Exception { public void testAddRestrictBackgroundBlacklist_restrictBackgroundOn() throws Exception {
assertRestrictBackgroundOn(); // Sanity check. assertRestrictBackgroundOn(); // Sanity check.
assertRestrictBackgroundChangedReceived(mFutureIntent, null);
addRestrictBackgroundBlacklist(false); addRestrictBackgroundBlacklist(false);
} }
@@ -600,6 +616,7 @@ public class NetworkPolicyManagerServiceTest {
@NetPolicyXml("uidA-blacklisted-restrict-background-on.xml") @NetPolicyXml("uidA-blacklisted-restrict-background-on.xml")
public void testRemoveRestrictBackgroundBlacklist_restrictBackgroundOn() throws Exception { public void testRemoveRestrictBackgroundBlacklist_restrictBackgroundOn() throws Exception {
assertRestrictBackgroundOn(); // Sanity check. assertRestrictBackgroundOn(); // Sanity check.
assertRestrictBackgroundChangedReceived(mFutureIntent, null);
removeRestrictBackgroundBlacklist(false); removeRestrictBackgroundBlacklist(false);
} }
@@ -635,6 +652,7 @@ public class NetworkPolicyManagerServiceTest {
public void testBlacklistedAppIsNotNotifiedWhenRestrictBackgroundIsOn() throws Exception { public void testBlacklistedAppIsNotNotifiedWhenRestrictBackgroundIsOn() throws Exception {
// Sanity checks. // Sanity checks.
assertRestrictBackgroundOn(); assertRestrictBackgroundOn();
assertRestrictBackgroundChangedReceived(mFutureIntent, null);
assertUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND); assertUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND);
final FutureIntent futureIntent = newRestrictBackgroundChangedFuture(); final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
@@ -647,6 +665,7 @@ public class NetworkPolicyManagerServiceTest {
public void testWhitelistedAppIsNotNotifiedWhenRestrictBackgroundIsOn() throws Exception { public void testWhitelistedAppIsNotNotifiedWhenRestrictBackgroundIsOn() throws Exception {
// Sanity checks. // Sanity checks.
assertRestrictBackgroundOn(); assertRestrictBackgroundOn();
assertRestrictBackgroundChangedReceived(mFutureIntent, null);
assertWhitelistUids(UID_A); assertWhitelistUids(UID_A);
final FutureIntent futureIntent = newRestrictBackgroundChangedFuture(); final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
@@ -659,6 +678,7 @@ public class NetworkPolicyManagerServiceTest {
public void testWhitelistedAppIsNotifiedWhenBlacklisted() throws Exception { public void testWhitelistedAppIsNotifiedWhenBlacklisted() throws Exception {
// Sanity checks. // Sanity checks.
assertRestrictBackgroundOn(); assertRestrictBackgroundOn();
assertRestrictBackgroundChangedReceived(mFutureIntent, null);
assertWhitelistUids(UID_A); assertWhitelistUids(UID_A);
final FutureIntent futureIntent = newRestrictBackgroundChangedFuture(); final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
@@ -741,19 +761,19 @@ public class NetworkPolicyManagerServiceTest {
@Test @Test
public void testUidForeground() throws Exception { public void testUidForeground() throws Exception {
// push all uids into background // push all uids into background
mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, 0); callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, 0);
mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_SERVICE, 0); callOnUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_SERVICE, 0);
assertFalse(mService.isUidForeground(UID_A)); assertFalse(mService.isUidForeground(UID_A));
assertFalse(mService.isUidForeground(UID_B)); assertFalse(mService.isUidForeground(UID_B));
// push one of the uids into foreground // push one of the uids into foreground
mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP, 0); callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP, 0);
assertTrue(mService.isUidForeground(UID_A)); assertTrue(mService.isUidForeground(UID_A));
assertFalse(mService.isUidForeground(UID_B)); assertFalse(mService.isUidForeground(UID_B));
// and swap another uid into foreground // and swap another uid into foreground
mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, 0); callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, 0);
mUidObserver.onUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_TOP, 0); callOnUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_TOP, 0);
assertFalse(mService.isUidForeground(UID_A)); assertFalse(mService.isUidForeground(UID_A));
assertTrue(mService.isUidForeground(UID_B)); assertTrue(mService.isUidForeground(UID_B));
} }
@@ -1111,8 +1131,7 @@ public class NetworkPolicyManagerServiceTest {
@Test @Test
public void testOnUidStateChanged_notifyAMS() throws Exception { public void testOnUidStateChanged_notifyAMS() throws Exception {
final long procStateSeq = 222; final long procStateSeq = 222;
mUidObserver.onUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, procStateSeq);
procStateSeq);
verify(mActivityManagerInternal).notifyNetworkPolicyRulesUpdated(UID_A, procStateSeq); verify(mActivityManagerInternal).notifyNetworkPolicyRulesUpdated(UID_A, procStateSeq);
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@@ -1124,6 +1143,16 @@ public class NetworkPolicyManagerServiceTest {
outputStream.toString().trim()); outputStream.toString().trim());
} }
private void callOnUidStateChanged(int uid, int procState, long procStateSeq)
throws Exception {
mUidObserver.onUidStateChanged(uid, procState, procStateSeq);
final CountDownLatch latch = new CountDownLatch(1);
mService.mUidEventHandler.post(() -> {
latch.countDown();
});
latch.await(2, TimeUnit.SECONDS);
}
@Test @Test
public void testProcStateHistory() { public void testProcStateHistory() {
// Verify dump works correctly with no elements added. // Verify dump works correctly with no elements added.
@@ -1425,7 +1454,7 @@ public class NetworkPolicyManagerServiceTest {
private static NetworkPolicy buildFakeMobilePolicy(int cycleDay, long warningBytes, private static NetworkPolicy buildFakeMobilePolicy(int cycleDay, long warningBytes,
long limitBytes, boolean inferred){ long limitBytes, boolean inferred){
final NetworkTemplate template = buildTemplateMobileAll(FAKE_SUBSCRIBER_ID); final NetworkTemplate template = buildTemplateMobileAll(FAKE_SUBSCRIBER_ID);
return new NetworkPolicy(template, cycleDay, "America/Los_Angeles", warningBytes, return new NetworkPolicy(template, cycleDay, new Time().timezone, warningBytes,
limitBytes, SNOOZE_NEVER, SNOOZE_NEVER, true, inferred); limitBytes, SNOOZE_NEVER, SNOOZE_NEVER, true, inferred);
} }