Skip to content

Commit abe2df7

Browse files
committed
improve test / mocking support
1 parent 8fe4339 commit abe2df7

9 files changed

+239
-53
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package net.sharksystem.asap.apps;
2+
3+
import java.util.List;
4+
5+
public interface ASAPEnvironmentChangesListener {
6+
/**
7+
* ASAP peers establish connections on their own and usually if possible. This
8+
* message is called if one or more connections could be established or got lost.
9+
* @param peerList current list of peer we have a connection to
10+
*/
11+
void onlinePeersChanged(List<CharSequence> peerList);
12+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package net.sharksystem.asap.apps;
2+
3+
public interface ASAPEnvironmentChangesListenerManagement {
4+
/**
5+
* Add listener for changes in ASAP environment
6+
* @param changesListener listener which is to be added
7+
*/
8+
void addASAPEnvironmentChangesListener(ASAPEnvironmentChangesListener changesListener);
9+
10+
/**
11+
* Remove changes listener
12+
* @param changesListener listener which is to be removed
13+
*/
14+
void removeASAPEnvironmentChangesListener(ASAPEnvironmentChangesListener changesListener);
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.sharksystem.asap.apps;
2+
3+
public interface ASAPMessageReceivedListenerManagement {
4+
/**
5+
* Add a listener that is called when a message came in
6+
* @param format app name == supported format
7+
* @param listener listener object
8+
*/
9+
void addASAPMessageReceivedListener(CharSequence format, ASAPMessageReceivedListener listener);
10+
void removeASAPMessageReceivedListener(CharSequence format, ASAPMessageReceivedListener listener);
11+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package net.sharksystem.asap.apps;
2+
3+
public interface ASAPPeerServices extends
4+
ASAPMessageSender,
5+
ASAPEnvironmentChangesListenerManagement
6+
{}

src/net/sharksystem/asap/apps/mock/ASAPSessionMock.java

Lines changed: 58 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,36 @@
22

33
import net.sharksystem.asap.ASAPException;
44
import net.sharksystem.asap.ASAPMessages;
5-
import net.sharksystem.asap.apps.ASAPMessageReceivedListener;
6-
import net.sharksystem.asap.apps.ASAPMessageSender;
5+
import net.sharksystem.asap.apps.*;
6+
import net.sharksystem.asap.listenermanager.ASAPEnvironmentChangesListenerManager;
7+
import net.sharksystem.asap.listenermanager.ASAPMessageReceivedListenerManager;
78

8-
import java.io.IOException;
99
import java.util.*;
1010

11-
public class ASAPSessionMock implements ASAPMessageSender {
12-
private Map<CharSequence, Map<CharSequence, List<byte[]>>> appMsgStorage = new HashMap<>();
13-
private Map<CharSequence, List<ASAPMessageReceivedListener>> listenerMap = new HashMap<>();
11+
public class ASAPSessionMock implements ASAPPeerServices {
1412
private boolean connected = false;
1513

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+
}
22+
23+
/**
24+
* disconnect - opposite of connect
25+
*/
26+
public void disconnect() {
27+
this.connected = false;
28+
}
29+
30+
////////////////////////////////////////////////////////////////////////////////////////////////////////
31+
// ASAPMessageManagement //
32+
////////////////////////////////////////////////////////////////////////////////////////////////////////
33+
private Map<CharSequence, Map<CharSequence, List<byte[]>>> appMsgStorage = new HashMap<>();
34+
1635
private List<byte[]> getStorage(CharSequence appName, CharSequence uri) {
1736
Map<CharSequence, List<byte[]>> charSequenceListMap = this.appMsgStorage.get(appName);
1837
if (charSequenceListMap == null) {
@@ -36,73 +55,59 @@ public void sendASAPMessage(CharSequence appName, CharSequence uri, byte[] messa
3655
storage.add(message);
3756
}
3857

39-
if(this.connected) this.notifyListeners();
58+
if(this.connected) this.notifyMessageReceived();
4059
}
4160

42-
public void addASAPMessageReceivedListener(CharSequence format, ASAPMessageReceivedListener listener) {
43-
List<ASAPMessageReceivedListener> asapMessageReceivedListeners = this.listenerMap.get(format);
44-
if(asapMessageReceivedListeners == null) {
45-
asapMessageReceivedListeners = new ArrayList<>();
46-
this.listenerMap.put(format, asapMessageReceivedListeners);
47-
}
48-
49-
asapMessageReceivedListeners.add(listener);
50-
}
61+
////////////////////////////////////////////////////////////////////////////////////////////////////////
62+
// ASAPMessageReceivedListener //
63+
////////////////////////////////////////////////////////////////////////////////////////////////////////
64+
private ASAPMessageReceivedListenerManager asapMessageReceivedListenerManager =
65+
new ASAPMessageReceivedListenerManager();
5166

52-
/**
53-
* Simulate a connection - this mock will notify all registered listeners and remove messages.
54-
* After connected - any sendASAPMessage call will immediately lead to a listener call.
55-
*/
56-
public void connect() {
57-
this.connected = true;
58-
this.notifyListeners();
67+
public void addASAPMessageReceivedListener(CharSequence format, ASAPMessageReceivedListener listener) {
68+
this.asapMessageReceivedListenerManager.addASAPMessageReceivedListener(format, listener);
5969
}
6070

61-
private void notifyListeners() {
71+
private void notifyMessageReceived() {
6272
Map<CharSequence, Map<CharSequence, List<byte[]>>> appUriMessages = null;
6373
synchronized(this.appMsgStorage) {
64-
if(this.appMsgStorage.isEmpty()) return;
65-
74+
if(this.appMsgStorage.isEmpty()) return; // nothing to do
6675
// else copy
6776
appUriMessages = this.appMsgStorage;
68-
6977
// create empty
7078
this.appMsgStorage = new HashMap<>();
79+
80+
// now: new message can be written and do not disturb notification process
7181
}
7282

73-
// send
83+
// notify about new messages == simulate sending
7484
for(CharSequence appName : appUriMessages.keySet()) {
7585
Map<CharSequence, List<byte[]>> appMap = appUriMessages.get(appName);
7686
if(appMap != null) {
77-
List<ASAPMessageReceivedListener> asapMessageReceivedListeners = this.listenerMap.get(appName);
78-
if(asapMessageReceivedListeners != null && !asapMessageReceivedListeners.isEmpty()) {
79-
Set<CharSequence> uris = appMap.keySet();
80-
for(CharSequence uri : uris) {
81-
List<byte[]> serializedAppPDUs = appMap.get(uri);
82-
for(ASAPMessageReceivedListener listener : asapMessageReceivedListeners) {
83-
// create a thread for each listener
84-
new Thread(new Runnable() {
85-
@Override
86-
public void run() {
87-
ASAPMessages messagesMock = new ASAPMessagesMock(appName, uri, serializedAppPDUs);
88-
try {
89-
listener.asapMessagesReceived(messagesMock);
90-
} catch (IOException e) {
91-
e.printStackTrace();
92-
}
93-
}
94-
}).start();
95-
}
96-
}
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);
9792
}
9893
}
9994
}
10095
}
10196

102-
/**
103-
* disconnect - opposite of connect
104-
*/
105-
public void disconnect() {
106-
this.connected = false;
97+
////////////////////////////////////////////////////////////////////////////////////////////////////////
98+
// ASAPEnvironmentChangesListener //
99+
////////////////////////////////////////////////////////////////////////////////////////////////////////
100+
101+
private ASAPEnvironmentChangesListenerManager environmentChangesListenerManager =
102+
new ASAPEnvironmentChangesListenerManager();
103+
104+
@Override
105+
public void addASAPEnvironmentChangesListener(ASAPEnvironmentChangesListener changesListener) {
106+
this.environmentChangesListenerManager.addASAPEnvironmentChangesListener(changesListener);
107+
}
108+
109+
@Override
110+
public void removeASAPEnvironmentChangesListener(ASAPEnvironmentChangesListener changesListener) {
111+
this.environmentChangesListenerManager.removeASAPEnvironmentChangesListener(changesListener);
107112
}
108113
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package net.sharksystem.asap.listenermanager;
2+
3+
import net.sharksystem.asap.apps.ASAPEnvironmentChangesListener;
4+
import net.sharksystem.asap.apps.ASAPEnvironmentChangesListenerManagement;
5+
6+
import java.util.List;
7+
8+
public class ASAPEnvironmentChangesListenerManager
9+
extends GenericListenerImplementation<ASAPEnvironmentChangesListener>
10+
implements ASAPEnvironmentChangesListenerManagement {
11+
12+
@Override
13+
public void addASAPEnvironmentChangesListener(ASAPEnvironmentChangesListener changesListener) {
14+
this.addListener(changesListener);
15+
}
16+
17+
@Override
18+
public void removeASAPEnvironmentChangesListener(ASAPEnvironmentChangesListener changesListener) {
19+
this.removeListener(changesListener);
20+
}
21+
22+
public void notifyListeners(List<CharSequence> peerList) {
23+
for(ASAPEnvironmentChangesListener listener : this.listenerList) {
24+
listener.onlinePeersChanged(peerList);
25+
}
26+
}
27+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package net.sharksystem.asap.listenermanager;
2+
3+
import net.sharksystem.asap.ASAPMessages;
4+
import net.sharksystem.asap.apps.ASAPMessageReceivedListener;
5+
import net.sharksystem.asap.apps.ASAPMessageReceivedListenerManagement;
6+
7+
import java.io.IOException;
8+
import java.util.HashMap;
9+
10+
public class ASAPMessageReceivedListenerManager implements ASAPMessageReceivedListenerManagement {
11+
private HashMap<CharSequence, GenericListenerImplementation<ASAPMessageReceivedListener>> listenerMap =
12+
new HashMap();
13+
14+
@Override
15+
public void addASAPMessageReceivedListener(CharSequence format, ASAPMessageReceivedListener listener) {
16+
GenericListenerImplementation<ASAPMessageReceivedListener> listenerList = this.listenerMap.get(format);
17+
if(listenerList == null) {
18+
listenerList = new GenericListenerImplementation<ASAPMessageReceivedListener>();
19+
}
20+
21+
listenerList.addListener(listener);
22+
}
23+
24+
@Override
25+
public void removeASAPMessageReceivedListener(CharSequence format, ASAPMessageReceivedListener listener) {
26+
GenericListenerImplementation<ASAPMessageReceivedListener> listenerList = this.listenerMap.get(format);
27+
if(listenerList != null) {
28+
listenerList.removeListener(listener);
29+
}
30+
}
31+
32+
public void removeAllListeners() {
33+
// reset
34+
this.listenerMap = new HashMap();
35+
}
36+
37+
public void notifyReceived(CharSequence format, ASAPMessages asapMessage) {
38+
this.notifyReceived(format, asapMessage, false);
39+
}
40+
41+
public void notifyReceived(CharSequence format, ASAPMessages asapMessage, boolean useThreads) {
42+
GenericListenerImplementation<ASAPMessageReceivedListener> listenerList = this.listenerMap.get(format);
43+
if(listenerList != null) {
44+
ASAPMessageReceivedNotifier asapMessageReceivedNotifier
45+
= new ASAPMessageReceivedNotifier(asapMessage);
46+
47+
listenerList.notifyAll(asapMessageReceivedNotifier, useThreads);
48+
}
49+
}
50+
51+
public class ASAPMessageReceivedNotifier implements GenericNotifier<ASAPMessageReceivedListener> {
52+
private final ASAPMessages asapMessage;
53+
54+
ASAPMessageReceivedNotifier(ASAPMessages asapMessage) {
55+
this.asapMessage = asapMessage;
56+
}
57+
58+
public void doNotify(ASAPMessageReceivedListener listener) {
59+
try {
60+
listener.asapMessagesReceived(this.asapMessage);
61+
} catch (IOException e) {
62+
System.err.println("error when notifying about received asap message: "
63+
+ e.getLocalizedMessage());
64+
}
65+
}
66+
}
67+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package net.sharksystem.asap.listenermanager;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class GenericListenerImplementation<L> {
7+
protected List<L> listenerList = new ArrayList<L>();
8+
9+
protected void addListener(L listener) {
10+
if(!this.listenerList.contains(listener)) {
11+
this.listenerList.add(listener);
12+
}
13+
}
14+
15+
protected void removeListener(L listener) {
16+
this.listenerList.remove(listener);
17+
}
18+
19+
public void removeAllListeners() {
20+
this.listenerList = new ArrayList<L>();
21+
}
22+
23+
public void notifyAll(GenericNotifier notifier, boolean useThreads) {
24+
for(L listener : this.listenerList) {
25+
if(useThreads) {
26+
new Thread (new Runnable() {
27+
@Override
28+
public void run() { notifier.doNotify(listener); }
29+
}).start();
30+
} else { // no threads
31+
notifier.doNotify(listener);
32+
}
33+
}
34+
}
35+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package net.sharksystem.asap.listenermanager;
2+
3+
public interface GenericNotifier<L> {
4+
/**
5+
* run specific notification
6+
*/
7+
void doNotify(L listener);
8+
}

0 commit comments

Comments
 (0)