1 package ca.uhn.hl7v2.hoh.raw.client;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.After;
6 import org.junit.Before;
7 import org.junit.Test;
8
9 import ca.uhn.hl7v2.hoh.api.DecodeException;
10 import ca.uhn.hl7v2.hoh.api.IReceivable;
11 import ca.uhn.hl7v2.hoh.auth.SingleCredentialClientCallback;
12 import ca.uhn.hl7v2.hoh.auth.SingleCredentialServerCallback;
13 import ca.uhn.hl7v2.hoh.encoder.EncodingStyle;
14 import ca.uhn.hl7v2.hoh.llp.Hl7OverHttpLowerLayerProtocol;
15 import ca.uhn.hl7v2.hoh.llp.ServerSocketThreadForTesting;
16 import ca.uhn.hl7v2.hoh.raw.api.RawSendable;
17 import ca.uhn.hl7v2.hoh.util.RandomServerPortProvider;
18 import ca.uhn.hl7v2.hoh.util.ServerRoleEnum;
19
20 public class HohRawClientMultithreadedTest {
21 private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(HohRawClientMultithreadedTest.class);
22 private static int myPort;
23 private static Hl7OverHttpLowerLayerProtocol myLlp;
24 private static SingleCredentialServerCallback ourServerCallback;
25 private static ServerSocketThreadForTesting myServerSocketThread;
26
27 @Test
28 public void testSendMessageSimple() throws Exception {
29
30 String message =
31 "MSH|^~\\&|||||200803051508||ADT^A31|2|P|2.5\r" +
32 "EVN||200803051509\r" +
33 "PID|||ZZZZZZ83M64Z148R^^^SSN^SSN^^20070103\r";
34
35 HohRawClientMultithreaded client = new HohRawClientMultithreaded("localhost", myPort, "/theUri");
36 client.setSocketTimeout(500);
37
38 client.setAuthorizationCallback(new SingleCredentialClientCallback("hello", "hapiworld"));
39
40
41
42
43 ourLog.info("*** Send message #1");
44
45 IReceivable<String> response = client.sendAndReceive(new RawSendable(message));
46 assertEquals(message, myServerSocketThread.getMessage());
47 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
48
49 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
50 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
51 assertEquals(1, myServerSocketThread.getConnectionCount());
52
53
54
55
56
57 ourLog.info("*** Send message #2");
58
59 response = client.sendAndReceive(new RawSendable(message));
60 assertEquals(message, myServerSocketThread.getMessage());
61 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
62
63 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
64 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
65 assertEquals(1, myServerSocketThread.getConnectionCount());
66
67 Thread.sleep(1000);
68
69
70
71
72 ourLog.info("*** Send message #3");
73
74 response = client.sendAndReceive(new RawSendable(message));
75 assertEquals(message, myServerSocketThread.getMessage());
76 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
77
78 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
79 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
80 assertEquals(2, myServerSocketThread.getConnectionCount());
81
82 }
83
84 @Test
85 public void testSendMessageAndRespectCloseHeaderInResponse() throws Exception {
86
87 String message =
88 "MSH|^~\\&|||||200803051508||ADT^A31|2|P|2.5\r" +
89 "EVN||200803051509\r" +
90 "PID|||ZZZZZZ83M64Z148R^^^SSN^SSN^^20070103\r";
91
92 HohRawClientMultithreaded client = new HohRawClientMultithreaded("localhost", myPort, "/theUri");
93 client.setSocketTimeout(500);
94
95 client.setAuthorizationCallback(new SingleCredentialClientCallback("hello", "hapiworld"));
96
97 myServerSocketThread.setCloseNormallyWithHeaderAfterEachMessage();
98
99
100
101
102 ourLog.info("*** Send message #1");
103
104 IReceivable<String> response = client.sendAndReceive(new RawSendable(message));
105 assertEquals(message, myServerSocketThread.getMessage());
106 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
107
108 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
109 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
110 assertEquals(1, myServerSocketThread.getConnectionCount());
111
112
113
114
115
116 ourLog.info("*** Send message #2");
117
118 response = client.sendAndReceive(new RawSendable(message));
119 assertEquals(message, myServerSocketThread.getMessage());
120 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
121
122 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
123 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
124 assertEquals(2, myServerSocketThread.getConnectionCount());
125
126 Thread.sleep(1000);
127
128
129
130
131 ourLog.info("*** Send message #3");
132
133 response = client.sendAndReceive(new RawSendable(message));
134 assertEquals(message, myServerSocketThread.getMessage());
135 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
136
137 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
138 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
139 assertEquals(3, myServerSocketThread.getConnectionCount());
140
141 }
142
143 @Test
144 public void testSendMessageWithNoTimeout() throws Exception {
145
146 String message =
147 "MSH|^~\\&|||||200803051508||ADT^A31|2|P|2.5\r" +
148 "EVN||200803051509\r" +
149 "PID|||ZZZZZZ83M64Z148R^^^SSN^SSN^^20070103\r";
150
151 HohRawClientMultithreaded client = new HohRawClientMultithreaded("localhost", myPort, "/theUri");
152 client.setSocketTimeout(-1);
153
154 client.setAuthorizationCallback(new SingleCredentialClientCallback("hello", "hapiworld"));
155
156
157
158
159 ourLog.info("*** Send message #1");
160
161 IReceivable<String> response = client.sendAndReceive(new RawSendable(message));
162 assertEquals(message, myServerSocketThread.getMessage());
163 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
164
165 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
166 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
167 assertEquals(1, myServerSocketThread.getConnectionCount());
168
169 Thread.sleep(1000);
170
171
172
173
174 ourLog.info("*** Send message #2");
175
176 response = client.sendAndReceive(new RawSendable(message));
177 assertEquals(message, myServerSocketThread.getMessage());
178 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
179
180 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
181 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
182 assertEquals(1, myServerSocketThread.getConnectionCount());
183
184 }
185
186 @Test
187 public void testReconnectAutomaticallyAfterUnexpectedClose() throws Exception {
188 myServerSocketThread.setCloseUnexpectedlyAfterEachMessage();
189
190 String message =
191 "MSH|^~\\&|||||200803051508||ADT^A31|2|P|2.5\r" +
192 "EVN||200803051509\r" +
193 "PID|||ZZZZZZ83M64Z148R^^^SSN^SSN^^20070103\r";
194
195 HohRawClientMultithreaded client = new HohRawClientMultithreaded("localhost", myPort, "/theUri");
196 client.setSocketTimeout(1000);
197
198 client.setAuthorizationCallback(new SingleCredentialClientCallback("hello", "hapiworld"));
199
200
201
202
203 ourLog.info("*** Send message #1");
204
205 IReceivable<String> response = client.sendAndReceive(new RawSendable(message));
206 assertEquals(message, myServerSocketThread.getMessage());
207 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
208
209 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
210 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
211 assertEquals(1, myServerSocketThread.getConnectionCount());
212
213 Thread.sleep(100);
214
215
216
217
218 ourLog.info("*** Send message #2");
219
220 try {
221 response = client.sendAndReceive(new RawSendable(message));
222 } catch (Exception e) {
223
224 }
225
226
227 response = client.sendAndReceive(new RawSendable(message));
228 assertEquals(message, myServerSocketThread.getMessage());
229 assertEquals(myServerSocketThread.getReply().encode(), response.getMessage());
230
231 assertEquals(EncodingStyle.ER7.getContentType(), myServerSocketThread.getContentType());
232 assertEquals(EncodingStyle.ER7, myServerSocketThread.getEncoding());
233 assertEquals(2, myServerSocketThread.getConnectionCount());
234
235 }
236 @After
237 public void after() throws InterruptedException {
238 ourLog.info("Marking done as true");
239 myServerSocketThread.done();
240 }
241
242 @Before
243 public void before() throws InterruptedException {
244 myPort = RandomServerPortProvider.findFreePort();
245
246 myLlp = new Hl7OverHttpLowerLayerProtocol(ServerRoleEnum.CLIENT);
247 myLlp.setAuthorizationCallback(new SingleCredentialClientCallback("hello", "hapiworld"));
248 ourServerCallback = new SingleCredentialServerCallback("hello", "hapiworld");
249
250 myServerSocketThread = new ServerSocketThreadForTesting(myPort, ourServerCallback);
251 myServerSocketThread.start();
252 myServerSocketThread.getLatch().await();
253 }
254
255 }