View Javadoc

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  		 * Send one message
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  		 * Send a second message
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  		 * Send a third message
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 		 * Send one message
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 		 * Send a second message
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 		 * Send a third message
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 		 * Send one message
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 		 * Send a third message
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 		 * Send one message
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 		 * Send a third message
217 		 */
218 		ourLog.info("*** Send message #2");
219 		
220 		try {
221 			response = client.sendAndReceive(new RawSendable(message));
222 		} catch (Exception e) {
223 			// We're allowed to fail once
224 		}
225 		
226 		// This try should succeed again
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 }