/*
* Copyright (c) 2008, The Codehaus. All Rights Reserved.
*
* 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 org.codehaus.httpcache4j.cache;
import org.codehaus.httpcache4j.*;
import static org.codehaus.httpcache4j.HeaderConstants.*;
import org.junit.Assert;
import org.junit.Test;
import org.junit.Before;
import java.time.*;
public class CacheItemTest {
private CacheItem item;
private final LocalDateTime storageTime = LocalDateTime.of(2008, 10, 12, 15, 0, 0, 0);
private final LocalDateTime now = storageTime.plusMinutes(1);
private Clock clock;
@Before
public void before() {
setClock(now);
}
private LocalDateTime newDate() {
return LocalDateTime.now(clock);
}
private void setClock(LocalDateTime dt) {
clock = Clock.fixed(dt.atZone(ZoneId.of("UTC")).toInstant(), ZoneId.of("UTC"));
}
public void setupItem(Headers headers) {
item = new DefaultCacheItem(new HTTPResponse(Status.OK, headers), storageTime);
}
@Test
public void testIsNotStale() {
Headers headers = createDefaultHeaders().add(new Header(CACHE_CONTROL, "private, max-age=3600"));
setupItem(headers);
Assert.assertFalse("Item was stale", item.isStale(newDate()));
item = new DefaultCacheItem(item.getResponse(), now.minusMinutes(61));
Assert.assertTrue("Item was not stale", item.isStale(newDate()));
}
private Headers createDefaultHeaders() {
return new Headers().add(HeaderUtils.toHttpDate(DATE, newDate()));
}
@Test
public void testIsStale() {
Headers headers = createDefaultHeaders().add(new Header(CACHE_CONTROL, "private, max-age=60"));
setupItem(headers);
setClock(now.plusMinutes(1));
Assert.assertTrue("Item was not stale", item.isStale(newDate()));
}
@Test
public void testIsStaleExpiresHeader() {
Headers headers = createDefaultHeaders().add(HeaderUtils.toHttpDate(EXPIRES, now));
setupItem(headers);
Assert.assertTrue("Item was not stale", item.isStale(newDate()));
}
@Test
public void testIsNotStaleExpiresHeader() {
Headers headers = createDefaultHeaders();
LocalDateTime future = now.plusHours(1);
headers = headers.add(HeaderUtils.toHttpDate(EXPIRES, future));
setupItem(headers);
Assert.assertTrue("Item was stale", !item.isStale(newDate()));
}
@Test
public void testIsStaleEqualToDateHeader() {
Headers headers = new Headers();
LocalDateTime future = now.plusHours(1);
headers = headers.add(HeaderUtils.toHttpDate(EXPIRES, future));
headers = headers.add(HeaderUtils.toHttpDate(DATE, future));
setupItem(headers);
Assert.assertTrue("Item was stale", item.isStale(now));
}
@Test
public void testIsStaleExpiresHeaderWithInvalidDate() {
Headers headers = new Headers().add(new Header(EXPIRES, "foo"));
setupItem(headers);
Assert.assertTrue("Item was stale", item.isStale(now));
}
@Test
public void testIsStaleExpiresHeaderWithCacheControl() {
Headers headers = createDefaultHeaders();
//This should be preferred by the isStale method.
headers = headers.add(new Header(CACHE_CONTROL, "private, max-age=60"));
LocalDateTime future = now.plusHours(24);
headers = headers.add(HeaderUtils.toHttpDate(EXPIRES, future));
setupItem(headers);
Assert.assertTrue("Item was not stale", item.isStale(newDate()));
}
private LocalDateTime createDateTime(int seconds) {
return now.plusSeconds(seconds);
}
@Test
public void ageShouldBe10Seconds() {
Headers headers = new Headers().add(HeaderUtils.toHttpDate("Date", now));
LocalDateTime dateTime = createDateTime(10);
setClock(dateTime);
HTTPResponse cachedResponse = new HTTPResponse(Status.OK, headers);
LocalDateTime requestTime = newDate();
long age = new DefaultCacheItem(cachedResponse, now).getAge(requestTime);
Assert.assertEquals(10, age);
}
}