17899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath/*
27899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * Copyright (C) 2012 Square, Inc.
37899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath *
47899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * Licensed under the Apache License, Version 2.0 (the "License");
57899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * you may not use this file except in compliance with the License.
67899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * You may obtain a copy of the License at
77899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath *
87899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath *      http://www.apache.org/licenses/LICENSE-2.0
97899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath *
107899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * Unless required by applicable law or agreed to in writing, software
117899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS,
127899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * See the License for the specific language governing permissions and
147899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath * limitations under the License.
157899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath */
162231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonpackage com.squareup.okhttp.internal.spdy;
172231db3e6bb54447a9b14cf004a6cb03c373651cjwilson
1854cf3446000fdcf88a9e62724f7deb0282e98da1jwilsonimport org.junit.Test;
1954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
20c6bd683320121544811f481709b3fdbcbe9b3866Neil Fullerimport static com.squareup.okhttp.internal.spdy.Settings.DEFAULT_INITIAL_WINDOW_SIZE;
212231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static com.squareup.okhttp.internal.spdy.Settings.DOWNLOAD_BANDWIDTH;
222231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static com.squareup.okhttp.internal.spdy.Settings.DOWNLOAD_RETRANS_RATE;
232231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static com.squareup.okhttp.internal.spdy.Settings.MAX_CONCURRENT_STREAMS;
242231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static com.squareup.okhttp.internal.spdy.Settings.PERSISTED;
252231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static com.squareup.okhttp.internal.spdy.Settings.PERSIST_VALUE;
262231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static com.squareup.okhttp.internal.spdy.Settings.UPLOAD_BANDWIDTH;
272231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static org.junit.Assert.assertEquals;
282231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static org.junit.Assert.assertFalse;
292231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonimport static org.junit.Assert.assertTrue;
302231db3e6bb54447a9b14cf004a6cb03c373651cjwilson
312231db3e6bb54447a9b14cf004a6cb03c373651cjwilsonpublic final class SettingsTest {
3254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  @Test public void unsetField() {
3354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    Settings settings = new Settings();
3454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(-3, settings.getUploadBandwidth(-3));
3554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  }
367899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath
3754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  @Test public void setFields() {
3854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    Settings settings = new Settings();
3954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
403c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    // WARNING: clash on flags between spdy/3 and http/2!
4154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(-3, settings.getUploadBandwidth(-3));
423c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(-1, settings.getHeaderTableSize());
433c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    settings.set(UPLOAD_BANDWIDTH, 0, 42);
4454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(42, settings.getUploadBandwidth(-3));
453c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    settings.set(Settings.HEADER_TABLE_SIZE, 0, 8096);
463c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(8096, settings.getHeaderTableSize());
4754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
483c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    // WARNING: clash on flags between spdy/3 and http/2!
4954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(-3, settings.getDownloadBandwidth(-3));
503c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(true, settings.getEnablePush(true));
513c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    settings.set(DOWNLOAD_BANDWIDTH, 0, 53);
5254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(53, settings.getDownloadBandwidth(-3));
533c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    settings.set(Settings.ENABLE_PUSH, 0, 0);
543c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    assertEquals(false, settings.getEnablePush(true));
5554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
5654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(-3, settings.getRoundTripTime(-3));
5754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, 0, 64);
5854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(64, settings.getRoundTripTime(-3));
5954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
6054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(-3, settings.getMaxConcurrentStreams(-3));
613c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    settings.set(MAX_CONCURRENT_STREAMS, 0, 75);
6254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(75, settings.getMaxConcurrentStreams(-3));
6354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
6454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(-3, settings.getCurrentCwnd(-3));
6554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.CURRENT_CWND, 0, 86);
6654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(86, settings.getCurrentCwnd(-3));
6754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
6854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(-3, settings.getDownloadRetransRate(-3));
693c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    settings.set(DOWNLOAD_RETRANS_RATE, 0, 97);
7054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(97, settings.getDownloadRetransRate(-3));
7154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
72c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals(DEFAULT_INITIAL_WINDOW_SIZE,
73c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller        settings.getInitialWindowSize(DEFAULT_INITIAL_WINDOW_SIZE));
7454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.INITIAL_WINDOW_SIZE, 0, 108);
75c6bd683320121544811f481709b3fdbcbe9b3866Neil Fuller    assertEquals(108, settings.getInitialWindowSize(DEFAULT_INITIAL_WINDOW_SIZE));
7654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
7754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(-3, settings.getClientCertificateVectorSize(-3));
7854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.CLIENT_CERTIFICATE_VECTOR_SIZE, 0, 117);
7954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(117, settings.getClientCertificateVectorSize(-3));
8054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  }
8154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
8254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  @Test public void isPersisted() {
8354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    Settings settings = new Settings();
8454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
8554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Initially false.
8654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
8754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
8854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Set no flags.
8954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, 0, 0);
9054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
9154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
9254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Set the wrong flag.
9354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE, 0);
9454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
9554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
9654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Set the right flag.
9754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, PERSISTED, 0);
9854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertTrue(settings.isPersisted(Settings.ROUND_TRIP_TIME));
9954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
10054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Set multiple flags.
10154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE | PERSISTED, 0);
10254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertTrue(settings.isPersisted(Settings.ROUND_TRIP_TIME));
10354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
10454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Clear the flag.
10554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE, 0);
10654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
10754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
10854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Clear all flags.
10954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, 0, 0);
11054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
11154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  }
11254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
11354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  @Test public void persistValue() {
11454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    Settings settings = new Settings();
11554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
11654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Initially false.
11754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
11854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
11954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Set no flags.
12054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, 0, 0);
12154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
12254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
12354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Set the wrong flag.
12454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, PERSISTED, 0);
12554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
12654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
12754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Set the right flag.
12854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE, 0);
12954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertTrue(settings.persistValue(Settings.ROUND_TRIP_TIME));
13054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
13154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Set multiple flags.
13254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE | PERSISTED, 0);
13354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertTrue(settings.persistValue(Settings.ROUND_TRIP_TIME));
13454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
13554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Clear the flag.
13654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, PERSISTED, 0);
13754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
13854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
13954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    // Clear all flags.
14054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    settings.set(Settings.ROUND_TRIP_TIME, 0, 0);
14154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
14254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  }
14354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
14454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  @Test public void merge() {
14554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    Settings a = new Settings();
14654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    a.set(UPLOAD_BANDWIDTH, PERSIST_VALUE, 100);
14754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    a.set(DOWNLOAD_BANDWIDTH, PERSIST_VALUE, 200);
14854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    a.set(DOWNLOAD_RETRANS_RATE, 0, 300);
14954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
15054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    Settings b = new Settings();
15154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    b.set(DOWNLOAD_BANDWIDTH, 0, 400);
15254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    b.set(DOWNLOAD_RETRANS_RATE, PERSIST_VALUE, 500);
15354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    b.set(MAX_CONCURRENT_STREAMS, PERSIST_VALUE, 600);
15454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson
15554cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    a.merge(b);
15654cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(100, a.getUploadBandwidth(-1));
15754cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(PERSIST_VALUE, a.flags(UPLOAD_BANDWIDTH));
15854cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(400, a.getDownloadBandwidth(-1));
15954cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(0, a.flags(DOWNLOAD_BANDWIDTH));
16054cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(500, a.getDownloadRetransRate(-1));
16154cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(PERSIST_VALUE, a.flags(DOWNLOAD_RETRANS_RATE));
16254cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(600, a.getMaxConcurrentStreams(-1));
16354cf3446000fdcf88a9e62724f7deb0282e98da1jwilson    assertEquals(PERSIST_VALUE, a.flags(MAX_CONCURRENT_STREAMS));
16454cf3446000fdcf88a9e62724f7deb0282e98da1jwilson  }
1657899c5ab935cf542069835ec7d3e457db596dbf7Narayan Kamath}
166