| /* |
| * 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()); |
| } |
| } |