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