/*
* Weblounge: Web Content Management System
* Copyright (c) 2003 - 2011 The Weblounge Team
* http://entwinemedia.com/weblounge
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package ch.entwine.weblounge.cache.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import ch.entwine.weblounge.cache.impl.handle.TaggedCacheHandle;
import ch.entwine.weblounge.common.Times;
import ch.entwine.weblounge.common.impl.request.CacheTagImpl;
import ch.entwine.weblounge.common.impl.request.CacheTagSet;
import ch.entwine.weblounge.common.request.CacheHandle;
import ch.entwine.weblounge.common.request.CacheTag;
import org.junit.Before;
import org.junit.Test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
/**
* Test case for the implementation at {@link CacheEntry}.
*/
public class CacheEntryTest {
/** The cache entry */
protected CacheEntry entry = null;
/** The cache handle */
protected CacheHandle handle = null;
/** Response body */
protected String content = "Hello World!";
/** The cached response headers */
protected CacheableHttpServletResponseHeaders headers = null;
/** The expiration time */
protected long expirationTime = 1000;
/** The recheck time */
protected long recheckTime = 1000;
/** The first cache tag */
protected CacheTag tag = new CacheTagImpl("a", "a-value");
/** The first cache tag */
protected CacheTag otherTag = new CacheTagImpl("b", "b-value");
/** The cache tags */
protected CacheTagSet tags = new CacheTagSet();
/** Name of the test header */
protected String testHeaderName = "Test-Header";
/** The content encoding */
protected String encoding = "UTF-8";
/** Test header value */
protected String testHeaderValue = "header-value";
/** Content type */
protected String contentType = "text/xml";
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
tags.add(tag);
tags.add(otherTag);
headers = new CacheableHttpServletResponseHeaders();
headers.setHeader(testHeaderName, testHeaderValue);
headers.setHeader("Content-Type", contentType);
handle = new TaggedCacheHandle(tags.getTags(), expirationTime, recheckTime);
entry = new CacheEntry(handle, content.getBytes(), encoding, headers);
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#getKey()}.
*/
@Test
public void testGetKey() {
StringBuffer calculatedKey = new StringBuffer();
calculatedKey.append(tag.getName()).append("=").append(tag.getValue()).append("; ");
calculatedKey.append(otherTag.getName()).append("=").append(otherTag.getValue());
assertEquals(calculatedKey.toString(), entry.getKey());
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#getETag()}.
*/
@Test
public void testGetETag() throws Exception {
String eTag = entry.getETag();
assertNotNull(eTag);
Thread.sleep(1000);
CacheHandle newHandle = new TaggedCacheHandle(tags.getTags(), expirationTime, recheckTime);
String newETag = new CacheEntry(newHandle, content.getBytes(), encoding, headers).getETag();
assertFalse(eTag.equals(newETag));
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#getCreationDate()}.
*/
@Test
public void testGetCreationDate() throws Exception {
Thread.sleep(100);
assertTrue(System.currentTimeMillis() >= entry.getCreationDate());
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#containsTag(ch.entwine.weblounge.common.request.CacheTag)}.
*/
@Test
public void testContainsTag() {
assertTrue(entry.containsTag(tag));
assertTrue(entry.containsTag(otherTag));
assertFalse(entry.containsTag(new CacheTagImpl("a", "x")));
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#getHeaders()}.
*/
@Test
public void testGetHeaders() {
CacheableHttpServletResponseHeaders h = entry.getHeaders();
assertNotNull(h);
assertEquals(2, h.size());
assertTrue(h.getHeaders().containsKey(testHeaderName));
assertEquals(testHeaderValue, h.getHeaders().get(testHeaderName));
assertEquals(contentType, h.getHeaders().get("Content-Type"));
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#setHeaders(CacheableHttpServletResponseHeaders)}.
*/
@Test
public void testPassETag() {
String eTag = "\"0123456789\"";
CacheableHttpServletResponseHeaders h = entry.getHeaders();
h.addHeader("ETag", eTag);
entry.setHeaders(h);
assertEquals(eTag, entry.getETag());
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#setHeaders(CacheableHttpServletResponseHeaders)}.
*/
@Test
public void testPassModificationDate() {
Calendar c = Calendar.getInstance();
c.set(Calendar.MILLISECOND, 0);
Date modificationDate = c.getTime();
DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
CacheableHttpServletResponseHeaders h = entry.getHeaders();
h.addHeader("Last-Modified", df.format(modificationDate));
entry.setHeaders(h);
assertEquals(modificationDate.getTime(), entry.getModificationDate());
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#getContent()}.
*/
@Test
public void testGetContent() throws Exception {
assertNotNull(entry.getContent());
assertEquals(content, new String(entry.getContent(), "utf-8"));
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#getContentType()}.
*/
@Test
public void testGetContentType() {
assertNotNull(entry.getContentType());
assertEquals(contentType, entry.getContentType());
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#notModified(long)}.
*/
@Test
public void testNotModified() throws Exception {
Thread.sleep(100);
assertTrue(entry.notModified(System.currentTimeMillis()));
assertFalse(entry.notModified(System.currentTimeMillis() - Times.MS_PER_HOUR));
}
/**
* Test method for {@link ch.entwine.weblounge.cache.impl.CacheEntry#matches(java.lang.String)}.
*/
@Test
public void testMatches() {
String eTag = entry.getETag();
assertTrue(entry.matches(eTag));
}
}