test: add NetworkMode setting to MTE (#5037)
parent
c42f93606a
commit
182f308f71
|
@ -35,6 +35,7 @@ import org.terasology.engine.core.subsystem.lwjgl.LwjglTimer;
|
|||
import org.terasology.engine.core.subsystem.openvr.OpenVRInput;
|
||||
import org.terasology.engine.integrationenvironment.jupiter.MTEExtension;
|
||||
import org.terasology.engine.network.JoinStatus;
|
||||
import org.terasology.engine.network.NetworkMode;
|
||||
import org.terasology.engine.network.NetworkSystem;
|
||||
import org.terasology.engine.registry.CoreRegistry;
|
||||
import org.terasology.engine.rendering.opengl.ScreenGrabber;
|
||||
|
@ -80,8 +81,10 @@ public class Engines {
|
|||
PathManager pathManager;
|
||||
PathManagerProvider.Cleaner pathManagerCleaner;
|
||||
TerasologyEngine host;
|
||||
private final NetworkMode networkMode;
|
||||
|
||||
public Engines(Set<String> dependencies, String worldGeneratorUri) {
|
||||
public Engines(Set<String> dependencies, String worldGeneratorUri, NetworkMode networkMode) {
|
||||
this.networkMode = networkMode;
|
||||
this.dependencies.addAll(dependencies);
|
||||
|
||||
if (worldGeneratorUri != null) {
|
||||
|
@ -97,7 +100,7 @@ public class Engines {
|
|||
public void setup() {
|
||||
mockPathManager();
|
||||
try {
|
||||
host = createHost();
|
||||
host = createHost(networkMode);
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
|
@ -256,11 +259,11 @@ public class Engines {
|
|||
PathManagerProvider.setPathManager(pathManager);
|
||||
}
|
||||
|
||||
TerasologyEngine createHost() throws IOException {
|
||||
TerasologyEngine createHost(NetworkMode networkMode) throws IOException {
|
||||
TerasologyEngine host = createHeadlessEngine();
|
||||
host.getFromEngineContext(SystemConfig.class).writeSaveGamesEnabled.set(false);
|
||||
host.subscribeToStateChange(new HeadlessStateChangeListener(host));
|
||||
host.changeState(new TestingStateHeadlessSetup(dependencies, worldGeneratorUri));
|
||||
host.changeState(new TestingStateHeadlessSetup(dependencies, worldGeneratorUri, networkMode));
|
||||
|
||||
doneLoading = false;
|
||||
host.subscribeToStateChange(() -> {
|
||||
|
|
|
@ -11,6 +11,7 @@ import org.terasology.engine.core.TerasologyConstants;
|
|||
import org.terasology.engine.core.TerasologyEngine;
|
||||
import org.terasology.engine.core.subsystem.headless.mode.StateHeadlessSetup;
|
||||
import org.terasology.engine.game.GameManifest;
|
||||
import org.terasology.engine.network.NetworkMode;
|
||||
import org.terasology.engine.world.time.WorldTime;
|
||||
import org.terasology.gestalt.naming.Name;
|
||||
|
||||
|
@ -33,7 +34,8 @@ public class TestingStateHeadlessSetup extends StateHeadlessSetup {
|
|||
strictModuleRequirements = true;
|
||||
}
|
||||
|
||||
public TestingStateHeadlessSetup(Collection<String> dependencies, String worldGeneratorUri) {
|
||||
public TestingStateHeadlessSetup(Collection<String> dependencies, String worldGeneratorUri, NetworkMode networkMode) {
|
||||
super(networkMode);
|
||||
this.dependencies = dependencies;
|
||||
this.worldGeneratorUri = new SimpleUri(worldGeneratorUri);
|
||||
checkArgument(this.worldGeneratorUri.isValid(), "Not a valid URI `%s`", worldGeneratorUri);
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2022 The Terasology Foundation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package org.terasology.engine.integrationenvironment.jupiter;
|
||||
|
||||
import org.terasology.engine.network.NetworkMode;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface IntegrationEnvironment {
|
||||
NetworkMode networkMode() default NetworkMode.LISTEN_SERVER;
|
||||
}
|
|
@ -11,10 +11,13 @@ import org.junit.jupiter.api.extension.ParameterResolutionException;
|
|||
import org.junit.jupiter.api.extension.ParameterResolver;
|
||||
import org.junit.jupiter.api.extension.TestInstancePostProcessor;
|
||||
import org.opentest4j.MultipleFailuresError;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.terasology.engine.integrationenvironment.Engines;
|
||||
import org.terasology.engine.integrationenvironment.MainLoop;
|
||||
import org.terasology.engine.integrationenvironment.ModuleTestingHelper;
|
||||
import org.terasology.engine.integrationenvironment.Scopes;
|
||||
import org.terasology.engine.network.NetworkMode;
|
||||
import org.terasology.engine.registry.In;
|
||||
import org.terasology.unittest.worlds.DummyWorldGenerator;
|
||||
|
||||
|
@ -25,6 +28,8 @@ import java.util.List;
|
|||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
|
||||
import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation;
|
||||
|
||||
/**
|
||||
* Sets up a Terasology environment for use with your {@index JUnit} 5 test.
|
||||
* <p>
|
||||
|
@ -80,6 +85,8 @@ import java.util.function.Function;
|
|||
*/
|
||||
public class MTEExtension implements ParameterResolver, TestInstancePostProcessor {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(MTEExtension.class);
|
||||
|
||||
protected Function<ExtensionContext, ExtensionContext.Namespace> helperLifecycle = Scopes.PER_CLASS;
|
||||
protected Function<ExtensionContext, Class<?>> getTestClass = Scopes::getTopTestClass;
|
||||
|
||||
|
@ -149,6 +156,17 @@ public class MTEExtension implements ParameterResolver, TestInstancePostProcesso
|
|||
return dependencies != null ? Sets.newHashSet(dependencies.value()) : Collections.emptySet();
|
||||
}
|
||||
|
||||
public NetworkMode getNetworkMode(ExtensionContext context) {
|
||||
return getAnnotationWithDefault(context, IntegrationEnvironment::networkMode);
|
||||
}
|
||||
|
||||
private <T> T getAnnotationWithDefault(ExtensionContext context, Function<IntegrationEnvironment, T> method) {
|
||||
var ann =
|
||||
findAnnotation(context.getRequiredTestClass(), IntegrationEnvironment.class)
|
||||
.orElseGet(ToReadDefaultValuesFrom::getDefaults);
|
||||
return method.apply(ann);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Engines for this test.
|
||||
* <p>
|
||||
|
@ -165,7 +183,11 @@ public class MTEExtension implements ParameterResolver, TestInstancePostProcesso
|
|||
protected Engines getEngines(ExtensionContext context) {
|
||||
ExtensionContext.Store store = context.getStore(helperLifecycle.apply(context));
|
||||
EnginesCleaner autoCleaner = store.getOrComputeIfAbsent(
|
||||
EnginesCleaner.class, k -> new EnginesCleaner(getDependencyNames(context), getWorldGeneratorUri(context)),
|
||||
EnginesCleaner.class, k -> new EnginesCleaner(
|
||||
getDependencyNames(context),
|
||||
getWorldGeneratorUri(context),
|
||||
getNetworkMode(context)
|
||||
),
|
||||
EnginesCleaner.class);
|
||||
return autoCleaner.engines;
|
||||
}
|
||||
|
@ -179,8 +201,8 @@ public class MTEExtension implements ParameterResolver, TestInstancePostProcesso
|
|||
static class EnginesCleaner implements ExtensionContext.Store.CloseableResource {
|
||||
protected Engines engines;
|
||||
|
||||
EnginesCleaner(Set<String> dependencyNames, String worldGeneratorUri) {
|
||||
engines = new Engines(dependencyNames, worldGeneratorUri);
|
||||
EnginesCleaner(Set<String> dependencyNames, String worldGeneratorUri, NetworkMode networkMode) {
|
||||
engines = new Engines(dependencyNames, worldGeneratorUri, networkMode);
|
||||
engines.setup();
|
||||
}
|
||||
|
||||
|
@ -190,4 +212,11 @@ public class MTEExtension implements ParameterResolver, TestInstancePostProcesso
|
|||
engines = null;
|
||||
}
|
||||
}
|
||||
|
||||
@IntegrationEnvironment
|
||||
private static final class ToReadDefaultValuesFrom {
|
||||
static IntegrationEnvironment getDefaults() {
|
||||
return ToReadDefaultValuesFrom.class.getDeclaredAnnotation(IntegrationEnvironment.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright 2022 The Terasology Foundation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
package org.terasology.engine.integrationenvironment;
|
||||
|
||||
import org.junit.jupiter.api.Tag;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.terasology.engine.integrationenvironment.jupiter.IntegrationEnvironment;
|
||||
import org.terasology.engine.integrationenvironment.jupiter.MTEExtension;
|
||||
import org.terasology.engine.logic.players.LocalPlayer;
|
||||
import org.terasology.engine.network.NetworkMode;
|
||||
import org.terasology.engine.network.NetworkSystem;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
@Tag("MteTest")
|
||||
@ExtendWith(MTEExtension.class)
|
||||
@IntegrationEnvironment(networkMode = NetworkMode.DEDICATED_SERVER)
|
||||
public class NetworkModeLocalServerTest {
|
||||
@Test
|
||||
void testNetworkMode(NetworkSystem network) {
|
||||
assertThat(network.getMode()).isEqualTo(NetworkMode.DEDICATED_SERVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testForLocalPlayer(NetworkSystem network, LocalPlayer player) {
|
||||
assertThat(network.getPlayers()).hasSize(1);
|
||||
var client = network.getPlayers().iterator().next();
|
||||
assertThat(client.isLocal()).isTrue();
|
||||
assertThat(player.isValid()).isTrue();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright 2022 The Terasology Foundation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
package org.terasology.engine.integrationenvironment;
|
||||
|
||||
import org.junit.jupiter.api.Tag;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.terasology.engine.integrationenvironment.jupiter.IntegrationEnvironment;
|
||||
import org.terasology.engine.integrationenvironment.jupiter.MTEExtension;
|
||||
import org.terasology.engine.logic.players.LocalPlayer;
|
||||
import org.terasology.engine.network.NetworkMode;
|
||||
import org.terasology.engine.network.NetworkSystem;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
@Tag("MteTest")
|
||||
@ExtendWith(MTEExtension.class)
|
||||
@IntegrationEnvironment(networkMode = NetworkMode.NONE)
|
||||
public class NetworkModeNoneTest {
|
||||
@Test
|
||||
void testNetworkMode(NetworkSystem network) {
|
||||
assertThat(network.getMode()).isEqualTo(NetworkMode.NONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testForLocalPlayer(NetworkSystem network, LocalPlayer player) {
|
||||
assertThat(network.getPlayers()).hasSize(1);
|
||||
var client = network.getPlayers().iterator().next();
|
||||
assertThat(client.isLocal()).isTrue();
|
||||
assertThat(player.isValid()).isTrue();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
// Copyright 2022 The Terasology Foundation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
package org.terasology.engine.integrationenvironment;
|
||||
|
||||
import org.junit.jupiter.api.Tag;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.terasology.engine.integrationenvironment.jupiter.IntegrationEnvironment;
|
||||
import org.terasology.engine.integrationenvironment.jupiter.MTEExtension;
|
||||
import org.terasology.engine.logic.players.LocalPlayer;
|
||||
import org.terasology.engine.network.NetworkMode;
|
||||
import org.terasology.engine.network.NetworkSystem;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
@Tag("MteTest")
|
||||
@ExtendWith(MTEExtension.class)
|
||||
@IntegrationEnvironment(networkMode = NetworkMode.LISTEN_SERVER)
|
||||
public class NetworkModeServerTest {
|
||||
@Test
|
||||
void testNetworkMode(NetworkSystem network) {
|
||||
assertThat(network.getMode()).isEqualTo(NetworkMode.LISTEN_SERVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testServerHasNoPlayers(NetworkSystem network, LocalPlayer player) {
|
||||
assertThat(network.getPlayers()).isEmpty();
|
||||
assertThat(player.isValid()).isFalse();
|
||||
}
|
||||
}
|
|
@ -35,7 +35,14 @@ public class StateHeadlessSetup extends AbstractState {
|
|||
|
||||
protected boolean strictModuleRequirements;
|
||||
|
||||
private final NetworkMode networkMode;
|
||||
|
||||
public StateHeadlessSetup() {
|
||||
this(NetworkMode.LISTEN_SERVER);
|
||||
}
|
||||
|
||||
public StateHeadlessSetup(NetworkMode networkMode) {
|
||||
this.networkMode = networkMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -58,7 +65,7 @@ public class StateHeadlessSetup extends AbstractState {
|
|||
config.getUniverseConfig().setSpawnWorldTitle(worldInfo.getTitle());
|
||||
config.getUniverseConfig().setUniverseSeed(gameManifest.getSeed());
|
||||
|
||||
gameEngine.changeState(new StateLoading(gameManifest, NetworkMode.LISTEN_SERVER));
|
||||
gameEngine.changeState(new StateLoading(gameManifest, networkMode));
|
||||
}
|
||||
|
||||
public GameManifest createGameManifest() {
|
||||
|
|
Loading…
Reference in New Issue