Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0dc35fa9 authored by Hugo Benichi's avatar Hugo Benichi Committed by Gerrit Code Review
Browse files

Merge "Fix NetworkStatsObserversTest"

parents 44b7e94a 1cebba71
Loading
Loading
Loading
Loading
+46 −38
Original line number Diff line number Diff line
@@ -18,21 +18,23 @@ package com.android.server.net;

import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.when;

import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.METERED_NO;
import static android.net.NetworkStats.ROAMING_NO;
import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.when;

import android.app.usage.NetworkStatsManager;
import android.net.DataUsageRequest;
import android.net.NetworkIdentity;
@@ -48,6 +50,7 @@ import android.os.Messenger;
import android.os.Process;
import android.os.UserHandle;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;

@@ -60,8 +63,9 @@ import java.util.ArrayList;
import java.util.Objects;
import java.util.List;

import junit.framework.TestCase;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -69,8 +73,9 @@ import org.mockito.MockitoAnnotations;
/**
 * Tests for {@link NetworkStatsObservers}.
 */
@RunWith(AndroidJUnit4.class)
@SmallTest
public class NetworkStatsObserversTest extends TestCase {
public class NetworkStatsObserversTest {
    private static final String TEST_IFACE = "test0";
    private static final String TEST_IFACE2 = "test1";
    private static final long TEST_START = 1194220800000L;
@@ -88,7 +93,7 @@ public class NetworkStatsObserversTest extends TestCase {
    private static final int UID_GREEN = UserHandle.PER_USER_RANGE + 3;
    private static final int UID_ANOTHER_USER = 2 * UserHandle.PER_USER_RANGE + 4;

    private static final long WAIT_TIMEOUT = 500;  // 1/2 sec
    private static final long WAIT_TIMEOUT_MS = 500;
    private static final long THRESHOLD_BYTES = 2 * MB_IN_BYTES;
    private static final long BASE_BYTES = 7 * MB_IN_BYTES;
    private static final int INVALID_TYPE = -1;
@@ -101,7 +106,6 @@ public class NetworkStatsObserversTest extends TestCase {
    private Handler mObserverNoopHandler;

    private LatchedHandler mHandler;
    private ConditionVariable mCv;

    private NetworkStatsObservers mStatsObservers;
    private Messenger mMessenger;
@@ -110,9 +114,8 @@ public class NetworkStatsObserversTest extends TestCase {

    @Mock private IBinder mockBinder;

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();
        MockitoAnnotations.initMocks(this);

        mObserverHandlerThread = new IdleableHandlerThread("HandlerThread");
@@ -125,14 +128,14 @@ public class NetworkStatsObserversTest extends TestCase {
            }
        };

        mCv = new ConditionVariable();
        mHandler = new LatchedHandler(Looper.getMainLooper(), mCv);
        mHandler = new LatchedHandler(Looper.getMainLooper(), new ConditionVariable());
        mMessenger = new Messenger(mHandler);

        mActiveIfaces = new ArrayMap<>();
        mActiveUidIfaces = new ArrayMap<>();
    }

    @Test
    public void testRegister_thresholdTooLow_setsDefaultThreshold() throws Exception {
        long thresholdTooLowBytes = 1L;
        DataUsageRequest inputRequest = new DataUsageRequest(
@@ -145,6 +148,7 @@ public class NetworkStatsObserversTest extends TestCase {
        assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
    }

    @Test
    public void testRegister_highThreshold_accepted() throws Exception {
        long highThresholdBytes = 2 * THRESHOLD_BYTES;
        DataUsageRequest inputRequest = new DataUsageRequest(
@@ -157,6 +161,7 @@ public class NetworkStatsObserversTest extends TestCase {
        assertEquals(highThresholdBytes, request.thresholdInBytes);
    }

    @Test
    public void testRegister_twoRequests_twoIds() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, THRESHOLD_BYTES);
@@ -174,6 +179,7 @@ public class NetworkStatsObserversTest extends TestCase {
        assertEquals(THRESHOLD_BYTES, request2.thresholdInBytes);
    }

    @Test
    public void testUnregister_unknownRequest_noop() throws Exception {
        DataUsageRequest unknownRequest = new DataUsageRequest(
                123456 /* id */, sTemplateWifi, THRESHOLD_BYTES);
@@ -181,6 +187,7 @@ public class NetworkStatsObserversTest extends TestCase {
        mStatsObservers.unregister(unknownRequest, UID_RED);
    }

    @Test
    public void testUnregister_knownRequest_releasesCaller() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -198,6 +205,7 @@ public class NetworkStatsObserversTest extends TestCase {
        Mockito.verify(mockBinder).unlinkToDeath(any(IBinder.DeathRecipient.class), anyInt());
    }

    @Test
    public void testUnregister_knownRequest_invalidUid_doesNotUnregister() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -215,6 +223,7 @@ public class NetworkStatsObserversTest extends TestCase {
        Mockito.verifyZeroInteractions(mockBinder);
    }

    @Test
    public void testUpdateStats_initialSample_doesNotNotify() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -240,11 +249,9 @@ public class NetworkStatsObserversTest extends TestCase {
                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
                VPN_INFO, TEST_START);
        waitForObserverToIdle();

        assertTrue(mCv.block(WAIT_TIMEOUT));
        assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
    }

    @Test
    public void testUpdateStats_belowThreshold_doesNotNotify() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -276,12 +283,10 @@ public class NetworkStatsObserversTest extends TestCase {
                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
                VPN_INFO, TEST_START);
        waitForObserverToIdle();

        assertTrue(mCv.block(WAIT_TIMEOUT));
        mCv.block(WAIT_TIMEOUT);
        assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
    }


    @Test
    public void testUpdateStats_deviceAccess_notifies() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -314,11 +319,10 @@ public class NetworkStatsObserversTest extends TestCase {
                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
                VPN_INFO, TEST_START);
        waitForObserverToIdle();

        assertTrue(mCv.block(WAIT_TIMEOUT));
        assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
    }

    @Test
    public void testUpdateStats_defaultAccess_notifiesSameUid() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -352,11 +356,10 @@ public class NetworkStatsObserversTest extends TestCase {
                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
                VPN_INFO, TEST_START);
        waitForObserverToIdle();

        assertTrue(mCv.block(WAIT_TIMEOUT));
        assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
    }

    @Test
    public void testUpdateStats_defaultAccess_usageOtherUid_doesNotNotify() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -390,11 +393,9 @@ public class NetworkStatsObserversTest extends TestCase {
                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
                VPN_INFO, TEST_START);
        waitForObserverToIdle();

        assertTrue(mCv.block(WAIT_TIMEOUT));
        assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
    }

    @Test
    public void testUpdateStats_userAccess_usageSameUser_notifies() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -428,11 +429,10 @@ public class NetworkStatsObserversTest extends TestCase {
                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
                VPN_INFO, TEST_START);
        waitForObserverToIdle();

        assertTrue(mCv.block(WAIT_TIMEOUT));
        assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
    }

    @Test
    public void testUpdateStats_userAccess_usageAnotherUser_doesNotNotify() throws Exception {
        DataUsageRequest inputRequest = new DataUsageRequest(
                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
@@ -467,14 +467,22 @@ public class NetworkStatsObserversTest extends TestCase {
                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
                VPN_INFO, TEST_START);
        waitForObserverToIdle();

        assertTrue(mCv.block(WAIT_TIMEOUT));
        assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
    }

    private void waitForObserverToIdle() {
        // Send dummy message to make sure that any previous message has been handled
        mHandler.sendMessage(mHandler.obtainMessage(-1));
        mObserverHandlerThread.waitForIdle(WAIT_TIMEOUT);
        waitForIdleLooper(mObserverHandlerThread.getLooper(), WAIT_TIMEOUT_MS);
        waitForIdleLooper(mHandler.getLooper(), WAIT_TIMEOUT_MS);
    }

    // TODO: unify with ConnectivityService.waitForIdleHandler and
    // NetworkServiceStatsTest.IdleableHandlerThread
    private static void waitForIdleLooper(Looper looper, long timeoutMs) {
        final ConditionVariable cv = new ConditionVariable();
        final Handler handler = new Handler(looper);
        handler.post(() -> cv.open());
        if (!cv.block(timeoutMs)) {
            fail("Looper did not become idle after " + timeoutMs + " ms");
        }
    }

}