blob: 5d1376737ed4b24b9220d24650fd314798b3a3c0 [file] [log] [blame]
/*
* Copyright (C) 2014 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.squareup.okhttp;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public final class CacheControlTest {
@Test public void emptyBuilderIsEmpty() throws Exception {
CacheControl cacheControl = new CacheControl.Builder().build();
assertEquals("", cacheControl.toString());
assertFalse(cacheControl.noCache());
assertFalse(cacheControl.noStore());
assertEquals(-1, cacheControl.maxAgeSeconds());
assertEquals(-1, cacheControl.sMaxAgeSeconds());
assertFalse(cacheControl.isPrivate());
assertFalse(cacheControl.isPublic());
assertFalse(cacheControl.mustRevalidate());
assertEquals(-1, cacheControl.maxStaleSeconds());
assertEquals(-1, cacheControl.minFreshSeconds());
assertFalse(cacheControl.onlyIfCached());
assertFalse(cacheControl.mustRevalidate());
}
@Test public void completeBuilder() throws Exception {
CacheControl cacheControl = new CacheControl.Builder()
.noCache()
.noStore()
.maxAge(1, TimeUnit.SECONDS)
.maxStale(2, TimeUnit.SECONDS)
.minFresh(3, TimeUnit.SECONDS)
.onlyIfCached()
.noTransform()
.build();
assertEquals("no-cache, no-store, max-age=1, max-stale=2, min-fresh=3, only-if-cached, "
+ "no-transform", cacheControl.toString());
assertTrue(cacheControl.noCache());
assertTrue(cacheControl.noStore());
assertEquals(1, cacheControl.maxAgeSeconds());
assertEquals(2, cacheControl.maxStaleSeconds());
assertEquals(3, cacheControl.minFreshSeconds());
assertTrue(cacheControl.onlyIfCached());
// These members are accessible to response headers only.
assertEquals(-1, cacheControl.sMaxAgeSeconds());
assertFalse(cacheControl.isPrivate());
assertFalse(cacheControl.isPublic());
assertFalse(cacheControl.mustRevalidate());
}
@Test public void parseEmpty() throws Exception {
CacheControl cacheControl = CacheControl.parse(
new Headers.Builder().set("Cache-Control", "").build());
assertEquals("", cacheControl.toString());
assertFalse(cacheControl.noCache());
assertFalse(cacheControl.noStore());
assertEquals(-1, cacheControl.maxAgeSeconds());
assertEquals(-1, cacheControl.sMaxAgeSeconds());
assertFalse(cacheControl.isPublic());
assertFalse(cacheControl.mustRevalidate());
assertEquals(-1, cacheControl.maxStaleSeconds());
assertEquals(-1, cacheControl.minFreshSeconds());
assertFalse(cacheControl.onlyIfCached());
assertFalse(cacheControl.mustRevalidate());
}
@Test public void parse() throws Exception {
String header = "no-cache, no-store, max-age=1, s-maxage=2, private, public, must-revalidate, "
+ "max-stale=3, min-fresh=4, only-if-cached, no-transform";
CacheControl cacheControl = CacheControl.parse(new Headers.Builder()
.set("Cache-Control", header)
.build());
assertTrue(cacheControl.noCache());
assertTrue(cacheControl.noStore());
assertEquals(1, cacheControl.maxAgeSeconds());
assertEquals(2, cacheControl.sMaxAgeSeconds());
assertTrue(cacheControl.isPrivate());
assertTrue(cacheControl.isPublic());
assertTrue(cacheControl.mustRevalidate());
assertEquals(3, cacheControl.maxStaleSeconds());
assertEquals(4, cacheControl.minFreshSeconds());
assertTrue(cacheControl.onlyIfCached());
assertTrue(cacheControl.noTransform());
assertEquals(header, cacheControl.toString());
}
@Test public void parseIgnoreCacheControlExtensions() throws Exception {
// Example from http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.6
String header = "private, community=\"UCI\"";
CacheControl cacheControl = CacheControl.parse(new Headers.Builder()
.set("Cache-Control", header)
.build());
assertFalse(cacheControl.noCache());
assertFalse(cacheControl.noStore());
assertEquals(-1, cacheControl.maxAgeSeconds());
assertEquals(-1, cacheControl.sMaxAgeSeconds());
assertTrue(cacheControl.isPrivate());
assertFalse(cacheControl.isPublic());
assertFalse(cacheControl.mustRevalidate());
assertEquals(-1, cacheControl.maxStaleSeconds());
assertEquals(-1, cacheControl.minFreshSeconds());
assertFalse(cacheControl.onlyIfCached());
assertFalse(cacheControl.noTransform());
assertEquals(header, cacheControl.toString());
}
@Test public void parseCacheControlAndPragmaAreCombined() {
Headers headers =
Headers.of("Cache-Control", "max-age=12", "Pragma", "must-revalidate", "Pragma", "public");
CacheControl cacheControl = CacheControl.parse(headers);
assertEquals("max-age=12, public, must-revalidate", cacheControl.toString());
}
@SuppressWarnings("RedundantStringConstructorCall") // Testing instance equality.
@Test public void parseCacheControlHeaderValueIsRetained() {
String value = new String("max-age=12");
Headers headers = Headers.of("Cache-Control", value);
CacheControl cacheControl = CacheControl.parse(headers);
assertSame(value, cacheControl.toString());
}
@Test public void parseCacheControlHeaderValueInvalidatedByPragma() {
Headers headers = Headers.of("Cache-Control", "max-age=12", "Pragma", "must-revalidate");
CacheControl cacheControl = CacheControl.parse(headers);
assertNull(cacheControl.headerValue);
}
@Test public void parseCacheControlHeaderValueInvalidatedByTwoValues() {
Headers headers = Headers.of("Cache-Control", "max-age=12", "Cache-Control", "must-revalidate");
CacheControl cacheControl = CacheControl.parse(headers);
assertNull(cacheControl.headerValue);
}
@Test public void parsePragmaHeaderValueIsNotRetained() {
Headers headers = Headers.of("Pragma", "must-revalidate");
CacheControl cacheControl = CacheControl.parse(headers);
assertNull(cacheControl.headerValue);
}
@Test public void computedHeaderValueIsCached() {
CacheControl cacheControl = new CacheControl.Builder()
.maxAge(2, TimeUnit.DAYS)
.build();
assertNull(cacheControl.headerValue);
assertEquals("max-age=172800", cacheControl.toString());
assertEquals("max-age=172800", cacheControl.headerValue);
cacheControl.headerValue = "Hi";
assertEquals("Hi", cacheControl.toString());
}
@Test public void timeDurationTruncatedToMaxValue() throws Exception {
CacheControl cacheControl = new CacheControl.Builder()
.maxAge(365 * 100, TimeUnit.DAYS) // Longer than Integer.MAX_VALUE seconds.
.build();
assertEquals(Integer.MAX_VALUE, cacheControl.maxAgeSeconds());
}
@Test public void secondsMustBeNonNegative() throws Exception {
CacheControl.Builder builder = new CacheControl.Builder();
try {
builder.maxAge(-1, TimeUnit.SECONDS);
fail();
} catch (IllegalArgumentException expected) {
}
}
@Test public void timePrecisionIsTruncatedToSeconds() throws Exception {
CacheControl cacheControl = new CacheControl.Builder()
.maxAge(4999, TimeUnit.MILLISECONDS)
.build();
assertEquals(4, cacheControl.maxAgeSeconds());
}
}