package org.jboss.resteasy.test.resource;
import org.jboss.logging.Logger;
import org.junit.Assert;
import org.junit.Test;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import java.util.Date;
import java.util.List;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @tpSubChapter Resource tests
* @tpChapter Unit tests
* @tpTestCaseDetails Set of tests for Cookie and NewCookie objects
* @tpSince RESTEasy 3.0.16
*/
public class CookieObjectTest {
private static Logger logger = Logger.getLogger(CookieObjectTest.class);
/**
* @tpTestDetails Create a version 0 Cookie instance by Parsing a String
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testParse1() throws Exception {
boolean pass = true;
String cookie_toParse = "NAME_1=Value_1;";
String name = "name_1";
String value = "value_1";
String path = "";
String domain = "";
int version = 0;
Cookie ck6 = javax.ws.rs.core.Cookie.valueOf(cookie_toParse);
pass = testCookie(ck6, name, value, path, domain, version);
}
/**
* @tpTestDetails Create a version 1 Cookie instance by Parsing a String
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testParse2() throws Exception {
boolean pass = true;
String cookie_toParse =
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\"; $Path=\"/acme\"";
String name = "customer";
String value = "wile_e_coyote";
String path = "/acme";
String domain = "";
int version = 1;
Cookie ck7 = javax.ws.rs.core.Cookie.valueOf(cookie_toParse);
pass = testCookie(ck7, name, value, path, domain, version);
}
/**
* @tpTestDetails Test if correct exception is thrown when calling Cookie.valueOf(null)
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testParse3() throws Exception {
try {
Cookie ck8 = javax.ws.rs.core.Cookie.valueOf(null);
throw new Exception("Expectecd IllegalArgumentException not thrown. Test Failed");
} catch (java.lang.IllegalArgumentException ilex) {
}
}
/**
* @tpTestDetails Create a version 1 NewCookie instance by Parsing a String
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testNewCookie1() throws Exception {
boolean pass = true;
String NewCookie_toParse = "NAME_1=Value_1;";
String name = "name_1";
String value = "value_1";
String path = "";
String domain = "";
int version = 1;
NewCookie nck26 = javax.ws.rs.core.NewCookie.valueOf(NewCookie_toParse);
pass = verifyNewCookie(nck26, name, value, path, domain, version,
"", -1, null, false, false);
// check round-tripping
Assert.assertEquals(nck26, NewCookie.valueOf(nck26.toString()));
}
/**
* @tpTestDetails Create a version 1 NewCookie instance by Parsing a String
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testNewCookie2() throws Exception {
boolean pass = true;
String NewCookie_toParse =
"Customer=WILE_E_COYOTE; Path=/acme; Version=1";
String name = "customer";
String value = "wile_e_coyote";
String path = "/acme";
String domain = "";
int version = 1;
NewCookie nck27 = javax.ws.rs.core.NewCookie.valueOf(NewCookie_toParse);
pass = verifyNewCookie(nck27, name, value, path, domain, version,
"", -1, null, false, false);
// check round-tripping
Assert.assertEquals(nck27, NewCookie.valueOf(nck27.toString()));
}
/**
* @tpTestDetails Create a NewCookie instance by Parsing a null String. Verify that IllegalArgumentException is thrown.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testNewCookie3() throws Exception {
try {
NewCookie nck27 = javax.ws.rs.core.NewCookie.valueOf(null);
throw new Exception("Expected IllegalArgumentException not thrown. Test Failed.");
} catch (IllegalArgumentException ilex) {
}
}
/**
* @tpTestDetails Create a version 1 NewCookie instance by Parsing a String
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testNewCookie4() throws Exception {
boolean pass = true;
String NewCookie_toParse =
"Customer=WILE_E_COYOTE; Path=/acme; Domain=acme.com; Max-Age=150000000; " +
"Expires=Thu, 03-May-2018 10:36:34 GMT; Secure; HttpOnly";
String name = "customer";
String value = "wile_e_coyote";
String path = "/acme";
String domain = "acme.com";
int version = 1;
String comment = "";
int maxAge = 150000000;
GregorianCalendar cal = new GregorianCalendar(2018, Calendar.MAY, 3, 10, 36, 34);
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
Date expiry = cal.getTime();
boolean secure = true;
boolean httpOnly = true;
NewCookie nck28 = javax.ws.rs.core.NewCookie.valueOf(NewCookie_toParse);
pass = verifyNewCookie(nck28, name, value, path, domain, version,
comment, maxAge, expiry, secure, httpOnly);
// check round-tripping
Assert.assertEquals(nck28, NewCookie.valueOf(nck28.toString()));
}
private boolean testCookie(Cookie ck, String name, String value,
String path, String domain, int version) throws Exception {
StringBuffer sb = new StringBuffer();
boolean pass = true;
if (name == "" || name == null) {
pass = false;
sb.append("Cookie's name is empty");
} else if (!ck.getName().toLowerCase().equals(name)) {
pass = false;
sb.append("Failed name test. Expect " + name + " got " +
ck.getName());
}
if (value == "" || value == null) {
pass = false;
sb.append("Cookie's value is empty");
} else if (!ck.getValue().toLowerCase().equals(value)) {
pass = false;
sb.append("Failed value test. Expect " + value + " got " +
ck.getValue());
}
if (ck.getVersion() != version) {
pass = false;
sb.append("Failed version test. Expect " + version + " got " +
ck.getVersion());
}
if (path == "" || path == null) {
if (ck.getPath() != "" && ck.getPath() != null) {
pass = false;
sb.append("Failed path test. Expect null String, got " +
ck.getPath());
}
} else if (ck.getPath() == null || ck.getPath() == "") {
pass = false;
sb.append("Failed path test. Got null, expecting " + path);
} else if (!ck.getPath().toLowerCase().equals(path)) {
pass = false;
sb.append("Failed path test. Expect " + path + " got " +
ck.getPath());
}
if (domain == "" || domain == null) {
if (ck.getDomain() != "" && ck.getDomain() != null) {
pass = false;
sb.append("Failed path test. Expect " + domain + " got " +
ck.getDomain());
}
} else if (!ck.getDomain().toLowerCase().equals(domain)) {
pass = false;
sb.append("Failed domain test. Expect " + domain + " got " +
ck.getDomain());
}
if (!pass) {
throw new Exception("At least one assertion falied: " + sb.toString());
}
return pass;
}
private boolean verifyNewCookie(NewCookie nck, String name, String value,
String path, String domain, int version, String comment, int maxage,
Date expiry, boolean secure, boolean httpOnly) throws Exception {
StringBuffer sb = new StringBuffer();
boolean pass = true;
if (name == null || name.isEmpty()) {
pass = false;
sb.append("NewCookie's name is empty");
} else if (!nck.getName().toLowerCase().equals(name)) {
pass = false;
sb.append("Failed name test. Expect " + name + " got " +
nck.getName());
}
if (value == null || value.isEmpty()) {
pass = false;
sb.append("NewCookie's value is empty");
} else if (!nck.getValue().toLowerCase().equals(value)) {
pass = false;
sb.append("Failed value test. Expect " + value + " got " +
nck.getValue());
}
if (nck.getVersion() != version) {
pass = false;
sb.append("Failed version test. Expect " + version + " got " +
nck.getVersion());
}
if (comment == null || comment.isEmpty()) {
if (nck.getComment() != "" && nck.getComment() != null) {
pass = false;
sb.append("Failed comment test. Expect null String, got <" +
nck.getComment() + ">");
}
} else if (!nck.getComment().toLowerCase().equals(comment)) {
pass = false;
sb.append("Failed comment test. Expect " + comment + " got " +
nck.getComment());
}
if (path == null || path.isEmpty()) {
if (nck.getPath() != "" && nck.getPath() != null) {
pass = false;
sb.append("Failed path test. Expect null String, got " +
nck.getPath());
}
} else if (nck.getPath() == null || nck.getPath().isEmpty()) {
pass = false;
sb.append("Failed path test. Got null, expecting " + path);
} else if (!nck.getPath().toLowerCase().equals(path)) {
pass = false;
sb.append("Failed path test. Expect " + path + " got " +
nck.getPath());
}
if (domain == null || domain.isEmpty()) {
if (nck.getDomain() != null && !nck.getDomain().isEmpty()) {
pass = false;
sb.append("Failed domain test. Expect " + domain + " got " +
nck.getDomain());
}
} else if (!nck.getDomain().toLowerCase().equals(domain)) {
pass = false;
sb.append("Failed domain test. Expect " + domain + " got " +
nck.getDomain());
}
if (nck.getMaxAge() != maxage) {
pass = false;
sb.append("Failed maxage test. Expect " + maxage + " got " +
nck.getMaxAge());
}
if (expiry == null) {
if (nck.getExpiry() != null) {
pass = false;
sb.append("Failed expiry test. Expect " + expiry + " got " +
nck.getExpiry());
}
} else if (nck.getExpiry() == null) {
pass = false;
sb.append("Failed expiry test. Got null, expecting " + expiry);
} else if (!nck.getExpiry().equals(expiry)) {
pass = false;
sb.append("Failed expirytest. Expect " + expiry + " got " +
nck.getExpiry());
}
if (nck.isSecure() != secure) {
pass = false;
sb.append("Failed secure test. Expect " + secure + " got " +
nck.isSecure());
}
if (nck.isHttpOnly() != httpOnly) {
pass = false;
sb.append("Failed httpOnly test. Expect " + httpOnly + " got " +
nck.isHttpOnly());
}
if (!pass) {
throw new Exception("At least one assertion failed: " + sb.toString());
}
return pass;
}
/**
* @tpTestDetails Create an instance of Response using Response.ResponseBuilder.cookie(NewCookie).build()
* and verify that correct status code is returned
* @tpSince RESTEasy 3.0.16
*/
@Test
public void cookieTest5() throws Exception {
StringBuffer sb = new StringBuffer();
boolean pass = true;
int status = 200;
String name = "name_1";
String value = "value_1";
int maxage = javax.ws.rs.core.NewCookie.DEFAULT_MAX_AGE;
int version = 1;
boolean secure = false;
Cookie ck1 = new Cookie(name, value);
NewCookie nck1 = new NewCookie(ck1);
name = "name_2";
value = "value_2";
String path = "/acme";
String domain = "";
Cookie ck2 = new Cookie(name, value, path, domain);
NewCookie nck2 = new NewCookie(ck2);
name = "name_3";
value = "value_3";
path = "";
domain = "y.x.foo.com";
Cookie ck3 = new Cookie(name, value, path, domain);
NewCookie nck3 = new NewCookie(ck3);
List<String> cookies = Arrays.asList(nck1.toString().toLowerCase(),
nck2.toString().toLowerCase(),
nck3.toString().toLowerCase());
Response resp = Response.status(status).cookie(nck1, nck2, nck3).build();
String tmp = verifyResponse(resp, null, status, null, null, null, null,
null, cookies);
if (tmp.endsWith("false")) {
pass = false;
}
sb.append(tmp + "\n");
logger.info(sb.toString());
if (!pass) {
throw new Exception("AT least one assertion failed.");
}
}
/**
* @tpTestDetails Create an instance of Response using Response.ResponseBuilder.header(String, Object).build()
* and verify that correct status code is returned
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testHeader() throws Exception {
StringBuffer sb = new StringBuffer();
boolean pass = true;
int status = 200;
List<String> type = Arrays.asList("text/plain", "text/html");
List<String> encoding = Arrays.asList("gzip", "compress");
List<String> lang = Arrays.asList("en_US", "en_GB", "zh_CN");
String name = "name_1";
String value = "value_1";
Cookie ck1 = new Cookie(name, value);
NewCookie nck1 = new NewCookie(ck1);
List<String> cookies = Arrays.asList(nck1.toString().toLowerCase());
Response resp = Response.status(status).header("Content-type",
"text/plain").header("Content-type", "text/html").header("Content-Language", "en_US").
header("Content-Language", "en_GB").header("Content-Language",
"zh_CN").header("Cache-Control", "no-transform").
header("Set-Cookie", "name_1=value_1;version=1").build();
String tmp = verifyResponse(resp, null, status, encoding, lang, type,
null, null, cookies);
if (tmp.endsWith("false")) {
pass = false;
}
sb.append(tmp + newline);
logger.info(sb.toString());
if (!pass) {
throw new Exception("AT least one assertion failed.");
}
}
private static String newline = "\n";
private static String indent = "\t";
private String verifyResponse(Response resp, String content, int status,
HashMap<String, String> expected_map) throws Exception {
boolean pass = true;
StringBuffer sb = new StringBuffer();
sb.append("========== Verifying a Response with Map: " + newline);
String entity = (String) resp.getEntity();
if ((content == null) || (content == "")) {
if (!(resp.getEntity() == null) || (resp.getEntity() == "")) {
pass = false;
sb.append(indent +
"Entity verification failed: expecting no content, got " +
(String) resp.getEntity() + newline);
}
} else if (!content.equals(((String) resp.getEntity()))) {
pass = false;
sb.append(indent + "Entity verification failed: expecting " +
content +
", got " + (String) resp.getEntity() + newline);
} else {
sb.append(indent + "Correct content found in Response: " +
(String) resp.getEntity() + newline);
}
if (resp.getStatus() != status) {
pass = false;
sb.append(indent + "Status code verification failed: expecting " +
status +
", got " + resp.getStatus() + newline);
} else {
sb.append(indent + "Correct status found in Response: " + status +
newline);
}
MultivaluedMap<String, Object> mvp =
resp.getMetadata();
if (expected_map == null) {
sb.append(indent +
"No keys to verify or expected, but found the following keys in Response:" +
newline);
for (String key : mvp.keySet()) {
sb.append(indent + indent + "Key: " + key + "; " +
mvp.getFirst(key) + ";" + newline);
}
} else {
for (String key_actual : mvp.keySet()) {
sb.append(indent + "Response contains key: " +
key_actual + newline);
}
sb.append(indent + "Verifying the following keys in Response:" +
newline);
String actual, expected = null;
for (Map.Entry<String, String> entry : expected_map.entrySet()) {
String key = entry.getKey();
if (!mvp.containsKey(key)) {
pass = false;
sb.append(indent + indent + "Key: " + key +
" is not found in Response;" + newline);
} else if (key.equalsIgnoreCase("last-modified")) {
sb.append(indent + indent +
"Key Last-Modified is found in response" +
newline);
} else {
expected = entry.getValue().toLowerCase();
actual = mvp.getFirst(key).toString().toLowerCase();
if (actual.startsWith("\"") && actual.endsWith("\"")) {
actual = actual.substring(1, actual.length() - 1);
}
if (!actual.equals(expected)) {
pass = false;
sb.append(indent + indent + "Key: " + key +
" found in Response, but with different value;" +
newline);
sb.append(indent + indent + "Expecting " +
entry.getValue() +
"; got " + mvp.getFirst(key) + newline);
}
sb.append(indent + indent + "Processed key " + key +
" with expected value " +
entry.getValue() + newline);
}
}
}
sb.append(indent + pass);
return sb.toString();
}
private String verifyResponse(Response resp, String content, int status,
List<String> encoding, List<String> language, List<String> type,
List<String> var, List<String> ccl, List<String> cookies)
throws Exception {
boolean pass = true;
StringBuffer sb = new StringBuffer();
sb.append("========== Verifying a Response: " + newline);
String tmp = verifyResponse(resp, content, status, null);
sb.append(indent + tmp + newline);
if (tmp.endsWith("false")) {
pass = false;
}
MultivaluedMap<java.lang.String, java.lang.Object> mvp =
resp.getMetadata();
for (Map.Entry<String, List<Object>> entry : mvp.entrySet()) {
String key = entry.getKey();
sb.append(indent + "Processing Key found in response: " + key + ": " +
entry.getValue() + "; " + newline);
if (key.equalsIgnoreCase("Vary")) {
for (String value : var) {
String actual = entry.getValue().toString().toLowerCase();
if (actual.indexOf(value) < 0) {
pass = false;
sb.append(indent + indent + "Expected header " + value +
" not set in Vary." + newline);
} else {
sb.append(indent + indent + "Found expected header " +
value + "." + newline);
}
}
}
if (encoding != null) {
if (key.toString().equalsIgnoreCase("Content-encoding")) {
for (Object enc : entry.getValue()) {
if (!encoding.contains(enc.toString().toLowerCase())) {
pass = false;
sb.append(indent + indent + "Encoding test failed: " +
newline);
}
}
}
}
if (language != null) {
if (key.toString().equalsIgnoreCase("Content-language")) {
for (Object lang : entry.getValue()) {
if (!language.contains(lang.toString())) {
pass = false;
sb.append(indent + indent + "language test failed: " +
lang +
" is not expected in Response" + newline);
for (String tt : language) {
sb.append(indent + indent +
"Expecting Content-Language " + tt +
newline);
}
}
}
}
}
if (type != null) {
if (key.toString().equalsIgnoreCase("Content-Type")) {
for (Object lang : entry.getValue()) {
if (!type.contains(lang.toString().toLowerCase())) {
pass = false;
sb.append(indent + indent +
"Content-Type test failed: " + lang +
" is not expected in Response" + newline);
}
}
}
}
if (ccl != null) {
for (String tt : ccl) {
sb.append("Expecting Cache-Control " + tt + newline);
}
if (key.toString().equalsIgnoreCase("Cache-Control")) {
for (Object all_ccl : entry.getValue()) {
for (String cc : ccl) {
if (!(all_ccl.toString().toLowerCase().indexOf(cc.toLowerCase()) >
-1)) {
pass = false;
sb.append(indent + indent +
"Cache-Control test failed: " + cc +
" is not found in Response." + newline);
}
}
}
}
}
if (cookies != null) {
for (String tt : cookies) {
sb.append(indent + indent + "EXpecting Set-Cookie" + tt +
newline);
}
if (key.toString().equalsIgnoreCase("Set-Cookie")) {
for (Object nck_actual : entry.getValue()) {
sb.append(indent + indent + "Processing " +
nck_actual.toString() +
newline);
String s = nck_actual.toString().toLowerCase().
replace(" ", "");
if (!cookies.contains(s)) {
pass = false;
sb.append(indent + indent +
"Set-Cookie test failed: " + nck_actual +
" is not expected in Response." + newline);
} else {
sb.append(indent + indent + "Expected Set-Cookie: " +
nck_actual +
" is found in Response." + newline);
}
}
}
}
}
sb.append(indent + pass);
return sb.toString();
}
}