Skip to content

Commit 0986d49

Browse files
committed
improve test / mocking support - much better now, see especially UseThisAsTemplate4YourAppTests in tests/mock
1 parent cd92b19 commit 0986d49

File tree

3 files changed

+234
-79
lines changed

3 files changed

+234
-79
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,104 @@
11
package net.sharksystem.asap.apps.mock;
22

3-
import net.sharksystem.asap.ASAPException;
3+
import net.sharksystem.asap.*;
44
import net.sharksystem.asap.apps.ASAPPeerServices;
5+
import net.sharksystem.asap.util.Helper;
56

6-
public class ASAPSimplePeer extends ASAPBasicAbstractPeer implements ASAPPeerServices {
7+
import java.io.File;
8+
import java.io.IOException;
9+
import java.net.ServerSocket;
10+
import java.net.Socket;
711

8-
protected ASAPSimplePeer(CharSequence peerName) {
12+
public class ASAPSimplePeer extends ASAPBasicAbstractPeer implements ASAPPeerServices, ASAPChunkReceivedListener {
13+
private final ASAPPeer peer;
14+
private final String folderName;
15+
private ServerSocket serverSocket = null;
16+
private Socket socket = null;
17+
18+
public ASAPSimplePeer(CharSequence peerName) throws IOException, ASAPException {
919
super(peerName);
20+
this.folderName = "./peers/" + peerName;
21+
File asapFolder = new File(folderName);
22+
if(!asapFolder.exists()) {
23+
asapFolder.mkdirs();
24+
}
25+
this.peer = ASAPPeerFS.createASAPPeer(peerName, folderName, this);
1026
}
1127

1228
@Override
1329
public void sendASAPMessage(CharSequence appName, CharSequence uri, byte[] message) throws ASAPException {
30+
try {
31+
ASAPEngine asapEngine = this.peer.createEngineByFormat(appName);
32+
asapEngine.activateOnlineMessages(this.peer);
33+
asapEngine.add(uri, message);
34+
} catch (IOException e) {
35+
this.log(e.getLocalizedMessage());
36+
throw new ASAPException("problems getting asap engine", e);
37+
}
38+
}
39+
40+
41+
public void startEncounter(int port, ASAPSimplePeer otherPeer) throws IOException {
42+
this.serverSocket = new ServerSocket(port);
43+
44+
new Thread(new Runnable() {
45+
@Override
46+
public void run() {
47+
try {
48+
ASAPSimplePeer.this.socket = ASAPSimplePeer.this.serverSocket.accept();
49+
} catch (IOException e) {
50+
ASAPSimplePeer.this.log("fatal while waiting for client to connect: "
51+
+ e.getLocalizedMessage());
52+
}
53+
54+
ASAPSimplePeer.this.startSession();
55+
}
56+
}).start();
57+
58+
// wait a moment
59+
try {
60+
Thread.sleep(100);
61+
} catch (InterruptedException e) {
62+
}
63+
64+
otherPeer.connect(port);
65+
}
66+
67+
private void connect(int port) throws IOException {
68+
this.socket = new Socket("localhost", port);
69+
this.startSession();
70+
}
71+
72+
public void stopEncounter(ASAPSimplePeer otherPeer) throws IOException {
73+
this.socket.close();
74+
}
75+
76+
private void startSession() {
77+
new Thread(new Runnable() {
78+
@Override
79+
public void run() {
80+
try {
81+
ASAPSimplePeer.this.peer.handleConnection(
82+
ASAPSimplePeer.this.socket.getInputStream(),
83+
ASAPSimplePeer.this.socket.getOutputStream());
84+
} catch (IOException | ASAPException e) {
85+
ASAPSimplePeer.this.log("fatal while connecting: " + e.getLocalizedMessage());
86+
}
87+
}
88+
}).start();
89+
}
90+
91+
@Override
92+
public void chunkReceived(String format, String sender, String uri, int era) throws IOException {
93+
StringBuilder sb = new StringBuilder();
94+
sb.append("\n++++++++++++++++++++++++++++++++ chunkReceived +++++++++++++++++++++++++++++++++\n");
95+
sb.append("app / format: " + format + " | " + sender + " | uri: " + uri + " | era: " + era);
96+
sb.append("\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
97+
this.log(sb.toString());
98+
99+
ASAPMessages receivedMessages =
100+
Helper.getMessagesByChunkReceivedInfos(format, sender, uri, folderName, era);
14101

102+
this.asapMessageReceivedListenerManager.notifyReceived(format, receivedMessages, true);
15103
}
16104
}

test/net/sharksystem/asap/mock/ASAPSimplePeerUsage.java

-76
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package net.sharksystem.asap.mock;
2+
3+
import net.sharksystem.asap.ASAPException;
4+
import net.sharksystem.asap.apps.ASAPPeerServices;
5+
import net.sharksystem.asap.apps.mock.ASAPPeerMock;
6+
import net.sharksystem.asap.apps.mock.ASAPSimplePeer;
7+
import org.junit.Test;
8+
9+
import java.io.*;
10+
11+
import static net.sharksystem.asap.mock.TestUtils.*;
12+
13+
/**
14+
* An ASAP app communicates by sending messages. First, you must ensure stability in your application.
15+
* Implement methods that serialized and deserialize messages. Implement a listener. Test your app
16+
* by testing scenarios. This class comprises a scenario in two steps.
17+
*
18+
* One tests uses an asap mock. It simulates a message exchange but does not use ASAP at all.
19+
*
20+
* The asapTestExamples is nearly identical with one important difference: The ASAP engines are used.
21+
*
22+
* Note: The test scenarios do not differ at all. Your application and test logic is written once and is tested
23+
* against a mock and later against ASAP. Same interfaces are also available in Android. YOu can spent some
24+
* times by implementing test scenarios. Makes app coding on your target platform much faster.
25+
*
26+
* Test your app first with the mock and afterwards with the ASAP protocol stack. If anything runs smoothly -
27+
* you will have a stable Android or Java app in no time.
28+
*/
29+
public class UseThisAsTemplate4YourAppTests {
30+
private static final int PORT = 7777;
31+
32+
private static int port = 0;
33+
static int getPortNumber() {
34+
if(UseThisAsTemplate4YourAppTests.port == 0) {
35+
UseThisAsTemplate4YourAppTests.port = PORT;
36+
} else {
37+
UseThisAsTemplate4YourAppTests.port++;
38+
}
39+
40+
return UseThisAsTemplate4YourAppTests.port;
41+
}
42+
43+
@Test
44+
public void mockTestExample() throws IOException, ASAPException, InterruptedException {
45+
///////////////// ALICE //////////////////////////////////////////////////////////////
46+
// setup mocked peer / asap application and activity in android
47+
ASAPPeerMock aliceMockPeer = new ASAPPeerMock(ALICE);
48+
ASAPPeerMock bobMockPeer = new ASAPPeerMock(BOB);
49+
50+
// 1st encounter
51+
this.scenarioPart1(aliceMockPeer, bobMockPeer);
52+
53+
aliceMockPeer.startEncounter(bobMockPeer);
54+
// give your app a moment to process
55+
Thread.sleep(1000);
56+
// stop encounter
57+
bobMockPeer.stopEncounter(aliceMockPeer);
58+
// give your app a moment to process
59+
Thread.sleep(1000);
60+
61+
// 2nd encounter
62+
this.scenarioPart2(aliceMockPeer, bobMockPeer);
63+
64+
bobMockPeer.startEncounter(bobMockPeer);
65+
}
66+
67+
@Test
68+
public void asapTestExample() throws IOException, ASAPException, InterruptedException {
69+
///////////////// ALICE //////////////////////////////////////////////////////////////
70+
// setup mocked peer / asap application and activity in android
71+
ASAPSimplePeer aliceSimplePeer = new ASAPSimplePeer(ALICE);
72+
ASAPSimplePeer bobSimplePeer = new ASAPSimplePeer(BOB);
73+
74+
// 1st encounter
75+
this.scenarioPart1(aliceSimplePeer, bobSimplePeer);
76+
77+
aliceSimplePeer.startEncounter(getPortNumber(), bobSimplePeer);
78+
// give your app a moment to process
79+
Thread.sleep(1000);
80+
// stop encounter
81+
bobSimplePeer.stopEncounter(aliceSimplePeer);
82+
// give your app a moment to process
83+
Thread.sleep(1000);
84+
85+
// 2nd encounter
86+
this.scenarioPart2(aliceSimplePeer, bobSimplePeer);
87+
88+
aliceSimplePeer.startEncounter(getPortNumber(), bobSimplePeer);
89+
}
90+
91+
public void scenarioPart1(ASAPPeerServices alicePeer, ASAPPeerServices bobPeer)
92+
throws IOException, ASAPException, InterruptedException {
93+
// simulate ASAP first encounter with full ASAP protocol stack and engines
94+
System.out.println("+++++++++++++++++++ 1st encounter starts soon ++++++++++++++++++++");
95+
Thread.sleep(50);
96+
97+
// setup message received listener - this should be replaced with your code - you implement a listener.
98+
ASAPMessageReceivedListenerExample aliceMessageReceivedListenerExample =
99+
new ASAPMessageReceivedListenerExample();
100+
101+
alicePeer.addASAPMessageReceivedListener(YOUR_APP_NAME, aliceMessageReceivedListenerExample);
102+
103+
// example - this should be produced by your application
104+
byte[] serializedData = TestUtils.serializeExample(42, "from alice", true);
105+
106+
alicePeer.sendASAPMessage(YOUR_APP_NAME, YOUR_URI, serializedData);
107+
108+
///////////////// BOB //////////////////////////////////////////////////////////////
109+
110+
// this should be replaced with your code - you must implement a listener.
111+
ASAPMessageReceivedListenerExample asapMessageReceivedListenerExample =
112+
new ASAPMessageReceivedListenerExample();
113+
114+
// register your listener (or that mock) with asap connection mock
115+
bobPeer.addASAPMessageReceivedListener(YOUR_APP_NAME, asapMessageReceivedListenerExample);
116+
117+
// bob writes something
118+
bobPeer.sendASAPMessage(YOUR_APP_NAME, YOUR_URI,
119+
TestUtils.serializeExample(43, "from bob", false));
120+
bobPeer.sendASAPMessage(YOUR_APP_NAME, YOUR_URI,
121+
TestUtils.serializeExample(44, "from bob again", false));
122+
123+
124+
// give your app a moment to process
125+
Thread.sleep(500);
126+
}
127+
128+
public void scenarioPart2(ASAPPeerServices alicePeer, ASAPPeerServices bobPeer)
129+
throws IOException, ASAPException, InterruptedException {
130+
131+
// bob writes something
132+
bobPeer.sendASAPMessage(YOUR_APP_NAME, YOUR_URI,
133+
TestUtils.serializeExample(43, "third message from bob", false));
134+
135+
// simulate second encounter
136+
System.out.println("+++++++++++++++++++ 2nd encounter starts soon ++++++++++++++++++++");
137+
Thread.sleep(50);
138+
}
139+
140+
public void testScenarioResults() {
141+
// TODO
142+
}
143+
}

0 commit comments

Comments
 (0)