unit testing for signal system & service manager
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
d438fc5484
commit
06a1f2dbbc
@ -1,3 +1,3 @@
|
|||||||
#maven.buildNumber.plugin properties file
|
#maven.buildNumber.plugin properties file
|
||||||
#Wed Aug 28 20:50:08 EDT 2024
|
#Thu Aug 29 20:24:54 EDT 2024
|
||||||
buildNumber=300
|
buildNumber=301
|
||||||
|
|||||||
11
pom.xml
11
pom.xml
@ -172,6 +172,17 @@
|
|||||||
<version>${junit.version}</version>
|
<version>${junit.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!--Mockito-->
|
||||||
|
<!--License: MIT-->
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-core</artifactId>
|
||||||
|
<version>5.12.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!--GraalVM-->
|
<!--GraalVM-->
|
||||||
<!--License: GPLv2 w/ classpath exception-->
|
<!--License: GPLv2 w/ classpath exception-->
|
||||||
<!--apparently maybe classpath exception allows use in eg game engine??-->
|
<!--apparently maybe classpath exception allows use in eg game engine??-->
|
||||||
|
|||||||
@ -12,8 +12,14 @@ public class Signal {
|
|||||||
*/
|
*/
|
||||||
public static enum SignalType {
|
public static enum SignalType {
|
||||||
|
|
||||||
|
//
|
||||||
|
//CORE ENGINE
|
||||||
|
//
|
||||||
|
ENGINE_SHUTDOWN,
|
||||||
|
|
||||||
|
//
|
||||||
//UI
|
//UI
|
||||||
|
//
|
||||||
APPLY_YOGA,
|
APPLY_YOGA,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import java.util.concurrent.Semaphore;
|
|||||||
|
|
||||||
import electrosphere.engine.service.Service;
|
import electrosphere.engine.service.Service;
|
||||||
import electrosphere.engine.signal.Signal.SignalType;
|
import electrosphere.engine.signal.Signal.SignalType;
|
||||||
|
import electrosphere.logger.LoggerInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The core messaging system
|
* The core messaging system
|
||||||
@ -52,6 +53,7 @@ public class SignalSystem implements Service {
|
|||||||
*/
|
*/
|
||||||
public void registerService(SignalType signalType, SignalService service){
|
public void registerService(SignalType signalType, SignalService service){
|
||||||
systemLock.acquireUninterruptibly();
|
systemLock.acquireUninterruptibly();
|
||||||
|
LoggerInterface.loggerEngine.DEBUG("[SignalSystem] Register signal service " + service.getName());
|
||||||
if(typeServiceMap.containsKey(signalType)){
|
if(typeServiceMap.containsKey(signalType)){
|
||||||
Set<SignalService> services = this.typeServiceMap.get(signalType);
|
Set<SignalService> services = this.typeServiceMap.get(signalType);
|
||||||
if(!services.contains(service)){
|
if(!services.contains(service)){
|
||||||
@ -72,6 +74,7 @@ public class SignalSystem implements Service {
|
|||||||
*/
|
*/
|
||||||
public void deregisterService(SignalType signalType, SignalService service){
|
public void deregisterService(SignalType signalType, SignalService service){
|
||||||
systemLock.acquireUninterruptibly();
|
systemLock.acquireUninterruptibly();
|
||||||
|
LoggerInterface.loggerEngine.DEBUG("[SignalSystem] Deregister signal service " + service.getName());
|
||||||
if(typeServiceMap.containsKey(signalType)){
|
if(typeServiceMap.containsKey(signalType)){
|
||||||
Set<SignalService> services = this.typeServiceMap.get(signalType);
|
Set<SignalService> services = this.typeServiceMap.get(signalType);
|
||||||
services.remove(service);
|
services.remove(service);
|
||||||
@ -89,6 +92,7 @@ public class SignalSystem implements Service {
|
|||||||
public void post(SignalType type, Object data){
|
public void post(SignalType type, Object data){
|
||||||
systemLock.acquireUninterruptibly();
|
systemLock.acquireUninterruptibly();
|
||||||
if(typeServiceMap.containsKey(type)){
|
if(typeServiceMap.containsKey(type)){
|
||||||
|
LoggerInterface.loggerEngine.DEBUG("[SignalSystem] Post signal " + type);
|
||||||
Signal signal = Signal.create(type, data);
|
Signal signal = Signal.create(type, data);
|
||||||
Set<SignalService> services = this.typeServiceMap.get(type);
|
Set<SignalService> services = this.typeServiceMap.get(type);
|
||||||
for(SignalService service : services){
|
for(SignalService service : services){
|
||||||
|
|||||||
26
src/test/java/annotations/BigDataTest.java
Normal file
26
src/test/java/annotations/BigDataTest.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Tag;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.Timeout;
|
||||||
|
import org.junit.jupiter.api.Timeout.ThreadMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A fast test that does not depend on setup/shutdown -- A unit test
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Target({ ElementType.TYPE, ElementType.METHOD })
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Tag("fast")
|
||||||
|
@Test
|
||||||
|
@Timeout( value = 100, unit = TimeUnit.MILLISECONDS, threadMode = ThreadMode.SAME_THREAD )
|
||||||
|
public @interface BigDataTest {
|
||||||
|
|
||||||
|
}
|
||||||
5
src/test/java/annotations/FastSetup.java
Normal file
5
src/test/java/annotations/FastSetup.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package annotations;
|
||||||
|
|
||||||
|
public class FastSetup {
|
||||||
|
|
||||||
|
}
|
||||||
@ -20,7 +20,7 @@ import org.junit.jupiter.api.Timeout.ThreadMode;
|
|||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Tag("fast")
|
@Tag("fast")
|
||||||
@Test
|
@Test
|
||||||
@Timeout( value = 20, unit = TimeUnit.MILLISECONDS, threadMode = ThreadMode.SAME_THREAD )
|
@Timeout( value = 10, unit = TimeUnit.MILLISECONDS, threadMode = ThreadMode.SAME_THREAD )
|
||||||
public @interface FastTest {
|
public @interface FastTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,102 @@
|
|||||||
|
package electrosphere.engine.service;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import annotations.BigDataTest;
|
||||||
|
import annotations.FastTest;
|
||||||
|
import electrosphere.logger.Logger;
|
||||||
|
import electrosphere.logger.LoggerInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service manager tests
|
||||||
|
*/
|
||||||
|
public class ServiceManagerTests {
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void init(){
|
||||||
|
LoggerInterface.loggerEngine = Mockito.mock(Logger.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FastTest
|
||||||
|
public void testInit(){
|
||||||
|
ServiceManager serviceManager = new ServiceManager();
|
||||||
|
serviceManager.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
@FastTest
|
||||||
|
public void testRegisterService(){
|
||||||
|
ServiceManager serviceManager = new ServiceManager();
|
||||||
|
serviceManager.init();
|
||||||
|
Service service1Mock = Mockito.mock(Service.class);
|
||||||
|
Service service1 = serviceManager.registerService(service1Mock);
|
||||||
|
assertEquals(service1Mock,service1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FastTest
|
||||||
|
public void testRegisterTwoServices(){
|
||||||
|
ServiceManager serviceManager = new ServiceManager();
|
||||||
|
serviceManager.init();
|
||||||
|
Service service1Mock = Mockito.mock(Service.class);
|
||||||
|
Service service1 = serviceManager.registerService(service1Mock);
|
||||||
|
Service service2Mock = Mockito.mock(Service.class);
|
||||||
|
Service service2 = serviceManager.registerService(service2Mock);
|
||||||
|
assertEquals(service1Mock,service1);
|
||||||
|
assertEquals(service2Mock,service2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@BigDataTest
|
||||||
|
public void testRegisterManyServices(){
|
||||||
|
ServiceManager serviceManager = new ServiceManager();
|
||||||
|
serviceManager.init();
|
||||||
|
for(int i = 0; i < 10; i++){
|
||||||
|
serviceManager.registerService(Mockito.mock(Service.class));
|
||||||
|
}
|
||||||
|
Service lastMock = Mockito.mock(Service.class);
|
||||||
|
Service lastService = serviceManager.registerService(lastMock);
|
||||||
|
assertEquals(lastMock,lastService);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FastTest
|
||||||
|
public void testInstantiate(){
|
||||||
|
ServiceManager serviceManager = new ServiceManager();
|
||||||
|
serviceManager.init();
|
||||||
|
|
||||||
|
//register service
|
||||||
|
Service service1Mock = Mockito.spy(Service.class);
|
||||||
|
Service service1 = serviceManager.registerService(service1Mock);
|
||||||
|
assertEquals(service1Mock,service1);
|
||||||
|
|
||||||
|
//instantiate all services
|
||||||
|
serviceManager.instantiate();
|
||||||
|
|
||||||
|
//verify init was called
|
||||||
|
Mockito.verify(service1Mock, Mockito.calls(1)).init();
|
||||||
|
}
|
||||||
|
|
||||||
|
@FastTest
|
||||||
|
public void testDestroy(){
|
||||||
|
ServiceManager serviceManager = new ServiceManager();
|
||||||
|
serviceManager.init();
|
||||||
|
|
||||||
|
//register service
|
||||||
|
Service service1Mock = Mockito.spy(Service.class);
|
||||||
|
Service service1 = serviceManager.registerService(service1Mock);
|
||||||
|
assertEquals(service1Mock,service1);
|
||||||
|
|
||||||
|
//instantiate all services
|
||||||
|
serviceManager.instantiate();
|
||||||
|
|
||||||
|
//verify init was called
|
||||||
|
Mockito.verify(service1Mock, Mockito.calls(1)).init();
|
||||||
|
|
||||||
|
//destroy
|
||||||
|
serviceManager.destroy();
|
||||||
|
|
||||||
|
//verify destroy was called
|
||||||
|
Mockito.verify(service1Mock, Mockito.calls(1)).destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
105
src/test/java/electrosphere/engine/signal/SignalSystemTests.java
Normal file
105
src/test/java/electrosphere/engine/signal/SignalSystemTests.java
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
package electrosphere.engine.signal;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
import electrosphere.engine.signal.Signal.SignalType;
|
||||||
|
import electrosphere.logger.Logger;
|
||||||
|
import electrosphere.logger.LoggerInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Testing the signal system
|
||||||
|
*/
|
||||||
|
public class SignalSystemTests {
|
||||||
|
|
||||||
|
ArgumentCaptor<Signal> signalCaptor;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void init(){
|
||||||
|
LoggerInterface.loggerEngine = Mockito.mock(Logger.class);
|
||||||
|
signalCaptor = ArgumentCaptor.forClass(Signal.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testInit(){
|
||||||
|
SignalSystem signalSystem = new SignalSystem();
|
||||||
|
signalSystem.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRegister(){
|
||||||
|
SignalSystem signalSystem = new SignalSystem();
|
||||||
|
signalSystem.init();
|
||||||
|
|
||||||
|
SignalService service = Mockito.mock(SignalService.class);
|
||||||
|
|
||||||
|
signalSystem.registerService(SignalType.APPLY_YOGA, service);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPost(){
|
||||||
|
SignalSystem signalSystem = new SignalSystem();
|
||||||
|
signalSystem.init();
|
||||||
|
|
||||||
|
SignalService service = Mockito.mock(SignalService.class);
|
||||||
|
signalSystem.registerService(SignalType.APPLY_YOGA, service);
|
||||||
|
|
||||||
|
signalSystem.post(SignalType.APPLY_YOGA);
|
||||||
|
|
||||||
|
Mockito.verify(service, Mockito.times(1)).post(signalCaptor.capture());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiPost(){
|
||||||
|
SignalSystem signalSystem = new SignalSystem();
|
||||||
|
signalSystem.init();
|
||||||
|
|
||||||
|
SignalService service = Mockito.mock(SignalService.class);
|
||||||
|
SignalService service2 = Mockito.mock(SignalService.class);
|
||||||
|
signalSystem.registerService(SignalType.APPLY_YOGA, service);
|
||||||
|
signalSystem.registerService(SignalType.APPLY_YOGA, service2);
|
||||||
|
|
||||||
|
signalSystem.post(SignalType.APPLY_YOGA);
|
||||||
|
|
||||||
|
Mockito.verify(service, Mockito.times(1)).post(signalCaptor.capture());
|
||||||
|
Mockito.verify(service2, Mockito.times(1)).post(signalCaptor.capture());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPostFiltering(){
|
||||||
|
SignalSystem signalSystem = new SignalSystem();
|
||||||
|
signalSystem.init();
|
||||||
|
|
||||||
|
SignalService service = Mockito.mock(SignalService.class);
|
||||||
|
SignalService service2 = Mockito.mock(SignalService.class);
|
||||||
|
SignalService service3 = Mockito.mock(SignalService.class);
|
||||||
|
signalSystem.registerService(SignalType.APPLY_YOGA, service);
|
||||||
|
signalSystem.registerService(SignalType.APPLY_YOGA, service2);
|
||||||
|
signalSystem.registerService(SignalType.ENGINE_SHUTDOWN, service3);
|
||||||
|
|
||||||
|
signalSystem.post(SignalType.APPLY_YOGA);
|
||||||
|
|
||||||
|
Mockito.verify(service, Mockito.times(1)).post(signalCaptor.capture());
|
||||||
|
Mockito.verify(service2, Mockito.times(1)).post(signalCaptor.capture());
|
||||||
|
Mockito.verify(service3, Mockito.never()).post(signalCaptor.capture());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDeregister(){
|
||||||
|
SignalSystem signalSystem = new SignalSystem();
|
||||||
|
signalSystem.init();
|
||||||
|
|
||||||
|
SignalService service = Mockito.mock(SignalService.class);
|
||||||
|
signalSystem.registerService(SignalType.APPLY_YOGA, service);
|
||||||
|
signalSystem.deregisterService(SignalType.APPLY_YOGA, service);
|
||||||
|
signalSystem.post(SignalType.APPLY_YOGA);
|
||||||
|
|
||||||
|
Mockito.verify(service, Mockito.never()).post(signalCaptor.capture());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -12,6 +12,7 @@ import java.util.Random;
|
|||||||
|
|
||||||
import org.joml.Vector3d;
|
import org.joml.Vector3d;
|
||||||
|
|
||||||
|
import annotations.BigDataTest;
|
||||||
import annotations.FastTest;
|
import annotations.FastTest;
|
||||||
import electrosphere.util.ds.Octree.OctreeNode;
|
import electrosphere.util.ds.Octree.OctreeNode;
|
||||||
|
|
||||||
@ -265,7 +266,7 @@ public class OctreeTests {
|
|||||||
/**
|
/**
|
||||||
* Adds lots of (random) points
|
* Adds lots of (random) points
|
||||||
*/
|
*/
|
||||||
@FastTest
|
@BigDataTest
|
||||||
public void testAddManyPoints(){
|
public void testAddManyPoints(){
|
||||||
Octree<Integer> octree = new Octree<Integer>(new Vector3d(0,0,0), new Vector3d(256,256,256));
|
Octree<Integer> octree = new Octree<Integer>(new Vector3d(0,0,0), new Vector3d(256,256,256));
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user