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