package org.codehaus.httpcache4j.cache;
import org.codehaus.httpcache4j.*;
import org.codehaus.httpcache4j.preference.Preference;
import org.junit.Test;
import org.junit.Assert;
import org.codehaus.httpcache4j.util.TestUtil;
import java.util.HashMap;
import java.util.Map;
import java.util.Collections;
import java.net.URI;
import java.io.File;
import static org.junit.Assert.*;
/**
* @author <a href="mailto:hamnis@codehaus.org">Erlend Hamnaberg</a>
* @version $Id $
*/
public class VaryTest {
@Test
public void testIsEmpty() {
Vary vary = new Vary();
assertTrue("Header names added", vary.isEmpty());
vary = new Vary(new HashMap<String, String>());
assertTrue("Header names added", vary.isEmpty());
}
@Test
public void testHasOne() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept-Language", "en");
Vary vary = new Vary(map);
assertFalse("Header names added", vary.isEmpty());
assertEquals("Header names added", 1, vary.size());
}
@Test
public void testIsAuthenticated() {
HashMap<String, String> map = new HashMap<String, String>();
map.put(HeaderConstants.AUTHORIZATION, "jdoe");
Vary vary = new Vary(map);
Assert.assertEquals("Header names added", 1, vary.size());
Assert.assertTrue("Request does not match",
vary.matches(new HTTPRequest(URI.create("hi")).challenge(new UsernamePasswordChallenge("jdoe", "bar"))));
}
@Test
public void testHasMultiple() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept-Language", "en");
map.put("Accept-Encoding", "gz");
map.put("Accept-Charset", "UTF-8");
Vary vary = new Vary(map);
assertFalse("Header names added", vary.isEmpty());
assertEquals("Header names added", 3, vary.size());
}
@Test
public void testDoesNotMatchRequest() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept-Language", "en");
map.put("Accept-Encoding", "gz");
map.put("Accept-Charset", "UTF-8");
Vary vary = new Vary(map);
Assert.assertFalse("Header names added", vary.isEmpty());
Assert.assertEquals("Header names added", 3, vary.size());
HTTPRequest request = new HTTPRequest(URI.create("no.uri"));
assertFalse(vary.matches(request));
}
@Test
public void testDoesMatchesRequest() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept-Language", "en");
map.put("Accept-Encoding", "gz");
map.put("Accept-Charset", "UTF-8");
Vary vary = new Vary(map);
assertFalse("Header names added", vary.isEmpty());
assertEquals("Header names added", 3, vary.size());
HTTPRequest request = new HTTPRequest(URI.create("no.uri"));
for (Map.Entry<String, String> header : map.entrySet()) {
request = request.addHeader(header.getKey(), header.getValue());
}
assertTrue(vary.matches(request));
}
@Test
public void testAlmostMatchesRequest() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept-Language", "en");
map.put("Accept-Encoding", "gz");
map.put("Accept-Charset", "UTF-8");
Vary vary = new Vary(map);
assertFalse("Header names added", vary.isEmpty());
assertEquals("Header names added", 3, vary.size());
HTTPRequest request = new HTTPRequest(URI.create("no.uri"));
request = request.addHeader("Accept-Language", "de");
request = request.addHeader("Accept-Encoding", "gz");
request = request.addHeader("Accept-Charset", "UTF-8");
assertFalse(vary.matches(request));
}
@Test
public void acceptShouldMatch() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept", "application/xml");
Vary vary = new Vary(map);
assertFalse("Header names added", vary.isEmpty());
assertEquals("Header names added", 1, vary.size());
HTTPRequest request = new HTTPRequest(URI.create("no.uri"));
request = request.addHeader("Accept", "application/xml");
request = request.headers(new Headers().addAccept(MIMEType.valueOf("application/xml")));
assertTrue("request did not specify application/xml", vary.matches(request));
}
@Test
public void acceptWithManyPreferencesShouldMatch() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept", "application/xml, application/json");
Vary vary = new Vary(map);
assertFalse("Header names added", vary.isEmpty());
assertEquals("Header names added", 1, vary.size());
HTTPRequest request = new HTTPRequest(URI.create("no.uri"));
request = request.addHeader("Accept", "application/xml");
request = request.headers(new Headers().addAccept(MIMEType.valueOf("application/xml"), MIMEType.valueOf("application/json")));
assertTrue("request did not specify application/xml", vary.matches(request));
}
@Test
public void acceptWithUnsortedManyPreferencesShouldMatch() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Accept", "application/xml; q=0.8, application/json");
Vary vary = new Vary(map);
assertFalse("Header names added", vary.isEmpty());
assertEquals("Header names added", 1, vary.size());
HTTPRequest request = new HTTPRequest(URI.create("no.uri"));
request = request.addHeader("Accept", "application/json, application/xml; q=0.8");
assertTrue("Wrong accept header", vary.matches(request));
request = request.setHeader("Accept", "application/xml; q=0.8, application/json");
assertTrue("Wrong accept header", vary.matches(request));
}
@Test
public void noVaryThenVary() {
final Vary empty = new Vary();
assertTrue("Empty vary was not empty", empty.isEmpty());
HashMap<String, String> map = new HashMap<>();
map.put("Accept", "application/xml");
HTTPRequest request = new HTTPRequest(URI.create("http://foo.com")).addHeader("Accept", "application/xml");
assertFalse("Empty matched Accept", empty.matches(request));
assertTrue("Did not match request", new Vary(map).matches(request));
}
@Test
public void All() {
Vary STAR = Vary.ALL;
HTTPRequest baseRequest = new HTTPRequest(URI.create("http://foo.com"));
assertFalse("STAR matched request", STAR.matches(baseRequest));
assertFalse("STAR matched request", STAR.matches(baseRequest.addHeader("Accept", "application/xml")));
}
@Test
public void testVaryFileResolve() {
FileManager resolver = new FileManager(TestUtil.getTestFile("target"));
File file = resolver.resolve(Key.create(URI.create("foo"), new Vary()));
File file2 = resolver.resolve(Key.create(URI.create("foo"), new Vary()));
File file3 = resolver.resolve(Key.create(URI.create("foo"), new Vary(new HashMap<String, String>())));
File file4 = resolver.resolve(Key.create(URI.create("foo"), new Vary(Collections.singletonMap("Accept-Language", "en"))));
assertEquals(file.getAbsolutePath(), file2.getAbsolutePath());
assertEquals(file.getAbsolutePath(), file3.getAbsolutePath());
assertEquals(file2.getAbsolutePath(), file3.getAbsolutePath());
assertEquals(file2.getAbsolutePath(), file3.getAbsolutePath());
assertFalse(file4.getAbsolutePath().equals(file3.getAbsolutePath()));
}
}