Skip to content

Commit a2d3da8

Browse files
authored
TestKit backend: add full support for temporal types (neo4j#1257)
1 parent 092de0b commit a2d3da8

28 files changed

+1014
-97
lines changed

testkit-backend/src/main/java/neo4j/org/testkit/backend/TestkitState.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import neo4j.org.testkit.backend.holder.TransactionHolder;
4141
import neo4j.org.testkit.backend.messages.requests.TestkitCallbackResult;
4242
import neo4j.org.testkit.backend.messages.responses.TestkitResponse;
43-
import org.neo4j.driver.exceptions.Neo4jException;
4443
import org.neo4j.driver.internal.cluster.RoutingTableRegistry;
4544
import reactor.core.publisher.Mono;
4645

@@ -69,7 +68,7 @@ public class TestkitState {
6968
private final Map<String, ReactiveTransactionHolder> transactionIdToReactiveTransactionHolder = new HashMap<>();
7069

7170
@Getter
72-
private final Map<String, Neo4jException> errors = new HashMap<>();
71+
private final Map<String, Exception> errors = new HashMap<>();
7372

7473
private final AtomicInteger idGenerator = new AtomicInteger(0);
7574

testkit-backend/src/main/java/neo4j/org/testkit/backend/channel/handler/TestkitRequestProcessorHandler.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.netty.channel.Channel;
2222
import io.netty.channel.ChannelHandlerContext;
2323
import io.netty.channel.ChannelInboundHandlerAdapter;
24+
import java.time.zone.ZoneRulesException;
2425
import java.util.concurrent.CompletableFuture;
2526
import java.util.concurrent.CompletionException;
2627
import java.util.concurrent.CompletionStage;
@@ -86,7 +87,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) {
8687
}
8788
});
8889
} catch (Throwable throwable) {
89-
ctx.writeAndFlush(createErrorResponse(throwable));
90+
exceptionCaught(ctx, throwable);
9091
}
9192
});
9293
}
@@ -102,6 +103,11 @@ private static CompletionStage<TestkitResponse> wrapSyncRequest(
102103
return result;
103104
}
104105

106+
@Override
107+
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
108+
ctx.writeAndFlush(createErrorResponse(cause));
109+
}
110+
105111
private TestkitResponse createErrorResponse(Throwable throwable) {
106112
if (throwable instanceof CompletionException) {
107113
throwable = throwable.getCause();
@@ -120,8 +126,10 @@ private TestkitResponse createErrorResponse(Throwable throwable) {
120126
.build();
121127
} else if (isConnectionPoolClosedException(throwable)
122128
|| throwable instanceof UntrustedServerException
123-
|| throwable instanceof NoSuchRecordException) {
129+
|| throwable instanceof NoSuchRecordException
130+
|| throwable instanceof ZoneRulesException) {
124131
String id = testkitState.newId();
132+
testkitState.getErrors().put(id, (Exception) throwable);
125133
return DriverError.builder()
126134
.data(DriverError.DriverErrorBody.builder()
127135
.id(id)

testkit-backend/src/main/java/neo4j/org/testkit/backend/channel/handler/TestkitRequestResponseMapperHandler.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
*/
1919
package neo4j.org.testkit.backend.channel.handler;
2020

21-
import com.fasterxml.jackson.core.JsonProcessingException;
2221
import com.fasterxml.jackson.databind.DeserializationFeature;
2322
import com.fasterxml.jackson.databind.ObjectMapper;
2423
import io.netty.channel.ChannelDuplexHandler;
@@ -32,14 +31,10 @@ public class TestkitRequestResponseMapperHandler extends ChannelDuplexHandler {
3231
private final ObjectMapper objectMapper = newObjectMapper();
3332

3433
@Override
35-
public void channelRead(ChannelHandlerContext ctx, Object msg) {
34+
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
3635
String testkitMessage = (String) msg;
3736
TestkitRequest testkitRequest;
38-
try {
39-
testkitRequest = objectMapper.readValue(testkitMessage, TestkitRequest.class);
40-
} catch (JsonProcessingException e) {
41-
throw new RuntimeException("Failed to deserialize Testkit message", e);
42-
}
37+
testkitRequest = objectMapper.readValue(testkitMessage, TestkitRequest.class);
4338
ctx.fireChannelRead(testkitRequest);
4439
}
4540

testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/TestkitModule.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,33 +19,60 @@
1919
package neo4j.org.testkit.backend.messages;
2020

2121
import com.fasterxml.jackson.databind.module.SimpleModule;
22-
import java.time.ZonedDateTime;
22+
import java.time.LocalDate;
2323
import java.util.List;
24+
import neo4j.org.testkit.backend.messages.requests.deserializer.TestkitCypherDateDeserializer;
2425
import neo4j.org.testkit.backend.messages.requests.deserializer.TestkitCypherDateTimeDeserializer;
26+
import neo4j.org.testkit.backend.messages.requests.deserializer.TestkitCypherDurationDeserializer;
27+
import neo4j.org.testkit.backend.messages.requests.deserializer.TestkitCypherTimeDeserializer;
2528
import neo4j.org.testkit.backend.messages.requests.deserializer.TestkitListDeserializer;
29+
import neo4j.org.testkit.backend.messages.requests.deserializer.types.CypherDateTime;
30+
import neo4j.org.testkit.backend.messages.requests.deserializer.types.CypherTime;
31+
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitDateTimeValueSerializer;
32+
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitDateValueSerializer;
33+
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitDurationValueSerializer;
2634
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitListValueSerializer;
35+
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitLocalDateTimeValueSerializer;
36+
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitLocalTimeValueSerializer;
2737
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitMapValueSerializer;
2838
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitNodeValueSerializer;
2939
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitPathValueSerializer;
3040
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitRecordSerializer;
3141
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitRelationshipValueSerializer;
42+
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitTimeValueSerializer;
3243
import neo4j.org.testkit.backend.messages.responses.serializer.TestkitValueSerializer;
3344
import org.neo4j.driver.Record;
3445
import org.neo4j.driver.Value;
46+
import org.neo4j.driver.internal.value.DateTimeValue;
47+
import org.neo4j.driver.internal.value.DateValue;
48+
import org.neo4j.driver.internal.value.DurationValue;
3549
import org.neo4j.driver.internal.value.ListValue;
50+
import org.neo4j.driver.internal.value.LocalDateTimeValue;
51+
import org.neo4j.driver.internal.value.LocalTimeValue;
3652
import org.neo4j.driver.internal.value.MapValue;
3753
import org.neo4j.driver.internal.value.NodeValue;
3854
import org.neo4j.driver.internal.value.PathValue;
3955
import org.neo4j.driver.internal.value.RelationshipValue;
56+
import org.neo4j.driver.internal.value.TimeValue;
57+
import org.neo4j.driver.types.IsoDuration;
4058

4159
public class TestkitModule extends SimpleModule {
4260
public TestkitModule() {
4361
this.addDeserializer(List.class, new TestkitListDeserializer());
44-
this.addDeserializer(ZonedDateTime.class, new TestkitCypherDateTimeDeserializer());
62+
this.addDeserializer(CypherDateTime.class, new TestkitCypherDateTimeDeserializer());
63+
this.addDeserializer(CypherTime.class, new TestkitCypherTimeDeserializer());
64+
this.addDeserializer(IsoDuration.class, new TestkitCypherDurationDeserializer());
65+
this.addDeserializer(LocalDate.class, new TestkitCypherDateDeserializer());
4566

4667
this.addSerializer(Value.class, new TestkitValueSerializer());
4768
this.addSerializer(NodeValue.class, new TestkitNodeValueSerializer());
4869
this.addSerializer(ListValue.class, new TestkitListValueSerializer());
70+
this.addSerializer(DateTimeValue.class, new TestkitDateTimeValueSerializer());
71+
this.addSerializer(DateValue.class, new TestkitDateValueSerializer());
72+
this.addSerializer(DurationValue.class, new TestkitDurationValueSerializer());
73+
this.addSerializer(LocalDateTimeValue.class, new TestkitLocalDateTimeValueSerializer());
74+
this.addSerializer(LocalTimeValue.class, new TestkitLocalTimeValueSerializer());
75+
this.addSerializer(TimeValue.class, new TestkitTimeValueSerializer());
4976
this.addSerializer(Record.class, new TestkitRecordSerializer());
5077
this.addSerializer(MapValue.class, new TestkitMapValueSerializer());
5178
this.addSerializer(PathValue.class, new TestkitPathValueSerializer());

testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/SessionReadTransaction.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.concurrent.ExecutionException;
2424
import lombok.Getter;
2525
import lombok.Setter;
26-
import neo4j.org.testkit.backend.FrontendError;
2726
import neo4j.org.testkit.backend.ReactiveTransactionContextAdapter;
2827
import neo4j.org.testkit.backend.TestkitState;
2928
import neo4j.org.testkit.backend.holder.AsyncTransactionHolder;
@@ -38,7 +37,6 @@
3837
import org.neo4j.driver.TransactionWork;
3938
import org.neo4j.driver.async.AsyncSession;
4039
import org.neo4j.driver.async.AsyncTransactionWork;
41-
import org.neo4j.driver.exceptions.Neo4jException;
4240
import org.neo4j.driver.reactive.ReactiveTransactionCallback;
4341
import org.neo4j.driver.reactive.RxTransactionWork;
4442
import org.reactivestreams.Publisher;
@@ -129,11 +127,8 @@ private TransactionWork<Void> handle(TestkitState testkitState, SessionHolder se
129127
if (workThrowable instanceof ExecutionException) {
130128
workThrowable = workThrowable.getCause();
131129
}
132-
if (workThrowable instanceof Neo4jException) {
133-
throw (Neo4jException) workThrowable;
134-
}
135-
if (workThrowable instanceof FrontendError) {
136-
throw (FrontendError) workThrowable;
130+
if (workThrowable instanceof RuntimeException) {
131+
throw (RuntimeException) workThrowable;
137132
}
138133
throw new RuntimeException("Unexpected exception occurred in transaction work function", workThrowable);
139134
}

testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/SessionWriteTransaction.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import java.util.concurrent.ExecutionException;
2525
import lombok.Getter;
2626
import lombok.Setter;
27-
import neo4j.org.testkit.backend.FrontendError;
2827
import neo4j.org.testkit.backend.ReactiveTransactionContextAdapter;
2928
import neo4j.org.testkit.backend.TestkitState;
3029
import neo4j.org.testkit.backend.holder.AsyncTransactionHolder;
@@ -39,7 +38,6 @@
3938
import org.neo4j.driver.TransactionWork;
4039
import org.neo4j.driver.async.AsyncSession;
4140
import org.neo4j.driver.async.AsyncTransactionWork;
42-
import org.neo4j.driver.exceptions.Neo4jException;
4341
import org.neo4j.driver.reactive.ReactiveTransactionCallback;
4442
import org.neo4j.driver.reactive.RxTransactionWork;
4543
import org.reactivestreams.Publisher;
@@ -130,11 +128,8 @@ private TransactionWork<Void> handle(TestkitState testkitState, SessionHolder se
130128
if (workThrowable instanceof ExecutionException) {
131129
workThrowable = workThrowable.getCause();
132130
}
133-
if (workThrowable instanceof Neo4jException) {
134-
throw (Neo4jException) workThrowable;
135-
}
136-
if (workThrowable instanceof FrontendError) {
137-
throw (FrontendError) workThrowable;
131+
if (workThrowable instanceof RuntimeException) {
132+
throw (RuntimeException) workThrowable;
138133
}
139134
throw new RuntimeException("Unexpected exception occurred in transaction work function", workThrowable);
140135
}

0 commit comments

Comments
 (0)