Skip to content

Commit cb09a4d

Browse files
authored
Introduce Testkit backend logging level support (neo4j#1406) (neo4j#1519)
This update introduces support for setting logging levels in Testkit backend. The selected level and the logging is shared by both the backend and the drivers created by the backend. The backend itself logs exchanges with the Testkit. Example: ``` 2023-04-06T13:20:14.769459 FINE neo4j.org.testkit.backend.channel.handler.TestkitRequestResponseMapperHandler - Inbound Testkit message '{"name": "NewSession", "data": {"driverId": "0", "accessMode": null, "bookmarks": null, "database": null, "fetchSize": null, "impersonatedUser": null, "notificationsMinSeverity": "WARNING"}}' 2023-04-06T13:20:14.781204 FINE neo4j.org.testkit.backend.channel.handler.TestkitRequestResponseMapperHandler - Outbound Testkit message '{"name":"Session","data":{"id":"1"}}' ``` The level is selected by setting a `TESTKIT_BACKEND_LOGGING_LEVEL` environment variable to one of the values supported by the `java.util.logging.Level.parse(String)`. The absence of the value or an empty string turns the logging off. This feature is meant for debugging purposes only.
1 parent 757de68 commit cb09a4d

File tree

5 files changed

+30
-5
lines changed

5 files changed

+30
-5
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525
import io.netty.channel.nio.NioEventLoopGroup;
2626
import io.netty.channel.socket.SocketChannel;
2727
import io.netty.channel.socket.nio.NioServerSocketChannel;
28+
import java.util.logging.Level;
2829
import neo4j.org.testkit.backend.channel.handler.TestkitMessageInboundHandler;
2930
import neo4j.org.testkit.backend.channel.handler.TestkitMessageOutboundHandler;
3031
import neo4j.org.testkit.backend.channel.handler.TestkitRequestProcessorHandler;
3132
import neo4j.org.testkit.backend.channel.handler.TestkitRequestResponseMapperHandler;
33+
import org.neo4j.driver.Logging;
3234

3335
public class Runner {
3436
public static void main(String[] args) throws InterruptedException {
@@ -41,6 +43,10 @@ public static void main(String[] args) throws InterruptedException {
4143
} else {
4244
backendMode = TestkitRequestProcessorHandler.BackendMode.SYNC;
4345
}
46+
String levelString = System.getenv("TESTKIT_BACKEND_LOGGING_LEVEL");
47+
Logging logging = levelString == null || levelString.isEmpty()
48+
? Logging.none()
49+
: Logging.console(Level.parse(levelString));
4450

4551
EventLoopGroup group = new NioEventLoopGroup();
4652
try {
@@ -54,8 +60,8 @@ public static void main(String[] args) throws InterruptedException {
5460
protected void initChannel(SocketChannel channel) {
5561
channel.pipeline().addLast(new TestkitMessageInboundHandler());
5662
channel.pipeline().addLast(new TestkitMessageOutboundHandler());
57-
channel.pipeline().addLast(new TestkitRequestResponseMapperHandler());
58-
channel.pipeline().addLast(new TestkitRequestProcessorHandler(backendMode));
63+
channel.pipeline().addLast(new TestkitRequestResponseMapperHandler(logging));
64+
channel.pipeline().addLast(new TestkitRequestProcessorHandler(backendMode, logging));
5965
}
6066
});
6167
ChannelFuture server = bootstrap.bind().sync();

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import neo4j.org.testkit.backend.holder.TransactionHolder;
3838
import neo4j.org.testkit.backend.messages.requests.TestkitCallbackResult;
3939
import neo4j.org.testkit.backend.messages.responses.TestkitResponse;
40+
import org.neo4j.driver.Logging;
4041
import org.neo4j.driver.internal.cluster.RoutingTableRegistry;
4142
import reactor.core.publisher.Mono;
4243

@@ -60,6 +61,7 @@ public class TestkitState {
6061
private final Map<String, TransactionHolder> transactionIdToTransactionHolder = new HashMap<>();
6162
private final Map<String, AsyncTransactionHolder> transactionIdToAsyncTransactionHolder = new HashMap<>();
6263
private final Map<String, RxTransactionHolder> transactionIdToRxTransactionHolder = new HashMap<>();
64+
private final Logging logging;
6365

6466
@Getter
6567
private final Map<String, Exception> errors = new HashMap<>();
@@ -72,8 +74,9 @@ public class TestkitState {
7274
@Getter
7375
private final Map<String, CompletableFuture<TestkitCallbackResult>> callbackIdToFuture = new HashMap<>();
7476

75-
public TestkitState(Consumer<TestkitResponse> responseWriter) {
77+
public TestkitState(Consumer<TestkitResponse> responseWriter, Logging logging) {
7678
this.responseWriter = responseWriter;
79+
this.logging = logging;
7780
}
7881

7982
public String newId() {
@@ -160,6 +163,10 @@ public Mono<RxResultHolder> getRxResultHolder(String id) {
160163
return getRx(id, resultIdToRxResultHolder, RESULT_NOT_FOUND_MESSAGE);
161164
}
162165

166+
public Logging getLogging() {
167+
return logging;
168+
}
169+
163170
private <T> String add(T value, Map<String, T> idToT) {
164171
String id = newId();
165172
idToT.put(id, value);

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,19 @@
3333
import neo4j.org.testkit.backend.messages.responses.BackendError;
3434
import neo4j.org.testkit.backend.messages.responses.DriverError;
3535
import neo4j.org.testkit.backend.messages.responses.TestkitResponse;
36+
import org.neo4j.driver.Logging;
3637
import org.neo4j.driver.exceptions.Neo4jException;
3738
import org.neo4j.driver.exceptions.UntrustedServerException;
3839
import org.neo4j.driver.internal.spi.ConnectionPool;
3940

4041
public class TestkitRequestProcessorHandler extends ChannelInboundHandlerAdapter {
41-
private final TestkitState testkitState = new TestkitState(this::writeAndFlush);
42+
private final TestkitState testkitState;
4243
private final BiFunction<TestkitRequest, TestkitState, CompletionStage<TestkitResponse>> processorImpl;
4344
// Some requests require multiple threads
4445
private final Executor requestExecutorService = Executors.newFixedThreadPool(10);
4546
private Channel channel;
4647

47-
public TestkitRequestProcessorHandler(BackendMode backendMode) {
48+
public TestkitRequestProcessorHandler(BackendMode backendMode, Logging logging) {
4849
switch (backendMode) {
4950
case ASYNC:
5051
processorImpl = TestkitRequest::processAsync;
@@ -56,6 +57,7 @@ public TestkitRequestProcessorHandler(BackendMode backendMode) {
5657
processorImpl = TestkitRequestProcessorHandler::wrapSyncRequest;
5758
break;
5859
}
60+
testkitState = new TestkitState(this::writeAndFlush, logging);
5961
}
6062

6163
@Override

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,21 @@
2626
import neo4j.org.testkit.backend.messages.TestkitModule;
2727
import neo4j.org.testkit.backend.messages.requests.TestkitRequest;
2828
import neo4j.org.testkit.backend.messages.responses.TestkitResponse;
29+
import org.neo4j.driver.Logger;
30+
import org.neo4j.driver.Logging;
2931

3032
public class TestkitRequestResponseMapperHandler extends ChannelDuplexHandler {
33+
private final Logger log;
3134
private final ObjectMapper objectMapper = newObjectMapper();
3235

36+
public TestkitRequestResponseMapperHandler(Logging logging) {
37+
log = logging.getLog(getClass());
38+
}
39+
3340
@Override
3441
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
3542
String testkitMessage = (String) msg;
43+
log.debug("Inbound Testkit message '%s'", testkitMessage.trim());
3644
TestkitRequest testkitRequest;
3745
testkitRequest = objectMapper.readValue(testkitMessage, TestkitRequest.class);
3846
ctx.fireChannelRead(testkitRequest);
@@ -42,6 +50,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
4250
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
4351
TestkitResponse testkitResponse = (TestkitResponse) msg;
4452
String responseStr = objectMapper.writeValueAsString(testkitResponse);
53+
log.debug("Outbound Testkit message '%s'", responseStr.trim());
4554
ctx.writeAndFlush(responseStr, promise);
4655
}
4756

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ public TestkitResponse process(TestkitState testkitState) {
113113
Optional.ofNullable(data.connectionAcquisitionTimeoutMs)
114114
.ifPresent(timeout -> configBuilder.withConnectionAcquisitionTimeout(timeout, TimeUnit.MILLISECONDS));
115115
configBuilder.withDriverMetrics();
116+
configBuilder.withLogging(testkitState.getLogging());
116117
org.neo4j.driver.Driver driver;
117118
Config config = configBuilder.build();
118119
try {

0 commit comments

Comments
 (0)