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

Commit 29b1826f authored by Hugo Benichi's avatar Hugo Benichi Committed by Gerrit Code Review
Browse files

Merge "Make NetworkManagementServiceTest pass again."

parents ff12ba93 a086800e
Loading
Loading
Loading
Loading
+33 −9
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.INetworkManagementService;
import android.os.PowerManager;
@@ -132,10 +133,27 @@ import java.util.concurrent.CountDownLatch;
 */
public class NetworkManagementService extends INetworkManagementService.Stub
        implements Watchdog.Monitor {

    /**
     * Helper class that encapsulates NetworkManagementService dependencies and makes them
     * easier to mock in unit tests.
     */
    static class SystemServices {
        public IBinder getService(String name) {
            return ServiceManager.getService(name);
        }
        public void registerLocalService(NetworkManagementInternal nmi) {
            LocalServices.addService(NetworkManagementInternal.class, nmi);
        }
        public INetd getNetd() {
            return NetdService.get();
        }
    }

    private static final String TAG = "NetworkManagement";
    private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
    private static final String NETD_TAG = "NetdConnector";
    private static final String NETD_SERVICE_NAME = "netd";
    static final String NETD_SERVICE_NAME = "netd";

    private static final int MAX_UID_RANGES_PER_COMMAND = 10;

@@ -217,6 +235,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub
    private final Handler mFgHandler;
    private final Handler mDaemonHandler;

    private final SystemServices mServices;

    private INetd mNetdService;

    private IBatteryStats mBatteryStats;
@@ -315,8 +335,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub
     *
     * @param context  Binder context for this service
     */
    private NetworkManagementService(Context context, String socket) {
    private NetworkManagementService(
            Context context, String socket, SystemServices services) {
        mContext = context;
        mServices = services;

        // make sure this is on the same looper as our NativeDaemonConnector for sync purposes
        mFgHandler = new Handler(FgThread.get().getLooper());
@@ -338,7 +360,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
        // Add ourself to the Watchdog monitors.
        Watchdog.getInstance().addMonitor(this);

        LocalServices.addService(NetworkManagementInternal.class, new LocalService());
        mServices.registerLocalService(new LocalService());

        synchronized (mTetheringStatsProviders) {
            mTetheringStatsProviders.put(new NetdTetheringStatsProvider(), "netd");
@@ -352,11 +374,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub
        mDaemonHandler = null;
        mFgHandler = null;
        mThread = null;
        mServices = null;
    }

    static NetworkManagementService create(Context context, String socket)
    static NetworkManagementService create(Context context, String socket, SystemServices services)
            throws InterruptedException {
        final NetworkManagementService service = new NetworkManagementService(context, socket);
        final NetworkManagementService service =
                new NetworkManagementService(context, socket, services);
        final CountDownLatch connectedSignal = service.mConnectedSignal;
        if (DBG) Slog.d(TAG, "Creating NetworkManagementService");
        service.mThread.start();
@@ -370,7 +394,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
    }

    public static NetworkManagementService create(Context context) throws InterruptedException {
        return create(context, NETD_SERVICE_NAME);
        return create(context, NETD_SERVICE_NAME, new SystemServices());
    }

    public void systemReady() {
@@ -390,8 +414,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub
            if (mBatteryStats != null) {
                return mBatteryStats;
            }
            mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
                    BatteryStats.SERVICE_NAME));
            mBatteryStats =
                    IBatteryStats.Stub.asInterface(mServices.getService(BatteryStats.SERVICE_NAME));
            return mBatteryStats;
        }
    }
@@ -589,7 +613,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
    }

    private void connectNativeNetdService() {
        mNetdService = NetdService.get();
        mNetdService = mServices.getNetd();
    }

    /**
+61 −34
Original line number Diff line number Diff line
@@ -16,16 +16,6 @@

package com.android.server;

import android.content.Context;
import android.net.LinkAddress;
import android.net.LocalSocket;
import android.net.LocalServerSocket;
import android.os.Binder;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import com.android.server.net.BaseNetworkObserver;
import com.android.internal.util.test.BroadcastInterceptingContext;

import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
@@ -33,14 +23,37 @@ import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;

import android.content.Context;
import android.net.INetd;
import android.net.LinkAddress;
import android.net.LocalSocket;
import android.net.LocalServerSocket;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.IBinder;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;

import com.android.internal.app.IBatteryStats;
import com.android.server.NetworkManagementService.SystemServices;
import com.android.server.net.BaseNetworkObserver;

import java.io.IOException;
import java.io.OutputStream;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

/**
 * Tests for {@link NetworkManagementService}.
 */
@LargeTest
public class NetworkManagementServiceTest extends AndroidTestCase {
@RunWith(AndroidJUnit4.class)
@SmallTest
public class NetworkManagementServiceTest {

    private static final String SOCKET_NAME = "__test__NetworkManagementServiceTest";
    private NetworkManagementService mNMService;
@@ -48,27 +61,46 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
    private LocalSocket mSocket;
    private OutputStream mOutputStream;

    @Mock private Context mContext;
    @Mock private IBatteryStats.Stub mBatteryStatsService;
    @Mock private INetd.Stub mNetdService;

    private final SystemServices mServices = new SystemServices() {
        @Override
        public IBinder getService(String name) {
            switch (name) {
                case BatteryStats.SERVICE_NAME:
                    return mBatteryStatsService;
                default:
                    throw new UnsupportedOperationException("Unknown service " + name);
            }
        }
        @Override
        public void registerLocalService(NetworkManagementInternal nmi) {
        }
        @Override
        public INetd getNetd() {
            return mNetdService;
        }
    };

    @Before
    public void setUp() throws Exception {
        super.setUp();
        // TODO: make this unnecessary. runtest might already make it unnecessary.
        System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
        MockitoAnnotations.initMocks(this);

        // Set up a sheltered test environment.
        BroadcastInterceptingContext context = new BroadcastInterceptingContext(getContext());
        mServerSocket = new LocalServerSocket(SOCKET_NAME);

        // Start the service and wait until it connects to our socket.
        mNMService = NetworkManagementService.create(context, SOCKET_NAME);
        mNMService = NetworkManagementService.create(mContext, SOCKET_NAME, mServices);
        mSocket = mServerSocket.accept();
        mOutputStream = mSocket.getOutputStream();
    }

    @Override
    @After
    public void tearDown() throws Exception {
        if (mSocket != null) mSocket.close();
        if (mServerSocket != null) mServerSocket.close();
        super.tearDown();
    }

    /**
@@ -80,12 +112,13 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
    }

    private static <T> T expectSoon(T mock) {
        return verify(mock, timeout(100));
        return verify(mock, timeout(200));
    }

    /**
     * Tests that network observers work properly.
     */
    @Test
    public void testNetworkObservers() throws Exception {
        BaseNetworkObserver observer = mock(BaseNetworkObserver.class);
        doReturn(new Binder()).when(observer).asBinder();  // Used by registerObserver.
@@ -143,22 +176,16 @@ public class NetworkManagementServiceTest extends AndroidTestCase {
         * Interface class activity.
         */

        sendMessage("613 IfaceClass active rmnet0");
        expectSoon(observer).interfaceClassDataActivityChanged("rmnet0", true, 0);

        sendMessage("613 IfaceClass active rmnet0 1234");
        expectSoon(observer).interfaceClassDataActivityChanged("rmnet0", true, 1234);

        sendMessage("613 IfaceClass idle eth0");
        expectSoon(observer).interfaceClassDataActivityChanged("eth0", false, 0);
        sendMessage("613 IfaceClass active 1 1234 10012");
        expectSoon(observer).interfaceClassDataActivityChanged("1", true, 1234);

        sendMessage("613 IfaceClass idle eth0 1234");
        expectSoon(observer).interfaceClassDataActivityChanged("eth0", false, 1234);
        sendMessage("613 IfaceClass idle 9 5678");
        expectSoon(observer).interfaceClassDataActivityChanged("9", false, 5678);

        sendMessage("613 IfaceClass reallyactive rmnet0 1234");
        expectSoon(observer).interfaceClassDataActivityChanged("rmnet0", false, 1234);
        sendMessage("613 IfaceClass reallyactive 9 4321");
        expectSoon(observer).interfaceClassDataActivityChanged("9", false, 4321);

        sendMessage("613 InterfaceClass reallyactive rmnet0");
        sendMessage("613 InterfaceClass reallyactive 1");
        // Invalid group.