Skip to content

Commit 0759fc3

Browse files
committed
Replace stub server test for GOODBYE message with IT
1 parent 69e3fa7 commit 0759fc3

File tree

3 files changed

+123
-28
lines changed

3 files changed

+123
-28
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Copyright (c) 2002-2018 "Neo4j,"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
package org.neo4j.driver.internal.util;
20+
21+
import io.netty.channel.Channel;
22+
import io.netty.channel.ChannelHandlerContext;
23+
import io.netty.channel.ChannelPipeline;
24+
import io.netty.handler.codec.MessageToMessageEncoder;
25+
26+
import java.util.List;
27+
import java.util.Map;
28+
import java.util.concurrent.ConcurrentHashMap;
29+
import java.util.concurrent.CopyOnWriteArrayList;
30+
31+
import org.neo4j.driver.internal.ConnectionSettings;
32+
import org.neo4j.driver.internal.DriverFactory;
33+
import org.neo4j.driver.internal.async.ChannelConnector;
34+
import org.neo4j.driver.internal.async.ChannelConnectorImpl;
35+
import org.neo4j.driver.internal.async.ChannelPipelineBuilder;
36+
import org.neo4j.driver.internal.async.ChannelPipelineBuilderImpl;
37+
import org.neo4j.driver.internal.async.outbound.OutboundMessageHandler;
38+
import org.neo4j.driver.internal.messaging.Message;
39+
import org.neo4j.driver.internal.messaging.MessageFormat;
40+
import org.neo4j.driver.internal.security.SecurityPlan;
41+
import org.neo4j.driver.v1.Config;
42+
import org.neo4j.driver.v1.Logging;
43+
44+
public class MessageRecordingDriverFactory extends DriverFactory
45+
{
46+
private final Map<Channel,List<Message>> messagesByChannel = new ConcurrentHashMap<>();
47+
48+
public Map<Channel,List<Message>> getMessagesByChannel()
49+
{
50+
return messagesByChannel;
51+
}
52+
53+
@Override
54+
protected ChannelConnector createConnector( ConnectionSettings settings, SecurityPlan securityPlan, Config config, Clock clock )
55+
{
56+
ChannelPipelineBuilder pipelineBuilder = new MessageRecordingChannelPipelineBuilder();
57+
return new ChannelConnectorImpl( settings, securityPlan, pipelineBuilder, config.logging(), clock );
58+
}
59+
60+
private class MessageRecordingChannelPipelineBuilder extends ChannelPipelineBuilderImpl
61+
{
62+
@Override
63+
public void build( MessageFormat messageFormat, ChannelPipeline pipeline, Logging logging )
64+
{
65+
super.build( messageFormat, pipeline, logging );
66+
pipeline.addAfter( OutboundMessageHandler.NAME, MessageRecordingHandler.class.getSimpleName(), new MessageRecordingHandler() );
67+
}
68+
}
69+
70+
private class MessageRecordingHandler extends MessageToMessageEncoder<Message>
71+
{
72+
@Override
73+
protected void encode( ChannelHandlerContext ctx, Message msg, List<Object> out )
74+
{
75+
List<Message> messages = messagesByChannel.computeIfAbsent( ctx.channel(), ignore -> new CopyOnWriteArrayList<>() );
76+
messages.add( msg );
77+
out.add( msg );
78+
}
79+
}
80+
}

driver/src/test/java/org/neo4j/driver/v1/integration/SessionBoltV3IT.java

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,25 @@
1818
*/
1919
package org.neo4j.driver.v1.integration;
2020

21+
import io.netty.channel.Channel;
2122
import org.junit.jupiter.api.Test;
2223
import org.junit.jupiter.api.extension.RegisterExtension;
2324

2425
import java.time.LocalDate;
26+
import java.util.ArrayList;
2527
import java.util.HashMap;
28+
import java.util.List;
2629
import java.util.Map;
2730
import java.util.concurrent.CompletionStage;
2831

29-
import org.neo4j.driver.internal.logging.DevNullLogging;
32+
import org.neo4j.driver.internal.cluster.RoutingSettings;
33+
import org.neo4j.driver.internal.messaging.Message;
34+
import org.neo4j.driver.internal.messaging.request.GoodbyeMessage;
35+
import org.neo4j.driver.internal.messaging.request.HelloMessage;
36+
import org.neo4j.driver.internal.retry.RetrySettings;
3037
import org.neo4j.driver.internal.util.EnabledOnNeo4jWith;
31-
import org.neo4j.driver.v1.AuthTokens;
32-
import org.neo4j.driver.v1.Config;
38+
import org.neo4j.driver.internal.util.MessageRecordingDriverFactory;
3339
import org.neo4j.driver.v1.Driver;
34-
import org.neo4j.driver.v1.GraphDatabase;
3540
import org.neo4j.driver.v1.Session;
3641
import org.neo4j.driver.v1.StatementResult;
3742
import org.neo4j.driver.v1.StatementResultCursor;
@@ -40,18 +45,19 @@
4045
import org.neo4j.driver.v1.exceptions.TransientException;
4146
import org.neo4j.driver.v1.summary.ResultSummary;
4247
import org.neo4j.driver.v1.util.SessionExtension;
43-
import org.neo4j.driver.v1.util.StubServer;
4448

4549
import static java.time.Duration.ofMillis;
4650
import static java.util.Arrays.asList;
47-
import static java.util.Collections.singletonMap;
4851
import static org.hamcrest.MatcherAssert.assertThat;
4952
import static org.hamcrest.Matchers.containsString;
53+
import static org.hamcrest.Matchers.greaterThan;
54+
import static org.hamcrest.Matchers.instanceOf;
5055
import static org.junit.jupiter.api.Assertions.assertEquals;
5156
import static org.junit.jupiter.api.Assertions.assertNotEquals;
5257
import static org.junit.jupiter.api.Assertions.assertNotNull;
5358
import static org.junit.jupiter.api.Assertions.assertThrows;
5459
import static org.neo4j.driver.internal.util.Neo4jFeature.BOLT_V3;
60+
import static org.neo4j.driver.v1.Config.defaultConfig;
5561
import static org.neo4j.driver.v1.util.TestUtil.await;
5662

5763
@EnabledOnNeo4jWith( BOLT_V3 )
@@ -257,22 +263,43 @@ void shouldUseBookmarksForAutoCommitTransactionsAndTransactionFunctions()
257263
}
258264

259265
@Test
260-
void shouldSendGoodbyeWhenClosingDriver() throws Throwable
266+
void shouldSendGoodbyeWhenClosingDriver()
261267
{
262-
StubServer server = StubServer.start( "goodbye_message.script", 9001 );
263-
try
268+
int txCount = 13;
269+
MessageRecordingDriverFactory driverFactory = new MessageRecordingDriverFactory();
270+
271+
try ( Driver driver = driverFactory.newInstance( session.uri(), session.authToken(), RoutingSettings.DEFAULT, RetrySettings.DEFAULT, defaultConfig() ) )
264272
{
265-
Config config = Config.build().withLogging( DevNullLogging.DEV_NULL_LOGGING ).withoutEncryption().toConfig();
266-
try ( Driver driver = GraphDatabase.driver( "bolt://localhost:9001", AuthTokens.none(), config ); Session session = driver.session() )
273+
List<Session> sessions = new ArrayList<>();
274+
List<Transaction> txs = new ArrayList<>();
275+
for ( int i = 0; i < txCount; i++ )
267276
{
268-
StatementResult result =
269-
session.run( "RETURN $x", singletonMap( "x", 1 ), TransactionConfig.builder().withMetadata( singletonMap( "mode", "r" ) ).build() );
270-
assertEquals( 1, result.single().get( "x" ).asInt() );
277+
Session session = driver.session();
278+
sessions.add( session );
279+
Transaction tx = session.beginTransaction();
280+
txs.add( tx );
281+
}
282+
283+
for ( int i = 0; i < txCount; i++ )
284+
{
285+
Session session = sessions.get( i );
286+
Transaction tx = txs.get( i );
287+
288+
tx.run( "CREATE ()" );
289+
tx.success();
290+
tx.close();
291+
session.close();
271292
}
272293
}
273-
finally
294+
295+
Map<Channel,List<Message>> messagesByChannel = driverFactory.getMessagesByChannel();
296+
assertEquals( txCount, messagesByChannel.size() );
297+
298+
for ( List<Message> messages : messagesByChannel.values() )
274299
{
275-
assertEquals( 0, server.exitStatus() );
300+
assertThat( messages.size(), greaterThan( 2 ) );
301+
assertThat( messages.get( 0 ), instanceOf( HelloMessage.class ) ); // first message is HELLO
302+
assertThat( messages.get( messages.size() - 1 ), instanceOf( GoodbyeMessage.class ) ); // last message is GOODBYE
276303
}
277304
}
278305

driver/src/test/resources/goodbye_message.script

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)