/******************************************************************************* * Copyright (c) 2010-2015 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.core.rest; import static org.junit.Assert.*; import java.io.IOException; import java.io.StringReader; import java.net.URL; import java.util.UUID; import org.apache.commons.lang.time.DateFormatUtils; import org.eclipse.skalli.commons.URLUtils; import org.eclipse.skalli.testutil.AssertUtils; import org.junit.Test; @SuppressWarnings("nls") public class JSONRestReaderTest { @Test public void testObjectVariousValues() throws Exception { UUID uuid = UUID.randomUUID(); URL url = URLUtils.asURL("http://localhost:8080/path"); long now = (System.currentTimeMillis() / 1000) * 1000; // cut off milliseconds JSONRestReader json = getRestReader("{\"a\":\"string\",\"b\":4711,\"c\":3.14,\"d\":true," + "\"e\":[\"x\",\"y\"],\"f\":\"\",\"g\":{\"x\":\"string\"},\"h\":\"" + uuid.toString() + "\"," + "\"i\":\"" + url.toExternalForm() + "\"," + "\"j\":\"" + DateFormatUtils.formatUTC(now, "yyyy-MM-dd'T'HH:mm:ss'Z'") + "\"}"); json.object(); assertTrue(json.hasMore()); assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("b","a","c")); assertFalse(json.isKeyAnyOf("x","y","z")); assertEquals("a", json.key()); assertFalse(json.isKey()); assertEquals("string", json.valueString()); assertTrue(json.hasMore()); assertEquals("b", json.key()); assertEquals(4711L, json.valueLong()); assertTrue(json.hasMore()); assertEquals("c", json.key()); assertEquals(3.14d, json.valueDouble(), 0.1d); assertTrue(json.hasMore()); assertEquals("d", json.key()); assertTrue(json.valueBoolean()); assertTrue(json.hasMore()); assertEquals("e", json.key()); assertTrue(json.isArray()); json.array(); assertTrue(json.hasMore()); assertEquals("x", json.valueString()); assertTrue(json.hasMore()); assertEquals("y", json.valueString()); assertFalse(json.hasMore()); json.end(); assertTrue(json.hasMore()); assertEquals("f", json.key()); assertEquals("", json.valueString()); assertTrue(json.hasMore()); assertEquals("g", json.key()); assertTrue(json.isObject()); json.object(); assertTrue(json.hasMore()); assertEquals("x", json.key()); assertEquals("string", json.valueString()); assertFalse(json.hasMore()); json.end(); assertTrue(json.hasMore()); assertEquals("h", json.key()); assertEquals(uuid, json.valueUUID()); assertTrue(json.hasMore()); assertEquals("i", json.key()); assertEquals(url, json.valueURL()); assertTrue(json.hasMore()); assertEquals("j", json.key()); assertEquals(now, json.valueDatetime().getTimeInMillis()); assertFalse(json.hasMore()); json.end(); } @Test public void testIsKeyIsValue() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\",\"value\":\"b\",\"c\":4711}"); json.object(); assertTrue(json.isKey()); assertTrue(json.isKey("a")); assertFalse(json.isValue()); assertEquals("a", json.key()); assertFalse(json.isKey()); assertTrue(json.isValue()); assertEquals("string", json.valueString()); assertTrue(json.isKey()); assertTrue(json.isKey("value")); assertTrue(json.isValue()); // attribute with the special name "value"! assertEquals("b", json.valueString()); assertTrue(json.isKey()); assertTrue(json.isKey("c")); assertFalse(json.isValue()); assertEquals("c", json.key()); assertFalse(json.isKey()); assertTrue(json.isValue()); assertEquals(4711L, json.valueLong()); json.end(); } @Test public void testStringValue() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\",\"b\":4711,\"c\":3.14,\"d\":true,\"e\":null}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); assertEquals("b", json.key()); assertEquals("4711", json.valueString()); assertEquals("c", json.key()); assertEquals("3.14", json.valueString()); assertEquals("d", json.key()); assertEquals("true", json.valueString()); assertEquals("e", json.key()); assertNull(json.valueString()); json.end(); } @Test public void testValueIgoreKeys() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\",\"b\":4711,\"c\":3.14,\"d\":true,\"e\":null}"); json.object(); assertEquals("string", json.valueString()); assertEquals(4711, json.valueLong()); assertEquals(3.14, json.valueDouble(), 0.1); assertEquals(true, json.valueBoolean()); assertNull(json.valueString()); json.end(); } @Test(expected=IllegalStateException.class) public void testStringValueOfArray() throws Exception { JSONRestReader json = getRestReader("\"a\":[\"x\",\"y\"]"); json.object(); assertEquals("a", json.key()); json.valueString(); } @Test(expected=IllegalStateException.class) public void testStringValueOfObject() throws Exception { JSONRestReader json = getRestReader("\"a\":{\"x\":\"y\"}"); json.object(); assertEquals("a", json.key()); json.valueString(); } public void testValueLongFromString() throws Exception { JSONRestReader json = getRestReader("\"a\":\"4711\",\"b\":\"1.0\""); json.object(); assertEquals("a", json.key()); assertEquals(4711, json.valueLong()); assertEquals("b", json.key()); assertEquals(1, json.valueLong()); json.end(); } @Test(expected=NumberFormatException.class) public void testValueLongOfString() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\"}"); json.object(); assertEquals("a", json.key()); json.valueLong(); } @Test(expected=NumberFormatException.class) public void testValueLongOfFloat() throws Exception { JSONRestReader json = getRestReader("{\"a\":3.14}"); json.object(); assertEquals("a", json.key()); json.valueLong(); } public void testValueDoubleFromString() throws Exception { JSONRestReader json = getRestReader("\"a\":\"4711\",\"b\":\"1.0\""); json.object(); assertEquals("a", json.key()); assertEquals(4711.0d, json.valueDouble(), 0.1d); assertEquals("b", json.key()); assertEquals(1.0d, json.valueDouble(), 0.1d); json.end(); } @Test(expected=NumberFormatException.class) public void testValueDoubleOfString() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\"}"); json.object(); assertEquals("a", json.key()); json.valueDouble(); } @Test public void testCollection() throws Exception { JSONRestReader json = getRestReader("{\"a\":[\"string\",4711,1.0,true,null]}"); json.object(); assertEquals("a", json.key()); AssertUtils.assertEquals("collection()", json.collection("foobar"), "string", "4711", "1.0", "true", null); json.end(); } @Test public void testAttributes() throws Exception { UUID uuid = UUID.randomUUID(); URL url = URLUtils.asURL("http://localhost:8080/path"); long now = (System.currentTimeMillis() / 1000) * 1000; // cut off milliseconds JSONRestReader json = getRestReader("{\"a\":\"string\",\"b\":4711,\"c\":3.14,\"d\":true," + "\"e\":\"" + uuid.toString() + "\"," + "\"f\":\"" + url.toExternalForm() + "\"," + "\"g\":\"" + DateFormatUtils.formatUTC(now, "yyyy-MM-dd'T'HH:mm:ss'Z'") + "\"}"); assertAttributes(json, uuid, url, now); } @Test public void testPrefixedAttributes() throws Exception { UUID uuid = UUID.randomUUID(); URL url = URLUtils.asURL("http://localhost:8080/path"); long now = (System.currentTimeMillis() / 1000) * 1000; // cut off milliseconds JSONRestReader json = getRestReader("{\"@a\":\"string\",\"@b\":4711,\"@c\":3.14,\"@d\":true," + "\"@e\":\"" + uuid.toString() + "\"," + "\"@f\":\"" + url.toExternalForm() + "\"," + "\"@g\":\"" + DateFormatUtils.formatUTC(now, "yyyy-MM-dd'T'HH:mm:ss'Z'") + "\"}"); json.set(JSONRestReader.PREFIXED_ATTRIBUTES); assertAttributes(json, uuid, url, now); } @Test public void testSkipObject() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\",\"b\":\"string\"}"); json.object(); assertTrue(json.hasMore()); assertTrue(json.isKey("a")); assertFalse(json.isValue()); json.skip(); assertTrue(json.hasMore()); assertTrue(json.isKey("b")); assertFalse(json.isValue()); json.skip(); assertFalse(json.hasMore()); json.end(); } @Test public void testSkipArray() throws Exception { JSONRestReader json = getRestReader("[\"a\",\"b\"]"); json.array(); assertTrue(json.hasMore()); assertFalse(json.isKey()); assertTrue(json.isValue()); json.skip(); assertTrue(json.hasMore()); assertFalse(json.isKey()); assertTrue(json.isValue()); json.skip(); assertFalse(json.hasMore()); json.end(); } @Test public void testSkipUnreadObjectAttributesAtEnd() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\",\"b\":\"string\"}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); json.end(); // must not fail! } @Test public void testSkipUnreadArrayEntriesAtEnd() throws Exception { JSONRestReader json = getRestReader("[\"a\",\"b\"]"); json.array(); assertEquals("a", json.valueString()); json.end(); // must not fail! } @Test(expected=IllegalStateException.class) public void testUnexpectedEnd() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\"}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); json.end(); json.end(); // unexpected } @Test(expected=IllegalStateException.class) public void testStillInInitialState() throws Exception { JSONRestReader json = getRestReader("{}"); json.end(); // unexpected } @Test(expected=IllegalStateException.class) public void testFinalStateObject() throws Exception { JSONRestReader json = getRestReader("{}"); json.object(); json.end(); assertFalse(json.isObject()); json.object(); } @Test(expected=IllegalStateException.class) public void testFinalStateArray() throws Exception { JSONRestReader json = getRestReader("{}"); json.object(); json.end(); assertFalse(json.isArray()); json.array(); } @Test(expected=IllegalStateException.class) public void testFinalStateKey() throws Exception { JSONRestReader json = getRestReader("{}"); json.object(); json.end(); assertFalse(json.isKey()); json.key(); } @Test(expected=IllegalStateException.class) public void testFinalStateValue() throws Exception { JSONRestReader json = getRestReader("{}"); json.object(); json.end(); json.valueString(); } @Test(expected=IllegalStateException.class) public void testFinalStateSkip() throws Exception { JSONRestReader json = getRestReader("{}"); json.object(); json.end(); json.skip(); } @Test public void testSkipArrayElement() throws Exception { JSONRestReader json = getRestReader("{\"a\":[\"skipped\",\"string\"]}"); json.object(); assertEquals("a", json.key()); json.array(); assertTrue(json.hasMore()); json.skip(); assertTrue(json.hasMore()); assertEquals("string", json.valueString()); json.end(); json.end(); } @Test public void testSkipObjectAttribute() throws Exception { JSONRestReader json = getRestReader("{\"a\":{\"skipped\":\"skipped\",\"y\":\"z\"}}"); json.object(); assertEquals("a", json.key()); json.object(); assertTrue(json.hasMore()); json.skip(); assertTrue(json.hasMore()); assertEquals("y", json.key()); assertEquals("z", json.valueString()); json.end(); json.end(); } @Test public void testSkipObjectValue() throws Exception { JSONRestReader json = getRestReader("{\"a\":{\"x\":\"skipped\",\"y\":\"z\"}}"); json.object(); assertEquals("a", json.key()); json.object(); assertTrue(json.hasMore()); assertEquals("x", json.key()); json.skip(); assertTrue(json.hasMore()); assertEquals("y", json.key()); assertEquals("z", json.valueString()); json.end(); json.end(); } @Test public void testSkipKeySequence() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"b\",\"c\":\"d\"}"); json.object(); assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("a")); assertEquals("b", json.attributeString()); assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("c")); assertEquals("d", json.attributeString()); json.end(); } @Test public void testSkipKeyArray() throws Exception { JSONRestReader json = getRestReader("{\"a\":[\"x\"]}"); json.object(); assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("a")); json.array(); assertEquals("x", json.valueString()); json.end(); json.end(); } @Test public void testSkipKeyObject() throws Exception { JSONRestReader json = getRestReader("{\"a\":{\"x\":\"y\"}}"); json.object(); assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("a")); json.object(); assertEquals("x", json.key()); assertEquals("y", json.valueString()); json.end(); json.end(); } @Test(expected=IllegalStateException.class) public void testImplicitSkipValue() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"b\",\"c\":\"d\"}"); json.object(); assertEquals("a", json.key()); assertEquals("c", json.key()); } @Test public void testExplicitSkipValue() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"b\",\"c\":\"d\"}"); json.object(); assertEquals("a", json.key()); json.skip(); assertEquals("c", json.key()); json.skip(); json.end(); } @Test public void testSkipSequence() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\",\"g\":\"h\"}"); json.object(); assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("a")); assertEquals("b", json.attributeString()); // skip the key assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("c")); json.skip(); // skip key and value assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("e")); assertEquals("e", json.key()); json.skip(); // skip the value assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("g")); assertEquals("g", json.key()); assertEquals("h", json.valueString()); json.end(); } @Test public void testCheckSameKeyTwice() throws Exception { JSONRestReader json = getRestReader("{\"a\":{}}"); json.object(); assertTrue(json.isKey()); assertTrue(json.isKey()); assertEquals("a", json.key()); assertFalse(json.isKey()); json.skip(); // skip the array value json.end(); } @Test(expected=IllegalStateException.class) public void testReadSameKeyTwice() throws Exception { JSONRestReader json = getRestReader("{\"a\":{}}"); json.object(); assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("a")); assertEquals("a", json.key()); assertFalse(json.isKey()); assertFalse(json.isKeyAnyOf("a")); json.key(); } @Test(expected=IllegalStateException.class) public void testExpectValueTwice() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"b\"}"); json.object(); assertTrue(json.isKey()); assertTrue(json.isKeyAnyOf("a")); assertEquals("a", json.key()); assertEquals("b", json.valueString()); json.valueString(); } @Test public void testNonExecutePrefix() throws Exception { JSONRestReader json = getRestReader(")]}'\n{\"a\":\"string\"}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); json.end(); } @Test(expected=IOException.class) public void testStrictNonExecutePrefix() throws Exception { JSONRestReader json = getRestReader(")]}'\n{\"a\":\"string\"}"); json.set(JSONRestReader.STRICT); json.object(); } @Test public void testLineComments() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\",\n # line comment \n\"c\":4711 /* c-style comment */}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); assertEquals("c", json.key()); assertEquals(4711, json.valueLong()); json.end(); } @Test(expected=IOException.class) public void testStrictLineComments() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\",\n # line comment \n\"c\":4711 /* c-style comment */}"); json.set(JSONRestReader.STRICT); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); json.key(); } @Test public void testUnquotedKey() throws Exception { JSONRestReader json = getRestReader("{a:\"string\"}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); json.end(); } @Test(expected=IOException.class) public void testStrictUnquotedKey() throws Exception { JSONRestReader json = getRestReader("{a:\"string\"}"); json.set(JSONRestReader.STRICT); json.object(); json.key(); } @Test public void testUnquotedString() throws Exception { JSONRestReader json = getRestReader("{\"a\": string ,\"b\":4711}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); // enclosing whitspace is ignored assertEquals("b", json.key()); assertEquals(4711, json.valueLong()); json.end(); } @Test(expected=IOException.class) public void testStrictUnquotedString() throws Exception { JSONRestReader json = getRestReader("{\"a\":string}"); json.set(JSONRestReader.STRICT); json.object(); assertEquals("a", json.key()); json.valueString(); } @Test public void testSingleQuotedKeys() throws Exception { JSONRestReader json = getRestReader("{'a':\"string\"}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); json.end(); } @Test(expected=IOException.class) public void testStrictSingleQuotedKeys() throws Exception { JSONRestReader json = getRestReader("{'a':\"string\"}"); json.set(JSONRestReader.STRICT); json.object(); json.key(); } @Test public void testSingleQuotedString() throws Exception { JSONRestReader json = getRestReader("{\"a\":' string ',\"b\":4711}"); json.object(); assertEquals("a", json.key()); assertEquals(" string ", json.valueString()); assertEquals("b", json.key()); assertEquals(4711, json.valueLong()); json.end(); } @Test(expected=IOException.class) public void testStrictSingleQuotedString() throws Exception { JSONRestReader json = getRestReader("{\"a\":'string'}"); json.set(JSONRestReader.STRICT); json.object(); assertEquals("a", json.key()); json.valueString(); } @Test public void testAlternativeSeparatorsObject() throws Exception { JSONRestReader json = getRestReader("{\"a\"=>\"string\";\"b\"=4711}"); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); assertEquals("b", json.key()); assertEquals(4711, json.valueLong()); json.end(); } @Test(expected=IOException.class) public void testStrictSeparatorObject1() throws Exception { JSONRestReader json = getRestReader("{\"a\"=\"string\"}"); json.set(JSONRestReader.STRICT); json.object(); assertEquals("a", json.key()); json.valueString(); } @Test(expected=IOException.class) public void testStrictSeparatorObject2() throws Exception { JSONRestReader json = getRestReader("{\"a\"=>\"string\"}"); json.set(JSONRestReader.STRICT); json.object(); assertEquals("a", json.key()); json.valueString(); } @Test(expected=IOException.class) public void testStrictSeparatorObject3() throws Exception { JSONRestReader json = getRestReader("{\"a\":\"string\";\"b\":4711}"); json.set(JSONRestReader.STRICT); json.object(); assertEquals("a", json.key()); assertEquals("string", json.valueString()); json.key(); } @Test public void testAlternativeSeparatorsArray() throws Exception { JSONRestReader json = getRestReader("[\"a\";\"b\"]"); json.array(); assertEquals("a", json.valueString()); assertEquals("b", json.valueString()); json.end(); } @Test(expected=IOException.class) public void testStrictSeparatorArray() throws Exception { JSONRestReader json = getRestReader("[\"a\";\"b\"]"); json.set(JSONRestReader.STRICT); json.array(); assertEquals("a", json.valueString()); json.valueString(); } @Test public void testArrayWithNullValues() throws Exception { JSONRestReader json = getRestReader("[\"a\",null,,,\"b\"]"); json.array(); assertEquals("a", json.valueString()); assertNull(json.valueString()); assertNull(json.valueString()); assertNull(json.valueString()); assertEquals("b", json.valueString()); json.end(); } @Test(expected=IOException.class) public void testStrictArrayWithNullValues() throws Exception { JSONRestReader json = getRestReader("[\"a\",,\"b\"]"); json.set(JSONRestReader.STRICT); json.array(); assertEquals("a", json.valueString()); json.valueString(); } private void assertAttributes(JSONRestReader json, UUID uuid, URL url, long now) throws Exception { json.object(); assertEquals("a", json.key()); assertEquals("string", json.attributeString()); assertEquals("b", json.key()); assertEquals(4711L, json.attributeLong()); assertEquals("c", json.key()); assertEquals(3.14d, json.attributeDouble(), 0.1d); assertEquals("d", json.key()); assertTrue(json.attributeBoolean()); assertEquals("e", json.key()); assertEquals(uuid, json.attributeUUID()); assertEquals("f", json.key()); assertEquals(url, json.attributeURL()); assertEquals("g", json.key()); assertEquals(now, json.attributeDatetime().getTimeInMillis()); json.end(); } private JSONRestReader getRestReader(String s) { StringReader reader = new StringReader(s); JSONRestReader json = new JSONRestReader(reader); return json; } }