| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package org.apache.cassandra.db.marshal; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import java.nio.ByteBuffer; |
| import org.apache.cassandra.cql3.QueryOptions; |
| import org.apache.cassandra.transport.Server; |
| import org.apache.cassandra.utils.UUIDGen; |
| import org.codehaus.jackson.map.ObjectMapper; |
| import org.junit.Test; |
| |
| public class JsonConversionTest |
| { |
| private static final ObjectMapper JSON_OBJECT_MAPPER = new ObjectMapper(); |
| |
| @Test |
| public void testMap() throws Exception |
| { |
| String type = "FrozenType(MapType(TupleType(ListType(Int32Type), ListType(Int32Type)), ListType(Int32Type)))"; |
| String json = "{" |
| + "\"[[1, 2, 3], [1, 2, 3]]\": [1, 2, 3], " |
| + "\"[[1, 2, 3, 4], [1, 2, 3, 4]]\": [1, 2, 3, 4], " |
| + "\"[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]\": [1, 2, 3, 4, 5]" |
| + "}"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testUDT() throws Exception |
| { |
| // 6161-> aa |
| // 78 -> x |
| String type = "UserType(ks,6161,78:TupleType(ListType(Int32Type), ListType(Int32Type)))"; |
| String json = "{" |
| + "\"x\": [[1, 2, 3], [1, 2, 3]]" |
| + "}"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testSimpleDate() throws Exception |
| { |
| String type = "SimpleDateType"; |
| String json = "\"1991-06-20\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testDate() throws Exception |
| { |
| String type = "DateType"; |
| String json = "\"1991-06-20 18:00:00.000Z\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testCounterColumn() throws Exception |
| { |
| Long value = 1L; |
| String json = "1"; |
| assertBytebufferPositionAndOutput(json, value, CounterColumnType.instance); |
| } |
| |
| @Test |
| public void testTimestamp() throws Exception |
| { |
| String type = "TimestampType"; |
| String json = "\"1991-06-20 18:00:00.000Z\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test(expected = UnsupportedOperationException.class) |
| public void testDynamicCompositeType() throws Exception |
| { |
| String type = "DynamicCompositeType(a=>Int32Type, b=>Int32Type)"; |
| // not supported |
| String json = "{" |
| + "\"a\":1," |
| + "\"b\":2" |
| + "}"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test(expected = UnsupportedOperationException.class) |
| public void testCompositeType() throws Exception |
| { |
| String type = "CompositeType(Int32Type, Int32Type)"; |
| // not supported |
| String json = "{" |
| + "\"a\":1," |
| + "\"b\":2" |
| + "}"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testList() throws Exception |
| { |
| String type = "FrozenType(ListType(TupleType(ListType(Int32Type), ListType(Int32Type))))"; |
| String json = "[" |
| + "[[1, 2, 3], [1, 2, 3]], " |
| + "[[1, 2, 3, 4], [1, 2, 3, 4]], " |
| + "[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]" |
| + "]"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testSet() throws Exception |
| { |
| String type = "FrozenType(SetType(TupleType(Int32Type, Int32Type)))"; |
| String json = "[[1, 2], [1, 3], [2, 3]]"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testTuple() throws Exception |
| { |
| String type = "FrozenType(TupleType(TupleType(ListType(Int32Type), ListType(Int32Type))))"; |
| String json = "[" |
| + "[[1, 2, 3], [1, 2, 3]]" |
| + "]"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testInt32() throws Exception |
| { |
| String type = "Int32Type"; |
| String json = "10000000"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testReversed() throws Exception |
| { |
| String type = "ReversedType(Int32Type)"; |
| String json = "10000000"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testInteger() throws Exception |
| { |
| String type = "IntegerType"; |
| String json = "10000000"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testDecimal() throws Exception |
| { |
| String type = "DecimalType"; |
| String json = "100000.01"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testEmpty() throws Exception |
| { |
| String type = "EmptyType"; |
| String json = "\"\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testDouble() throws Exception |
| { |
| String type = "DoubleType"; |
| String json = "100000.01"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testFloat() throws Exception |
| { |
| String type = "FloatType"; |
| String json = "100000.01"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testShort() throws Exception |
| { |
| String type = "ShortType"; |
| String json = "100"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testByte() throws Exception |
| { |
| String type = "ByteType"; |
| String json = "0"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testTime() throws Exception |
| { |
| String type = "TimeType"; |
| String json = "\"00:00:00.000001991\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testInetAddress() throws Exception |
| { |
| String type = "InetAddressType"; |
| String json = "\"127.0.0.1\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testBoolean() throws Exception |
| { |
| String type = "BooleanType"; |
| String json = "false"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testLong() throws Exception |
| { |
| String type = "LongType"; |
| String json = "10000000000"; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testAscii() throws Exception |
| { |
| String type = "AsciiType"; |
| String json = "\"aaa\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testBytes() throws Exception |
| { |
| String type = "BytesType"; |
| String json = "\"0x00000001\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testUUID() throws Exception |
| { |
| String type = "UUIDType"; |
| String json = "\"6bddc89a-5644-11e4-97fc-56847afe9799\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testLexicalUUID() throws Exception |
| { |
| String type = "LexicalUUIDType"; |
| String json = "\"6bddc89a-5644-11e4-97fc-56847afe9799\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testTimeUUID() throws Exception |
| { |
| String type = "TimeUUIDType"; |
| String json = "\"" + UUIDGen.getTimeUUID() + "\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| @Test |
| public void testUtf8() throws Exception |
| { |
| String type = "UTF8Type"; |
| String json = "\"abc\""; |
| assertBytebufferPositionAndOutput(json, type); |
| } |
| |
| // for those only supports toJson, eg. Counter |
| private static <T> void assertBytebufferPositionAndOutput(String json, T value, AbstractType<T> type) |
| throws Exception |
| { |
| ByteBuffer bb = type.getSerializer().serialize(value); |
| int position = bb.position(); |
| |
| String output = type.toJSONString(bb, Server.CURRENT_VERSION); |
| assertEquals(position, bb.position()); |
| assertEquals(json, output); |
| } |
| |
| // test fromJSONObject and toJSONString |
| private static void assertBytebufferPositionAndOutput(String json, String typeString) throws Exception |
| { |
| AbstractType<?> type = TypeParser.parse(typeString); |
| Object jsonObject = JSON_OBJECT_MAPPER.readValue(json, Object.class); |
| ByteBuffer bb = type.fromJSONObject(jsonObject).bindAndGet(QueryOptions.DEFAULT); |
| int position = bb.position(); |
| |
| String output = type.toJSONString(bb, Server.CURRENT_VERSION); |
| assertEquals(position, bb.position()); |
| assertEquals(json, output); |
| } |
| } |