| /* |
| * 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.tinkerpop.gremlin.driver.ser; |
| |
| import io.netty.buffer.ByteBuf; |
| import io.netty.buffer.ByteBufAllocator; |
| import io.netty.buffer.UnpooledByteBufAllocator; |
| import org.apache.tinkerpop.gremlin.driver.MessageSerializer; |
| import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage; |
| import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode; |
| import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; |
| import org.apache.tinkerpop.gremlin.structure.Edge; |
| import org.apache.tinkerpop.gremlin.structure.Graph; |
| import org.apache.tinkerpop.gremlin.structure.Vertex; |
| import org.apache.tinkerpop.gremlin.structure.VertexProperty; |
| import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge; |
| import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex; |
| import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory; |
| import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; |
| import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; |
| import org.junit.Test; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.UUID; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| /** |
| * Serializer tests that cover non-lossy serialization/deserialization methods. |
| * |
| * @author Stephen Mallette (http://stephen.genoprime.com) |
| */ |
| public class GryoLiteMessageSerializerV1d0Test { |
| private static final Map<String, Object> config = new HashMap<String, Object>() {{ |
| put(AbstractGryoMessageSerializerV1d0.TOKEN_SERIALIZE_RESULT_TO_STRING, true); |
| }}; |
| |
| private UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1"); |
| private ResponseMessage.Builder responseMessageBuilder = ResponseMessage.build(requestId); |
| private static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT; |
| |
| public MessageSerializer binarySerializer = new GryoLiteMessageSerializerV1d0(); |
| |
| @Test |
| public void shouldSerializeEdge() throws Exception { |
| final Graph g = TinkerGraph.open(); |
| final Vertex v1 = g.addVertex(); |
| final Vertex v2 = g.addVertex(); |
| final Edge e = v1.addEdge("test", v2); |
| e.property("abc", 123); |
| |
| final Iterable<Edge> iterable = IteratorUtils.list(g.edges()); |
| |
| final ResponseMessage response = convertBinary(iterable); |
| assertCommon(response); |
| |
| final List<ReferenceEdge> edgeList = (List<ReferenceEdge>) response.getResult().getData(); |
| assertEquals(1, edgeList.size()); |
| |
| final ReferenceEdge deserializedEdge = edgeList.get(0); |
| assertEquals(e.id(), deserializedEdge.id()); |
| assertEquals("test", deserializedEdge.label()); |
| |
| assertEquals(0, IteratorUtils.count(deserializedEdge.properties())); |
| assertEquals(v1.id(), deserializedEdge.outVertex().id()); |
| assertEquals(Vertex.DEFAULT_LABEL, deserializedEdge.outVertex().label()); |
| assertEquals(v2.id(), deserializedEdge.inVertex().id()); |
| assertEquals(Vertex.DEFAULT_LABEL, deserializedEdge.inVertex().label()); |
| } |
| |
| @Test |
| public void shouldSerializeVertexWithEmbeddedMap() throws Exception { |
| final Graph g = TinkerGraph.open(); |
| final Vertex v = g.addVertex(); |
| final Map<String, Object> map = new HashMap<>(); |
| map.put("x", 500); |
| map.put("y", "some"); |
| |
| final ArrayList<Object> friends = new ArrayList<>(); |
| friends.add("x"); |
| friends.add(5); |
| friends.add(map); |
| |
| v.property(VertexProperty.Cardinality.single, "friends", friends); |
| |
| final List list = IteratorUtils.list(g.vertices()); |
| |
| final ResponseMessage response = convertBinary(list); |
| assertCommon(response); |
| |
| final List<ReferenceVertex> vertexList = (List<ReferenceVertex>) response.getResult().getData(); |
| assertEquals(1, vertexList.size()); |
| |
| final ReferenceVertex deserializedVertex = vertexList.get(0); |
| assertEquals(0L, deserializedVertex.id()); |
| assertEquals(Vertex.DEFAULT_LABEL, deserializedVertex.label()); |
| |
| assertEquals(0, IteratorUtils.count(deserializedVertex.properties())); |
| } |
| |
| @Test |
| public void shouldSerializeToMapWithElementForKey() throws Exception { |
| final TinkerGraph graph = TinkerFactory.createClassic(); |
| final GraphTraversalSource g = graph.traversal(); |
| final Map<Vertex, Integer> map = new HashMap<>(); |
| map.put(g.V().has("name", "marko").next(), 1000); |
| |
| final ResponseMessage response = convertBinary(map); |
| assertCommon(response); |
| |
| final Map<Vertex, Integer> deserializedMap = (Map<Vertex, Integer>) response.getResult().getData(); |
| assertEquals(1, deserializedMap.size()); |
| |
| final Vertex deserializedMarko = deserializedMap.keySet().iterator().next(); |
| assertEquals(0, IteratorUtils.count(deserializedMarko.properties())); |
| assertEquals(1, deserializedMarko.id()); |
| assertEquals(Vertex.DEFAULT_LABEL, deserializedMarko.label()); |
| |
| assertEquals(new Integer(1000), deserializedMap.values().iterator().next()); |
| } |
| |
| private void assertCommon(final ResponseMessage response) { |
| assertEquals(requestId, response.getRequestId()); |
| assertEquals(ResponseStatusCode.SUCCESS, response.getStatus().getCode()); |
| } |
| |
| private ResponseMessage convertBinary(final Object toSerialize) throws SerializationException { |
| final ByteBuf bb = binarySerializer.serializeResponseAsBinary(responseMessageBuilder.result(toSerialize).create(), allocator); |
| return binarySerializer.deserializeResponse(bb); |
| } |
| } |