1/*
2 * Copyright (C) 2012 Square, Inc.
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 */
16package com.squareup.okhttp.internal.spdy;
17
18import org.junit.Test;
19
20import static com.squareup.okhttp.internal.spdy.Settings.DEFAULT_INITIAL_WINDOW_SIZE;
21import static com.squareup.okhttp.internal.spdy.Settings.DOWNLOAD_BANDWIDTH;
22import static com.squareup.okhttp.internal.spdy.Settings.DOWNLOAD_RETRANS_RATE;
23import static com.squareup.okhttp.internal.spdy.Settings.MAX_CONCURRENT_STREAMS;
24import static com.squareup.okhttp.internal.spdy.Settings.PERSISTED;
25import static com.squareup.okhttp.internal.spdy.Settings.PERSIST_VALUE;
26import static com.squareup.okhttp.internal.spdy.Settings.UPLOAD_BANDWIDTH;
27import static org.junit.Assert.assertEquals;
28import static org.junit.Assert.assertFalse;
29import static org.junit.Assert.assertTrue;
30
31public final class SettingsTest {
32  @Test public void unsetField() {
33    Settings settings = new Settings();
34    assertEquals(-3, settings.getUploadBandwidth(-3));
35  }
36
37  @Test public void setFields() {
38    Settings settings = new Settings();
39
40    // WARNING: clash on flags between spdy/3 and http/2!
41    assertEquals(-3, settings.getUploadBandwidth(-3));
42    assertEquals(-1, settings.getHeaderTableSize());
43    settings.set(UPLOAD_BANDWIDTH, 0, 42);
44    assertEquals(42, settings.getUploadBandwidth(-3));
45    settings.set(Settings.HEADER_TABLE_SIZE, 0, 8096);
46    assertEquals(8096, settings.getHeaderTableSize());
47
48    // WARNING: clash on flags between spdy/3 and http/2!
49    assertEquals(-3, settings.getDownloadBandwidth(-3));
50    assertEquals(true, settings.getEnablePush(true));
51    settings.set(DOWNLOAD_BANDWIDTH, 0, 53);
52    assertEquals(53, settings.getDownloadBandwidth(-3));
53    settings.set(Settings.ENABLE_PUSH, 0, 0);
54    assertEquals(false, settings.getEnablePush(true));
55
56    assertEquals(-3, settings.getRoundTripTime(-3));
57    settings.set(Settings.ROUND_TRIP_TIME, 0, 64);
58    assertEquals(64, settings.getRoundTripTime(-3));
59
60    assertEquals(-3, settings.getMaxConcurrentStreams(-3));
61    settings.set(MAX_CONCURRENT_STREAMS, 0, 75);
62    assertEquals(75, settings.getMaxConcurrentStreams(-3));
63
64    assertEquals(-3, settings.getCurrentCwnd(-3));
65    settings.set(Settings.CURRENT_CWND, 0, 86);
66    assertEquals(86, settings.getCurrentCwnd(-3));
67
68    assertEquals(-3, settings.getDownloadRetransRate(-3));
69    settings.set(DOWNLOAD_RETRANS_RATE, 0, 97);
70    assertEquals(97, settings.getDownloadRetransRate(-3));
71
72    assertEquals(DEFAULT_INITIAL_WINDOW_SIZE,
73        settings.getInitialWindowSize(DEFAULT_INITIAL_WINDOW_SIZE));
74    settings.set(Settings.INITIAL_WINDOW_SIZE, 0, 108);
75    assertEquals(108, settings.getInitialWindowSize(DEFAULT_INITIAL_WINDOW_SIZE));
76
77    assertEquals(-3, settings.getClientCertificateVectorSize(-3));
78    settings.set(Settings.CLIENT_CERTIFICATE_VECTOR_SIZE, 0, 117);
79    assertEquals(117, settings.getClientCertificateVectorSize(-3));
80  }
81
82  @Test public void isPersisted() {
83    Settings settings = new Settings();
84
85    // Initially false.
86    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
87
88    // Set no flags.
89    settings.set(Settings.ROUND_TRIP_TIME, 0, 0);
90    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
91
92    // Set the wrong flag.
93    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE, 0);
94    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
95
96    // Set the right flag.
97    settings.set(Settings.ROUND_TRIP_TIME, PERSISTED, 0);
98    assertTrue(settings.isPersisted(Settings.ROUND_TRIP_TIME));
99
100    // Set multiple flags.
101    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE | PERSISTED, 0);
102    assertTrue(settings.isPersisted(Settings.ROUND_TRIP_TIME));
103
104    // Clear the flag.
105    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE, 0);
106    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
107
108    // Clear all flags.
109    settings.set(Settings.ROUND_TRIP_TIME, 0, 0);
110    assertFalse(settings.isPersisted(Settings.ROUND_TRIP_TIME));
111  }
112
113  @Test public void persistValue() {
114    Settings settings = new Settings();
115
116    // Initially false.
117    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
118
119    // Set no flags.
120    settings.set(Settings.ROUND_TRIP_TIME, 0, 0);
121    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
122
123    // Set the wrong flag.
124    settings.set(Settings.ROUND_TRIP_TIME, PERSISTED, 0);
125    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
126
127    // Set the right flag.
128    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE, 0);
129    assertTrue(settings.persistValue(Settings.ROUND_TRIP_TIME));
130
131    // Set multiple flags.
132    settings.set(Settings.ROUND_TRIP_TIME, PERSIST_VALUE | PERSISTED, 0);
133    assertTrue(settings.persistValue(Settings.ROUND_TRIP_TIME));
134
135    // Clear the flag.
136    settings.set(Settings.ROUND_TRIP_TIME, PERSISTED, 0);
137    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
138
139    // Clear all flags.
140    settings.set(Settings.ROUND_TRIP_TIME, 0, 0);
141    assertFalse(settings.persistValue(Settings.ROUND_TRIP_TIME));
142  }
143
144  @Test public void merge() {
145    Settings a = new Settings();
146    a.set(UPLOAD_BANDWIDTH, PERSIST_VALUE, 100);
147    a.set(DOWNLOAD_BANDWIDTH, PERSIST_VALUE, 200);
148    a.set(DOWNLOAD_RETRANS_RATE, 0, 300);
149
150    Settings b = new Settings();
151    b.set(DOWNLOAD_BANDWIDTH, 0, 400);
152    b.set(DOWNLOAD_RETRANS_RATE, PERSIST_VALUE, 500);
153    b.set(MAX_CONCURRENT_STREAMS, PERSIST_VALUE, 600);
154
155    a.merge(b);
156    assertEquals(100, a.getUploadBandwidth(-1));
157    assertEquals(PERSIST_VALUE, a.flags(UPLOAD_BANDWIDTH));
158    assertEquals(400, a.getDownloadBandwidth(-1));
159    assertEquals(0, a.flags(DOWNLOAD_BANDWIDTH));
160    assertEquals(500, a.getDownloadRetransRate(-1));
161    assertEquals(PERSIST_VALUE, a.flags(DOWNLOAD_RETRANS_RATE));
162    assertEquals(600, a.getMaxConcurrentStreams(-1));
163    assertEquals(PERSIST_VALUE, a.flags(MAX_CONCURRENT_STREAMS));
164  }
165}
166