You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by va...@apache.org on 2023/05/12 00:15:25 UTC

[tinkerpop] 01/01: merge from 3.6-dev

This is an automated email from the ASF dual-hosted git repository.

valentyn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 0391479ae40d9357ed753c8680a3c780e0a39479
Merge: 9cde287e05 78a14f7a43
Author: Valentyn Kahamlyk <va...@bitquilltech.com>
AuthorDate: Thu May 11 17:15:13 2023 -0700

    merge from 3.6-dev

 CHANGELOG.asciidoc                                 |   2 +-
 .../tinkerpop/gremlin/process/traversal/P.java     |   5 +
 .../tinkerpop/gremlin/process/traversal/TextP.java |   7 +
 .../traversal/translator/DotNetTranslator.java     |  14 +-
 .../traversal/translator/GolangTranslator.java     |  15 +-
 .../traversal/translator/GroovyTranslator.java     |   6 +-
 .../traversal/translator/JavascriptTranslator.java |  16 +-
 .../traversal/translator/PythonTranslator.java     |   9 +-
 .../gremlin/process/traversal/util/AndP.java       |   3 +
 .../gremlin/process/traversal/util/OrP.java        |   3 +
 .../structure/io/binary/types/PSerializer.java     |   4 +-
 .../io/graphson/TraversalSerializersV2d0.java      |   7 +-
 .../io/graphson/TraversalSerializersV3d0.java      |   7 +-
 .../traversal/translator/GolangTranslatorTest.java |   1 -
 .../GraphBinaryRemoteGraphComputerProvider.java    |   8 +
 .../GraphSONRemoteGraphComputerProvider.java       |   8 +
 .../process/traversal/step/filter/HasTest.java     |  81 +++++++
 ...undTripTest.java => AbstractRoundTripTest.java} |  80 ++----
 ...GraphSONMessageSerializerV3d0RoundTripTest.java |  59 +++++
 .../GraphBinaryReaderWriterRoundTripTest.java      | 270 +--------------------
 20 files changed, 214 insertions(+), 391 deletions(-)

diff --cc gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/GolangTranslatorTest.java
index 19b37b79eb,19b37b79eb..81e9559823
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/GolangTranslatorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/GolangTranslatorTest.java
@@@ -31,7 -31,7 +31,6 @@@ import org.apache.tinkerpop.gremlin.pro
  import org.apache.tinkerpop.gremlin.structure.VertexProperty;
  import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
  import org.apache.tinkerpop.gremlin.util.function.Lambda;
--import org.junit.Ignore;
  import org.junit.Test;
  
  import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal;
diff --cc gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractRoundTripTest.java
index be9c23857b,0000000000..18dfa1a645
mode 100644,000000..100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractRoundTripTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractRoundTripTest.java
@@@ -1,313 -1,0 +1,265 @@@
 +/*
 + * 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.util.ser.binary;
++package org.apache.tinkerpop.gremlin.util.ser;
 +
- import io.netty.buffer.ByteBufAllocator;
- import org.apache.tinkerpop.gremlin.util.ser.NettyBufferFactory;
 +import org.apache.tinkerpop.gremlin.process.computer.Computer;
 +import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
 +import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
- import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
- import org.apache.tinkerpop.gremlin.process.traversal.Operator;
- import org.apache.tinkerpop.gremlin.process.traversal.Order;
- import org.apache.tinkerpop.gremlin.process.traversal.P;
- import org.apache.tinkerpop.gremlin.process.traversal.Pick;
- import org.apache.tinkerpop.gremlin.process.traversal.Pop;
- import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
- import org.apache.tinkerpop.gremlin.process.traversal.Scope;
- import org.apache.tinkerpop.gremlin.process.traversal.TextP;
- import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
++import org.apache.tinkerpop.gremlin.process.traversal.*;
 +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 +import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
 +import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
 +import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
- import org.apache.tinkerpop.gremlin.structure.Column;
- import org.apache.tinkerpop.gremlin.structure.Direction;
- import org.apache.tinkerpop.gremlin.structure.Graph;
- import org.apache.tinkerpop.gremlin.structure.T;
- import org.apache.tinkerpop.gremlin.structure.Vertex;
- import org.apache.tinkerpop.gremlin.structure.VertexProperty;
- import org.apache.tinkerpop.gremlin.structure.io.Buffer;
++import org.apache.tinkerpop.gremlin.structure.*;
 +import org.apache.tinkerpop.gremlin.structure.io.IoTest;
- import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryReader;
- import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryWriter;
 +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge;
 +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty;
 +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
- import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
++import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty;
 +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
 +import org.apache.tinkerpop.gremlin.util.function.Lambda;
- import org.junit.Test;
 +import org.junit.runner.RunWith;
 +import org.junit.runners.Parameterized;
 +
 +import java.math.BigDecimal;
 +import java.math.BigInteger;
 +import java.net.InetAddress;
 +import java.nio.ByteBuffer;
 +import java.sql.Timestamp;
 +import java.text.DateFormat;
- import java.time.Duration;
- import java.time.Instant;
- import java.time.LocalDate;
- import java.time.LocalDateTime;
- import java.time.LocalTime;
- import java.time.MonthDay;
- import java.time.OffsetDateTime;
- import java.time.OffsetTime;
- import java.time.Period;
- import java.time.Year;
- import java.time.YearMonth;
- import java.time.ZoneOffset;
- import java.time.ZonedDateTime;
++import java.time.*;
 +import java.util.*;
 +import java.util.concurrent.TimeUnit;
 +import java.util.function.Consumer;
 +
- import static org.apache.tinkerpop.gremlin.util.MockitoHamcrestMatcherAdapter.reflectionEquals;
 +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.hasLabel;
- import static org.junit.Assert.assertEquals;
++import static org.apache.tinkerpop.gremlin.util.MockitoHamcrestMatcherAdapter.reflectionEquals;
 +import static org.hamcrest.MatcherAssert.assertThat;
++import static org.junit.Assert.assertEquals;
 +
 +@RunWith(Parameterized.class)
- public class GraphBinaryReaderWriterRoundTripTest {
-     private final GraphBinaryWriter writer = new GraphBinaryWriter();
-     private final GraphBinaryReader reader = new GraphBinaryReader();
-     private final ByteBufAllocator allocator = ByteBufAllocator.DEFAULT;
-     private static NettyBufferFactory bufferFactory = new NettyBufferFactory();
- 
-     private static final GraphTraversalSource g = TinkerFactory.createModern().traversal();
++public abstract class AbstractRoundTripTest {
 +
++    protected static final GraphTraversalSource g = TinkerFactory.createModern().traversal();
 +    @Parameterized.Parameters(name = "Type{0}")
 +    public static Collection input() throws Exception {
 +        final Bytecode bytecode = new Bytecode();
 +        bytecode.addStep("V");
 +        bytecode.addStep("tail", 3);
 +        bytecode.addSource(TraversalSource.Symbols.withComputer, "myComputer");
 +
 +        final Map<String, Integer> map = new HashMap<>();
 +        map.put("one", 1);
 +        map.put("two", 2);
 +
 +        final Map<String, Map<String, Integer>> nestedMap = new HashMap<>();
 +        nestedMap.put("first", map);
 +
 +        final List<Object> list = new ArrayList<>();
 +        list.add("string 1");
 +        list.add("string 1");
 +        list.add(200);
 +        list.add("string 2");
 +
 +        final List<List<Object>> nestedList = new ArrayList<>();
 +        nestedList.add(list);
 +
 +        final Set<Object> set = new HashSet<>();
 +        set.add("one");
 +        set.add(2);
 +
 +        final Set<Set<Object>> nestedSet = new HashSet<>();
 +        nestedSet.add(set);
 +
 +        final BulkSet<String> bulkSet = new BulkSet<>();
 +        bulkSet.add("marko", 1);
 +        bulkSet.add("josh", 3);
 +
 +        final Tree<Vertex> tree = new Tree<>();
 +        final Tree<Vertex> subTree = new Tree<>();
 +        final Tree<Vertex> subSubTree = new Tree<>();
 +        subSubTree.put(new ReferenceVertex(1, "animal"), new Tree<>());
 +        subSubTree.put(new ReferenceVertex(2, "animal"), new Tree<>());
 +        subTree.put(new ReferenceVertex(100, "animal"), subSubTree);
 +        tree.put(new ReferenceVertex(1000, "animal"), subTree);
 +
 +        final MutableMetrics metrics = new MutableMetrics("id1", "name1");
 +        metrics.setDuration(123, TimeUnit.MICROSECONDS);
 +        metrics.setCount("c1", 20);
 +        metrics.setAnnotation("a", "b");
 +        metrics.addNested(new MutableMetrics("idNested", "nameNested"));
 +
 +        // can't use the existing 'metrics' because traversal metrics modifies its nested metrics
 +        final MutableMetrics metrics1 = metrics.clone();
 +
 +        final MutableMetrics metrics2 = new MutableMetrics("id2", "name2");
 +        metrics2.setDuration(456, TimeUnit.MICROSECONDS);
 +        metrics2.setCount("c2", 40);
 +        metrics2.setAnnotation("c", "d");
 +        metrics2.addNested(new MutableMetrics("idNested2", "nameNested2"));
 +
 +        List<MutableMetrics> nestedMetrics = Arrays.asList(metrics1, metrics2);
 +        final DefaultTraversalMetrics traversalMetrics = new DefaultTraversalMetrics(666, nestedMetrics);
 +        final DefaultTraversalMetrics emptyTraversalMetrics = new DefaultTraversalMetrics(444, Collections.emptyList());
 +
 +        return Arrays.asList(
 +                new Object[] {"String", "ABC", null},
 +                new Object[] {"Char", '£', null},
 +
 +                // numerics
 +                new Object[] {"Byte", 1, null},
 +                new Object[] {"Integer", 1, null},
 +                new Object[] {"Float", 2f, null},
 +                new Object[] {"Double", 3.1d, null},
 +                new Object[] {"Double", Double.NaN, null},
 +                new Object[] {"Double", Double.POSITIVE_INFINITY, null},
 +                new Object[] {"Double", Double.NEGATIVE_INFINITY, null},
 +                new Object[] {"Long", 10122L, null},
 +                new Object[] {"IntegerZero", 0, null},
 +                new Object[] {"FloatZero", 0f, null},
 +                new Object[] {"IntegerMin", Integer.MIN_VALUE, null},
 +                new Object[] {"IntegerMax", Integer.MAX_VALUE, null},
 +                new Object[] {"LongMax", Long.MAX_VALUE, null},
 +                new Object[] {"BigIntegerPos", new BigInteger("1234567890987654321"), null},
 +                new Object[] {"BigIntegerNeg", new BigInteger("-1234567890987654321"), null},
 +                new Object[] {"BigDecimalPos", new BigDecimal("1234567890987654321.1232132"), null},
 +                new Object[] {"BigDecimalNeg", new BigDecimal("-1234567890987654321.1232132"), null},
 +
 +                // date+time
 +                new Object[] {"Date", DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.US).parse("Jan 12, 1952"), null},
 +                new Object[] {"Timestamp", Timestamp.valueOf("2016-01-15 12:01:02"), null},
 +                new Object[] {"Duration", Duration.ofSeconds(213123213, 400), null},
 +                new Object[] {"Instant", Instant.ofEpochSecond(213123213, 400), null},
 +                new Object[] {"LocalDate", LocalDate.of(2016, 10, 21), null},
 +                new Object[] {"LocalTime", LocalTime.of(12, 20, 30, 300), null},
 +                new Object[] {"LocalDateTime", LocalDateTime.of(2016, 10, 21, 12, 20, 30, 300), null},
 +                new Object[] {"MonthDay", MonthDay.of(12, 28), null},
 +                new Object[] {"OffsetDateTime", OffsetDateTime.of(2017, 11, 15, 12, 30, 45, 300, ZoneOffset.ofTotalSeconds(400)), null},
 +                new Object[] {"OffsetTime", OffsetTime.of(12, 30, 45, 300, ZoneOffset.ofTotalSeconds(400)), null},
 +                new Object[] {"Period", Period.of(1, 6, 15), null},
 +                new Object[] {"Year", Year.of(1996), null},
 +                new Object[] {"YearMonth", YearMonth.of(2016, 11), null},
 +                new Object[] {"ZonedDateTime", ZonedDateTime.of(2016, 11, 15, 12, 30, 45, 300, ZoneOffset.ofTotalSeconds(200)), null},
 +                new Object[] {"ZoneOffset", ZoneOffset.ofTotalSeconds(100), null},
 +
 +                new Object[] {"UUID", UUID.randomUUID(), null},
 +                new Object[] {"Bytecode", bytecode, null},
 +                new Object[] {"Binding", new Bytecode.Binding<>("x", 123), null},
 +                new Object[] {"Traverser", new DefaultRemoteTraverser<>("marko", 100), null},
 +                new Object[] {"Class", Bytecode.class, null},
 +                new Object[] {"ByteBuffer", ByteBuffer.wrap(new byte[]{ 1, 2, 3 }), null},
 +                new Object[] {"InetAddressV4", InetAddress.getByName("localhost"), null},
 +                new Object[] {"InetAddressV6", InetAddress.getByName("::1"), null},
 +                new Object[] {"Lambda0", Lambda.supplier("return 1"), null},
 +                new Object[] {"Lambda1", Lambda.consumer("it"), null},
 +                new Object[] {"Lambda2", Lambda.biFunction("x,y -> x + y"), null},
 +                new Object[] {"LambdaN", new Lambda.UnknownArgLambda("x,y,z -> x + y + z", "gremlin-groovy", 3), null},
 +
 +                // enums
 +                new Object[] {"Barrier", SackFunctions.Barrier.normSack, null},
 +                new Object[] {"Cardinality", VertexProperty.Cardinality.list, null},
 +                new Object[] {"Columns", Column.values, null},
 +                new Object[] {"Direction", Direction.BOTH, null},
 +                new Object[] {"Operator", Operator.sum, null},
 +                new Object[] {"Operator", Operator.div, null},
 +                new Object[] {"Order", Order.desc, null},
 +                new Object[] {"Pick", Pick.any, null},
 +                new Object[] {"Pop", Pop.mixed, null},
 +                new Object[] {"Scope", Scope.global, null},
 +                new Object[] {"T", T.label, null},
 +                new Object[] {"Pgt", P.gt(0), null},
 +                new Object[] {"Pgte", P.gte(0), null},
 +                new Object[] {"Pbetween", P.between(0,1), null},
 +                new Object[] {"Pand", P.gt(1).and(P.lt(2)), null},
 +                new Object[] {"Por", P.gt(1).or(P.lt(2)), null},
 +                new Object[] {"Pnot", P.not(P.lte(1)), null},
 +                new Object[] {"Pwithout", P.without(1,2,3,4,null), null},
 +                new Object[] {"Pinside", P.inside(0.0d, 0.6d), null},
-                 new Object[] {"TextP", TextP.startingWith("mark"), null},
++                new Object[] {"TextPstartingWith", TextP.startingWith("mark"), null},
++                new Object[] {"TextPregex", TextP.regex("^meh"), null},
++                new Object[] {"TextPnotRegex", TextP.notRegex("^meh"), null},
 +
 +                // graph
 +                new Object[] {"ReferenceEdge", new ReferenceEdge(123, "person", new ReferenceVertex(123, "person"), new ReferenceVertex(321, "person")), null},
 +                new Object[] {"TinkerEdge", g.E().hasLabel("knows").next(), null},
 +                new Object[] {"ReferenceProperty", new ReferenceProperty<>("name", "john"), (Consumer<ReferenceProperty>) referenceProperty -> {
 +                    assertEquals("name", referenceProperty.key());
 +                    assertEquals("john", referenceProperty.value());
 +                }},
 +                new Object[] {"ReferenceVertex", new ReferenceVertex(123, "person"), null},
 +                new Object[] {"TinkerVertex", g.V().hasLabel("person").next(), null},
-                 new Object[] {"DetachedVertexProperty", new DetachedVertexProperty<>(123, "name", "john", null), (Consumer<DetachedVertexProperty>) vertexProperty -> {
-                     assertEquals("name", vertexProperty.key());
-                     assertEquals("john", vertexProperty.value());
-                     assertEquals(123, vertexProperty.id());
++                new Object[] {"ReferenceVertexProperty", new ReferenceVertexProperty<>(123, "name", "john"), (Consumer<ReferenceVertexProperty>) referenceProperty -> {
++                    assertEquals("name", referenceProperty.key());
++                    assertEquals("john", referenceProperty.value());
++                    assertEquals(123, referenceProperty.id());
 +                }},
 +                new Object[] {"PathLabelled", g.V().as("a", "b").out().as("c").path().next(), null},
 +                new Object[] {"PathNotLabelled", g.V().out().inE().values().path().next(), null},
 +                new Object[] {"Graph", g.E().subgraph("k").cap("k").next(), (Consumer<Graph>) graph -> {
 +                    IoTest.assertModernGraph(graph, true, false);
 +                }},
 +                new Object[] {"TraversalStrategyVertexProgram", new VertexProgramStrategy(Computer.compute()), (Consumer<TraversalStrategyProxy>) strategy -> {
 +                    assertEquals(VertexProgramStrategy.class, strategy.getStrategyClass());
 +                    assertEquals("org.apache.tinkerpop.gremlin.process.computer.GraphComputer", strategy.getConfiguration().getProperty(VertexProgramStrategy.GRAPH_COMPUTER));
 +                }},
 +                new Object[] {"TraversalStrategySubgraph", SubgraphStrategy.build().vertices(hasLabel("person")).create(), (Consumer<TraversalStrategyProxy>) strategy -> {
 +                    assertEquals(SubgraphStrategy.class, strategy.getStrategyClass());
 +                    assertEquals(hasLabel("person").asAdmin().getBytecode(), strategy.getConfiguration().getProperty(SubgraphStrategy.VERTICES));
 +                }},
 +                new Object[] {"BulkSet", bulkSet, null},
 +                new Object[] {"Tree", tree, null},
 +                new Object[] {"EmptyMetrics", new MutableMetrics("idEmpty", "nameEmpty"), (Consumer<Metrics>) m -> {
 +                    assertThat(m, reflectionEquals(new MutableMetrics("idEmpty", "nameEmpty")));
 +                }},
 +                new Object[] {"Metrics", metrics, (Consumer<Metrics>) m -> {
 +                    assertThat(m, reflectionEquals(metrics, "nested", "counts"));
 +                    assertEquals(new ArrayList(metrics.getCounts().values()), new ArrayList(m.getCounts().values()));
 +                    assertThat(m.getNested(), reflectionEquals(metrics.getNested()));
 +                }},
 +                new Object[] {"EmptyTraversalMetrics", emptyTraversalMetrics, (Consumer<TraversalMetrics>) m -> {
 +                    assertThat(m, reflectionEquals(emptyTraversalMetrics));
 +                }},
 +                new Object[] {"TraversalMetrics", traversalMetrics, (Consumer<TraversalMetrics>) m -> {
 +                    assertEquals(m.toString(), traversalMetrics.toString());
 +                    assertThat(m, reflectionEquals(traversalMetrics, "stepIndexedMetrics", "positionIndexedMetrics"));
 +                }},
 +
 +                // collections
 +                new Object[] {"ListSingle", list, null},
 +                new Object[] {"ListNested", nestedList, null},
 +                new Object[] {"Map", map, null},
 +                new Object[] {"Map", nestedMap, null},
 +                new Object[] {"Set", set, null},
 +                new Object[] {"SetNested", nestedSet, null});
 +    }
 +
 +    @Parameterized.Parameter(value = 0)
 +    public String name;
 +
 +    @Parameterized.Parameter(value = 1)
 +    public Object value;
 +
 +    @Parameterized.Parameter(value = 2)
 +    public Consumer<?> assertion;
- 
-     @Test
-     public void shouldWriteAndRead() throws Exception {
-         // Test it multiple times as the type registry might change its internal state
-         for (int i = 0; i < 5; i++) {
-             final Buffer buffer = bufferFactory.create(allocator.buffer());
-             writer.write(value, buffer);
-             buffer.readerIndex(0);
-             final Object result = reader.read(buffer);
- 
-             Optional.ofNullable(assertion).orElse((Consumer) r -> assertEquals(value, r)).accept(result);
-         }
-     }
 +}
diff --cc gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV3d0RoundTripTest.java
index 0000000000,0000000000..c6b53ec974
new file mode 100644
--- /dev/null
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/GraphSONMessageSerializerV3d0RoundTripTest.java
@@@ -1,0 -1,0 +1,59 @@@
++/*
++ * 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.util.ser;
++
++import io.netty.buffer.ByteBuf;
++import io.netty.buffer.ByteBufAllocator;
++import io.netty.buffer.UnpooledByteBufAllocator;
++import org.apache.tinkerpop.gremlin.util.message.ResponseMessage;
++import org.junit.Test;
++
++import java.util.Arrays;
++import java.util.List;
++import java.util.Optional;
++import java.util.UUID;
++import java.util.function.Consumer;
++
++import static org.junit.Assert.assertEquals;
++
++public class GraphSONMessageSerializerV3d0RoundTripTest extends AbstractRoundTripTest {
++
++    private final UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1");
++    private final ResponseMessage.Builder responseMessageBuilder = ResponseMessage.build(requestId);
++    private final static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
++
++    public final GraphSONMessageSerializerV3d0 serializer = new GraphSONMessageSerializerV3d0();
++
++    private static List<String> skippedTests
++            = Arrays.asList("ReferenceVertex", "ReferenceVertexProperty", "ReferenceProperty", "Graph");
++
++    @Test
++    public void shouldWriteAndRead() throws Exception {
++        // some tests are not valid for json
++        if (skippedTests.contains(name)) return;
++
++        for (int i = 0; i < 5; i++) {
++
++            final ByteBuf bb = serializer.serializeResponseAsBinary(responseMessageBuilder.result(value).create(), allocator);
++            final Object result = serializer.deserializeResponse(bb).getResult().getData();
++
++            Optional.ofNullable(assertion).orElse((Consumer) r -> assertEquals(value, r)).accept(result);
++        }
++    }
++}
diff --cc gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
index be9c23857b,0000000000..d34c88ef1b
mode 100644,000000..100644
--- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
+++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/binary/GraphBinaryReaderWriterRoundTripTest.java
@@@ -1,313 -1,0 +1,57 @@@
 +/*
 + * 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.util.ser.binary;
 +
 +import io.netty.buffer.ByteBufAllocator;
++import org.apache.tinkerpop.gremlin.util.ser.AbstractRoundTripTest;
 +import org.apache.tinkerpop.gremlin.util.ser.NettyBufferFactory;
- import org.apache.tinkerpop.gremlin.process.computer.Computer;
- import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
- import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
- import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
- import org.apache.tinkerpop.gremlin.process.traversal.Operator;
- import org.apache.tinkerpop.gremlin.process.traversal.Order;
- import org.apache.tinkerpop.gremlin.process.traversal.P;
- import org.apache.tinkerpop.gremlin.process.traversal.Pick;
- import org.apache.tinkerpop.gremlin.process.traversal.Pop;
- import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
- import org.apache.tinkerpop.gremlin.process.traversal.Scope;
- import org.apache.tinkerpop.gremlin.process.traversal.TextP;
- import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
- import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
- import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
- import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
- import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
- import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
- import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
- import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
- import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
- import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
- import org.apache.tinkerpop.gremlin.structure.Column;
- import org.apache.tinkerpop.gremlin.structure.Direction;
- import org.apache.tinkerpop.gremlin.structure.Graph;
- import org.apache.tinkerpop.gremlin.structure.T;
- import org.apache.tinkerpop.gremlin.structure.Vertex;
- import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 +import org.apache.tinkerpop.gremlin.structure.io.Buffer;
- import org.apache.tinkerpop.gremlin.structure.io.IoTest;
 +import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryReader;
 +import org.apache.tinkerpop.gremlin.structure.io.binary.GraphBinaryWriter;
- import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge;
- import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty;
- import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
- import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
- import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
- import org.apache.tinkerpop.gremlin.util.function.Lambda;
 +import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.junit.runners.Parameterized;
- 
- import java.math.BigDecimal;
- import java.math.BigInteger;
- import java.net.InetAddress;
- import java.nio.ByteBuffer;
- import java.sql.Timestamp;
- import java.text.DateFormat;
- import java.time.Duration;
- import java.time.Instant;
- import java.time.LocalDate;
- import java.time.LocalDateTime;
- import java.time.LocalTime;
- import java.time.MonthDay;
- import java.time.OffsetDateTime;
- import java.time.OffsetTime;
- import java.time.Period;
- import java.time.Year;
- import java.time.YearMonth;
- import java.time.ZoneOffset;
- import java.time.ZonedDateTime;
 +import java.util.*;
- import java.util.concurrent.TimeUnit;
 +import java.util.function.Consumer;
 +
- import static org.apache.tinkerpop.gremlin.util.MockitoHamcrestMatcherAdapter.reflectionEquals;
- import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.hasLabel;
 +import static org.junit.Assert.assertEquals;
- import static org.hamcrest.MatcherAssert.assertThat;
 +
- @RunWith(Parameterized.class)
- public class GraphBinaryReaderWriterRoundTripTest {
++public class GraphBinaryReaderWriterRoundTripTest extends AbstractRoundTripTest {
 +    private final GraphBinaryWriter writer = new GraphBinaryWriter();
 +    private final GraphBinaryReader reader = new GraphBinaryReader();
 +    private final ByteBufAllocator allocator = ByteBufAllocator.DEFAULT;
 +    private static NettyBufferFactory bufferFactory = new NettyBufferFactory();
 +
-     private static final GraphTraversalSource g = TinkerFactory.createModern().traversal();
- 
-     @Parameterized.Parameters(name = "Type{0}")
-     public static Collection input() throws Exception {
-         final Bytecode bytecode = new Bytecode();
-         bytecode.addStep("V");
-         bytecode.addStep("tail", 3);
-         bytecode.addSource(TraversalSource.Symbols.withComputer, "myComputer");
- 
-         final Map<String, Integer> map = new HashMap<>();
-         map.put("one", 1);
-         map.put("two", 2);
- 
-         final Map<String, Map<String, Integer>> nestedMap = new HashMap<>();
-         nestedMap.put("first", map);
- 
-         final List<Object> list = new ArrayList<>();
-         list.add("string 1");
-         list.add("string 1");
-         list.add(200);
-         list.add("string 2");
- 
-         final List<List<Object>> nestedList = new ArrayList<>();
-         nestedList.add(list);
- 
-         final Set<Object> set = new HashSet<>();
-         set.add("one");
-         set.add(2);
- 
-         final Set<Set<Object>> nestedSet = new HashSet<>();
-         nestedSet.add(set);
- 
-         final BulkSet<String> bulkSet = new BulkSet<>();
-         bulkSet.add("marko", 1);
-         bulkSet.add("josh", 3);
- 
-         final Tree<Vertex> tree = new Tree<>();
-         final Tree<Vertex> subTree = new Tree<>();
-         final Tree<Vertex> subSubTree = new Tree<>();
-         subSubTree.put(new ReferenceVertex(1, "animal"), new Tree<>());
-         subSubTree.put(new ReferenceVertex(2, "animal"), new Tree<>());
-         subTree.put(new ReferenceVertex(100, "animal"), subSubTree);
-         tree.put(new ReferenceVertex(1000, "animal"), subTree);
- 
-         final MutableMetrics metrics = new MutableMetrics("id1", "name1");
-         metrics.setDuration(123, TimeUnit.MICROSECONDS);
-         metrics.setCount("c1", 20);
-         metrics.setAnnotation("a", "b");
-         metrics.addNested(new MutableMetrics("idNested", "nameNested"));
- 
-         // can't use the existing 'metrics' because traversal metrics modifies its nested metrics
-         final MutableMetrics metrics1 = metrics.clone();
- 
-         final MutableMetrics metrics2 = new MutableMetrics("id2", "name2");
-         metrics2.setDuration(456, TimeUnit.MICROSECONDS);
-         metrics2.setCount("c2", 40);
-         metrics2.setAnnotation("c", "d");
-         metrics2.addNested(new MutableMetrics("idNested2", "nameNested2"));
- 
-         List<MutableMetrics> nestedMetrics = Arrays.asList(metrics1, metrics2);
-         final DefaultTraversalMetrics traversalMetrics = new DefaultTraversalMetrics(666, nestedMetrics);
-         final DefaultTraversalMetrics emptyTraversalMetrics = new DefaultTraversalMetrics(444, Collections.emptyList());
- 
-         return Arrays.asList(
-                 new Object[] {"String", "ABC", null},
-                 new Object[] {"Char", '£', null},
- 
-                 // numerics
-                 new Object[] {"Byte", 1, null},
-                 new Object[] {"Integer", 1, null},
-                 new Object[] {"Float", 2f, null},
-                 new Object[] {"Double", 3.1d, null},
-                 new Object[] {"Double", Double.NaN, null},
-                 new Object[] {"Double", Double.POSITIVE_INFINITY, null},
-                 new Object[] {"Double", Double.NEGATIVE_INFINITY, null},
-                 new Object[] {"Long", 10122L, null},
-                 new Object[] {"IntegerZero", 0, null},
-                 new Object[] {"FloatZero", 0f, null},
-                 new Object[] {"IntegerMin", Integer.MIN_VALUE, null},
-                 new Object[] {"IntegerMax", Integer.MAX_VALUE, null},
-                 new Object[] {"LongMax", Long.MAX_VALUE, null},
-                 new Object[] {"BigIntegerPos", new BigInteger("1234567890987654321"), null},
-                 new Object[] {"BigIntegerNeg", new BigInteger("-1234567890987654321"), null},
-                 new Object[] {"BigDecimalPos", new BigDecimal("1234567890987654321.1232132"), null},
-                 new Object[] {"BigDecimalNeg", new BigDecimal("-1234567890987654321.1232132"), null},
- 
-                 // date+time
-                 new Object[] {"Date", DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.US).parse("Jan 12, 1952"), null},
-                 new Object[] {"Timestamp", Timestamp.valueOf("2016-01-15 12:01:02"), null},
-                 new Object[] {"Duration", Duration.ofSeconds(213123213, 400), null},
-                 new Object[] {"Instant", Instant.ofEpochSecond(213123213, 400), null},
-                 new Object[] {"LocalDate", LocalDate.of(2016, 10, 21), null},
-                 new Object[] {"LocalTime", LocalTime.of(12, 20, 30, 300), null},
-                 new Object[] {"LocalDateTime", LocalDateTime.of(2016, 10, 21, 12, 20, 30, 300), null},
-                 new Object[] {"MonthDay", MonthDay.of(12, 28), null},
-                 new Object[] {"OffsetDateTime", OffsetDateTime.of(2017, 11, 15, 12, 30, 45, 300, ZoneOffset.ofTotalSeconds(400)), null},
-                 new Object[] {"OffsetTime", OffsetTime.of(12, 30, 45, 300, ZoneOffset.ofTotalSeconds(400)), null},
-                 new Object[] {"Period", Period.of(1, 6, 15), null},
-                 new Object[] {"Year", Year.of(1996), null},
-                 new Object[] {"YearMonth", YearMonth.of(2016, 11), null},
-                 new Object[] {"ZonedDateTime", ZonedDateTime.of(2016, 11, 15, 12, 30, 45, 300, ZoneOffset.ofTotalSeconds(200)), null},
-                 new Object[] {"ZoneOffset", ZoneOffset.ofTotalSeconds(100), null},
- 
-                 new Object[] {"UUID", UUID.randomUUID(), null},
-                 new Object[] {"Bytecode", bytecode, null},
-                 new Object[] {"Binding", new Bytecode.Binding<>("x", 123), null},
-                 new Object[] {"Traverser", new DefaultRemoteTraverser<>("marko", 100), null},
-                 new Object[] {"Class", Bytecode.class, null},
-                 new Object[] {"ByteBuffer", ByteBuffer.wrap(new byte[]{ 1, 2, 3 }), null},
-                 new Object[] {"InetAddressV4", InetAddress.getByName("localhost"), null},
-                 new Object[] {"InetAddressV6", InetAddress.getByName("::1"), null},
-                 new Object[] {"Lambda0", Lambda.supplier("return 1"), null},
-                 new Object[] {"Lambda1", Lambda.consumer("it"), null},
-                 new Object[] {"Lambda2", Lambda.biFunction("x,y -> x + y"), null},
-                 new Object[] {"LambdaN", new Lambda.UnknownArgLambda("x,y,z -> x + y + z", "gremlin-groovy", 3), null},
- 
-                 // enums
-                 new Object[] {"Barrier", SackFunctions.Barrier.normSack, null},
-                 new Object[] {"Cardinality", VertexProperty.Cardinality.list, null},
-                 new Object[] {"Columns", Column.values, null},
-                 new Object[] {"Direction", Direction.BOTH, null},
-                 new Object[] {"Operator", Operator.sum, null},
-                 new Object[] {"Operator", Operator.div, null},
-                 new Object[] {"Order", Order.desc, null},
-                 new Object[] {"Pick", Pick.any, null},
-                 new Object[] {"Pop", Pop.mixed, null},
-                 new Object[] {"Scope", Scope.global, null},
-                 new Object[] {"T", T.label, null},
-                 new Object[] {"Pgt", P.gt(0), null},
-                 new Object[] {"Pgte", P.gte(0), null},
-                 new Object[] {"Pbetween", P.between(0,1), null},
-                 new Object[] {"Pand", P.gt(1).and(P.lt(2)), null},
-                 new Object[] {"Por", P.gt(1).or(P.lt(2)), null},
-                 new Object[] {"Pnot", P.not(P.lte(1)), null},
-                 new Object[] {"Pwithout", P.without(1,2,3,4,null), null},
-                 new Object[] {"Pinside", P.inside(0.0d, 0.6d), null},
-                 new Object[] {"TextP", TextP.startingWith("mark"), null},
- 
-                 // graph
-                 new Object[] {"ReferenceEdge", new ReferenceEdge(123, "person", new ReferenceVertex(123, "person"), new ReferenceVertex(321, "person")), null},
-                 new Object[] {"TinkerEdge", g.E().hasLabel("knows").next(), null},
-                 new Object[] {"ReferenceProperty", new ReferenceProperty<>("name", "john"), (Consumer<ReferenceProperty>) referenceProperty -> {
-                     assertEquals("name", referenceProperty.key());
-                     assertEquals("john", referenceProperty.value());
-                 }},
-                 new Object[] {"ReferenceVertex", new ReferenceVertex(123, "person"), null},
-                 new Object[] {"TinkerVertex", g.V().hasLabel("person").next(), null},
-                 new Object[] {"DetachedVertexProperty", new DetachedVertexProperty<>(123, "name", "john", null), (Consumer<DetachedVertexProperty>) vertexProperty -> {
-                     assertEquals("name", vertexProperty.key());
-                     assertEquals("john", vertexProperty.value());
-                     assertEquals(123, vertexProperty.id());
-                 }},
-                 new Object[] {"PathLabelled", g.V().as("a", "b").out().as("c").path().next(), null},
-                 new Object[] {"PathNotLabelled", g.V().out().inE().values().path().next(), null},
-                 new Object[] {"Graph", g.E().subgraph("k").cap("k").next(), (Consumer<Graph>) graph -> {
-                     IoTest.assertModernGraph(graph, true, false);
-                 }},
-                 new Object[] {"TraversalStrategyVertexProgram", new VertexProgramStrategy(Computer.compute()), (Consumer<TraversalStrategyProxy>) strategy -> {
-                     assertEquals(VertexProgramStrategy.class, strategy.getStrategyClass());
-                     assertEquals("org.apache.tinkerpop.gremlin.process.computer.GraphComputer", strategy.getConfiguration().getProperty(VertexProgramStrategy.GRAPH_COMPUTER));
-                 }},
-                 new Object[] {"TraversalStrategySubgraph", SubgraphStrategy.build().vertices(hasLabel("person")).create(), (Consumer<TraversalStrategyProxy>) strategy -> {
-                     assertEquals(SubgraphStrategy.class, strategy.getStrategyClass());
-                     assertEquals(hasLabel("person").asAdmin().getBytecode(), strategy.getConfiguration().getProperty(SubgraphStrategy.VERTICES));
-                 }},
-                 new Object[] {"BulkSet", bulkSet, null},
-                 new Object[] {"Tree", tree, null},
-                 new Object[] {"EmptyMetrics", new MutableMetrics("idEmpty", "nameEmpty"), (Consumer<Metrics>) m -> {
-                     assertThat(m, reflectionEquals(new MutableMetrics("idEmpty", "nameEmpty")));
-                 }},
-                 new Object[] {"Metrics", metrics, (Consumer<Metrics>) m -> {
-                     assertThat(m, reflectionEquals(metrics, "nested", "counts"));
-                     assertEquals(new ArrayList(metrics.getCounts().values()), new ArrayList(m.getCounts().values()));
-                     assertThat(m.getNested(), reflectionEquals(metrics.getNested()));
-                 }},
-                 new Object[] {"EmptyTraversalMetrics", emptyTraversalMetrics, (Consumer<TraversalMetrics>) m -> {
-                     assertThat(m, reflectionEquals(emptyTraversalMetrics));
-                 }},
-                 new Object[] {"TraversalMetrics", traversalMetrics, (Consumer<TraversalMetrics>) m -> {
-                     assertEquals(m.toString(), traversalMetrics.toString());
-                     assertThat(m, reflectionEquals(traversalMetrics, "stepIndexedMetrics", "positionIndexedMetrics"));
-                 }},
- 
-                 // collections
-                 new Object[] {"ListSingle", list, null},
-                 new Object[] {"ListNested", nestedList, null},
-                 new Object[] {"Map", map, null},
-                 new Object[] {"Map", nestedMap, null},
-                 new Object[] {"Set", set, null},
-                 new Object[] {"SetNested", nestedSet, null});
-     }
- 
-     @Parameterized.Parameter(value = 0)
-     public String name;
- 
-     @Parameterized.Parameter(value = 1)
-     public Object value;
- 
-     @Parameterized.Parameter(value = 2)
-     public Consumer<?> assertion;
++    private static List<String> skippedTests
++            = Arrays.asList("ReferenceVertexProperty");
 +
 +    @Test
 +    public void shouldWriteAndRead() throws Exception {
++        // some tests are not valid for graphbinary
++        if (skippedTests.contains(name)) return;
++
 +        // Test it multiple times as the type registry might change its internal state
 +        for (int i = 0; i < 5; i++) {
 +            final Buffer buffer = bufferFactory.create(allocator.buffer());
 +            writer.write(value, buffer);
 +            buffer.readerIndex(0);
 +            final Object result = reader.read(buffer);
 +
 +            Optional.ofNullable(assertion).orElse((Consumer) r -> assertEquals(value, r)).accept(result);
 +        }
 +    }
 +}