Skip to content

Commit e8d9e1b

Browse files
committed
Update AbstractMongoBackend
Change method visibility to public for extensibility Add tests to cover synchronous and asynchronous method call
1 parent 27e8bce commit e8d9e1b

2 files changed

Lines changed: 92 additions & 8 deletions

File tree

core/src/main/java/de/bwaldvogel/mongo/backend/AbstractMongoBackend.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public abstract class AbstractMongoBackend implements MongoBackend {
5050

5151
protected static final String OPLOG_COLLECTION_NAME = "oplog.rs";
5252

53-
private static final String ADMIN_DB_NAME = "admin";
53+
protected static final String ADMIN_DB_NAME = "admin";
5454

5555
private final Map<String, MongoDatabase> databases = new ConcurrentHashMap<>();
5656

@@ -148,7 +148,7 @@ private Document getLog(String argument) {
148148
return response;
149149
}
150150

151-
private Document handleAdminCommand(String command, Document query) {
151+
protected Document handleAdminCommand(String command, Document query) {
152152
if (command.equalsIgnoreCase("listdatabases")) {
153153
List<Document> databases = listDatabaseNames().stream()
154154
.sorted()
@@ -296,8 +296,7 @@ private MongoCollection<?> resolveCollection(final String namespace) {
296296

297297
protected abstract MongoDatabase openOrCreateDatabase(String databaseName);
298298

299-
@Override
300-
public Document handleCommand(Channel channel, String databaseName, String command, Document query) {
299+
protected Document handleCommandSync(Channel channel, String databaseName, String command, Document query) {
301300
if (command.equalsIgnoreCase("whatsmyuri")) {
302301
Document response = new Document();
303302
InetSocketAddress remoteAddress = (InetSocketAddress) channel.remoteAddress();
@@ -327,13 +326,21 @@ public Document handleCommand(Channel channel, String databaseName, String comma
327326
} else if (command.equalsIgnoreCase("killCursors")) {
328327
return handleKillCursors(query);
329328
}
329+
return null;
330+
}
331+
332+
@Override
333+
public Document handleCommand(Channel channel, String databaseName, String command, Document query) {
334+
Document commandResponse = handleCommandSync(channel, databaseName, command, query);
335+
if (commandResponse != null) {
336+
return commandResponse;
337+
}
330338

331339
if (databaseName.equals(ADMIN_DB_NAME)) {
332340
return handleAdminCommand(command, query);
333-
} else {
334-
MongoDatabase db = resolveDatabase(databaseName);
335-
return db.handleCommand(channel, command, query, oplog);
336341
}
342+
343+
return resolveDatabase(databaseName).handleCommand(channel, command, query, oplog);
337344
}
338345

339346
@Override

core/src/test/java/de/bwaldvogel/mongo/backend/AbstractMongoBackendTest.java

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
package de.bwaldvogel.mongo.backend;
22

3+
import static de.bwaldvogel.mongo.backend.AbstractMongoBackend.ADMIN_DB_NAME;
34
import static org.assertj.core.api.Assertions.assertThat;
45
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
6+
import static org.mockito.ArgumentMatchers.any;
7+
import static org.mockito.Mockito.when;
58

9+
import java.net.InetSocketAddress;
610
import java.util.Arrays;
711
import java.util.Collections;
812
import java.util.List;
13+
import java.util.concurrent.CompletionStage;
914

1015
import org.junit.jupiter.api.BeforeEach;
1116
import org.junit.jupiter.api.Test;
17+
import org.mockito.Mockito;
1218

1319
import de.bwaldvogel.mongo.MongoBackend;
1420
import de.bwaldvogel.mongo.MongoDatabase;
1521
import de.bwaldvogel.mongo.bson.Document;
1622
import de.bwaldvogel.mongo.exception.CursorNotFoundException;
1723
import de.bwaldvogel.mongo.wire.message.MongoGetMore;
1824
import de.bwaldvogel.mongo.wire.message.MongoKillCursors;
25+
import io.netty.channel.Channel;
1926

2027
class AbstractMongoBackendTest {
2128

@@ -32,7 +39,15 @@ public void setup() {
3239

3340
@Override
3441
protected MongoDatabase openOrCreateDatabase(String databaseName) {
35-
return null;
42+
MongoDatabase mockDatabase = Mockito.mock(AbstractMongoDatabase.class);
43+
44+
Document fakeResponse = new Document();
45+
Utils.markOkay(fakeResponse);
46+
fakeResponse.put("message", "fakeResponse");
47+
48+
when(mockDatabase.handleCommand(any(), any(), any(), any())).thenReturn(fakeResponse);
49+
50+
return mockDatabase;
3651
}
3752
};
3853
}
@@ -73,4 +88,66 @@ void testHandleKillCursor() {
7388
assertThat(cursorRegistry.getCursor(cursor2.getId())).isNotNull();
7489
}
7590

91+
@Test
92+
void testHandleCommandSync() {
93+
Channel channel = Mockito.mock(Channel.class);
94+
when(channel.remoteAddress()).thenReturn(new InetSocketAddress("127.0.1.254", 27017));
95+
96+
Document response = backend.handleCommand(channel, null, "whatsmyuri", null);
97+
assertThat(response).isNotNull();
98+
assertThat(response.get("ok")).isEqualTo(1.0);
99+
assertThat(response.get("you")).isEqualTo("127.0.1.254:27017");
100+
}
101+
102+
@Test
103+
void testHandleCommandAsync() throws Exception {
104+
Channel channel = Mockito.mock(Channel.class);
105+
when(channel.remoteAddress()).thenReturn(new InetSocketAddress("127.0.1.254", 27017));
106+
107+
CompletionStage<Document> responseFuture = backend.handleCommandAsync(channel, null, "whatsmyuri", null);
108+
Document response = responseFuture.toCompletableFuture().get();
109+
assertThat(response).isNotNull();
110+
assertThat(response.get("ok")).isEqualTo(1.0);
111+
assertThat(response.get("you")).isEqualTo("127.0.1.254:27017");
112+
}
113+
114+
@Test
115+
void testHandleAdminCommand() {
116+
Channel channel = Mockito.mock(Channel.class);
117+
118+
Document response = backend.handleCommand(channel, ADMIN_DB_NAME, "ping", null);
119+
assertThat(response).isNotNull();
120+
assertThat(response.get("ok")).isEqualTo(1.0);
121+
}
122+
123+
@Test
124+
void testHandleAdminCommandAsync() throws Exception {
125+
Channel channel = Mockito.mock(Channel.class);
126+
127+
CompletionStage<Document> responseFuture = backend.handleCommandAsync(channel, ADMIN_DB_NAME, "ping", null);
128+
Document response = responseFuture.toCompletableFuture().get();
129+
assertThat(response).isNotNull();
130+
assertThat(response.get("ok")).isEqualTo(1.0);
131+
}
132+
133+
@Test
134+
void testMongoDatabaseHandleCommand() {
135+
Channel channel = Mockito.mock(Channel.class);
136+
137+
Document response = backend.handleCommand(channel, "mockDatabase", "find", null);
138+
assertThat(response).isNotNull();
139+
assertThat(response.get("ok")).isEqualTo(1.0);
140+
assertThat(response.get("message")).isEqualTo("fakeResponse");
141+
}
142+
143+
@Test
144+
void testMongoDatabaseHandleCommandAsync() throws Exception {
145+
Channel channel = Mockito.mock(Channel.class);
146+
147+
CompletionStage<Document> responseFuture = backend.handleCommandAsync(channel, "mockDatabase", "find", null);
148+
Document response = responseFuture.toCompletableFuture().get();
149+
assertThat(response).isNotNull();
150+
assertThat(response.get("ok")).isEqualTo(1.0);
151+
assertThat(response.get("message")).isEqualTo("fakeResponse");
152+
}
76153
}

0 commit comments

Comments
 (0)