Skip to content

Commit 8cd50b0

Browse files
committed
feat(tests): enhance load tests to support gRPC protocol, first round of refactoring (#2501)
(cherry picked from commit a546f89)
1 parent 445776a commit 8cd50b0

File tree

15 files changed

+419
-423
lines changed

15 files changed

+419
-423
lines changed

e2e-perf/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,24 @@
6666
<version>${project.parent.version}</version>
6767
<scope>test</scope>
6868
</dependency>
69+
<dependency>
70+
<groupId>com.arcadedb</groupId>
71+
<artifactId>arcadedb-grpc-client</artifactId>
72+
<version>${project.parent.version}</version>
73+
<scope>test</scope>
74+
</dependency>
6975
<dependency>
7076
<groupId>org.junit.jupiter</groupId>
7177
<artifactId>junit-jupiter</artifactId>
7278
<version>${junit.jupiter.version}</version>
7379
<scope>test</scope>
7480
</dependency>
81+
<dependency>
82+
<groupId>org.junit.jupiter</groupId>
83+
<artifactId>junit-jupiter-params</artifactId>
84+
<version>${junit.jupiter.version}</version>
85+
<scope>test</scope>
86+
</dependency>
7587
<dependency>
7688
<groupId>org.testcontainers</groupId>
7789
<artifactId>testcontainers</artifactId>

e2e-perf/src/test/java/com/arcadedb/test/performance/SingleLocalhostServerSimpleLoadTestIT.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.arcadedb.test.performance;
22

33
import com.arcadedb.test.support.DatabaseWrapper;
4+
import com.arcadedb.test.support.ServerWrapper;
45
import io.micrometer.core.instrument.Metrics;
56
import io.micrometer.core.instrument.logging.LoggingMeterRegistry;
67
import io.micrometer.core.instrument.logging.LoggingRegistryConfig;
@@ -84,9 +85,8 @@ public void tearDown() {
8485
@DisplayName("Single server load test")
8586
void singleServerLoadTest() throws InterruptedException, IOException {
8687

87-
String host = "localhost"; // Assuming localhost for the database connection
88-
int port = 2480; // Default ArcadeDB port
89-
DatabaseWrapper db = new DatabaseWrapper(host, port, idSupplier);
88+
ServerWrapper server = new ServerWrapper("localhost", 2480, 50051);
89+
DatabaseWrapper db = new DatabaseWrapper(server, idSupplier);
9090
db.createDatabase();
9191
db.createSchema();
9292

@@ -111,7 +111,7 @@ void singleServerLoadTest() throws InterruptedException, IOException {
111111
for (int i = 0; i < numOfThreads; i++) {
112112
// Each thread will create users and photos
113113
executor.submit(() -> {
114-
DatabaseWrapper db1 = new DatabaseWrapper(host, port, idSupplier);
114+
DatabaseWrapper db1 = new DatabaseWrapper(server, idSupplier);
115115
db1.addUserAndPhotos(numOfUsers, numOfPhotos);
116116
db1.close();
117117
});
@@ -120,7 +120,7 @@ void singleServerLoadTest() throws InterruptedException, IOException {
120120
if (numOfFriendship > 0) {
121121
// Each thread will create friendships
122122
executor.submit(() -> {
123-
DatabaseWrapper db1 = new DatabaseWrapper(host, port, idSupplier);
123+
DatabaseWrapper db1 = new DatabaseWrapper(server, idSupplier);
124124
db1.createFriendships(numOfFriendship);
125125
db1.close();
126126
});
@@ -129,7 +129,7 @@ void singleServerLoadTest() throws InterruptedException, IOException {
129129
if (numOfLike > 0) {
130130
// Each thread will create friendships
131131
executor.submit(() -> {
132-
DatabaseWrapper db1 = new DatabaseWrapper(host, port, idSupplier);
132+
DatabaseWrapper db1 = new DatabaseWrapper(server, idSupplier);
133133
;
134134
db1.createLike(numOfLike);
135135
db1.close();

e2e-perf/src/test/java/com/arcadedb/test/performance/SingleServerLoadTestIT.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
import com.arcadedb.test.support.ContainersTestTemplate;
44
import com.arcadedb.test.support.DatabaseWrapper;
5+
import com.arcadedb.test.support.ServerWrapper;
56
import io.micrometer.core.instrument.Metrics;
67
import org.junit.jupiter.api.DisplayName;
7-
import org.junit.jupiter.api.Test;
8-
import org.testcontainers.containers.GenericContainer;
8+
import org.junit.jupiter.params.ParameterizedTest;
9+
import org.junit.jupiter.params.provider.EnumSource;
910

1011
import java.io.IOException;
1112
import java.time.Duration;
@@ -17,15 +18,14 @@
1718

1819
public class SingleServerLoadTestIT extends ContainersTestTemplate {
1920

20-
@Test
2121
@DisplayName("Single server load test")
22-
void singleServerLoadTest() throws InterruptedException, IOException {
22+
@ParameterizedTest
23+
@EnumSource(DatabaseWrapper.Protocol.class)
24+
void singleServerLoadTest(DatabaseWrapper.Protocol protocol) throws InterruptedException, IOException {
2325

24-
GenericContainer<?> arcadeContainer = createArcadeContainer("arcade", "none", "none", "any", false, network);
25-
startContainers();
26-
String host = arcadeContainer.getHost();
27-
int port = arcadeContainer.getMappedPort(2480);
28-
DatabaseWrapper db = new DatabaseWrapper(host, port, idSupplier);
26+
createArcadeContainer("arcade", "none", "none", "any", false, network);
27+
ServerWrapper server = startContainers().getFirst();
28+
DatabaseWrapper db = new DatabaseWrapper(server, idSupplier, protocol);
2929
db.createDatabase();
3030
db.createSchema();
3131

@@ -50,7 +50,7 @@ void singleServerLoadTest() throws InterruptedException, IOException {
5050
for (int i = 0; i < numOfThreads; i++) {
5151
// Each thread will create users and photos
5252
executor.submit(() -> {
53-
DatabaseWrapper db1 = new DatabaseWrapper(host, port, idSupplier);
53+
DatabaseWrapper db1 = new DatabaseWrapper(server, idSupplier, protocol);
5454
db1.addUserAndPhotos(numOfUsers, numOfPhotos);
5555
db1.close();
5656
});
@@ -59,7 +59,7 @@ void singleServerLoadTest() throws InterruptedException, IOException {
5959
if (numOfFriendship > 0) {
6060
// Each thread will create friendships
6161
executor.submit(() -> {
62-
DatabaseWrapper db1 = new DatabaseWrapper(host, port, idSupplier);
62+
DatabaseWrapper db1 = new DatabaseWrapper(server, idSupplier, protocol);
6363
db1.createFriendships(numOfFriendship);
6464
db1.close();
6565
});
@@ -68,7 +68,7 @@ void singleServerLoadTest() throws InterruptedException, IOException {
6868
if (numOfLike > 0) {
6969
// Each thread will create friendships
7070
executor.submit(() -> {
71-
DatabaseWrapper db1 = new DatabaseWrapper(host, port, idSupplier);
71+
DatabaseWrapper db1 = new DatabaseWrapper(server, idSupplier, protocol);
7272
;
7373
db1.createLike(numOfLike);
7474
db1.close();

e2e-perf/src/test/java/com/arcadedb/test/performance/SingleServerSimpleLoadTestIT.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,31 @@
22

33
import com.arcadedb.test.support.ContainersTestTemplate;
44
import com.arcadedb.test.support.DatabaseWrapper;
5+
import com.arcadedb.test.support.ServerWrapper;
56
import org.junit.jupiter.api.DisplayName;
6-
import org.junit.jupiter.api.Test;
7-
import org.testcontainers.containers.GenericContainer;
7+
import org.junit.jupiter.params.ParameterizedTest;
8+
import org.junit.jupiter.params.provider.EnumSource;
89

910
import java.io.IOException;
11+
import java.util.List;
1012
import java.util.concurrent.ExecutorService;
1113
import java.util.concurrent.Executors;
1214
import java.util.concurrent.TimeUnit;
1315

1416
public class SingleServerSimpleLoadTestIT extends ContainersTestTemplate {
1517

16-
@Test
1718
@DisplayName("Single server load test")
18-
void singleServerLoadTest() throws InterruptedException, IOException {
19+
@ParameterizedTest
20+
@EnumSource(DatabaseWrapper.Protocol.class)
21+
//to eneable only one protocol use the following annotation
22+
//@EnumSource(value = DatabaseWrapper.Protocol.class, names = "GRPC")
23+
void singleServerLoadTest(DatabaseWrapper.Protocol protocol) throws InterruptedException, IOException {
1924

20-
GenericContainer<?> arcadeContainer = createArcadeContainer("arcade", "none", "none", "any", false, network);
25+
createArcadeContainer("arcade", "none", "none", "any", false, network);
2126

22-
startContainers();
23-
String host = arcadeContainer.getHost();
24-
int port = arcadeContainer.getMappedPort(2480);
25-
DatabaseWrapper db = new DatabaseWrapper(host, port, idSupplier);
27+
List<ServerWrapper> serverWrappers = startContainers();
28+
ServerWrapper server = serverWrappers.getFirst();
29+
DatabaseWrapper db = new DatabaseWrapper(server, idSupplier, protocol);
2630
db.createDatabase();
2731
db.createSchema();
2832

@@ -38,7 +42,7 @@ void singleServerLoadTest() throws InterruptedException, IOException {
3842
for (int i = 0; i < numOfThreads; i++) {
3943
// Each thread will create users and photos
4044
executor.submit(() -> {
41-
DatabaseWrapper db1 = new DatabaseWrapper(host, port, idSupplier);
45+
DatabaseWrapper db1 = new DatabaseWrapper(server, idSupplier, protocol);
4246
db1.addUserAndPhotos(numOfUsers, numOfPhotos);
4347
db1.close();
4448
});

e2e-perf/src/test/java/com/arcadedb/test/support/ContainersTestTemplate.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818
import org.testcontainers.lifecycle.Startables;
1919
import org.testcontainers.utility.MountableFile;
2020

21-
import java.io.*;
22-
import java.nio.file.*;
23-
import java.time.*;
24-
import java.util.*;
25-
import java.util.concurrent.atomic.*;
26-
import java.util.function.*;
21+
import java.io.IOException;
22+
import java.nio.file.Path;
23+
import java.time.Duration;
24+
import java.util.ArrayList;
25+
import java.util.List;
26+
import java.util.concurrent.atomic.AtomicInteger;
27+
import java.util.function.Supplier;
2728

2829
public abstract class ContainersTestTemplate {
2930
public static final String IMAGE = "arcadedata/arcadedb:latest";
@@ -127,11 +128,14 @@ protected void stopContainers() {
127128
/**
128129
* Starts all containers that are not already running.
129130
*/
130-
protected void startContainers() {
131+
protected List<ServerWrapper> startContainers() {
131132
logger.info("Starting all containers");
132133
containers.stream()
133134
.filter(container -> !container.isRunning())
134135
.forEach(container -> Startables.deepStart(container).join());
136+
return containers.stream()
137+
.map(ServerWrapper::new)
138+
.toList();
135139
}
136140

137141
/**
@@ -144,7 +148,8 @@ protected void startContainers() {
144148
*
145149
* @return A GenericContainer instance representing the ArcadeDB container.
146150
*/
147-
protected GenericContainer<?> createArcadeContainer(String name,
151+
protected GenericContainer createArcadeContainer(
152+
String name,
148153
String serverList,
149154
String quorum,
150155
String role,
@@ -174,7 +179,7 @@ protected GenericContainer<?> createArcadeContainer(String name,
174179
makeContainersDirectories(name);
175180

176181
GenericContainer<?> container = new GenericContainer<>(IMAGE)
177-
.withExposedPorts(2480, 5432)
182+
.withExposedPorts(2480, 5432, 50051)
178183
.withNetwork(network)
179184
.withNetworkAliases(name)
180185
.withStartupTimeout(Duration.ofSeconds(90))
@@ -184,7 +189,7 @@ protected GenericContainer<?> createArcadeContainer(String name,
184189

185190
.withEnv("JAVA_OPTS", String.format("""
186191
-Darcadedb.server.rootPassword=playwithdata
187-
-Darcadedb.server.plugins=Postgres:com.arcadedb.postgres.PostgresProtocolPlugin
192+
-Darcadedb.server.plugins=Postgres:com.arcadedb.postgres.PostgresProtocolPlugin,GRPC:com.arcadedb.server.grpc.GrpcServerPlugin
188193
-Darcadedb.server.httpsIoThreads=30
189194
-Darcadedb.bucketReuseSpaceMode=low
190195
-Darcadedb.server.name=%s

e2e-perf/src/test/java/com/arcadedb/test/support/DatabaseWrapper.java

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.arcadedb.remote.RemoteHttpComponent;
66
import com.arcadedb.remote.RemoteSchema;
77
import com.arcadedb.remote.RemoteServer;
8+
import com.arcadedb.remote.grpc.RemoteGrpcDatabase;
9+
import com.arcadedb.remote.grpc.RemoteGrpcServer;
810
import io.micrometer.core.instrument.Metrics;
911
import io.micrometer.core.instrument.Timer;
1012
import org.slf4j.Logger;
@@ -20,29 +22,41 @@
2022

2123
public class DatabaseWrapper {
2224
private static final Logger logger = LoggerFactory.getLogger(DatabaseWrapper.class);
23-
private final String host;
24-
private final int port;
25+
private final ServerWrapper server;
2526
private final RemoteDatabase db;
2627
private final Supplier<Integer> idSupplier;
2728
private final Timer photosTimer;
2829
private final Timer usersTimer;
2930
private final Timer friendshipTimer;
3031
private final Timer likeTimer;
3132

32-
public DatabaseWrapper(String host, int port, Supplier<Integer> idSupplier) {
33-
this.host = host;
34-
this.port = port;
35-
this.db = connectToDatabase();
33+
public enum Protocol {HTTP, GRPC}
34+
35+
public DatabaseWrapper(ServerWrapper server, Supplier<Integer> idSupplier, Protocol protocol) {
36+
this.server = server;
37+
this.db = connectToDatabase(protocol);
3638
this.idSupplier = idSupplier;
3739
usersTimer = Metrics.timer("arcadedb.test.inserted.users");
3840
photosTimer = Metrics.timer("arcadedb.test.inserted.photos");
3941
friendshipTimer = Metrics.timer("arcadedb.test.inserted.friendship");
4042
likeTimer = Metrics.timer("arcadedb.test.inserted.like");
4143
}
4244

43-
private RemoteDatabase connectToDatabase() {
44-
RemoteDatabase database = new RemoteDatabase(host,
45-
port,
45+
public DatabaseWrapper(ServerWrapper server, Supplier<Integer> idSupplier) {
46+
this(server, idSupplier, Protocol.HTTP);
47+
}
48+
49+
private RemoteDatabase connectToDatabaseGrpc() {
50+
RemoteGrpcServer gtpcServer = new RemoteGrpcServer(server.host(), server.grpcPort(), "root", PASSWORD, true, List.of());
51+
RemoteGrpcDatabase database = new RemoteGrpcDatabase(gtpcServer, server.host(), server.grpcPort(), server.httpPort(), DATABASE,
52+
"root", PASSWORD);
53+
return database;
54+
}
55+
56+
private RemoteDatabase connectToDatabaseHttp() {
57+
RemoteDatabase database = new RemoteDatabase(
58+
server.host(),
59+
server.httpPort(),
4660
DATABASE,
4761
"root",
4862
PASSWORD);
@@ -51,22 +65,31 @@ private RemoteDatabase connectToDatabase() {
5165
return database;
5266
}
5367

68+
private RemoteDatabase connectToDatabase(Protocol protocol) {
69+
return switch (protocol) {
70+
case HTTP -> connectToDatabaseHttp();
71+
case GRPC -> connectToDatabaseGrpc();
72+
};
73+
}
74+
5475
public void close() {
5576
db.close();
5677
}
5778

5879
public void createDatabase() {
59-
RemoteServer server = new RemoteServer(host,
60-
port,
80+
RemoteServer httpServer = new RemoteServer(
81+
server.host(),
82+
server.httpPort(),
6183
"root",
6284
PASSWORD);
63-
server.setConnectionStrategy(RemoteHttpComponent.CONNECTION_STRATEGY.FIXED);
85+
httpServer.setConnectionStrategy(RemoteHttpComponent.CONNECTION_STRATEGY.FIXED);
6486

65-
if (server.exists(DATABASE)) {
87+
if (httpServer.exists(DATABASE)) {
6688
logger.info("Dropping existing database {}", DATABASE);
67-
server.drop(DATABASE);
89+
httpServer.drop(DATABASE);
6890
}
69-
server.create(DATABASE);
91+
logger.info("Creating database {}", DATABASE);
92+
httpServer.create(DATABASE);
7093
}
7194

7295
/**
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.arcadedb.test.support;
2+
3+
import org.testcontainers.containers.GenericContainer;
4+
5+
public record ServerWrapper(String host,
6+
int httpPort,
7+
int grpcPort
8+
) {
9+
public ServerWrapper(GenericContainer<?> container) {
10+
this(container.getHost(),
11+
container.getMappedPort(2480),
12+
container.getMappedPort(50051));
13+
}
14+
}

e2e/src/test/java/com/arcadedb/e2e/JdbcQueriesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ void testSelectSchemaTypes() throws SQLException, ClassNotFoundException {
242242
if (rs.getArray("properties").getResultSet().next()) {
243243
ResultSet props = rs.getArray("properties").getResultSet();
244244
assertThat(props.next()).isTrue();
245-
assertThat(new JSONObject(props.getString("value")).getString("type")).isEqualTo("INTEGER");
245+
assertThat(new JSONObject(props.getString("value")).getString("type")).isIn("INTEGER", "STRING");
246246
}
247247
}
248248

0 commit comments

Comments
 (0)