Skip to content

Commit d25bcba

Browse files
committed
Migrate tests depending on Boltkit to use Docker
Boltkit has been deprecated and requires additional setup on the host to run tests. This update migrates tests depending on Boltkit to use Docker that is needed for Testkit testing as well.
1 parent 020cd0f commit d25bcba

30 files changed

+439
-841
lines changed

README.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,18 @@ To use the driver in a project, please use the released driver via Maven Central
9797

9898
#### Running Tests and Creating a Package
9999

100-
Our test setup requires a bit of infrastructure to run.
101-
We rely mostly on [`testkit`](https://github.com/neo4j-drivers/testkit).
102-
Testkit is a tooling that is used to run integration tests for all of the drivers we provide.
103-
104-
Some older tests still rely on [`boltkit`](https://github.com/neo4j-drivers/boltkit), the predecessor to Testkit.
105-
If `boltkit` is not installed, then all tests that requires `boltkit` will be ignored and will not be executed.
106-
107-
In case you want or can verify contributions with unit tests alone, use the following command to skip all integration and Testkit tests:
108-
100+
The following command may be used to unit test and install artifacts without running integration tests:
109101
```
110102
mvn clean install -DskipITs -P skip-testkit
111103
```
112104

105+
Integration tests have the following prerequisites:
106+
- Docker
107+
- [`Testkit`](https://github.com/neo4j-drivers/testkit)
108+
109+
Testkit that is a tooling that is used to run integration tests for all official Neo4j drivers.
110+
It can be executed using Docker during Maven build and in such case does not require additional setup. See the instructions below for more details.
111+
113112
There are 2 ways of running Testkit tests:
114113
1. Using the `testkit-tests` module of this project.
115114
2. Manually cloning Testkit and running it directly.

driver/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@
100100
<groupId>org.reactivestreams</groupId>
101101
<artifactId>reactive-streams-tck</artifactId>
102102
</dependency>
103+
<dependency>
104+
<groupId>ch.qos.logback</groupId>
105+
<artifactId>logback-classic</artifactId>
106+
</dependency>
103107
</dependencies>
104108

105109
<build>

driver/src/test/java/org/neo4j/driver/integration/ConnectionPoolIT.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ void shouldRecoverFromDownedServer() throws Throwable {
8080
sessionGrabber.start();
8181

8282
// When
83-
neo4j.forceRestartDb();
83+
neo4j.stopProxy();
84+
neo4j.startProxy();
8485

8586
// Then we accept a hump with failing sessions, but demand that failures stop as soon as the server is back up.
8687
sessionGrabber.assertSessionsAvailableWithin(120);

driver/src/test/java/org/neo4j/driver/integration/CredentialsIT.java

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,8 @@
2525
import static org.junit.jupiter.api.Assertions.assertThrows;
2626
import static org.neo4j.driver.AuthTokens.basic;
2727
import static org.neo4j.driver.AuthTokens.custom;
28-
import static org.neo4j.driver.Values.ofValue;
29-
import static org.neo4j.driver.Values.parameters;
3028
import static org.neo4j.driver.internal.logging.DevNullLogging.DEV_NULL_LOGGING;
31-
import static org.neo4j.driver.util.Neo4jRunner.PASSWORD;
3229

33-
import java.nio.file.Files;
34-
import java.nio.file.Paths;
3530
import java.util.Map;
3631
import org.junit.jupiter.api.Test;
3732
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -44,58 +39,18 @@
4439
import org.neo4j.driver.Value;
4540
import org.neo4j.driver.exceptions.AuthenticationException;
4641
import org.neo4j.driver.exceptions.SecurityException;
47-
import org.neo4j.driver.internal.security.InternalAuthToken;
48-
import org.neo4j.driver.internal.util.DisabledOnNeo4jWith;
49-
import org.neo4j.driver.internal.util.Neo4jFeature;
5042
import org.neo4j.driver.util.DatabaseExtension;
51-
import org.neo4j.driver.util.Neo4jSettings;
5243
import org.neo4j.driver.util.ParallelizableIT;
5344

5445
@ParallelizableIT
5546
class CredentialsIT {
5647
@RegisterExtension
5748
static final DatabaseExtension neo4j = new DatabaseExtension();
5849

59-
@Test
60-
@DisabledOnNeo4jWith(Neo4jFeature.BOLT_V4)
61-
// This feature is removed in 4.0
62-
void shouldBePossibleToChangePassword() throws Exception {
63-
String newPassword = "secret";
64-
String tmpDataDir = Files.createTempDirectory(Paths.get("target"), "tmp")
65-
.toAbsolutePath()
66-
.toString()
67-
.replace("\\", "/");
68-
69-
neo4j.restartDb(Neo4jSettings.TEST_SETTINGS.updateWith(Neo4jSettings.DATA_DIR, tmpDataDir));
70-
71-
AuthToken authToken = new InternalAuthToken(parameters(
72-
"scheme", "basic",
73-
"principal", "neo4j",
74-
"credentials", "neo4j",
75-
"new_credentials", newPassword)
76-
.asMap(ofValue()));
77-
78-
// change the password
79-
try (Driver driver = GraphDatabase.driver(neo4j.uri(), authToken);
80-
Session session = driver.session()) {
81-
session.run("RETURN 1").consume();
82-
}
83-
84-
// verify old password does not work
85-
final Driver badDriver = GraphDatabase.driver(CredentialsIT.neo4j.uri(), basic("neo4j", PASSWORD));
86-
assertThrows(AuthenticationException.class, badDriver::verifyConnectivity);
87-
88-
// verify new password works
89-
try (Driver driver = GraphDatabase.driver(CredentialsIT.neo4j.uri(), AuthTokens.basic("neo4j", newPassword));
90-
Session session = driver.session()) {
91-
session.run("RETURN 2").consume();
92-
}
93-
}
94-
9550
@Test
9651
void basicCredentialsShouldWork() {
9752
// When & Then
98-
try (Driver driver = GraphDatabase.driver(neo4j.uri(), basic("neo4j", PASSWORD));
53+
try (Driver driver = GraphDatabase.driver(neo4j.uri(), basic("neo4j", neo4j.adminPassword()));
9954
Session session = driver.session()) {
10055
Value single = session.run("RETURN 1").single().get(0);
10156
assertThat(single.asLong(), equalTo(1L));
@@ -105,7 +60,8 @@ void basicCredentialsShouldWork() {
10560
@Test
10661
void shouldGetHelpfulErrorOnInvalidCredentials() {
10762
SecurityException e = assertThrows(SecurityException.class, () -> {
108-
try (Driver driver = GraphDatabase.driver(neo4j.uri(), basic("thisisnotthepassword", PASSWORD));
63+
try (Driver driver =
64+
GraphDatabase.driver(neo4j.uri(), basic("thisisnotthepassword", neo4j.adminPassword()));
10965
Session session = driver.session()) {
11066
session.run("RETURN 1");
11167
}
@@ -116,7 +72,7 @@ void shouldGetHelpfulErrorOnInvalidCredentials() {
11672
@Test
11773
void shouldBeAbleToProvideRealmWithBasicAuth() {
11874
// When & Then
119-
try (Driver driver = GraphDatabase.driver(neo4j.uri(), basic("neo4j", PASSWORD, "native"));
75+
try (Driver driver = GraphDatabase.driver(neo4j.uri(), basic("neo4j", neo4j.adminPassword(), "native"));
12076
Session session = driver.session()) {
12177
Value single = session.run("CREATE () RETURN 1").single().get(0);
12278
assertThat(single.asLong(), equalTo(1L));
@@ -126,7 +82,8 @@ void shouldBeAbleToProvideRealmWithBasicAuth() {
12682
@Test
12783
void shouldBeAbleToConnectWithCustomToken() {
12884
// When & Then
129-
try (Driver driver = GraphDatabase.driver(neo4j.uri(), custom("neo4j", PASSWORD, "native", "basic"));
85+
try (Driver driver =
86+
GraphDatabase.driver(neo4j.uri(), custom("neo4j", neo4j.adminPassword(), "native", "basic"));
13087
Session session = driver.session()) {
13188
Value single = session.run("CREATE () RETURN 1").single().get(0);
13289
assertThat(single.asLong(), equalTo(1L));
@@ -138,7 +95,8 @@ void shouldBeAbleToConnectWithCustomTokenWithAdditionalParameters() {
13895
Map<String, Object> params = singletonMap("secret", 16);
13996

14097
// When & Then
141-
try (Driver driver = GraphDatabase.driver(neo4j.uri(), custom("neo4j", PASSWORD, "native", "basic", params));
98+
try (Driver driver = GraphDatabase.driver(
99+
neo4j.uri(), custom("neo4j", neo4j.adminPassword(), "native", "basic", params));
142100
Session session = driver.session()) {
143101
Value single = session.run("CREATE () RETURN 1").single().get(0);
144102
assertThat(single.asLong(), equalTo(1L));
@@ -147,12 +105,12 @@ void shouldBeAbleToConnectWithCustomTokenWithAdditionalParameters() {
147105

148106
@Test
149107
void directDriverShouldFailEarlyOnWrongCredentials() {
150-
testDriverFailureOnWrongCredentials("bolt://localhost:" + neo4j.boltPort());
108+
testDriverFailureOnWrongCredentials(neo4j.uri().toString());
151109
}
152110

153111
@Test
154112
void routingDriverShouldFailEarlyOnWrongCredentials() {
155-
testDriverFailureOnWrongCredentials("neo4j://localhost:" + neo4j.boltPort());
113+
testDriverFailureOnWrongCredentials(neo4j.uri().toString());
156114
}
157115

158116
private void testDriverFailureOnWrongCredentials(String uri) {

driver/src/test/java/org/neo4j/driver/integration/DirectDriverIT.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,11 @@
2525
import static org.neo4j.driver.internal.util.Matchers.directDriverWithAddress;
2626

2727
import java.net.URI;
28-
import org.hamcrest.CoreMatchers;
2928
import org.junit.jupiter.api.AfterEach;
3029
import org.junit.jupiter.api.Test;
3130
import org.junit.jupiter.api.extension.RegisterExtension;
3231
import org.neo4j.driver.Driver;
3332
import org.neo4j.driver.GraphDatabase;
34-
import org.neo4j.driver.Result;
35-
import org.neo4j.driver.Session;
3633
import org.neo4j.driver.internal.BoltServerAddress;
3734
import org.neo4j.driver.util.DatabaseExtension;
3835
import org.neo4j.driver.util.ParallelizableIT;
@@ -87,17 +84,4 @@ void shouldRegisterSingleServer() {
8784
// Then
8885
assertThat(driver, is(directDriverWithAddress(address)));
8986
}
90-
91-
@Test
92-
void shouldConnectIPv6Uri() {
93-
// Given
94-
try (Driver driver = GraphDatabase.driver("bolt://[::1]:" + neo4j.boltPort(), neo4j.authToken());
95-
Session session = driver.session()) {
96-
// When
97-
Result result = session.run("RETURN 1");
98-
99-
// Then
100-
assertThat(result.single().get(0).asInt(), CoreMatchers.equalTo(1));
101-
}
102-
}
10387
}

driver/src/test/java/org/neo4j/driver/integration/EncryptionIT.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import static org.neo4j.driver.Config.TrustStrategy.trustAllCertificates;
2626

2727
import java.net.URI;
28+
import java.util.HashMap;
29+
import java.util.Map;
2830
import org.junit.jupiter.api.Test;
2931
import org.junit.jupiter.api.extension.RegisterExtension;
3032
import org.neo4j.driver.Config;
@@ -81,7 +83,9 @@ void shouldOperateWithoutEncryptionWhenItIsAlsoDisabledInTheDatabase() {
8183
}
8284

8385
private void testMatchingEncryption(BoltTlsLevel tlsLevel, boolean driverEncrypted, String scheme) {
84-
neo4j.restartDb(Neo4jSettings.TEST_SETTINGS.updateWith(Neo4jSettings.BOLT_TLS_LEVEL, tlsLevel.toString()));
86+
Map<String, String> tlsConfig = new HashMap<>();
87+
tlsConfig.put(Neo4jSettings.BOLT_TLS_LEVEL, tlsLevel.toString());
88+
neo4j.deleteAndStartNeo4j(tlsConfig);
8589
Config config;
8690

8791
if (scheme.equals(Scheme.BOLT_LOW_TRUST_URI_SCHEME)) {
@@ -107,7 +111,9 @@ private void testMatchingEncryption(BoltTlsLevel tlsLevel, boolean driverEncrypt
107111
}
108112

109113
private void testMismatchingEncryption(BoltTlsLevel tlsLevel, boolean driverEncrypted) {
110-
neo4j.restartDb(Neo4jSettings.TEST_SETTINGS.updateWith(Neo4jSettings.BOLT_TLS_LEVEL, tlsLevel.toString()));
114+
Map<String, String> tlsConfig = new HashMap<>();
115+
tlsConfig.put(Neo4jSettings.BOLT_TLS_LEVEL, tlsLevel.toString());
116+
neo4j.deleteAndStartNeo4j(tlsConfig);
111117
Config config = newConfig(driverEncrypted);
112118

113119
ServiceUnavailableException e = assertThrows(

driver/src/test/java/org/neo4j/driver/integration/ErrorIT.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,12 @@ void shouldHandleFailureAtRunTime() {
177177
}
178178

179179
@Test
180-
void shouldGetHelpfulErrorWhenTryingToConnectToHttpPort() throws Throwable {
181-
// the http server needs some time to start up
182-
Thread.sleep(2000);
183-
180+
void shouldGetHelpfulErrorWhenTryingToConnectToHttpPort() {
184181
Config config = Config.builder().withoutEncryption().build();
185182

186-
final Driver driver = GraphDatabase.driver("bolt://localhost:" + session.httpPort(), config);
183+
URI boltUri = session.uri();
184+
URI uri = URI.create(String.format("%s://%s:%d", boltUri.getScheme(), boltUri.getHost(), session.httpPort()));
185+
final Driver driver = GraphDatabase.driver(uri, config);
187186
ClientException e = assertThrows(ClientException.class, driver::verifyConnectivity);
188187
assertEquals(
189188
"Server responded HTTP. Make sure you are not trying to connect to the http endpoint "

driver/src/test/java/org/neo4j/driver/integration/LoadCSVIT.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@
3131
import org.neo4j.driver.Result;
3232
import org.neo4j.driver.Session;
3333
import org.neo4j.driver.util.DatabaseExtension;
34-
import org.neo4j.driver.util.Neo4jSettings;
3534
import org.neo4j.driver.util.ParallelizableIT;
3635

3736
@ParallelizableIT
3837
class LoadCSVIT {
3938
@RegisterExtension
40-
static final DatabaseExtension neo4j = new DatabaseExtension(
41-
Neo4jSettings.TEST_SETTINGS.without(Neo4jSettings.IMPORT_DIR).without(Neo4jSettings.SERVER_IMPORT_DIR));
39+
static final DatabaseExtension neo4j = new DatabaseExtension();
4240

4341
@Test
4442
void shouldLoadCSV() throws Throwable {
@@ -74,7 +72,7 @@ private String createLocalIrisData(Session session) throws IOException {
7472
session.run("CREATE (c:Class {name: $className}) RETURN c", parameters("className", className));
7573
}
7674

77-
return neo4j.putTmpFile("iris", ".csv", IRIS_DATA).toExternalForm();
75+
return neo4j.addImportFile("iris", ".csv", IRIS_DATA);
7876
}
7977

8078
private static String[] IRIS_CLASS_NAMES = new String[] {"Iris-setosa", "Iris-versicolor", "Iris-virginica"};

driver/src/test/java/org/neo4j/driver/integration/ServerKilledIT.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import static org.junit.jupiter.api.Assertions.assertEquals;
2222
import static org.junit.jupiter.api.Assertions.fail;
2323
import static org.neo4j.driver.Config.TrustStrategy.trustCustomCertificateSignedBy;
24-
import static org.neo4j.driver.util.Neo4jRunner.DEFAULT_AUTH_TOKEN;
2524

2625
import java.util.List;
2726
import java.util.concurrent.TimeUnit;
@@ -69,11 +68,12 @@ private static Stream<Arguments> data() {
6968
@MethodSource("data")
7069
void shouldRecoverFromServerRestart(String name, Config.ConfigBuilder configBuilder) {
7170
// Given config with sessionLivenessCheckTimeout not set, i.e. turned off
72-
try (Driver driver = GraphDatabase.driver(neo4j.uri(), DEFAULT_AUTH_TOKEN, configBuilder.build())) {
71+
try (Driver driver = GraphDatabase.driver(neo4j.uri(), neo4j.authToken(), configBuilder.build())) {
7372
acquireAndReleaseConnections(4, driver);
7473

7574
// When
76-
neo4j.forceRestartDb();
75+
neo4j.stopProxy();
76+
neo4j.startProxy();
7777

7878
// Then we should be able to start using sessions again, at most O(numSessions) session calls later
7979
int toleratedFailures = 4;
@@ -102,8 +102,9 @@ void shouldDropBrokenOldSessions(String name, Config.ConfigBuilder configBuilder
102102
try (Driver driver = createDriver(clock, configBuilder.build())) {
103103
acquireAndReleaseConnections(5, driver);
104104

105-
// restart database to invalidate all idle connections in the pool
106-
neo4j.forceRestartDb();
105+
// restart database access to invalidate all idle connections in the pool
106+
neo4j.stopProxy();
107+
neo4j.startProxy();
107108
// move clock forward more than configured liveness check timeout
108109
clock.progress(TimeUnit.MINUTES.toMillis(livenessCheckTimeoutMinutes + 1));
109110

@@ -131,6 +132,6 @@ private Driver createDriver(Clock clock, Config config) {
131132
RoutingSettings routingSettings = RoutingSettings.DEFAULT;
132133
RetrySettings retrySettings = RetrySettings.DEFAULT;
133134
return factory.newInstance(
134-
neo4j.uri(), DEFAULT_AUTH_TOKEN, routingSettings, retrySettings, config, SecurityPlanImpl.insecure());
135+
neo4j.uri(), neo4j.authToken(), routingSettings, retrySettings, config, SecurityPlanImpl.insecure());
135136
}
136137
}

driver/src/test/java/org/neo4j/driver/integration/SessionIT.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import static org.neo4j.driver.internal.util.Matchers.connectionAcquisitionTimeoutError;
5151
import static org.neo4j.driver.internal.util.Neo4jFeature.BOLT_V4;
5252
import static org.neo4j.driver.util.DaemonThreadFactory.daemon;
53-
import static org.neo4j.driver.util.Neo4jRunner.DEFAULT_AUTH_TOKEN;
5453

5554
import java.util.HashSet;
5655
import java.util.List;
@@ -1247,10 +1246,9 @@ private Driver newDriverWithoutRetries() {
12471246

12481247
private Driver newDriverWithFixedRetries(int maxRetriesCount) {
12491248
DriverFactory driverFactory = new DriverFactoryWithFixedRetryLogic(maxRetriesCount);
1250-
AuthToken auth = DEFAULT_AUTH_TOKEN;
12511249
return driverFactory.newInstance(
12521250
neo4j.uri(),
1253-
auth,
1251+
neo4j.authToken(),
12541252
RoutingSettings.DEFAULT,
12551253
RetrySettings.DEFAULT,
12561254
noLoggingConfig(),

driver/src/test/java/org/neo4j/driver/integration/TrustCustomCertificateIT.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static org.neo4j.driver.Config.TrustStrategy.trustCustomCertificateSignedBy;
2525
import static org.neo4j.driver.util.CertificateUtil.createNewCertificateAndKey;
2626
import static org.neo4j.driver.util.CertificateUtil.createNewCertificateAndKeySignedBy;
27+
import static org.neo4j.driver.util.DatabaseExtension.getDockerHostGeneralName;
2728

2829
import java.io.File;
2930
import java.util.function.Supplier;
@@ -35,31 +36,30 @@
3536
import org.neo4j.driver.Result;
3637
import org.neo4j.driver.Session;
3738
import org.neo4j.driver.exceptions.SecurityException;
38-
import org.neo4j.driver.util.CertificateExtension;
3939
import org.neo4j.driver.util.CertificateUtil.CertificateKeyPair;
4040
import org.neo4j.driver.util.DatabaseExtension;
4141
import org.neo4j.driver.util.ParallelizableIT;
4242

4343
@ParallelizableIT
4444
class TrustCustomCertificateIT {
4545
@RegisterExtension
46-
static final DatabaseExtension neo4j = new CertificateExtension();
46+
static final DatabaseExtension neo4j = new DatabaseExtension();
4747

4848
@Test
4949
void shouldAcceptServerWithCertificateSignedByDriverCertificate() throws Throwable {
5050
// Given root certificate
5151
CertificateKeyPair<File, File> root = createNewCertificateAndKey();
5252

5353
// When
54-
CertificateKeyPair<File, File> server = createNewCertificateAndKeySignedBy(root);
54+
CertificateKeyPair<File, File> server = createNewCertificateAndKeySignedBy(root, getDockerHostGeneralName());
5555
neo4j.updateEncryptionKeyAndCert(server.key(), server.cert());
5656

5757
// Then
5858
shouldBeAbleToRunCypher(() -> createDriverWithCustomCertificate(root.cert()));
5959
}
6060

6161
@Test
62-
void shouldAcceptServerWithSameCertificate() throws Throwable {
62+
void shouldAcceptServerWithSameCertificate() {
6363
shouldBeAbleToRunCypher(() -> createDriverWithCustomCertificate(neo4j.tlsCertFile()));
6464
}
6565

@@ -70,7 +70,7 @@ void shouldRejectServerWithUntrustedCertificate() throws Throwable {
7070

7171
// When & Then
7272
final Driver driver = createDriverWithCustomCertificate(certificateAndKey.cert());
73-
SecurityException error = assertThrows(SecurityException.class, driver::verifyConnectivity);
73+
assertThrows(SecurityException.class, driver::verifyConnectivity);
7474
}
7575

7676
private void shouldBeAbleToRunCypher(Supplier<Driver> driverSupplier) {

0 commit comments

Comments
 (0)