Skip to content

Commit 884f313

Browse files
committed
create bug report for multi hop message forwarding
1 parent 1f8945e commit 884f313

File tree

1 file changed

+189
-0
lines changed

1 file changed

+189
-0
lines changed
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package bugreports;
2+
3+
import net.sharksystem.CountsReceivedMessagesListener;
4+
import net.sharksystem.SharkException;
5+
import net.sharksystem.asap.*;
6+
import net.sharksystem.asap.apps.TCPServerSocketAcceptor;
7+
import net.sharksystem.utils.fs.FSUtils;
8+
import net.sharksystem.utils.streams.StreamPairImpl;
9+
import net.sharksystem.utils.testsupport.TestConstants;
10+
import net.sharksystem.utils.testsupport.TestHelper;
11+
import org.junit.jupiter.api.Assertions;
12+
import org.junit.jupiter.api.BeforeAll;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.BeforeEach;
15+
16+
import java.io.IOException;
17+
import java.net.Socket;
18+
import java.util.ArrayList;
19+
import java.util.Collection;
20+
21+
22+
/**
23+
* This Test is a bug report for sending multi-hop messages.
24+
* There are three peers: Alice, Bob, and Clara. Alice and Clara are connected to Bob.
25+
*
26+
* Alice sends a message to Bob, and Bob forwards it to Clara.
27+
* The first test shows the bug.
28+
* If the message is sent after alice and clara have established a connection to bob and handled it, the message is
29+
* only received by Bob and is not forwarded to Clara.
30+
*
31+
* At the second test, clara handles the connection after the message from alice was received by bob.
32+
* The message is received by Bob and forwarded to Clara.
33+
*/
34+
public class ConnectPeersMultiHopTest {
35+
36+
private static final String TEST_FOLDER = "ConnectPeers";
37+
private final CharSequence EXAMPLE_APP_FORMAT = "shark/x-connectPeersExample";
38+
39+
private ASAPConnectionHandler alice;
40+
private ASAPConnectionHandler bob;
41+
private ASAPConnectionHandler clara;
42+
43+
private ASAPEncounterManager aliceEncounterManager;
44+
private ASAPEncounterManager bobEncounterManager;
45+
private ASAPEncounterManager claraEncounterManager;
46+
47+
@BeforeAll
48+
public static void removePreviousTestFolder() {
49+
FSUtils.removeFolder(TestConstants.ROOT_DIRECTORY + TEST_FOLDER);
50+
}
51+
52+
@BeforeEach
53+
public void setUp() throws IOException, SharkException {
54+
// supported formats
55+
Collection<CharSequence> formats = new ArrayList<>();
56+
formats.add(EXAMPLE_APP_FORMAT);
57+
58+
// test folder for this test run
59+
String rootFolder = TestHelper.getFullTempFolderName(TEST_FOLDER, true);
60+
61+
////////////////////////// set up peers
62+
// set up alice
63+
String aliceFolder = rootFolder + "/" + TestConstants.ALICE_ID;
64+
alice = new ASAPPeerFS(TestConstants.ALICE_ID, aliceFolder, formats);
65+
// set up bob
66+
String bobFolder = rootFolder + "/" + TestConstants.BOB_ID;
67+
bob = new ASAPPeerFS(TestConstants.BOB_ID, bobFolder, formats);
68+
// set up clara
69+
String claraFolder = rootFolder + "/" + TestConstants.CLARA_ID;
70+
clara = new ASAPPeerFS(TestConstants.CLARA_ID, claraFolder, formats);
71+
72+
aliceEncounterManager = new ASAPEncounterManagerImpl(alice, TestConstants.ALICE_ID);
73+
bobEncounterManager = new ASAPEncounterManagerImpl(bob, TestConstants.BOB_ID);
74+
claraEncounterManager = new ASAPEncounterManagerImpl(clara, TestConstants.CLARA_ID);
75+
}
76+
77+
@Test
78+
public void sendMessageMultiHopBug() throws IOException, SharkException, InterruptedException {
79+
80+
////////////////////////// set up server socket and handle connection requests
81+
int portNumberAlice = TestHelper.getPortNumber();
82+
TCPServerSocketAcceptor aliceTcpServerSocketAcceptor =
83+
new TCPServerSocketAcceptor(portNumberAlice, aliceEncounterManager);
84+
85+
int portNumberBob = TestHelper.getPortNumber();
86+
TCPServerSocketAcceptor bobTcpServerSocketAcceptor =
87+
new TCPServerSocketAcceptor(portNumberBob, bobEncounterManager);
88+
89+
// create second port for Bob, so that alice and clara can connect to Bob
90+
int portNumberBob2 = TestHelper.getPortNumber();
91+
TCPServerSocketAcceptor bobTcpServerSocketAcceptor2 =
92+
new TCPServerSocketAcceptor(portNumberBob2, bobEncounterManager);
93+
94+
// setup message received listeners for bob and clara
95+
ASAPPeerFS bobPeerFS = (ASAPPeerFS) bob;
96+
CountsReceivedMessagesListener messageReceivedListenerBob = new CountsReceivedMessagesListener(TestConstants.BOB_ID);
97+
bobPeerFS.addASAPMessageReceivedListener(EXAMPLE_APP_FORMAT, messageReceivedListenerBob);
98+
99+
ASAPPeerFS claraPeerFS = (ASAPPeerFS) clara;
100+
CountsReceivedMessagesListener messageReceivedListenerClara = new CountsReceivedMessagesListener(TestConstants.CLARA_ID);
101+
claraPeerFS.addASAPMessageReceivedListener(EXAMPLE_APP_FORMAT, messageReceivedListenerClara);
102+
103+
// give it a moment to settle
104+
Thread.sleep(5);
105+
106+
// now, bob opens two server sockets - one for alice and one for clara
107+
// open connection to Bob
108+
Socket socketAliceToBob = new Socket("localhost", portNumberBob);
109+
Socket socketClaraToBob = new Socket("localhost", portNumberBob2);
110+
111+
112+
// let Alice handle it
113+
aliceEncounterManager.handleEncounter(
114+
StreamPairImpl.getStreamPair(socketAliceToBob.getInputStream(), socketAliceToBob.getOutputStream()),
115+
ASAPEncounterConnectionType.INTERNET);
116+
// let clara handle it
117+
claraEncounterManager.handleEncounter(
118+
StreamPairImpl.getStreamPair(socketClaraToBob.getInputStream(), socketClaraToBob.getOutputStream()),
119+
ASAPEncounterConnectionType.INTERNET);
120+
// give it a moment to run ASAP session
121+
Thread.sleep(5000);
122+
123+
// send message from Alice to Bob after peers handled the connection
124+
ASAPPeerFS alicePeerFS = (ASAPPeerFS) alice;
125+
alicePeerFS.sendASAPMessage(EXAMPLE_APP_FORMAT, "my-uri", "Hello Bob!".getBytes());
126+
127+
// give it a moment for processing messages
128+
Thread.sleep(2000);
129+
130+
Assertions.assertTrue(messageReceivedListenerBob.numberOfMessages > 0);
131+
Assertions.assertTrue(messageReceivedListenerClara.numberOfMessages > 0);
132+
}
133+
134+
135+
@Test
136+
public void sendMessageMultiHopGood() throws IOException, SharkException, InterruptedException {
137+
138+
////////////////////////// set up server socket and handle connection requests
139+
int portNumberAlice = TestHelper.getPortNumber();
140+
TCPServerSocketAcceptor aliceTcpServerSocketAcceptor =
141+
new TCPServerSocketAcceptor(portNumberAlice, aliceEncounterManager);
142+
143+
int portNumberBob = TestHelper.getPortNumber();
144+
TCPServerSocketAcceptor bobTcpServerSocketAcceptor =
145+
new TCPServerSocketAcceptor(portNumberBob, bobEncounterManager);
146+
147+
// create second port for Bob, so that alice and clara can connect to Bob
148+
int portNumberBob2 = TestHelper.getPortNumber();
149+
TCPServerSocketAcceptor bobTcpServerSocketAcceptor2 =
150+
new TCPServerSocketAcceptor(portNumberBob2, bobEncounterManager);
151+
152+
// setup message received listeners for bob and clara
153+
ASAPPeerFS bobPeerFS = (ASAPPeerFS) bob;
154+
CountsReceivedMessagesListener messageReceivedListenerBob = new CountsReceivedMessagesListener(TestConstants.BOB_ID);
155+
bobPeerFS.addASAPMessageReceivedListener(EXAMPLE_APP_FORMAT, messageReceivedListenerBob);
156+
157+
ASAPPeerFS claraPeerFS = (ASAPPeerFS) clara;
158+
CountsReceivedMessagesListener messageReceivedListenerClara = new CountsReceivedMessagesListener(TestConstants.CLARA_ID);
159+
claraPeerFS.addASAPMessageReceivedListener(EXAMPLE_APP_FORMAT, messageReceivedListenerClara);
160+
161+
// give it a moment to settle
162+
Thread.sleep(5);
163+
164+
// now, bob opens two server sockets - one for alice and one for clara
165+
// open connection to Bob
166+
Socket socketAliceToBob = new Socket("localhost", portNumberBob);
167+
Socket socketClaraToBob = new Socket("localhost", portNumberBob2);
168+
169+
ASAPPeerFS alicePeerFS = (ASAPPeerFS) alice;
170+
alicePeerFS.sendASAPMessage(EXAMPLE_APP_FORMAT, "my-uri", "Hello Bob!".getBytes());
171+
// let Alice handle it
172+
aliceEncounterManager.handleEncounter(
173+
StreamPairImpl.getStreamPair(socketAliceToBob.getInputStream(), socketAliceToBob.getOutputStream()),
174+
ASAPEncounterConnectionType.INTERNET);
175+
176+
Thread.sleep(2000);
177+
Assertions.assertTrue(messageReceivedListenerBob.numberOfMessages > 0);
178+
179+
// handle connection after message from alice was received by bob
180+
claraEncounterManager.handleEncounter(
181+
StreamPairImpl.getStreamPair(socketClaraToBob.getInputStream(), socketClaraToBob.getOutputStream()),
182+
ASAPEncounterConnectionType.INTERNET);
183+
184+
// give it a moment to run ASAP session
185+
Thread.sleep(2000);
186+
Assertions.assertTrue(messageReceivedListenerClara.numberOfMessages > 0);
187+
}
188+
189+
}

0 commit comments

Comments
 (0)