11package org .fluentd .logger ;
22
3+ import org .fluentd .logger .errorhandler .ErrorHandler ;
34import org .fluentd .logger .sender .Event ;
45import org .fluentd .logger .sender .NullSender ;
56import org .fluentd .logger .util .MockFluentd ;
1718import java .util .concurrent .ExecutorService ;
1819import java .util .concurrent .Executors ;
1920import java .util .concurrent .TimeUnit ;
21+ import java .util .concurrent .atomic .AtomicReference ;
2022
21- import static org .junit .Assert .assertEquals ;
22- import static org .junit .Assert .assertFalse ;
23- import static org .junit .Assert .assertTrue ;
23+ import static org .junit .Assert .*;
2424
2525public class TestFluentLogger {
2626 private Logger _logger = LoggerFactory .getLogger (TestFluentLogger .class );
@@ -203,9 +203,11 @@ public void testReconnection() throws Exception {
203203 int port = MockFluentd .randomPort ();
204204 String host = "localhost" ;
205205 final List <Event > elist1 = new ArrayList <Event >();
206+ final AtomicReference <Exception > lastError = new AtomicReference <Exception >();
206207
207208 FixedThreadManager threadManager = new FixedThreadManager (2 );
208209
210+ // run a fluentd
209211 MockFluentd fluentd1 = new MockFluentd (port , new MockFluentd .MockProcess () {
210212 public void process (MessagePack msgpack , Socket socket ) throws IOException {
211213 BufferedInputStream in = new BufferedInputStream (socket .getInputStream ());
@@ -226,8 +228,16 @@ public void process(MessagePack msgpack, Socket socket) throws IOException {
226228 });
227229 threadManager .submit (fluentd1 );
228230
229- // start loggers
230- FluentLogger logger = FluentLogger .getLogger ("testtag" , host , port );
231+ // start a logger
232+ final FluentLogger logger = FluentLogger .getLogger ("testtag" , host , port );
233+ final ErrorHandler errorHandler = new ErrorHandler () {
234+ @ Override
235+ public void handleNetworkError (IOException ex ) {
236+ lastError .set (ex );
237+ }
238+ };
239+ logger .setErrorHandler (errorHandler );
240+
231241 assertFalse (logger .isConnected ());
232242 {
233243 Map <String , Object > data = new HashMap <String , Object >();
@@ -237,21 +247,46 @@ public void process(MessagePack msgpack, Socket socket) throws IOException {
237247 }
238248 assertTrue (logger .isConnected ());
239249
250+ // close the fluentd to make the situation that the fluentd gets down
240251 TimeUnit .MILLISECONDS .sleep (500 );
241252 _logger .info ("Closing the current fluentd instance" );
242253 fluentd1 .closeClientSockets ();
243254 fluentd1 .close ();
244255
256+ // the logger should fail to send an event
245257 TimeUnit .MILLISECONDS .sleep (500 );
246258 assertTrue (logger .isConnected ());
259+ for (int i = 0 ; i < 2 ; i ++) {
260+ // repeat twice to test both behaviors on socket write error and connection error
261+ assertNull (lastError .get ());
262+ {
263+ // writing to the closed socket
264+ Map <String , Object > data = new HashMap <String , Object >();
265+ data .put ("k3" , "v3" );
266+ data .put ("k4" , "v4" );
267+ logger .log ("test01" , data );
268+ }
269+ assertTrue (lastError .get () instanceof IOException );
270+ lastError .set (null ); // Clear the last error
271+ assertFalse (logger .isConnected ());
272+ TimeUnit .MILLISECONDS .sleep (100 );
273+ }
274+
275+ // the logger shouldn't call the error handler after calling removeErrorHandler()
276+ logger .removeErrorHandler ();
247277 {
278+ // writing to the closed socket
248279 Map <String , Object > data = new HashMap <String , Object >();
249280 data .put ("k3" , "v3" );
250281 data .put ("k4" , "v4" );
251282 logger .log ("test01" , data );
252283 }
253- assertFalse (logger .isConnected ());
284+ assertNull (lastError .get ());
285+ lastError .set (null ); // Clear the last error
254286
287+ logger .setErrorHandler (errorHandler );
288+
289+ // run the fluentd again
255290 final List <Event > elist2 = new ArrayList <Event >();
256291 MockFluentd fluentd2 = new MockFluentd (port , new MockFluentd .MockProcess () {
257292 public void process (MessagePack msgpack , Socket socket ) throws IOException {
@@ -270,14 +305,15 @@ public void process(MessagePack msgpack, Socket socket) throws IOException {
270305 });
271306 threadManager .submit (fluentd2 );
272307
308+ // the logger should send an event successfully
273309 TimeUnit .MILLISECONDS .sleep (500 );
274-
275310 {
276311 Map <String , Object > data = new HashMap <String , Object >();
277312 data .put ("k5" , "v5" );
278313 data .put ("k6" , "v6" );
279314 logger .log ("test01" , data );
280315 }
316+ assertNull (lastError .get ());
281317 assertTrue (logger .isConnected ());
282318
283319 // close loggers
@@ -289,14 +325,16 @@ public void process(MessagePack msgpack, Socket socket) throws IOException {
289325 // wait for unpacking event data on fluentd
290326 TimeUnit .MILLISECONDS .sleep (2000 );
291327 threadManager .join ();
328+ assertNull (lastError .get ());
292329
293330 // check data
294331 assertEquals (1 , elist1 .size ());
295332 assertEquals ("testtag.test01" , elist1 .get (0 ).tag );
296333
297- assertEquals (2 , elist2 .size ());
298- assertEquals ("testtag.test01" , elist2 .get (0 ).tag );
299- assertEquals ("testtag.test01" , elist2 .get (1 ).tag );
334+ assertEquals (4 , elist2 .size ());
335+ for (int i = 0 ; i < elist2 .size (); i ++) {
336+ assertEquals ("testtag.test01" , elist2 .get (i ).tag );
337+ }
300338 }
301339
302340 @ Test
0 commit comments