|
|
@@ -0,0 +1,107 @@
|
|
|
+/*
|
|
|
+ * @author Ranides Atterwim <ranides@gmail.com>
|
|
|
+ * @copyright Ranides Atterwim
|
|
|
+ * @license WTFPL
|
|
|
+ * @url http://ranides.net/projects/assira
|
|
|
+ */
|
|
|
+package net.ranides.assira.io;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.OutputStream;
|
|
|
+import java.io.StringWriter;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.concurrent.ConcurrentLinkedQueue;
|
|
|
+import net.ranides.assira.text.TextEncoding;
|
|
|
+import net.ranides.assira.text.TextOutputStream;
|
|
|
+import net.ranides.assira.time.TimeUtils;
|
|
|
+import net.ranides.assira.trace.LoggerUtils;
|
|
|
+import org.apache.log4j.Level;
|
|
|
+import org.apache.log4j.WriterAppender;
|
|
|
+import org.junit.Test;
|
|
|
+import static org.junit.Assert.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ * @author msieron
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+public class AsyncStreamTest {
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testWriteLogger() throws IOException {
|
|
|
+ StringWriter errorsWriter = new StringWriter();
|
|
|
+ LoggerUtils.resetLogger4j(Level.ALL, new WriterAppender(LoggerUtils.LAYOUT, errorsWriter));
|
|
|
+
|
|
|
+ OutputStream ostream = new TSG();
|
|
|
+ OutputStream astream = AsyncStream.create(ostream, "logger");
|
|
|
+
|
|
|
+ astream.write(65);
|
|
|
+ astream.write("qwerty".getBytes(TextEncoding.NIO_UTF8));
|
|
|
+ astream.write("HELLO".getBytes(TextEncoding.NIO_UTF8), 1, 3);
|
|
|
+ astream.close();
|
|
|
+ astream.close();
|
|
|
+
|
|
|
+ TimeUtils.sleep(100);
|
|
|
+// System.out.println( "value=" + ostream.toString() );
|
|
|
+// System.out.println( "errors=" + errorsWriter.toString() );
|
|
|
+ assertEquals("AqwertyELL", ostream.toString());
|
|
|
+ // we don't check if ALL errors are reported
|
|
|
+ assertTrue(errorsWriter.toString().contains("already closed") );
|
|
|
+
|
|
|
+ LoggerUtils.resetLogger4j(false);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testWriteListener() throws IOException {
|
|
|
+ LoggerUtils.resetLogger4j(false);
|
|
|
+
|
|
|
+ final ConcurrentLinkedQueue<String> out = new ConcurrentLinkedQueue<>();
|
|
|
+
|
|
|
+ OutputStream ostream = new TSG();
|
|
|
+ OutputStream astream = AsyncStream.create(new AsyncStream.OutputListener(ostream) {
|
|
|
+ @Override
|
|
|
+ public void handleEvent(IOEvent event) {
|
|
|
+ out.add(event.toString());
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ astream.write(65);
|
|
|
+ astream.write("qwerty".getBytes(TextEncoding.NIO_UTF8));
|
|
|
+ astream.write("HELLO".getBytes(TextEncoding.NIO_UTF8), 1, 3);
|
|
|
+ astream.close();
|
|
|
+ astream.close();
|
|
|
+
|
|
|
+ TimeUtils.sleep(100);
|
|
|
+// System.out.println( "value=" + ostream.toString() );
|
|
|
+// System.out.println( "events=" + out.toString() );
|
|
|
+ assertEquals("AqwertyELL", ostream.toString());
|
|
|
+ List<String> expected = Arrays.asList(
|
|
|
+ "IOEvent.WriteByte: 65",
|
|
|
+ "IOEvent.WriteByteArray: 6",
|
|
|
+ "IOEvent.WriteByteArray: 3",
|
|
|
+ "IOEvent.Close",
|
|
|
+ "IOEvent.Failure: java.io.IOException: already closed",
|
|
|
+ "IOEvent.Failure: java.io.IOException: already closed"
|
|
|
+ );
|
|
|
+ assertEquals(expected, new ArrayList<>(out));
|
|
|
+ }
|
|
|
+
|
|
|
+ private static class TSG extends TextOutputStream {
|
|
|
+
|
|
|
+ private boolean opened = true;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void close() throws IOException {
|
|
|
+ if( !opened ) {
|
|
|
+ throw new IOException("already closed");
|
|
|
+ }
|
|
|
+ opened = false;
|
|
|
+ super.close();
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|