1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.net.telemetry; 6 7 import static com.google.common.truth.Truth.assertThat; 8 9 import static org.junit.Assert.assertEquals; 10 11 import static org.chromium.net.telemetry.ExperimentalOptions.UNSET_INT_VALUE; 12 import static org.chromium.net.telemetry.ExperimentalOptions.VALID_CONNECTION_OPTIONS; 13 14 import androidx.test.ext.junit.runners.AndroidJUnit4; 15 16 import com.google.common.base.Splitter; 17 18 import org.json.JSONException; 19 import org.json.JSONObject; 20 import org.junit.Test; 21 import org.junit.runner.RunWith; 22 23 import org.chromium.base.test.util.Batch; 24 import org.chromium.net.telemetry.ExperimentalOptions.OptionalBoolean; 25 26 @RunWith(AndroidJUnit4.class) 27 @Batch(Batch.UNIT_TESTS) 28 public final class ExperimentalOptionsTest { 29 // Some random numbers to test with 30 private static final int TEST_VALUE = 2; 31 private static final String CONN_STRING = "CHLO,IW10"; 32 33 @Test 34 public void testExperimentalOptionsConnectionoptions_shouldConsistofCommaSeparatedStringofChars()35 testExperimentalOptionsConnectionoptions_shouldConsistofCommaSeparatedStringofChars() 36 throws JSONException { 37 // QUIC connection options are represented with a comma separated list of {3,4}-char strings 38 // eg 'ABCD, EFGH' 39 JSONObject quicExperiment = 40 new JSONObject() 41 .put("connection_options", "|we/3," + CONN_STRING + ",bbra@google.com"); 42 JSONObject experimentalOptions = new JSONObject().put("QUIC", quicExperiment); 43 ExperimentalOptions options = new ExperimentalOptions(experimentalOptions.toString()); 44 45 String connectionOptions = options.getConnectionOptionsOption(); 46 Iterable<String> optionsArray = Splitter.on(',').split(connectionOptions); 47 48 assertEquals(CONN_STRING, connectionOptions); 49 for (String option : optionsArray) { 50 assertThat(VALID_CONNECTION_OPTIONS).contains(option); 51 } 52 } 53 54 @Test testNullString_shouldUseUnsetValues()55 public void testNullString_shouldUseUnsetValues() { 56 ExperimentalOptions option = new ExperimentalOptions(""); 57 58 assertThat(option.getConnectionOptionsOption()).isNull(); 59 assertEquals(OptionalBoolean.UNSET, option.getStoreServerConfigsInPropertiesOption()); 60 assertEquals(UNSET_INT_VALUE, option.getMaxServerConfigsStoredInPropertiesOption()); 61 assertEquals(UNSET_INT_VALUE, option.getIdleConnectionTimeoutSecondsOption()); 62 assertEquals(OptionalBoolean.UNSET, option.getGoawaySessionsOnIpChangeOption()); 63 assertEquals(OptionalBoolean.UNSET, option.getCloseSessionsOnIpChangeOption()); 64 assertEquals(OptionalBoolean.UNSET, option.getMigrateSessionsOnNetworkChangeV2Option()); 65 assertEquals(OptionalBoolean.UNSET, option.getMigrateSessionsEarlyV2()); 66 assertEquals(OptionalBoolean.UNSET, option.getDisableBidirectionalStreamsOption()); 67 assertEquals(UNSET_INT_VALUE, option.getMaxTimeBeforeCryptoHandshakeSecondsOption()); 68 assertEquals(UNSET_INT_VALUE, option.getMaxIdleTimeBeforeCryptoHandshakeSecondsOption()); 69 assertEquals(OptionalBoolean.UNSET, option.getEnableSocketRecvOptimizationOption()); 70 assertEquals(OptionalBoolean.UNSET, option.getAsyncDnsEnableOption()); 71 assertEquals(OptionalBoolean.UNSET, option.getStaleDnsEnableOption()); 72 assertEquals(UNSET_INT_VALUE, option.getStaleDnsDelayMillisOption()); 73 assertEquals(UNSET_INT_VALUE, option.getStaleDnsMaxExpiredTimeMillisOption()); 74 assertEquals(UNSET_INT_VALUE, option.getStaleDnsMaxStaleUsesOption()); 75 assertEquals(OptionalBoolean.UNSET, option.getStaleDnsAllowOtherNetworkOption()); 76 assertEquals(OptionalBoolean.UNSET, option.getStaleDnsPersistToDiskOption()); 77 assertEquals(UNSET_INT_VALUE, option.getStaleDnsPersistDelayMillisOption()); 78 assertEquals(OptionalBoolean.UNSET, option.getStaleDnsUseStaleOnNameNotResolvedOption()); 79 assertEquals(OptionalBoolean.UNSET, option.getDisableIpv6OnWifiOption()); 80 } 81 82 @Test testInvalidString_shouldUseUnsetValues()83 public void testInvalidString_shouldUseUnsetValues() { 84 ExperimentalOptions option = new ExperimentalOptions("blah"); 85 86 assertThat(option.getConnectionOptionsOption()).isNull(); 87 assertEquals(OptionalBoolean.UNSET, option.getStoreServerConfigsInPropertiesOption()); 88 assertEquals(UNSET_INT_VALUE, option.getMaxServerConfigsStoredInPropertiesOption()); 89 assertEquals(UNSET_INT_VALUE, option.getIdleConnectionTimeoutSecondsOption()); 90 assertEquals(OptionalBoolean.UNSET, option.getGoawaySessionsOnIpChangeOption()); 91 assertEquals(OptionalBoolean.UNSET, option.getCloseSessionsOnIpChangeOption()); 92 assertEquals(OptionalBoolean.UNSET, option.getMigrateSessionsOnNetworkChangeV2Option()); 93 assertEquals(OptionalBoolean.UNSET, option.getMigrateSessionsEarlyV2()); 94 assertEquals(OptionalBoolean.UNSET, option.getDisableBidirectionalStreamsOption()); 95 assertEquals(UNSET_INT_VALUE, option.getMaxTimeBeforeCryptoHandshakeSecondsOption()); 96 assertEquals(UNSET_INT_VALUE, option.getMaxIdleTimeBeforeCryptoHandshakeSecondsOption()); 97 assertEquals(OptionalBoolean.UNSET, option.getEnableSocketRecvOptimizationOption()); 98 assertEquals(OptionalBoolean.UNSET, option.getAsyncDnsEnableOption()); 99 assertEquals(OptionalBoolean.UNSET, option.getStaleDnsEnableOption()); 100 assertEquals(UNSET_INT_VALUE, option.getStaleDnsDelayMillisOption()); 101 assertEquals(UNSET_INT_VALUE, option.getStaleDnsMaxExpiredTimeMillisOption()); 102 assertEquals(UNSET_INT_VALUE, option.getStaleDnsMaxStaleUsesOption()); 103 assertEquals(OptionalBoolean.UNSET, option.getStaleDnsAllowOtherNetworkOption()); 104 assertEquals(OptionalBoolean.UNSET, option.getStaleDnsPersistToDiskOption()); 105 assertEquals(UNSET_INT_VALUE, option.getStaleDnsPersistDelayMillisOption()); 106 assertEquals(OptionalBoolean.UNSET, option.getStaleDnsUseStaleOnNameNotResolvedOption()); 107 assertEquals(OptionalBoolean.UNSET, option.getDisableIpv6OnWifiOption()); 108 } 109 110 @Test testSetToTrueOptions_shouldUseSetValues()111 public void testSetToTrueOptions_shouldUseSetValues() throws JSONException { 112 ExperimentalOptions option = generateExperimentalValuesWith(true); 113 114 assertEquals(OptionalBoolean.TRUE, option.getStoreServerConfigsInPropertiesOption()); 115 assertEquals(TEST_VALUE, option.getMaxServerConfigsStoredInPropertiesOption()); 116 assertEquals(TEST_VALUE, option.getIdleConnectionTimeoutSecondsOption()); 117 assertEquals(OptionalBoolean.TRUE, option.getGoawaySessionsOnIpChangeOption()); 118 assertEquals(OptionalBoolean.TRUE, option.getCloseSessionsOnIpChangeOption()); 119 assertEquals(OptionalBoolean.TRUE, option.getMigrateSessionsOnNetworkChangeV2Option()); 120 assertEquals(OptionalBoolean.TRUE, option.getMigrateSessionsEarlyV2()); 121 assertEquals(OptionalBoolean.TRUE, option.getDisableBidirectionalStreamsOption()); 122 assertEquals(TEST_VALUE, option.getMaxTimeBeforeCryptoHandshakeSecondsOption()); 123 assertEquals(TEST_VALUE, option.getMaxIdleTimeBeforeCryptoHandshakeSecondsOption()); 124 assertEquals(OptionalBoolean.TRUE, option.getEnableSocketRecvOptimizationOption()); 125 assertEquals(OptionalBoolean.TRUE, option.getAsyncDnsEnableOption()); 126 assertEquals(OptionalBoolean.TRUE, option.getStaleDnsEnableOption()); 127 assertEquals(TEST_VALUE, option.getStaleDnsDelayMillisOption()); 128 assertEquals(TEST_VALUE, option.getStaleDnsMaxExpiredTimeMillisOption()); 129 assertEquals(TEST_VALUE, option.getStaleDnsMaxStaleUsesOption()); 130 assertEquals(OptionalBoolean.TRUE, option.getStaleDnsAllowOtherNetworkOption()); 131 assertEquals(OptionalBoolean.TRUE, option.getStaleDnsPersistToDiskOption()); 132 assertEquals(TEST_VALUE, option.getStaleDnsPersistDelayMillisOption()); 133 assertEquals(OptionalBoolean.TRUE, option.getStaleDnsUseStaleOnNameNotResolvedOption()); 134 assertEquals(OptionalBoolean.TRUE, option.getDisableIpv6OnWifiOption()); 135 } 136 137 @Test testSetToFalseOptions_shouldUseFalseValues()138 public void testSetToFalseOptions_shouldUseFalseValues() throws JSONException { 139 ExperimentalOptions option = generateExperimentalValuesWith(false); 140 141 assertEquals(OptionalBoolean.FALSE, option.getStoreServerConfigsInPropertiesOption()); 142 assertEquals(OptionalBoolean.FALSE, option.getGoawaySessionsOnIpChangeOption()); 143 assertEquals(OptionalBoolean.FALSE, option.getCloseSessionsOnIpChangeOption()); 144 assertEquals(OptionalBoolean.FALSE, option.getMigrateSessionsOnNetworkChangeV2Option()); 145 assertEquals(OptionalBoolean.FALSE, option.getMigrateSessionsEarlyV2()); 146 assertEquals(OptionalBoolean.FALSE, option.getDisableBidirectionalStreamsOption()); 147 assertEquals(OptionalBoolean.FALSE, option.getEnableSocketRecvOptimizationOption()); 148 assertEquals(OptionalBoolean.FALSE, option.getAsyncDnsEnableOption()); 149 assertEquals(OptionalBoolean.FALSE, option.getStaleDnsEnableOption()); 150 assertEquals(OptionalBoolean.FALSE, option.getStaleDnsAllowOtherNetworkOption()); 151 assertEquals(OptionalBoolean.FALSE, option.getStaleDnsPersistToDiskOption()); 152 assertEquals(OptionalBoolean.FALSE, option.getStaleDnsUseStaleOnNameNotResolvedOption()); 153 assertEquals(OptionalBoolean.FALSE, option.getDisableIpv6OnWifiOption()); 154 } 155 generateExperimentalValuesWith(Boolean value)156 private ExperimentalOptions generateExperimentalValuesWith(Boolean value) throws JSONException { 157 JSONObject quicExperiment = 158 new JSONObject() 159 .put("connection_options", "") 160 .put("store_server_configs_in_properties", value) 161 .put("goaway_sessions_on_ip_change", value) 162 .put("close_sessions_on_ip_change", value) 163 .put("migrate_sessions_on_network_change_v2", value) 164 .put("migrate_sessions_early_v2", value) 165 .put("disable_bidirectional_streams", value) 166 .put("enable_socket_recv_optimization", value); 167 JSONObject asyncDNS = new JSONObject().put("enable", value); 168 JSONObject staleDNS = 169 new JSONObject() 170 .put("enable", value) 171 .put("allow_other_network", value) 172 .put("persist_to_disk", value) 173 .put("use_stale_on_name_not_resolved", value); 174 175 // add the integer values if needed 176 if (value) { 177 quicExperiment 178 .put("connection_options", CONN_STRING) 179 .put("max_server_configs_stored_in_properties", TEST_VALUE) 180 .put("idle_connection_timeout_seconds", TEST_VALUE) 181 .put("max_time_before_crypto_handshake_seconds", TEST_VALUE) 182 .put("max_idle_time_before_crypto_handshake_seconds", TEST_VALUE); 183 184 staleDNS.put("delay_ms", TEST_VALUE) 185 .put("max_expired_time_ms", TEST_VALUE) 186 .put("max_stale_uses", TEST_VALUE) 187 .put("persist_delay_ms", TEST_VALUE); 188 } 189 190 JSONObject options = 191 new JSONObject() 192 .put("QUIC", quicExperiment) 193 .put("AsyncDNS", asyncDNS) 194 .put("StaleDNS", staleDNS) 195 .put("disable_ipv6_on_wifi", value); 196 197 return new ExperimentalOptions(options.toString()); 198 } 199 } 200