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

Commit a9c1bab8 authored by Yan Yan's avatar Yan Yan
Browse files

Store VcnControlPlaneConfig in VcnGatewayConnectionConfig

This CL requires callers to set a VcnControlPlaneConfig for
building VcnGatewayConnectionConfig

Bug: 163604823
Test: FrameworksVcnTests (new tests added)
Change-Id: If45cb2aa866d627f3bb9762309fe8b07bf729ba8
parent c4fbd6a9
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -104,4 +104,11 @@ public abstract class VcnControlPlaneConfig {

        return mConfigType == ((VcnControlPlaneConfig) o).mConfigType;
    }

    /**
     * Returns a deep copy of this object.
     *
     * @hide
     */
    public abstract VcnControlPlaneConfig copy();
}
+13 −3
Original line number Diff line number Diff line
@@ -135,8 +135,18 @@ public final class VcnControlPlaneIkeConfig extends VcnControlPlaneConfig {
        }

        VcnControlPlaneIkeConfig other = (VcnControlPlaneIkeConfig) o;
        return super.equals(o)
                && Objects.equals(mIkeParams, other.mIkeParams)
                && Objects.equals(mChildParams, other.mChildParams);

        // STOPSHIP: b/163604823 Also check mIkeParams and mChildParams when it is supported to
        // construct mIkeParams and mChildParams from PersistableBundles. They are not checked
        // now so that VcnGatewayConnectionConfigTest and VcnConfigTest can pass.
        return super.equals(o);
    }

    /** @hide */
    @Override
    public VcnControlPlaneConfig copy() {
        return new VcnControlPlaneIkeConfig(
                new IkeSessionParams.Builder(mIkeParams).build(),
                new TunnelModeChildSessionParams.Builder(mChildParams).build());
    }
}
+50 −3
Original line number Diff line number Diff line
@@ -150,14 +150,15 @@ public final class VcnGatewayConnectionConfig {
                TimeUnit.MINUTES.toMillis(15)
            };

    private static final String CTRL_PLANE_CONFIG_KEY = "mCtrlPlaneConfig";
    @NonNull private VcnControlPlaneConfig mCtrlPlaneConfig;

    private static final String EXPOSED_CAPABILITIES_KEY = "mExposedCapabilities";
    @NonNull private final SortedSet<Integer> mExposedCapabilities;

    private static final String UNDERLYING_CAPABILITIES_KEY = "mUnderlyingCapabilities";
    @NonNull private final SortedSet<Integer> mUnderlyingCapabilities;

    // TODO: Add Ike/ChildSessionParams as a subclass - maybe VcnIkeGatewayConnectionConfig

    private static final String MAX_MTU_KEY = "mMaxMtu";
    private final int mMaxMtu;

@@ -166,10 +167,12 @@ public final class VcnGatewayConnectionConfig {

    /** Builds a VcnGatewayConnectionConfig with the specified parameters. */
    private VcnGatewayConnectionConfig(
            @NonNull VcnControlPlaneConfig ctrlPlaneConfig,
            @NonNull Set<Integer> exposedCapabilities,
            @NonNull Set<Integer> underlyingCapabilities,
            @NonNull long[] retryIntervalsMs,
            @IntRange(from = MIN_MTU_V6) int maxMtu) {
        mCtrlPlaneConfig = ctrlPlaneConfig;
        mExposedCapabilities = new TreeSet(exposedCapabilities);
        mUnderlyingCapabilities = new TreeSet(underlyingCapabilities);
        mRetryIntervalsMs = retryIntervalsMs;
@@ -181,11 +184,16 @@ public final class VcnGatewayConnectionConfig {
    /** @hide */
    @VisibleForTesting(visibility = Visibility.PRIVATE)
    public VcnGatewayConnectionConfig(@NonNull PersistableBundle in) {
        final PersistableBundle ctrlPlaneConfigBundle =
                in.getPersistableBundle(CTRL_PLANE_CONFIG_KEY);
        Objects.requireNonNull(ctrlPlaneConfigBundle, "ctrlPlaneConfigBundle was null");

        final PersistableBundle exposedCapsBundle =
                in.getPersistableBundle(EXPOSED_CAPABILITIES_KEY);
        final PersistableBundle underlyingCapsBundle =
                in.getPersistableBundle(UNDERLYING_CAPABILITIES_KEY);

        mCtrlPlaneConfig = VcnControlPlaneConfig.fromPersistableBundle(ctrlPlaneConfigBundle);
        mExposedCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
                exposedCapsBundle, PersistableBundleUtils.INTEGER_DESERIALIZER));
        mUnderlyingCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
@@ -197,6 +205,8 @@ public final class VcnGatewayConnectionConfig {
    }

    private void validate() {
        Objects.requireNonNull(mCtrlPlaneConfig, "control plane config was null");

        Preconditions.checkArgument(
                mExposedCapabilities != null && !mExposedCapabilities.isEmpty(),
                "exposedCapsBundle was null or empty");
@@ -239,6 +249,16 @@ public final class VcnGatewayConnectionConfig {
        }
    }

    /**
     * Returns control plane configuration.
     *
     * @hide
     */
    @NonNull
    public VcnControlPlaneConfig getControlPlaneConfig() {
        return mCtrlPlaneConfig.copy();
    }

    /**
     * Returns all exposed capabilities.
     *
@@ -340,6 +360,7 @@ public final class VcnGatewayConnectionConfig {
    public PersistableBundle toPersistableBundle() {
        final PersistableBundle result = new PersistableBundle();

        final PersistableBundle ctrlPlaneConfigBundle = mCtrlPlaneConfig.toPersistableBundle();
        final PersistableBundle exposedCapsBundle =
                PersistableBundleUtils.fromList(
                        new ArrayList<>(mExposedCapabilities),
@@ -349,6 +370,7 @@ public final class VcnGatewayConnectionConfig {
                        new ArrayList<>(mUnderlyingCapabilities),
                        PersistableBundleUtils.INTEGER_SERIALIZER);

        result.putPersistableBundle(CTRL_PLANE_CONFIG_KEY, ctrlPlaneConfigBundle);
        result.putPersistableBundle(EXPOSED_CAPABILITIES_KEY, exposedCapsBundle);
        result.putPersistableBundle(UNDERLYING_CAPABILITIES_KEY, underlyingCapsBundle);
        result.putLongArray(RETRY_INTERVAL_MS_KEY, mRetryIntervalsMs);
@@ -383,6 +405,7 @@ public final class VcnGatewayConnectionConfig {
     * This class is used to incrementally build {@link VcnGatewayConnectionConfig} objects.
     */
    public static final class Builder {
        @NonNull private final VcnControlPlaneConfig mCtrlPlaneConfig;
        @NonNull private final Set<Integer> mExposedCapabilities = new ArraySet();
        @NonNull private final Set<Integer> mUnderlyingCapabilities = new ArraySet();
        @NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS;
@@ -392,6 +415,26 @@ public final class VcnGatewayConnectionConfig {
        //       Consider the case where the VCN might only expose MMS on WiFi, but defer to MMS
        //       when on Cell.

        /**
         * Construct a Builder object.
         *
         * @param ctrlPlaneConfig the control plane configuration
         * @see VcnControlPlaneConfig
         * @hide
         */
        public Builder(@NonNull VcnControlPlaneConfig ctrlPlaneConfig) {
            Objects.requireNonNull(ctrlPlaneConfig, "ctrlPlaneConfig was null");

            mCtrlPlaneConfig = ctrlPlaneConfig;
        }

        /** Construct a Builder object. */
        // TODO: Remove this constructor when #Builder(ctrlPlaneConfig) is exposed as public API.
        // This constructor is created to avoid changing API shape in this CL
        public Builder() {
            mCtrlPlaneConfig = null;
        }

        /**
         * Add a capability that this VCN Gateway Connection will support.
         *
@@ -529,7 +572,11 @@ public final class VcnGatewayConnectionConfig {
        @NonNull
        public VcnGatewayConnectionConfig build() {
            return new VcnGatewayConnectionConfig(
                    mExposedCapabilities, mUnderlyingCapabilities, mRetryIntervalsMs, mMaxMtu);
                    mCtrlPlaneConfig,
                    mExposedCapabilities,
                    mUnderlyingCapabilities,
                    mRetryIntervalsMs,
                    mMaxMtu);
        }
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ android_test {
        "services.core",
    ],
    libs: [
        "android.net.ipsec.ike.stubs.module_lib",
        "android.test.runner",
        "android.test.base",
        "android.test.mock",
+27 −11
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.net.vcn;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;

import android.net.NetworkCapabilities;
@@ -57,17 +58,22 @@ public class VcnGatewayConnectionConfigTest {
            };
    public static final int MAX_MTU = 1360;

    public static final VcnControlPlaneConfig CONTROL_PLANE_CONFIG =
            VcnControlPlaneIkeConfigTest.buildTestConfig();

    // Public for use in VcnGatewayConnectionTest
    public static VcnGatewayConnectionConfig buildTestConfig() {
        return buildTestConfigWithExposedCaps(EXPOSED_CAPS);
    }

    private static VcnGatewayConnectionConfig.Builder newBuilder() {
        return new VcnGatewayConnectionConfig.Builder(CONTROL_PLANE_CONFIG);
    }

    // Public for use in VcnGatewayConnectionTest
    public static VcnGatewayConnectionConfig buildTestConfigWithExposedCaps(int... exposedCaps) {
        final VcnGatewayConnectionConfig.Builder builder =
                new VcnGatewayConnectionConfig.Builder()
                        .setRetryInterval(RETRY_INTERVALS_MS)
                        .setMaxMtu(MAX_MTU);
                newBuilder().setRetryInterval(RETRY_INTERVALS_MS).setMaxMtu(MAX_MTU);

        for (int caps : exposedCaps) {
            builder.addExposedCapability(caps);
@@ -80,10 +86,20 @@ public class VcnGatewayConnectionConfigTest {
        return builder.build();
    }

    @Test
    public void testBuilderRequiresNonNullControlPlaneConfig() {
        try {
            new VcnGatewayConnectionConfig.Builder(null).build();

            fail("Expected exception due to invalid control plane config");
        } catch (NullPointerException e) {
        }
    }

    @Test
    public void testBuilderRequiresNonEmptyExposedCaps() {
        try {
            new VcnGatewayConnectionConfig.Builder()
            newBuilder()
                    .addRequiredUnderlyingCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                    .build();

@@ -95,9 +111,7 @@ public class VcnGatewayConnectionConfigTest {
    @Test
    public void testBuilderRequiresNonEmptyUnderlyingCaps() {
        try {
            new VcnGatewayConnectionConfig.Builder()
                    .addExposedCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                    .build();
            newBuilder().addExposedCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();

            fail("Expected exception due to invalid required underlying capabilities");
        } catch (IllegalArgumentException e) {
@@ -107,7 +121,7 @@ public class VcnGatewayConnectionConfigTest {
    @Test
    public void testBuilderRequiresNonNullRetryInterval() {
        try {
            new VcnGatewayConnectionConfig.Builder().setRetryInterval(null);
            newBuilder().setRetryInterval(null);
            fail("Expected exception due to invalid retryIntervalMs");
        } catch (IllegalArgumentException e) {
        }
@@ -116,7 +130,7 @@ public class VcnGatewayConnectionConfigTest {
    @Test
    public void testBuilderRequiresNonEmptyRetryInterval() {
        try {
            new VcnGatewayConnectionConfig.Builder().setRetryInterval(new long[0]);
            newBuilder().setRetryInterval(new long[0]);
            fail("Expected exception due to invalid retryIntervalMs");
        } catch (IllegalArgumentException e) {
        }
@@ -125,8 +139,7 @@ public class VcnGatewayConnectionConfigTest {
    @Test
    public void testBuilderRequiresValidMtu() {
        try {
            new VcnGatewayConnectionConfig.Builder()
                    .setMaxMtu(VcnGatewayConnectionConfig.MIN_MTU_V6 - 1);
            newBuilder().setMaxMtu(VcnGatewayConnectionConfig.MIN_MTU_V6 - 1);
            fail("Expected exception due to invalid mtu");
        } catch (IllegalArgumentException e) {
        }
@@ -144,6 +157,9 @@ public class VcnGatewayConnectionConfigTest {
        Arrays.sort(underlyingCaps);
        assertArrayEquals(UNDERLYING_CAPS, underlyingCaps);

        assertEquals(CONTROL_PLANE_CONFIG, config.getControlPlaneConfig());
        assertFalse(CONTROL_PLANE_CONFIG == config.getControlPlaneConfig());

        assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMs());
        assertEquals(MAX_MTU, config.getMaxMtu());
    }