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

Commit 99a48419 authored by Benedict Wong's avatar Benedict Wong
Browse files

Integrate testNetworkService and Manager with Connectivity stack

This change adds TestAPIs for tests to retrive an instance of
ConnectivityManager, allowing it to build test TUN interfaces, as well
as test networks.

This also integrates the TestNetwork types with ConnectivityManager,
creating virtual networks if the network agent is a test agent.

Bug: 72950854
Test: Compiles, CTS tests using this passing correctly
Change-Id: I741ef9cdf4bd4125d9129af3a030edf32f438e4f
parent c91fa25b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -599,6 +599,7 @@ package android.content {
    method public void setAutofillOptions(@Nullable android.content.AutofillOptions);
    method public void setContentCaptureOptions(@Nullable android.content.ContentCaptureOptions);
    field public static final String ROLLBACK_SERVICE = "rollback";
    field public static final String TEST_NETWORK_SERVICE = "test_network";
  }

  public class ContextWrapper extends android.content.Context {
+26 −0
Original line number Diff line number Diff line
@@ -104,11 +104,13 @@ import android.net.IEthernetManager;
import android.net.IIpMemoryStore;
import android.net.IIpSecService;
import android.net.INetworkPolicyManager;
import android.net.ITestNetworkManager;
import android.net.IpMemoryStore;
import android.net.IpSecManager;
import android.net.NetworkPolicyManager;
import android.net.NetworkScoreManager;
import android.net.NetworkWatchlistManager;
import android.net.TestNetworkManager;
import android.net.lowpan.ILowpanManager;
import android.net.lowpan.LowpanManager;
import android.net.nsd.INsdManager;
@@ -146,6 +148,7 @@ import android.os.IUserManager;
import android.os.IncidentManager;
import android.os.PowerManager;
import android.os.RecoverySystem;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
import android.os.SystemUpdateManager;
@@ -357,6 +360,29 @@ final class SystemServiceRegistry {
                return new IpSecManager(ctx, service);
            }});

        registerService(
                Context.TEST_NETWORK_SERVICE,
                TestNetworkManager.class,
                new StaticApplicationContextServiceFetcher<TestNetworkManager>() {
                    @Override
                    public TestNetworkManager createService(Context context)
                            throws ServiceNotFoundException {
                        IBinder csBinder =
                                ServiceManager.getServiceOrThrow(Context.CONNECTIVITY_SERVICE);
                        IConnectivityManager csMgr =
                                IConnectivityManager.Stub.asInterface(csBinder);

                        final IBinder tnBinder;
                        try {
                            tnBinder = csMgr.startOrGetTestNetworkService();
                        } catch (RemoteException e) {
                            throw new ServiceNotFoundException(Context.TEST_NETWORK_SERVICE);
                        }
                        ITestNetworkManager tnMgr = ITestNetworkManager.Stub.asInterface(tnBinder);
                        return new TestNetworkManager(context, tnMgr);
                    }
                });

        registerService(Context.COUNTRY_DETECTOR, CountryDetector.class,
                new StaticServiceFetcher<CountryDetector>() {
            @Override
+10 −0
Original line number Diff line number Diff line
@@ -3127,6 +3127,7 @@ public abstract class Context {
            CONNECTIVITY_SERVICE,
            //@hide: IP_MEMORY_STORE_SERVICE,
            IPSEC_SERVICE,
            TEST_NETWORK_SERVICE,
            //@hide: UPDATE_LOCK_SERVICE,
            //@hide: NETWORKMANAGEMENT_SERVICE,
            NETWORK_STATS_SERVICE,
@@ -3689,6 +3690,15 @@ public abstract class Context {
     */
    public static final String IPSEC_SERVICE = "ipsec";

    /**
     * Use with {@link #getSystemService(String)} to retrieve a {@link
     * android.net.TestNetworkManager} for building TUNs and limited-use Networks
     *
     * @see #getSystemService(String)
     * @hide
     */
    @TestApi public static final String TEST_NETWORK_SERVICE = "test_network";

    /**
     * Use with {@link #getSystemService(String)} to retrieve a {@link
     * android.os.IUpdateLock} for managing runtime sequences that
+2 −0
Original line number Diff line number Diff line
@@ -219,4 +219,6 @@ interface IConnectivityManager

    void registerTetheringEventCallback(ITetheringEventCallback callback, String callerPkg);
    void unregisterTetheringEventCallback(ITetheringEventCallback callback, String callerPkg);

    IBinder startOrGetTestNetworkService();
}
+27 −0
Original line number Diff line number Diff line
@@ -299,6 +299,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
    private INetworkPolicyManager mPolicyManager;
    private NetworkPolicyManagerInternal mPolicyManagerInternal;

    /**
     * TestNetworkService (lazily) created upon first usage. Locked to prevent creation of multiple
     * instances.
     */
    @GuardedBy("mTNSLock")
    private TestNetworkService mTNS;

    private final Object mTNSLock = new Object();

    private String mCurrentTcpBufferSizes;

    private static final SparseArray<String> sMagicDecoderRing = MessageUtils.findMessageNames(
@@ -6958,4 +6967,22 @@ public class ConnectivityService extends IConnectivityManager.Stub
            return vpn != null && vpn.getLockdown();
        }
    }

    /**
     * Returns a IBinder to a TestNetworkService. Will be lazily created as needed.
     *
     * <p>The TestNetworkService must be run in the system server due to TUN creation.
     */
    @Override
    public IBinder startOrGetTestNetworkService() {
        synchronized (mTNSLock) {
            TestNetworkService.enforceTestNetworkPermissions(mContext);

            if (mTNS == null) {
                mTNS = new TestNetworkService(mContext, mNMS);
            }

            return mTNS;
        }
    }
}