Skip to content

Commit 449f6e7

Browse files
authored
Introduce Testkit backend logging level support (#1406)
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 7f76fa0 commit 449f6e7

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 {
@@ -45,6 +47,10 @@ public static void main(String[] args) throws InterruptedException {
4547
} else {
4648
backendMode = TestkitRequestProcessorHandler.BackendMode.SYNC;
4749
}
50+
var levelString = System.getenv("TESTKIT_BACKEND_LOGGING_LEVEL");
51+
var logging = levelString == null || levelString.isEmpty()
52+
? Logging.none()
53+
: Logging.console(Level.parse(levelString));
4854

4955
EventLoopGroup group = new NioEventLoopGroup();
5056
try {
@@ -58,8 +64,8 @@ public static void main(String[] args) throws InterruptedException {
5864
protected void initChannel(SocketChannel channel) {
5965
channel.pipeline().addLast(new TestkitMessageInboundHandler());
6066
channel.pipeline().addLast(new TestkitMessageOutboundHandler());
61-
channel.pipeline().addLast(new TestkitRequestResponseMapperHandler());
62-
channel.pipeline().addLast(new TestkitRequestProcessorHandler(backendMode));
67+
channel.pipeline().addLast(new TestkitRequestResponseMapperHandler(logging));
68+
channel.pipeline().addLast(new TestkitRequestProcessorHandler(backendMode, logging));
6369
}
6470
});
6571
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
@@ -44,6 +44,7 @@
4444
import neo4j.org.testkit.backend.messages.requests.TestkitCallbackResult;
4545
import neo4j.org.testkit.backend.messages.responses.TestkitResponse;
4646
import org.neo4j.driver.BookmarkManager;
47+
import org.neo4j.driver.Logging;
4748
import org.neo4j.driver.internal.cluster.RoutingTableRegistry;
4849
import reactor.core.publisher.Mono;
4950

@@ -76,6 +77,7 @@ public class TestkitState {
7677
private final Map<String, ReactiveTransactionStreamsHolder> transactionIdToReactiveTransactionStreamsHolder =
7778
new HashMap<>();
7879
private final Map<String, BookmarkManager> bookmarkManagerIdToBookmarkManager = new HashMap<>();
80+
private final Logging logging;
7981

8082
@Getter
8183
private final Map<String, Exception> errors = new HashMap<>();
@@ -88,8 +90,9 @@ public class TestkitState {
8890
@Getter
8991
private final Map<String, CompletableFuture<TestkitCallbackResult>> callbackIdToFuture = new HashMap<>();
9092

91-
public TestkitState(Consumer<TestkitResponse> responseWriter) {
93+
public TestkitState(Consumer<TestkitResponse> responseWriter, Logging logging) {
9294
this.responseWriter = responseWriter;
95+
this.logging = logging;
9396
}
9497

9598
public String newId() {
@@ -238,6 +241,10 @@ public void removeBookmarkManager(String id) {
238241
}
239242
}
240243

244+
public Logging getLogging() {
245+
return logging;
246+
}
247+
241248
private <T> String add(T value, Map<String, T> idToT) {
242249
String id = newId();
243250
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
@@ -35,19 +35,20 @@
3535
import neo4j.org.testkit.backend.messages.responses.BackendError;
3636
import neo4j.org.testkit.backend.messages.responses.DriverError;
3737
import neo4j.org.testkit.backend.messages.responses.TestkitResponse;
38+
import org.neo4j.driver.Logging;
3839
import org.neo4j.driver.exceptions.Neo4jException;
3940
import org.neo4j.driver.exceptions.NoSuchRecordException;
4041
import org.neo4j.driver.exceptions.UntrustedServerException;
4142
import org.neo4j.driver.internal.spi.ConnectionPool;
4243

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

50-
public TestkitRequestProcessorHandler(BackendMode backendMode) {
51+
public TestkitRequestProcessorHandler(BackendMode backendMode, Logging logging) {
5152
switch (backendMode) {
5253
case ASYNC:
5354
processorImpl = TestkitRequest::processAsync;
@@ -63,6 +64,7 @@ public TestkitRequestProcessorHandler(BackendMode backendMode) {
6364
processorImpl = TestkitRequestProcessorHandler::wrapSyncRequest;
6465
break;
6566
}
67+
testkitState = new TestkitState(this::writeAndFlush, logging);
6668
}
6769

6870
@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
@@ -118,6 +118,7 @@ public TestkitResponse process(TestkitState testkitState) {
118118
configBuilder.withNotificationConfig(
119119
toNotificationConfig(data.notificationsMinSeverity, data.notificationsDisabledCategories));
120120
configBuilder.withDriverMetrics();
121+
configBuilder.withLogging(testkitState.getLogging());
121122
org.neo4j.driver.Driver driver;
122123
Config config = configBuilder.build();
123124
try {

0 commit comments

Comments
 (0)