package com.goebl.david;
import junit.framework.TestCase;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.text.DateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TimeZone;
import java.util.zip.GZIPInputStream;
public class TestWebbUtils_NoMock extends TestCase {
public void testQueryString() throws Exception {
Map<String, Object> map = new LinkedHashMap<String, Object>();
assertEquals("empty map", "", WebbUtils.queryString(map));
map.put("abc", 123);
assertEquals("simple single param", "abc=123", WebbUtils.queryString(map));
map.put("dumb param", Boolean.TRUE);
assertEquals("uri-encode param", "abc=123&dumb+param=true", WebbUtils.queryString(map));
map.clear();
map.put("email", "abc@abc.com");
assertEquals("uri-encode value", "email=abc%40abc.com", WebbUtils.queryString(map));
}
public void testQueryStringMultiValuesObjectArray() throws Exception {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("m", new Object[]{"abc", 1, true, "abc@abc.com"});
assertEquals("multi-values", "m=abc&m=1&m=true&m=abc%40abc.com", WebbUtils.queryString(map));
}
public void testQueryStringMultiValuesStringArray() throws Exception {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("m", new String[]{"abc", "1", "true", "abc@abc.com"});
assertEquals("multi-values", "m=abc&m=1&m=true&m=abc%40abc.com", WebbUtils.queryString(map));
}
public void testQueryStringMultiValuesCollection() throws Exception {
Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("m", Arrays.asList("abc", 1, true, "abc@abc.com"));
assertEquals("multi-values", "m=abc&m=1&m=true&m=abc%40abc.com", WebbUtils.queryString(map));
}
public void testUrlEncode() throws Exception {
assertEquals("", WebbUtils.urlEncode(""));
assertEquals("normal-ascii", WebbUtils.urlEncode("normal-ascii"));
// instead of '+' for space '%20' is valid as well; in case of problems adapt test
assertEquals("Hello%2FWorld+%26+Co.%3F", WebbUtils.urlEncode("Hello/World & Co.?"));
assertEquals("M%C3%BCnchen+1+Ma%C3%9F+10+%E2%82%AC", WebbUtils.urlEncode("München 1 Maß 10 €"));
}
public void testToJsonObject() throws Exception {
JSONObject jsonExpected = new JSONObject();
jsonExpected.put("int", 1);
jsonExpected.put("bool", true);
jsonExpected.put("str", "a string");
String jsonStr = jsonExpected.toString();
JSONObject json = WebbUtils.toJsonObject(jsonStr.getBytes("UTF-8"));
assertEquals(jsonExpected.toString(), json.toString());
}
public void testToJsonObjectFail() throws Exception {
try {
// JSONObject parser is very forgiving: without ',' it would get parsed - unbelievable!
JSONObject json = WebbUtils.toJsonObject("{in, valid: 'json object'}".getBytes("UTF-8"));
// System.out.println(json.toString());
} catch (WebbException expected) {
return;
}
fail();
}
public void testToJsonArray() throws Exception {
JSONArray jsonExpected = new JSONArray();
jsonExpected.put(1);
jsonExpected.put(true);
jsonExpected.put("a string");
String jsonStr = jsonExpected.toString();
JSONArray json = WebbUtils.toJsonArray(jsonStr.getBytes("UTF-8"));
assertEquals(jsonExpected.toString(), json.toString());
}
public void testToJsonArrayFail() throws Exception {
try {
JSONArray array = WebbUtils.toJsonArray("[in - valid, 'json! array]".getBytes("UTF-8"));
// System.out.println(array.toString());
} catch (WebbException expected) {
return;
}
fail();
}
public void testReadBytes() throws Exception {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1024 * 2 + 100; ++i) {
sb.append(Character.valueOf((char) (i % 256)));
}
byte[] input = sb.toString().getBytes("UTF-8");
ByteArrayInputStream is = new ByteArrayInputStream(input);
byte[] read = WebbUtils.readBytes(is);
is.close();
assertArrayEquals(input, read);
assertNull("return null when is=null", WebbUtils.readBytes(null));
}
public void testAddRequestProperty_valueNull() throws Exception {
try {
WebbUtils.addRequestProperty(null, "name1", null);
} catch (IllegalArgumentException expected) {
return;
}
fail();
}
public void testAddRequestProperty_nameNull() throws Exception {
try {
WebbUtils.addRequestProperty(null, null, "abc");
} catch (IllegalArgumentException expected) {
return;
}
fail();
}
public void testAddRequestProperty_nameEmpty() throws Exception {
try {
WebbUtils.addRequestProperty(null, "", "abc");
} catch (IllegalArgumentException expected) {
return;
}
fail();
}
public void testGetRfc1123DateFormat() throws Exception {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.set(2013, Calendar.DECEMBER, 24, 23, 59);
cal.set(Calendar.SECOND, 30);
cal.set(Calendar.MILLISECOND, 501);
Date date = cal.getTime();
DateFormat dateFormat = WebbUtils.getRfc1123DateFormat();
String formatted = dateFormat.format(date);
if (!formatted.matches("^Tue, 24 Dec 2013 23:59:30 UTC(\\+0+:?0{0,2})?$")) {
fail();
}
}
public void testGzip() throws Exception {
try {
WebbUtils.gzip(null);
fail("should not accept null array");
} catch (WebbException expected) {
// good dog!
}
byte[] payload = new byte[5000];
for (int i = 0; i < payload.length; ++i) {
payload[i] = (byte) (0xFF & (i / 100));
}
byte[] gzip = WebbUtils.gzip(payload);
assertNotNull(gzip);
assertTrue(payload.length > gzip.length);
assertArrayEquals(payload, gunzip(gzip));
}
public static byte[] gunzip(byte[] gzip) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(gzip);
GZIPInputStream gzipInputStream = new GZIPInputStream(bais);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
WebbUtils.copyStream(gzipInputStream, baos);
gzipInputStream.close();
baos.close();
return baos.toByteArray();
}
private void assertArrayEquals(byte[] expected, byte[] bytes) {
assertEquals("array length mismatch", expected.length, bytes.length);
for (int i = 0; i < expected.length; i++) {
if (expected[i] != bytes[i]) {
fail(String.format("array different at index %d expected: %d, is: %d", i, expected[i], bytes[i]));
}
}
}
}