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

Commit d3d6ddea authored by Hugo Benichi's avatar Hugo Benichi Committed by android-build-merger
Browse files

Merge "Make NetworkManagementServiceTest pass again."

am: 29b1826f

Change-Id: If7fafa0922fdbc499c0c911a3f88ede9c8a26c1d
parents bbadcfd3 29b1826f
Loading
Loading
Loading
Loading
+33 −9
Original line number Original line Diff line number Diff line
@@ -73,6 +73,7 @@ import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.os.BatteryStats;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Binder;
import android.os.Handler;
import android.os.Handler;
import android.os.IBinder;
import android.os.INetworkActivityListener;
import android.os.INetworkActivityListener;
import android.os.INetworkManagementService;
import android.os.INetworkManagementService;
import android.os.PowerManager;
import android.os.PowerManager;
@@ -132,10 +133,27 @@ import java.util.concurrent.CountDownLatch;
 */
 */
public class NetworkManagementService extends INetworkManagementService.Stub
public class NetworkManagementService extends INetworkManagementService.Stub
        implements Watchdog.Monitor {
        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 String TAG = "NetworkManagement";
    private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
    private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
    private static final String NETD_TAG = "NetdConnector";
    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;
    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 mFgHandler;
    private final Handler mDaemonHandler;
    private final Handler mDaemonHandler;


    private final SystemServices mServices;

    private INetd mNetdService;
    private INetd mNetdService;


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


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


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


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


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


    public static NetworkManagementService create(Context context) throws InterruptedException {
    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() {
    public void systemReady() {
@@ -390,8 +414,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub
            if (mBatteryStats != null) {
            if (mBatteryStats != null) {
                return mBatteryStats;
                return mBatteryStats;
            }
            }
            mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService(
            mBatteryStats =
                    BatteryStats.SERVICE_NAME));
                    IBatteryStats.Stub.asInterface(mServices.getService(BatteryStats.SERVICE_NAME));
            return mBatteryStats;
            return mBatteryStats;
        }
        }
    }
    }
@@ -589,7 +613,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub
    }
    }


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


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


package com.android.server;
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.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
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.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
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.IOException;
import java.io.OutputStream;
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}.
 * Tests for {@link NetworkManagementService}.
 */
 */
@LargeTest
@RunWith(AndroidJUnit4.class)
public class NetworkManagementServiceTest extends AndroidTestCase {
@SmallTest
public class NetworkManagementServiceTest {


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


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

    private final SystemServices mServices = new SystemServices() {
        @Override
        @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 {
    public void setUp() throws Exception {
        super.setUp();
        MockitoAnnotations.initMocks(this);
        // TODO: make this unnecessary. runtest might already make it unnecessary.
        System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());


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


        // Start the service and wait until it connects to our socket.
        // 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();
        mSocket = mServerSocket.accept();
        mOutputStream = mSocket.getOutputStream();
        mOutputStream = mSocket.getOutputStream();
    }
    }


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


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


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


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


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

        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 idle eth0 1234");
        sendMessage("613 IfaceClass idle 9 5678");
        expectSoon(observer).interfaceClassDataActivityChanged("eth0", false, 1234);
        expectSoon(observer).interfaceClassDataActivityChanged("9", false, 5678);


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


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