From 653e8255609677d8052bd4371d10411f9239fade Mon Sep 17 00:00:00 2001 From: fmittag Date: Wed, 16 Nov 2011 18:06:01 +0100 Subject: [PATCH] Added first End-To-End Test for StoreForward -> SwissTimingConnector driven by a script of messages --- .../SwissTimingAdapterPersistenceImpl.java | 23 ++- .../META-INF/MANIFEST.MF | 1 + .../resources/InitMessagesScript.txt | 2 + .../EndToEndListeningStoreAndFowardTest.java | 178 ++++++++++++++++++ .../test/ScriptedStoreAndForwardTest.java | 13 +- 5 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/EndToEndListeningStoreAndFowardTest.java diff --git a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java index 33d259c0df5..bcd807c6eb4 100755 --- a/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.persistence/src/com/sap/sailing/domain/swisstimingadapter/persistence/impl/SwissTimingAdapterPersistenceImpl.java @@ -148,9 +148,10 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers query.append(FieldNames.RACE_ID.name(), raceID); DBObject o = races.findOne(query); if (o != null) { + Long startTimeAsMillis = (Long) o.get(FieldNames.RACE_STARTTIME.name()); Race race = swissTimingFactory.createRace((String) o.get(FieldNames.RACE_ID.name()), (String) o.get(FieldNames.RACE_DESCRIPTION.name()), - new MillisecondsTimePoint((Long) o.get(FieldNames.RACE_STARTTIME.name()))); + startTimeAsMillis == null ? null : new MillisecondsTimePoint(startTimeAsMillis)); return race; } return null; @@ -208,7 +209,15 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers messageCollection = database.getCollection(CollectionNames.COMMAND_MESSAGES.name()); } messageCollection.insert(objToInsert); - if(message.getRaceID() != null && cachedRaces.containsKey(message.getRaceID()) == false) { + + if(message.getType() == MessageType.RAC) { + // store the new race in the master data collection + List availableRaces = parseAvailableRacesMessage(message); + + for (Race newRace : availableRaces) { + storeRace(newRace); + } + } else if(message.getRaceID() != null && cachedRaces.containsKey(message.getRaceID()) == false) { // ah, we found a new raceID which is not in the list of known races // in order to have a more intelligent conflict resolver mechanism we will forward the resolution to a special thread later on boolean simpleResolution = true; @@ -226,6 +235,16 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers } } + private List parseAvailableRacesMessage(SailMasterMessage availableRacesMessage) { + int count = Integer.valueOf(availableRacesMessage.getSections()[1]); + List result = new ArrayList(); + for (int i=0; i raceHandles = new ArrayList(); + + for(String raceToTrack: racesToTrack) { + RaceHandle raceHandle = racingEventService.addSwissTimingRace(raceToTrack, "localhost", CLIENT_PORT, emptyWindStore, -1); + raceHandles.add(raceHandle); + + if(connector == null) { + connector = racingEventService.getSwissTimingFactory().getOrCreateSailMasterConnector("localhost", CLIENT_PORT, swissTimingAdapterPersistence); + } + } + + InputStream is = getClass().getResourceAsStream("/InitMessagesScript.txt"); + + ScriptedMessagesReader scriptedMessagesReader = new ScriptedMessagesReader(); + scriptedMessagesReader.addMessagesFromTextFile(is); + + final int messageCount = scriptedMessagesReader.getMessages().size(); + + final int[] receivedMessagesCount = new int[] {0}; + final boolean[] receivedAll = new boolean[1]; + + connector.addSailMasterListener(new SailMasterAdapter() { + @Override + public void receivedStartList(String raceID, StartList startList) { + + receivedMessagesCount[0] = receivedMessagesCount[0] + 1; + } + + @Override + public void receivedCourseConfiguration(String raceID, Course course) { + receivedMessagesCount[0] = receivedMessagesCount[0] + 1; + + if(messageCount == receivedMessagesCount[0]) { + synchronized (EndToEndListeningStoreAndFowardTest.this) { + receivedAll[0] = true; + EndToEndListeningStoreAndFowardTest.this.notifyAll(); + } + } + + } + + + @Override + public void receivedAvailableRaces(Iterable races) { + + receivedMessagesCount[0] = receivedMessagesCount[0] + 1; + } + }); + + for(String msg: scriptedMessagesReader.getMessages()) { + transceiver.sendMessage(msg, sendingStream); + } + + synchronized (this) { + while (!receivedAll[0]) { + wait(2000l); // wait for two seconds to receive the messages + } + } + + Iterable allEvents = racingEventService.getAllEvents(); + for (Event event : allEvents) { + DynamicTrackedEvent trackedEvent = racingEventService.getTrackedEvent(event); + + Iterable trackedRaces = trackedEvent.getTrackedRaces(); + + for (TrackedRace trackedRace : trackedRaces) { + RaceDefinition race = trackedRace.getRace(); + + System.out.println(race); + } + } + + + + for(RaceHandle raceHandle: raceHandles) + racingEventService.stopTracking(raceHandle.getEvent()); + + //for(String raceToTrack: racesToTrack) + // connector.stopTrackingRace(raceToTrack); + + } + +} diff --git a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ScriptedStoreAndForwardTest.java b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ScriptedStoreAndForwardTest.java index 183812bd056..f1a1dec6947 100644 --- a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ScriptedStoreAndForwardTest.java +++ b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/ScriptedStoreAndForwardTest.java @@ -20,6 +20,7 @@ import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.sap.sailing.domain.swisstimingadapter.Competitor; +import com.sap.sailing.domain.swisstimingadapter.Course; import com.sap.sailing.domain.swisstimingadapter.Race; import com.sap.sailing.domain.swisstimingadapter.SailMasterAdapter; import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector; @@ -93,6 +94,7 @@ public class ScriptedStoreAndForwardTest { final List racesReceived = new ArrayList(); final boolean[] receivedAll = new boolean[1]; final List receivedCompetitors = new ArrayList(); + final List receivedCourses = new ArrayList(); connector.addSailMasterListener(new SailMasterAdapter() { @Override @@ -102,6 +104,14 @@ public class ScriptedStoreAndForwardTest { receivedCompetitors.add(competitor); receivedMessagesCount[0] = receivedMessagesCount[0] + 1; + } + + @Override + public void receivedCourseConfiguration(String raceID, Course course) { + + receivedCourses.add(course); + + receivedMessagesCount[0] = receivedMessagesCount[0] + 1; if(messageCount == receivedMessagesCount[0]) { synchronized (ScriptedStoreAndForwardTest.this) { @@ -109,8 +119,8 @@ public class ScriptedStoreAndForwardTest { ScriptedStoreAndForwardTest.this.notifyAll(); } } - } + @Override public void receivedAvailableRaces(Iterable races) { @@ -132,6 +142,7 @@ public class ScriptedStoreAndForwardTest { } assertEquals(2, racesReceived.size()); assertEquals(5, receivedCompetitors.size()); + assertEquals(2, receivedCourses.size()); for(String raceToTrack: racesToTrack) connector.stopTrackingRace(raceToTrack);