mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-26 23:46:36 +00:00
first successful tiny and trivial Operational Transformation test, replicating the addition of a leaderboard
This commit is contained in:
+2
-4
@@ -35,18 +35,16 @@ public class MongoDBServiceImpl implements MongoDBService {
|
|||||||
return configuration;
|
return configuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setConfiguration(MongoDBConfiguration configuration)
|
public void setConfiguration(MongoDBConfiguration configuration) {
|
||||||
{
|
|
||||||
this.configuration = configuration;
|
this.configuration = configuration;
|
||||||
logger.info("Used Mongo configuration: host:port/DBName: "+configuration.getHostName()+":"+configuration.getPort()+"/"+configuration.getDatabaseName());
|
logger.info("Used Mongo configuration: host:port/DBName: "+configuration.getHostName()+":"+configuration.getPort()+"/"+configuration.getDatabaseName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public DB getDB() {
|
public DB getDB() {
|
||||||
if(configuration == null) {
|
if (configuration == null) {
|
||||||
configuration = MongoDBConfiguration.getDefaultTestConfiguration();
|
configuration = MongoDBConfiguration.getDefaultTestConfiguration();
|
||||||
logger.info("Used default Mongo configuration: host:port/DBName: "+configuration.getHostName()+":"+configuration.getPort()+"/"+configuration.getDatabaseName());
|
logger.info("Used default Mongo configuration: host:port/DBName: "+configuration.getHostName()+":"+configuration.getPort()+"/"+configuration.getDatabaseName());
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return getDB(configuration);
|
return getDB(configuration);
|
||||||
} catch (UnknownHostException e) {
|
} catch (UnknownHostException e) {
|
||||||
|
|||||||
+2
-1
@@ -104,7 +104,7 @@ public class PeerImpl<O extends Operation<S>, S> implements Peer<O, S> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public S addPeer(Peer<O, S> peer) {
|
public S addPeer(Peer<O, S> peer) {
|
||||||
if ( role == Role.CLIENT && getPeers().size() > 0) {
|
if (role == Role.CLIENT && getPeers().size() > 0) {
|
||||||
throw new RuntimeException("A client must be connected to at most one server");
|
throw new RuntimeException("A client must be connected to at most one server");
|
||||||
}
|
}
|
||||||
unmergedOperationsForPeer.put(peer, new UnmergedOperationsQueue<O, S>());
|
unmergedOperationsForPeer.put(peer, new UnmergedOperationsQueue<O, S>());
|
||||||
@@ -193,6 +193,7 @@ public class PeerImpl<O extends Operation<S>, S> implements Peer<O, S> {
|
|||||||
* by this peer's apply(...) method.
|
* by this peer's apply(...) method.
|
||||||
*/
|
*/
|
||||||
peer.apply(PeerImpl.this, operation, numberOfMergedOpsForPeer);
|
peer.apply(PeerImpl.this, operation, numberOfMergedOpsForPeer);
|
||||||
|
// TODO what to do if apply throws a RuntimeException?
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ Require-Bundle: com.sap.sailing.server,
|
|||||||
com.sap.sailing.domain.tractracadapter,
|
com.sap.sailing.domain.tractracadapter,
|
||||||
com.sap.sailing.domain.swisstimingadapter,
|
com.sap.sailing.domain.swisstimingadapter,
|
||||||
com.sap.sailing.domain.common,
|
com.sap.sailing.domain.common,
|
||||||
com.sap.sailing.expeditionconnector
|
com.sap.sailing.expeditionconnector,
|
||||||
|
com.sap.sailing.operationaltransformation,
|
||||||
|
com.sap.sailing.mongodb,
|
||||||
|
com.mongodb.driver;bundle-version="2.6.2"
|
||||||
Import-Package: junit.framework;version="4.8.1",
|
Import-Package: junit.framework;version="4.8.1",
|
||||||
org.junit;version="4.8.1",
|
org.junit;version="4.8.1",
|
||||||
com.tractrac.clientmodule,
|
com.tractrac.clientmodule,
|
||||||
|
|||||||
Executable
+56
@@ -0,0 +1,56 @@
|
|||||||
|
package com.sap.sailing.server.test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.common.DefaultLeaderboardName;
|
||||||
|
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||||
|
import com.sap.sailing.mongodb.MongoDBService;
|
||||||
|
import com.sap.sailing.operationaltransformation.Peer;
|
||||||
|
import com.sap.sailing.operationaltransformation.Peer.Role;
|
||||||
|
import com.sap.sailing.operationaltransformation.PeerImpl;
|
||||||
|
import com.sap.sailing.server.RacingEventService;
|
||||||
|
import com.sap.sailing.server.impl.RacingEventServiceImpl;
|
||||||
|
import com.sap.sailing.server.operationaltransformation.AddLeaderboard;
|
||||||
|
import com.sap.sailing.server.operationaltransformation.OperationalTransformer;
|
||||||
|
import com.sap.sailing.server.operationaltransformation.RacingEventServiceOperation;
|
||||||
|
|
||||||
|
public class OperationalTransformationTest {
|
||||||
|
private static final String LEADERBOARDNAME = "TESTBOARD";
|
||||||
|
|
||||||
|
private RacingEventService racingEventServiceServer;
|
||||||
|
private RacingEventService racingEventServiceReplica;
|
||||||
|
private Peer<RacingEventServiceOperation, RacingEventService> server;
|
||||||
|
private Peer<RacingEventServiceOperation, RacingEventService> replica;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
// ensure that leaderboards will be loaded from and stored to the test database which is
|
||||||
|
MongoDBService.INSTANCE.getDB().dropDatabase();
|
||||||
|
racingEventServiceServer = new RacingEventServiceImpl();
|
||||||
|
racingEventServiceReplica = new RacingEventServiceImpl();
|
||||||
|
OperationalTransformer transformer = new OperationalTransformer();
|
||||||
|
server = new PeerImpl<>(transformer, racingEventServiceServer, Role.SERVER);
|
||||||
|
replica = new PeerImpl<>(transformer, racingEventServiceReplica, Role.CLIENT);
|
||||||
|
// wire the peers:
|
||||||
|
server.addPeer(replica);
|
||||||
|
replica.addPeer(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddLeaderboard() {
|
||||||
|
RacingEventServiceOperation addLeaderboardOp = new AddLeaderboard(LEADERBOARDNAME, new int[] { 5 });
|
||||||
|
server.apply(addLeaderboardOp);
|
||||||
|
server.waitForNotRunning();
|
||||||
|
Map<String, Leaderboard> replicaLeaderboards = racingEventServiceReplica.getLeaderboards();
|
||||||
|
assertEquals(2, replicaLeaderboards.size()); // expected to include the default leaderboard
|
||||||
|
assertEquals(new HashSet<String>(Arrays.asList(new String[] { DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME, LEADERBOARDNAME })),
|
||||||
|
replicaLeaderboards.keySet());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,5 +30,6 @@ Export-Package: com.sap.sailing.server,
|
|||||||
x-friends:="com.sap.sailing.mongodb.test,
|
x-friends:="com.sap.sailing.mongodb.test,
|
||||||
com.sap.sailing.server.test,
|
com.sap.sailing.server.test,
|
||||||
com.sap.sailing.domain.swisstimingadapter.test,
|
com.sap.sailing.domain.swisstimingadapter.test,
|
||||||
com.sap.sailing.gwt.ui.test"
|
com.sap.sailing.gwt.ui.test",
|
||||||
|
com.sap.sailing.server.operationaltransformation
|
||||||
Web-ContextPath: /sailingserver
|
Web-ContextPath: /sailingserver
|
||||||
|
|||||||
java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/AddLeaderboard.java
Executable
+33
@@ -0,0 +1,33 @@
|
|||||||
|
package com.sap.sailing.server.operationaltransformation;
|
||||||
|
|
||||||
|
import com.sap.sailing.server.RacingEventService;
|
||||||
|
|
||||||
|
public class AddLeaderboard extends AbstractRacingEventServiceOperation {
|
||||||
|
private final String leaderboardName;
|
||||||
|
private final int[] discardThresholds;
|
||||||
|
|
||||||
|
public AddLeaderboard(String leaderboardName, int[] discardThresholds) {
|
||||||
|
super();
|
||||||
|
this.leaderboardName = leaderboardName;
|
||||||
|
this.discardThresholds = discardThresholds;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RacingEventService applyTo(RacingEventService toState) {
|
||||||
|
toState.addLeaderboard(leaderboardName, discardThresholds);
|
||||||
|
return toState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RacingEventServiceOperation transformClientOp(RacingEventServiceOperation serverOp) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RacingEventServiceOperation transformServerOp(RacingEventServiceOperation clientOp) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user