From d84c1c93163a24c51b7c1e2dd7d8dd9314c8e137 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Wed, 9 Jul 2025 09:33:58 +0200 Subject: [PATCH] bug6117 aftermath: migrated PeerImpl.finalize() into a shutdown() method invoked by @AfterEach methods in tests --- .../test/OperationalTransformationTest.java | 7 + .../server/test/RaceLogInRaceColumnTest.java | 270 +----------------- .../RaceLogOperationalTransformationTest.java | 8 + .../test/OperationalTransformationTest.java | 9 + .../sse/operationaltransformation/Peer.java | 6 + .../operationaltransformation/PeerImpl.java | 2 +- 6 files changed, 37 insertions(+), 265 deletions(-) diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java index cb579fa20a1..272c834e14b 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/OperationalTransformationTest.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Map; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -47,6 +48,12 @@ public class OperationalTransformationTest { server.addPeer(replica); replica.addPeer(server); } + + @AfterEach + public void tearDown() { + server.shutdown(); + replica.shutdown(); + } @Test public void testAddLeaderboard() { diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java index a88f33e87cc..ba29074a05b 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogInRaceColumnTest.java @@ -2,6 +2,7 @@ package com.sap.sailing.server.test; import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -45,32 +46,31 @@ public class RaceLogInRaceColumnTest { OperationalTransformer> transformer = new OperationalTransformer<>(); server = new PeerImpl<>(transformer, racingEventServiceServer, Role.SERVER); } + + @AfterEach + public void tearDown() { + server.shutdown(); + } @Test public void testAddEventToSingleRaceLog() throws InterruptedException { String raceColumnName = "myRaceColumn"; - RacingEventServiceOperation addLeaderboardOp = new CreateFlexibleLeaderboard( LEADERBOARDNAME, LEADERBOARDNAME, new int[] { 5 }, new LowPoint(), null); server.apply(addLeaderboardOp); - RacingEventServiceOperation addLeaderboardColumn = new AddColumnToLeaderboard( raceColumnName, LEADERBOARDNAME, true); server.apply(addLeaderboardColumn); - TimePoint t1 = MillisecondsTimePoint.now(); RaceLogEvent rlEvent = new RaceLogFlagEventImpl( t1, author, 0, Flags.CLASS, Flags.NONE, true); - Leaderboard leaderboard = racingEventServiceServer.getLeaderboardByName(LEADERBOARDNAME); RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); Fleet fleet = raceColumn.getFleetByName("Default"); RaceLog raceLog = raceColumn.getRaceLog(fleet); - raceLog.add(rlEvent); - // TODO: Why do we have to sleep? Thread.sleep(1000); try { @@ -80,262 +80,4 @@ public class RaceLogInRaceColumnTest { raceLog.unlockAfterRead(); } } - - } - -/* -public class RaceLogInRacingEventServiceImplTest { - - private static final String LEADERBOARDNAME = "TESTBOARD"; - - private RacingEventService racingEventServiceServer; - private Peer, RacingEventService> server; - - @Before - public void setUp() { - MongoDBService.INSTANCE.getDB().dropDatabase(); - racingEventServiceServer = new RacingEventServiceImpl(); - OperationalTransformer transformer = new OperationalTransformer(); - server = new PeerImpl<>(transformer, racingEventServiceServer, Role.SERVER); - } - - @Test - public void testRecordingOfRaceLogEventsForDifferentRaces() throws InterruptedException { - RacingEventServiceOperation addLeaderboardOp = new CreateFlexibleLeaderboard(LEADERBOARDNAME, new int[] { 5 }, - new LowPoint(), null); - server.apply(addLeaderboardOp); - - RacingEventServiceOperation addLeaderboardColumn = new AddColumnToLeaderboard( - "newColumn", LEADERBOARDNAME, true); - server.apply(addLeaderboardColumn); - - RacingEventServiceOperation addLeaderboardColumn2 = new AddColumnToLeaderboard( - "ColumnMy", LEADERBOARDNAME, false); - server.apply(addLeaderboardColumn2); - - TimePoint t1 = MillisecondsTimePoint.now(); - TimePoint t2 = new MillisecondsTimePoint(t1.asMillis() + 1000); - int passId = 0; - boolean isDisplayed = true; - RaceLogFlagEvent rcEvent = new RaceLogFlagEventImpl(t1, passId, Flags.CLASS, Flags.NONE, isDisplayed); - RaceLogFlagEvent rcEvent2 = new RaceLogFlagEventImpl(t2, passId, Flags.AP, Flags.NONE, isDisplayed); - - Leaderboard leaderboard = racingEventServiceServer.getLeaderboardByName(LEADERBOARDNAME); - RaceColumn raceColumn = leaderboard.getRaceColumnByName("newColumn"); - Fleet fleet = raceColumn.getFleetByName("Default"); - - RaceLogIdentifier identifier = new RaceLogIdentifierImpl(leaderboard, raceColumn, fleet); - - RaceLog raceLog = racingEventServiceServer.getRaceLog(identifier); - raceLog.add(rcEvent); - - Thread.sleep(1000); - - RaceLog raceLogAfterAdd = racingEventServiceServer.getRaceLog(identifier); - raceLog.lockForRead(); - try { - raceLogAfterAdd.lockForRead(); - try { - assertEquals(Util.size(raceLog.getFixes()), Util.size(raceLogAfterAdd.getFixes())); - } finally { - raceLogAfterAdd.unlockAfterRead(); - } - } finally { - raceLog.unlockAfterRead(); - } - - RaceColumn raceColumnMy = leaderboard.getRaceColumnByName("ColumnMy"); - Fleet fleetMy = raceColumnMy.getFleetByName("Default"); - RaceLogIdentifier identifierMy = new RaceLogIdentifierImpl(leaderboard, raceColumnMy, fleetMy); - - RaceLog raceLogMy = racingEventServiceServer.getRaceLog(identifierMy); - raceLogMy.add(rcEvent); - raceLogMy.add(rcEvent2); - - Thread.sleep(1000); - - RaceLog raceLogMyAfterAdd = racingEventServiceServer.getRaceLog(identifierMy); - raceLogMy.lockForRead(); - try { - raceLogMyAfterAdd.lockForRead(); - try { - assertEquals(Util.size(raceLogMy.getFixes()), Util.size(raceLogMyAfterAdd.getFixes())); - } finally { - raceLogMyAfterAdd.unlockAfterRead(); - } - raceLog.lockForRead(); - try { - assertEquals(2, Util.size(raceLogMy.getFixes())); - assertEquals(1, Util.size(raceLog.getFixes())); - } finally { - raceLog.unlockAfterRead(); - } - } finally { - raceLogMy.unlockAfterRead(); - } - } - - @Test - public void testRecordingOfRaceLogEventsWithRegattaLeaderboard() throws InterruptedException { - String regattaName = "IDM 2013-Default"; - String regattaLeaderboardName = RegattaImpl.getFullName(regattaName, "Dragon"); - RacingEventServiceOperation addDefaultRegatta = new AddDefaultRegatta(regattaName, "Dragon", UUID.randomUUID()); - server.apply(addDefaultRegatta); - - Regatta regatta = racingEventServiceServer.getRegattaByName(regattaLeaderboardName); - Series series = regatta.getSeriesByName("Default"); - series.addRaceColumn("R1", racingEventServiceServer); - series.addRaceColumn("R2", racingEventServiceServer); - - RacingEventServiceOperation addLeaderboardOp = - new CreateRegattaLeaderboard(regatta.getRegattaIdentifier(), new int[] { 5 }, null); - server.apply(addLeaderboardOp); - - - TimePoint t1 = MillisecondsTimePoint.now(); - TimePoint t2 = new MillisecondsTimePoint(t1.asMillis() + 1000); - int passId = 0; - boolean isDisplayed = true; - RaceLogFlagEvent rcEvent = new RaceLogFlagEventImpl(t1, passId, Flags.CLASS, Flags.NONE, isDisplayed); - RaceLogFlagEvent rcEvent2 = new RaceLogFlagEventImpl(t2, passId, Flags.AP, Flags.NONE, isDisplayed); - - Leaderboard leaderboard = racingEventServiceServer.getLeaderboardByName(regattaLeaderboardName); - RaceColumn raceColumn = leaderboard.getRaceColumnByName("R1"); - Fleet fleet = raceColumn.getFleetByName("Default"); - - RaceLogIdentifier identifierR1 = new RaceLogIdentifierImpl(leaderboard, raceColumn, fleet); - - RaceLog raceLog = racingEventServiceServer.getRaceLog(identifierR1); - raceLog.add(rcEvent); - - Thread.sleep(1000); - - RaceLog raceLog2 = racingEventServiceServer.getRaceLog(identifierR1); - raceLog.lockForRead(); - try { - raceLog2.lockForRead(); - try { - assertEquals(Util.size(raceLog.getFixes()), Util.size(raceLog2.getFixes())); - } finally { - raceLog2.unlockAfterRead(); - } - } finally { - raceLog.unlockAfterRead(); - } - - RaceColumn raceColumnR2 = leaderboard.getRaceColumnByName("R2"); - Fleet fleetR2 = raceColumnR2.getFleetByName("Default"); - RaceLogIdentifier identifierR2 = new RaceLogIdentifierImpl(leaderboard, raceColumnR2, fleetR2); - - RaceLog raceLogR2BeforeAdd = racingEventServiceServer.getRaceLog(identifierR2); - raceLogR2BeforeAdd.add(rcEvent); - raceLogR2BeforeAdd.add(rcEvent2); - - Thread.sleep(1000); - - RaceLog raceLogR2AfterAdd = racingEventServiceServer.getRaceLog(identifierR2); - raceLogR2BeforeAdd.lockForRead(); - try { - raceLogR2AfterAdd.lockForRead(); - try { - assertEquals(Util.size(raceLogR2BeforeAdd.getFixes()), Util.size(raceLogR2AfterAdd.getFixes())); - } finally { - raceLogR2AfterAdd.unlockAfterRead(); - } - raceLog.lockForRead(); - try { - assertEquals(2, Util.size(raceLogR2BeforeAdd.getFixes())); - assertEquals(1, Util.size(raceLog.getFixes())); - } finally { - raceLog.unlockAfterRead(); - } - } finally { - raceLogR2BeforeAdd.unlockAfterRead(); - } - } - - @Test - public void testRecordingOfRaceLogEventOverOperationalTransformationCommand() throws InterruptedException { - String regattaName = "IDM 2013-Default"; - String regattaLeaderboardName = RegattaImpl.getFullName(regattaName, "Dragon"); - RacingEventServiceOperation addDefaultRegatta = new AddDefaultRegatta(regattaName, "Dragon", UUID.randomUUID()); - server.apply(addDefaultRegatta); - - Regatta regatta = racingEventServiceServer.getRegattaByName(regattaLeaderboardName); - Series series = regatta.getSeriesByName("Default"); - series.addRaceColumn("R1", racingEventServiceServer); - series.addRaceColumn("R2", racingEventServiceServer); - - RacingEventServiceOperation addLeaderboardOp = - new CreateRegattaLeaderboard(regatta.getRegattaIdentifier(), new int[] { 5 }, null); - server.apply(addLeaderboardOp); - - - TimePoint t1 = MillisecondsTimePoint.now(); - TimePoint t2 = new MillisecondsTimePoint(t1.asMillis() + 1000); - int passId = 0; - boolean isDisplayed = true; - RaceLogFlagEvent rcEvent = new RaceLogFlagEventImpl(t1, passId, Flags.CLASS, Flags.NONE, isDisplayed); - RaceLogFlagEvent rcEvent2 = new RaceLogFlagEventImpl(t2, passId, Flags.AP, Flags.NONE, isDisplayed); - - Leaderboard leaderboard = racingEventServiceServer.getLeaderboardByName(regattaLeaderboardName); - RaceColumn raceColumn = leaderboard.getRaceColumnByName("R1"); - Fleet fleet = raceColumn.getFleetByName("Default"); - - RaceLogIdentifier identifierR1 = new RaceLogIdentifierImpl(leaderboard, raceColumn, fleet); - - RaceLog raceLogR1 = racingEventServiceServer.getRaceLog(identifierR1); - - server.apply(new RecordRaceLogEvent(identifierR1, rcEvent)); - - Thread.sleep(1000); - RaceLog raceLogR1_2 = racingEventServiceServer.getRaceLog(identifierR1); - raceLogR1.lockForRead(); - try { - raceLogR1_2.lockForRead(); - try { - assertEquals(1, Util.size(raceLogR1.getFixes())); - assertEquals(1, Util.size(raceLogR1_2.getFixes())); - } finally { - raceLogR1_2.unlockAfterRead(); - } - } finally { - raceLogR1.unlockAfterRead(); - } - - RaceColumn raceColumnR2 = leaderboard.getRaceColumnByName("R2"); - Fleet fleetR2 = raceColumnR2.getFleetByName("Default"); - - RaceLogIdentifier identifierR2 = new RaceLogIdentifierImpl(leaderboard, raceColumnR2, fleetR2); - - RaceLog raceLogR2 = racingEventServiceServer.getRaceLog(identifierR2); - - server.apply(new RecordRaceLogEvent(identifierR2, rcEvent)); - server.apply(new RecordRaceLogEvent(identifierR2, rcEvent2)); - - Thread.sleep(1000); - - RaceLog raceLogR2AfterAdd = racingEventServiceServer.getRaceLog(identifierR2); - raceLogR2AfterAdd.lockForRead(); - try { - raceLogR2.lockForRead(); - try { - assertEquals(2, Util.size(raceLogR2.getFixes())); - assertEquals(2, Util.size(raceLogR2AfterAdd.getFixes())); - } finally { - raceLogR2.unlockAfterRead(); - } - raceLogR1_2.lockForRead(); - try { - assertEquals(2, Util.size(raceLogR2AfterAdd.getFixes())); - assertEquals(1, Util.size(raceLogR1_2.getFixes())); - } finally { - raceLogR1_2.unlockAfterRead(); - } - } finally { - raceLogR2AfterAdd.unlockAfterRead(); - } - } - -}*/ diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java index 69dc5d672ec..a5330985097 100755 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/RaceLogOperationalTransformationTest.java @@ -7,6 +7,7 @@ import java.util.GregorianCalendar; import java.util.UUID; import java.util.concurrent.CountDownLatch; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -91,6 +92,13 @@ public class RaceLogOperationalTransformationTest { client2.addPeer(server); } + @AfterEach + public void tearDown() { + server.shutdown(); + client1.shutdown(); + client2.shutdown(); + } + @Test public void testSimpleApply() { Calendar c = new GregorianCalendar(2013, 6, 7, 13, 59, 33); diff --git a/java/com.sap.sse.operationaltransformation.test/src/com/sap/sse/operationaltransformation/test/OperationalTransformationTest.java b/java/com.sap.sse.operationaltransformation.test/src/com/sap/sse/operationaltransformation/test/OperationalTransformationTest.java index 3a9127d8abc..6a87200621d 100755 --- a/java/com.sap.sse.operationaltransformation.test/src/com/sap/sse/operationaltransformation/test/OperationalTransformationTest.java +++ b/java/com.sap.sse.operationaltransformation.test/src/com/sap/sse/operationaltransformation/test/OperationalTransformationTest.java @@ -11,6 +11,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Logger; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -134,6 +135,13 @@ public class OperationalTransformationTest { client2 = new PeerImpl("Client2", new StringInsertTransformer(), server); } + @AfterEach + public void tearDown() { + server.shutdown(); + client1.shutdown(); + client2.shutdown(); + } + @Test public void testBasicTransformation() { client1.apply(new StringInsertOperation(0, "abc")); @@ -233,6 +241,7 @@ public class OperationalTransformationTest { assertEquals(server.getCurrentState().getState(), client2.getCurrentState().getState()); assertEquals(server.getCurrentState().getState(), server2.getCurrentState().getState()); assertEquals(6*COUNT, server2.getCurrentState().getState().length()); + server2.shutdown(); } /** diff --git a/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/Peer.java b/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/Peer.java index f3382af4c4b..6409e434986 100755 --- a/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/Peer.java +++ b/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/Peer.java @@ -97,4 +97,10 @@ public interface Peer, S> { * wait until consistency has been reached across clients and server. */ void waitForNotRunning(); + + /** + * Shuts any executor service, e.g., the one used for merging incoming operations, + * down. This is an irreversible operation; this peer cannot be used anymore afterwards. + */ + void shutdown(); } diff --git a/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/PeerImpl.java b/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/PeerImpl.java index e3da05eb2c1..0a0965a7c39 100755 --- a/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/PeerImpl.java +++ b/java/com.sap.sse.operationaltransformation/src/com/sap/sse/operationaltransformation/PeerImpl.java @@ -97,7 +97,7 @@ public class PeerImpl, S> implements Peer { } @Override - public void finalize() { + public void shutdown() { merger.shutdown(); }