1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.net.vcn.cts; 18 19 import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; 20 import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; 21 import static android.net.ipsec.ike.IkeSessionParams.IKE_OPTION_MOBIKE; 22 import static android.net.vcn.VcnGatewayConnectionConfig.VCN_GATEWAY_OPTION_ENABLE_DATA_STALL_RECOVERY_WITH_MOBILITY; 23 24 import static org.junit.Assert.assertArrayEquals; 25 import static org.junit.Assert.assertEquals; 26 import static org.junit.Assert.assertFalse; 27 import static org.junit.Assert.assertTrue; 28 import static org.junit.Assert.fail; 29 30 import android.net.ipsec.ike.IkeSessionParams; 31 import android.net.ipsec.ike.IkeTunnelConnectionParams; 32 import android.net.vcn.VcnGatewayConnectionConfig; 33 import android.net.vcn.VcnUnderlyingNetworkTemplate; 34 35 import androidx.test.ext.junit.runners.AndroidJUnit4; 36 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 40 import java.util.ArrayList; 41 import java.util.Collections; 42 import java.util.List; 43 import java.util.Set; 44 import java.util.concurrent.TimeUnit; 45 46 @RunWith(AndroidJUnit4.class) 47 public class VcnGatewayConnectionConfigTest extends VcnTestBase { 48 private static final String VCN_GATEWAY_CONNECTION_NAME = "test-vcn-gateway-connection"; 49 private static final long[] RETRY_INTERNAL_MILLIS = 50 new long[] { 51 TimeUnit.SECONDS.toMillis(1), 52 TimeUnit.MINUTES.toMillis(1), 53 TimeUnit.HOURS.toMillis(1) 54 }; 55 private static final int MAX_MTU = 1360; 56 57 private static final List<VcnUnderlyingNetworkTemplate> UNDERLYING_NETWORK_TEMPLATES; 58 59 static { 60 List<VcnUnderlyingNetworkTemplate> nwTemplates = new ArrayList<>(); VcnCellUnderlyingNetworkTemplateTest.getTestNetworkTemplate()61 nwTemplates.add(VcnCellUnderlyingNetworkTemplateTest.getTestNetworkTemplate()); VcnWifiUnderlyingNetworkTemplateTest.getTestNetworkTemplate()62 nwTemplates.add(VcnWifiUnderlyingNetworkTemplateTest.getTestNetworkTemplate()); 63 UNDERLYING_NETWORK_TEMPLATES = Collections.unmodifiableList(nwTemplates); 64 } 65 66 private static final Set<Integer> GATEWAY_OPTIONS = 67 Collections.singleton(VCN_GATEWAY_OPTION_ENABLE_DATA_STALL_RECOVERY_WITH_MOBILITY); 68 buildVcnGatewayConnectionConfigBase()69 public static VcnGatewayConnectionConfig.Builder buildVcnGatewayConnectionConfigBase() { 70 return new VcnGatewayConnectionConfig.Builder( 71 VCN_GATEWAY_CONNECTION_NAME, buildTunnelConnectionParams()) 72 .addExposedCapability(NET_CAPABILITY_INTERNET) 73 .setRetryIntervalsMillis(RETRY_INTERNAL_MILLIS) 74 .setMaxMtu(MAX_MTU) 75 .setVcnUnderlyingNetworkPriorities(UNDERLYING_NETWORK_TEMPLATES); 76 } 77 78 // Package private for use in VcnConfigTest buildVcnGatewayConnectionConfig()79 static VcnGatewayConnectionConfig buildVcnGatewayConnectionConfig() { 80 return buildVcnGatewayConnectionConfigBase().build(); 81 } 82 83 @Test testBuildVcnGatewayConnectionConfig()84 public void testBuildVcnGatewayConnectionConfig() throws Exception { 85 final VcnGatewayConnectionConfig gatewayConnConfig = buildVcnGatewayConnectionConfig(); 86 87 assertEquals(VCN_GATEWAY_CONNECTION_NAME, gatewayConnConfig.getGatewayConnectionName()); 88 assertEquals(buildTunnelConnectionParams(), gatewayConnConfig.getTunnelConnectionParams()); 89 assertArrayEquals( 90 new int[] {NET_CAPABILITY_INTERNET}, gatewayConnConfig.getExposedCapabilities()); 91 assertEquals( 92 UNDERLYING_NETWORK_TEMPLATES, 93 gatewayConnConfig.getVcnUnderlyingNetworkPriorities()); 94 assertArrayEquals(RETRY_INTERNAL_MILLIS, gatewayConnConfig.getRetryIntervalsMillis()); 95 assertEquals(MAX_MTU, gatewayConnConfig.getMaxMtu()); 96 } 97 98 @Test testBuilderAddRemove()99 public void testBuilderAddRemove() throws Exception { 100 final VcnGatewayConnectionConfig gatewayConnConfig = 101 buildVcnGatewayConnectionConfigBase() 102 .addExposedCapability(NET_CAPABILITY_DUN) 103 .removeExposedCapability(NET_CAPABILITY_DUN) 104 .build(); 105 106 assertArrayEquals( 107 new int[] {NET_CAPABILITY_INTERNET}, gatewayConnConfig.getExposedCapabilities()); 108 } 109 110 @Test testBuildWithoutMobikeEnabled()111 public void testBuildWithoutMobikeEnabled() { 112 final IkeSessionParams ikeParams = 113 getIkeSessionParamsBase().removeIkeOption(IKE_OPTION_MOBIKE).build(); 114 final IkeTunnelConnectionParams tunnelParams = buildTunnelConnectionParams(ikeParams); 115 116 try { 117 new VcnGatewayConnectionConfig.Builder(VCN_GATEWAY_CONNECTION_NAME, tunnelParams); 118 fail("Expected exception if MOBIKE not configured"); 119 } catch (IllegalArgumentException e) { 120 } 121 } 122 123 @Test testBuilderAddGatewayOptions()124 public void testBuilderAddGatewayOptions() throws Exception { 125 final VcnGatewayConnectionConfig.Builder builder = buildVcnGatewayConnectionConfigBase(); 126 127 for (int option : GATEWAY_OPTIONS) { 128 builder.addGatewayOption(option); 129 } 130 131 final VcnGatewayConnectionConfig gatewayConnConfig = builder.build(); 132 for (int option : GATEWAY_OPTIONS) { 133 assertTrue(gatewayConnConfig.hasGatewayOption(option)); 134 } 135 } 136 137 @Test testBuilderAddRemoveGatewayOptions()138 public void testBuilderAddRemoveGatewayOptions() throws Exception { 139 final VcnGatewayConnectionConfig.Builder builder = buildVcnGatewayConnectionConfigBase(); 140 141 for (int option : GATEWAY_OPTIONS) { 142 builder.addGatewayOption(option); 143 } 144 145 for (int option : GATEWAY_OPTIONS) { 146 builder.removeGatewayOption(option); 147 } 148 149 final VcnGatewayConnectionConfig gatewayConnConfig = builder.build(); 150 for (int option : GATEWAY_OPTIONS) { 151 assertFalse(gatewayConnConfig.hasGatewayOption(option)); 152 } 153 } 154 155 @Test testBuilderRequiresValidOption()156 public void testBuilderRequiresValidOption() { 157 try { 158 buildVcnGatewayConnectionConfigBase().addGatewayOption(-1); 159 fail("Expected exception due to the invalid VCN gateway option"); 160 } catch (IllegalArgumentException e) { 161 } 162 } 163 164 @Test testBuilderSetMinUdpPort4500NatTimeout()165 public void testBuilderSetMinUdpPort4500NatTimeout() { 166 final int natTimeoutSeconds = 600; 167 final VcnGatewayConnectionConfig gatewayConnConfig = buildVcnGatewayConnectionConfigBase() 168 .setMinUdpPort4500NatTimeoutSeconds(600).build(); 169 assertEquals(natTimeoutSeconds, gatewayConnConfig.getMinUdpPort4500NatTimeoutSeconds()); 170 } 171 172 @Test testBuilderSetMinUdpPort4500NatTimeout_invalidValues()173 public void testBuilderSetMinUdpPort4500NatTimeout_invalidValues() { 174 try { 175 buildVcnGatewayConnectionConfigBase().setMinUdpPort4500NatTimeoutSeconds(119); 176 fail("Expected exception due to invalid timeout range"); 177 } catch (IllegalArgumentException e) { 178 } 179 } 180 181 @Test testBuilderSetSafeModeEnabled()182 public void testBuilderSetSafeModeEnabled() { 183 final VcnGatewayConnectionConfig gatewayConnConfig = 184 buildVcnGatewayConnectionConfigBase().setSafeModeEnabled(false).build(); 185 assertFalse(gatewayConnConfig.isSafeModeEnabled()); 186 } 187 188 @Test testGetSafeModeEnabledDefault()189 public void testGetSafeModeEnabledDefault() { 190 final VcnGatewayConnectionConfig gatewayConnConfig = buildVcnGatewayConnectionConfig(); 191 assertTrue(gatewayConnConfig.isSafeModeEnabled()); 192 } 193 } 194