Skip to content

Commit 7abb16f

Browse files
committed
Integrate Docker with JUnit for test execution
1 parent cc072fe commit 7abb16f

File tree

13 files changed

+247
-9
lines changed

13 files changed

+247
-9
lines changed

pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,5 +200,4 @@
200200
<scope>test</scope>
201201
</dependency>
202202
</dependencies>
203-
204203
</project>

src/main/java/pl/szelagi/SessionAPI.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import pl.szelagi.manager.SessionManager;
1717
import pl.szelagi.manager.VersionManager;
1818
import pl.szelagi.recovery.RecoveryManager;
19+
import pl.szelagi.test.Tests;
1920
import pl.szelagi.util.Debug;
2021
import pl.szelagi.world.SessionWorldManager;
2122

@@ -63,6 +64,8 @@ public void onEnable() {
6364
RecoveryManager.initialize(this);
6465
SessionWorldManager.initialize(this);
6566
Command.registerCommands();
67+
68+
Tests.loadAll();
6669
}
6770

6871
@Override

src/main/java/pl/szelagi/command/Command.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import pl.szelagi.command.manage.LeaveSessionCommand;
2121
import pl.szelagi.command.manage.PlayerSessionCommand;
2222
import pl.szelagi.command.manage.StopSessionCommand;
23+
import pl.szelagi.command.test.IntegrationTestCommand;
2324

2425

2526
public class Command {
@@ -108,5 +109,11 @@ public static void registerCommands() {
108109
assert selfTest != null;
109110
var selfTestResolver = new SelfTestCommand();
110111
selfTest.setExecutor(selfTestResolver);
112+
113+
// session-integration-test
114+
var integrationTest = sapi.getCommand("session-integration-test");
115+
assert integrationTest != null;
116+
var integrationTestResolver = new IntegrationTestCommand();
117+
integrationTest.setExecutor(integrationTestResolver);
111118
}
112119
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* SessionAPI - A framework for game containerization on Minecraft servers
3+
* Copyright (C) 2025 Szelagi (https://github.com/Szelagi/SessionAPI)
4+
* Licensed under the GNU General Public License v3.0.
5+
* For more details, visit <https://www.gnu.org/licenses/>.
6+
*/
7+
8+
package pl.szelagi.command.test;
9+
10+
import org.bukkit.command.Command;
11+
import org.bukkit.command.CommandExecutor;
12+
import org.bukkit.command.CommandSender;
13+
import org.bukkit.entity.Player;
14+
import org.jetbrains.annotations.NotNull;
15+
import pl.szelagi.buildin.creator.Creator;
16+
import pl.szelagi.buildin.creator.CreatorBoard;
17+
import pl.szelagi.component.board.Board;
18+
import pl.szelagi.manager.SessionManager;
19+
import pl.szelagi.spatial.ISpatial;
20+
import pl.szelagi.tag.TagAnalyzer;
21+
import pl.szelagi.test.Test;
22+
23+
import java.util.*;
24+
import java.util.stream.Collectors;
25+
26+
import static pl.szelagi.command.CommandHelper.PREFIX;
27+
28+
public class IntegrationTestCommand implements CommandExecutor {
29+
public static final String SUCCESS = "OK";
30+
private static final Map<String, Test> TESTS = new HashMap<>();
31+
32+
public static void register(String name, Test test) {
33+
if (TESTS.containsKey(name))
34+
throw new IllegalArgumentException("Test already registered." + name);
35+
TESTS.put(name, test);
36+
}
37+
38+
private void sendError(CommandSender sender, String message) {
39+
if (message.equals(SUCCESS)) {
40+
throw new IllegalArgumentException("Success cannot be an error.");
41+
}
42+
sender.sendMessage(message);
43+
}
44+
45+
private void sendSuccess(CommandSender sender) {
46+
sender.sendMessage(SUCCESS);
47+
}
48+
49+
@Override
50+
public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) {
51+
if (strings.length == 0) {
52+
sendError(commandSender, "Test name not provided.");
53+
return true;
54+
}
55+
56+
var testName = strings[0];
57+
var args = Arrays.copyOfRange(strings, 1, strings.length);
58+
59+
var test = TESTS.get(testName);
60+
if (test == null) {
61+
sendError(commandSender, "Unknown test.");
62+
return true;
63+
}
64+
65+
try {
66+
test.execute(args);
67+
sendSuccess(commandSender);
68+
} catch (Exception e) {
69+
var stackTrace = Arrays.stream(e.getStackTrace())
70+
.map(StackTraceElement::toString)
71+
.collect(Collectors.joining("\n"));
72+
73+
var errorMessage = e.getClass().getName() + ": " + e.getMessage() + "\n" + stackTrace;
74+
75+
sendError(commandSender, errorMessage);
76+
}
77+
78+
return true;
79+
}
80+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* SessionAPI - A framework for game containerization on Minecraft servers
3+
* Copyright (C) 2025 Szelagi (https://github.com/Szelagi/SessionAPI)
4+
* Licensed under the GNU General Public License v3.0.
5+
* For more details, visit <https://www.gnu.org/licenses/>.
6+
*/
7+
8+
package pl.szelagi.test;
9+
10+
public abstract class Test {
11+
public abstract void execute(String[] args) throws Exception;
12+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* SessionAPI - A framework for game containerization on Minecraft servers
3+
* Copyright (C) 2025 Szelagi (https://github.com/Szelagi/SessionAPI)
4+
* Licensed under the GNU General Public License v3.0.
5+
* For more details, visit <https://www.gnu.org/licenses/>.
6+
*/
7+
8+
package pl.szelagi.test;
9+
10+
import pl.szelagi.command.test.IntegrationTestCommand;
11+
import pl.szelagi.test.sample.SampleTest;
12+
13+
public abstract class Tests {
14+
public static final String SAMPLE_TEST_NAME = "sample-test";
15+
16+
public static void loadAll() {
17+
IntegrationTestCommand.register(SAMPLE_TEST_NAME, new SampleTest());
18+
}
19+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* SessionAPI - A framework for game containerization on Minecraft servers
3+
* Copyright (C) 2025 Szelagi (https://github.com/Szelagi/SessionAPI)
4+
* Licensed under the GNU General Public License v3.0.
5+
* For more details, visit <https://www.gnu.org/licenses/>.
6+
*/
7+
8+
package pl.szelagi.test.sample;
9+
10+
import org.jetbrains.annotations.NotNull;
11+
import pl.szelagi.component.board.Board;
12+
import pl.szelagi.component.session.Session;
13+
import pl.szelagi.spatial.ISpatial;
14+
import pl.szelagi.spatial.Spatial;
15+
16+
public class SampleBoard extends Board {
17+
public SampleBoard(@NotNull Session session) {
18+
super(session);
19+
}
20+
21+
@Override
22+
public ISpatial defineSecureZone() {
23+
return new Spatial(space().getFirstPoint(), space().getSecondPoint());
24+
}
25+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* SessionAPI - A framework for game containerization on Minecraft servers
3+
* Copyright (C) 2025 Szelagi (https://github.com/Szelagi/SessionAPI)
4+
* Licensed under the GNU General Public License v3.0.
5+
* For more details, visit <https://www.gnu.org/licenses/>.
6+
*/
7+
8+
package pl.szelagi.test.sample;
9+
10+
import org.bukkit.plugin.java.JavaPlugin;
11+
import org.jetbrains.annotations.NotNull;
12+
import pl.szelagi.component.board.Board;
13+
import pl.szelagi.component.session.Session;
14+
15+
public class SampleSession extends Session {
16+
public SampleSession(JavaPlugin plugin) {
17+
super(plugin);
18+
}
19+
20+
@Override
21+
protected @NotNull Board defaultBoard() {
22+
return new SampleBoard(this);
23+
}
24+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* SessionAPI - A framework for game containerization on Minecraft servers
3+
* Copyright (C) 2025 Szelagi (https://github.com/Szelagi/SessionAPI)
4+
* Licensed under the GNU General Public License v3.0.
5+
* For more details, visit <https://www.gnu.org/licenses/>.
6+
*/
7+
8+
package pl.szelagi.test.sample;
9+
10+
import pl.szelagi.SessionAPI;
11+
import pl.szelagi.test.Test;
12+
13+
public class SampleTest extends Test {
14+
15+
@Override
16+
public void execute(String[] args) throws Exception {
17+
var session = new SampleSession(SessionAPI.instance());
18+
session.start();
19+
session.stop();
20+
}
21+
22+
}

src/main/resources/plugin.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ commands:
6363
description: "Checks if SessionAPI is working correctly."
6464
permission: "sessionapi.debug"
6565

66+
session-integration-test:
67+
description: "Command for running integration tests."
68+
permission: "sessionapi.test"
69+
70+
6671

6772
permissions:
6873
# Board editor permissions
@@ -102,4 +107,8 @@ permissions:
102107
# Session debug permissions
103108
sessionapi.debug:
104109
description: "Allows the user to start test sessions and toggle debug messages."
110+
default: op
111+
112+
sessionapi.test:
113+
description: "Allows use of the integration test command"
105114
default: op

0 commit comments

Comments
 (0)