• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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