11package net .sharksystem .asap .apps .mock ;
22
3+ import net .sharksystem .asap .ASAP ;
34import net .sharksystem .asap .ASAPException ;
45import net .sharksystem .asap .ASAPMessages ;
56import net .sharksystem .asap .apps .*;
89
910import java .util .*;
1011
11- public class ASAPSessionMock implements ASAPPeerServices {
12+ /**
13+ * This class mocks an ASAPApplication. The ASAP protocol stack is bypassed completely. You can
14+ * test your applications logic without any fear of ASAP bugs.
15+ *
16+ */
17+ public class ASAPPeerMock implements ASAPPeerServices {
18+ private final CharSequence peerName ;
1219 private boolean connected = false ;
1320
14- /**
15- * Simulate a connection - this mock will notify all registered listeners and remove messages.
16- * After connected - any sendASAPMessage call will immediately lead to a listener call.
17- */
18- public void connect () {
19- this .connected = true ;
20- this .notifyMessageReceived ();
21+ public ASAPPeerMock (CharSequence peerName ) {
22+ this .peerName = peerName ;
2123 }
2224
23- /**
24- * disconnect - opposite of connect
25- */
26- public void disconnect () {
27- this .connected = false ;
25+ public ASAPPeerMock () {
26+ this (ASAP .createUniqueID ());
27+ }
28+
29+ ////////////////////////////////////////////////////////////////////////////////////////////////////////
30+ // Encounter simulation //
31+ ////////////////////////////////////////////////////////////////////////////////////////////////////////
32+
33+ /** peer name, era of last encounter */
34+ private HashMap <CharSequence , Integer > encounterEra = new HashMap <>();
35+ private int currentEra = ASAP .INITIAL_ERA ;
36+
37+ private void newEra () {
38+ synchronized (this .appMsgStorage ) {
39+ if (!this .appMsgStorage .isEmpty ()) {
40+ this .log ("messages were stored in this era" );
41+ this .currentEra = ASAP .nextEra (this .currentEra );
42+ this .log ("we enter a new era: " + this .currentEra );
43+ this .previousErasMsgStorage .add (this .appMsgStorage );
44+ this .appMsgStorage = new HashMap <>();
45+ } else {
46+ this .log ("no new messages - era remains unchanged: " + this .currentEra );
47+ }
48+ }
49+ }
50+
51+ public void startEncounter (ASAPPeerMock otherPeer ) {
52+ this .startEncounter (otherPeer , true );
53+ }
54+
55+ private void startEncounter (ASAPPeerMock otherPeer , boolean callOtherSide ) {
56+ this .log ("start simulation of encounter with: " + otherPeer .getPeerName ());
57+
58+ this .newEra ();
59+
60+ // already met this peer?
61+ Integer lastMetEra = this .encounterEra .get (otherPeer .getPeerName ());
62+ if (lastMetEra == null ) { // never met
63+ this .log ("never met before: " + otherPeer .getPeerName ());
64+ lastMetEra = ASAP .INITIAL_ERA ;
65+ } else {
66+ this .log ("last encounter: " + otherPeer .getPeerName () + " | " + lastMetEra );
67+ }
68+
69+ // remember this encounter
70+ this .encounterEra .put (otherPeer .getPeerName (), this .currentEra );
71+
72+ // simulate message sending
73+ for (int tmpEra = lastMetEra ; tmpEra < this .currentEra ; tmpEra ++) {
74+ otherPeer .takeMessages (this , tmpEra , this .previousErasMsgStorage .get (tmpEra ));
75+ }
76+
77+ if (callOtherSide ) {
78+ otherPeer .startEncounter (this , false );
79+ }
80+ }
81+
82+ private void takeMessages (ASAPPeerMock asapPeerMock , int tmpEra , Map <CharSequence , Map <CharSequence , List <byte []>>> appMessages ) {
83+ if (appMessages != null && !appMessages .isEmpty ()) {
84+ this .log ("handle received messages (sender | era): " + asapPeerMock .getPeerName () + " | " + tmpEra );
85+ this .notifyMessagesReceived (appMessages );
86+ }
87+ }
88+
89+ private CharSequence getPeerName () {
90+ return this .peerName ;
91+ }
92+
93+ public void stopEncounter (ASAPPeerMock otherPeer ) {
94+ this .stopEncounter (otherPeer , true );
95+ }
96+
97+ public void stopEncounter (ASAPPeerMock otherPeer , boolean callOtherSide ) {
98+ this .log ("stop encounter with " + otherPeer .getPeerName ());
99+ this .newEra ();
100+ if (callOtherSide ) {
101+ otherPeer .stopEncounter (this , false );
102+ }
28103 }
29104
30105 ////////////////////////////////////////////////////////////////////////////////////////////////////////
31106 // ASAPMessageManagement //
32107 ////////////////////////////////////////////////////////////////////////////////////////////////////////
108+
109+ /** appName, <uri, messageBytes> */
110+ private List < Map <CharSequence , Map <CharSequence , List <byte []> > > > previousErasMsgStorage = new ArrayList <>();
111+
112+ /** appName, <uri, messageBytes> */
33113 private Map <CharSequence , Map <CharSequence , List <byte []>>> appMsgStorage = new HashMap <>();
34114
35115 private List <byte []> getStorage (CharSequence appName , CharSequence uri ) {
@@ -68,6 +148,21 @@ public void addASAPMessageReceivedListener(CharSequence format, ASAPMessageRecei
68148 this .asapMessageReceivedListenerManager .addASAPMessageReceivedListener (format , listener );
69149 }
70150
151+ private void notifyMessagesReceived (Map <CharSequence , Map <CharSequence , List <byte []>>> appUriMessages ) {
152+ // notify about new messages == simulate sending
153+ for (CharSequence appName : appUriMessages .keySet ()) {
154+ Map <CharSequence , List <byte []>> appMap = appUriMessages .get (appName );
155+ if (appMap != null ) {
156+ Set <CharSequence > uris = appMap .keySet ();
157+ for (CharSequence uri : uris ) {
158+ List <byte []> serializedAppPDUs = appMap .get (uri );
159+ ASAPMessages messagesMock = new ASAPMessagesMock (appName , uri , serializedAppPDUs );
160+ this .asapMessageReceivedListenerManager .notifyReceived (appName , messagesMock , true );
161+ }
162+ }
163+ }
164+ }
165+
71166 private void notifyMessageReceived () {
72167 Map <CharSequence , Map <CharSequence , List <byte []>>> appUriMessages = null ;
73168 synchronized (this .appMsgStorage ) {
@@ -81,17 +176,7 @@ private void notifyMessageReceived() {
81176 }
82177
83178 // notify about new messages == simulate sending
84- for (CharSequence appName : appUriMessages .keySet ()) {
85- Map <CharSequence , List <byte []>> appMap = appUriMessages .get (appName );
86- if (appMap != null ) {
87- Set <CharSequence > uris = appMap .keySet ();
88- for (CharSequence uri : uris ) {
89- List <byte []> serializedAppPDUs = appMap .get (uri );
90- ASAPMessages messagesMock = new ASAPMessagesMock (appName , uri , serializedAppPDUs );
91- this .asapMessageReceivedListenerManager .notifyReceived (appName , messagesMock , true );
92- }
93- }
94- }
179+ this .notifyMessagesReceived (appUriMessages );
95180 }
96181
97182 ////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -110,4 +195,17 @@ public void addASAPEnvironmentChangesListener(ASAPEnvironmentChangesListener cha
110195 public void removeASAPEnvironmentChangesListener (ASAPEnvironmentChangesListener changesListener ) {
111196 this .environmentChangesListenerManager .removeASAPEnvironmentChangesListener (changesListener );
112197 }
198+
199+ ////////////////////////////////////////////////////////////////////////////////////////////////////////
200+ // util //
201+ ////////////////////////////////////////////////////////////////////////////////////////////////////////
202+
203+ private void log (String msg ) {
204+ StringBuilder sb = new StringBuilder ();
205+ sb .append (this .peerName );
206+ sb .append (": " );
207+ sb .append (msg );
208+
209+ System .out .println (sb .toString ());
210+ }
113211}
0 commit comments