/*
* JBoss, Home of Professional Open Source.
*
* Copyright 2012 Red Hat, Inc. and/or its affiliates, and individual
* contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xnio.streams;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import org.junit.Test;
/**
* Test for {@link WriterOutputStream}.
*
* @author <a href="mailto:flavia.rainone@jboss.com">Flavia Rainone</a>
*/
public class WriterOutputStreamTestCase {
@Test
public void invalidConstructorArguments() throws IOException {
// null writer
Exception expected = null;
try {
new WriterOutputStream(null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
new WriterOutputStream(null, Charset.defaultCharset());
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
new WriterOutputStream(null, Charset.defaultCharset().newDecoder());
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
new WriterOutputStream(null, "UTF-8");
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
new WriterOutputStream(null, Charset.defaultCharset().newDecoder(), 10000);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
// null char set
final StringWriter writer = new StringWriter();
expected = null;
try {
new WriterOutputStream(writer, (Charset) null);
} catch (NullPointerException e) {
expected = e;
}
assertNotNull(expected);
// null char set name
expected = null;
try {
new WriterOutputStream(writer, (String) null);
} catch (IllegalArgumentException e) {
expected= e;
}
assertNotNull(expected);
// null decoder
expected = null;
try {
new WriterOutputStream(writer, (CharsetDecoder) null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
new WriterOutputStream(writer, null, 10000);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
// negative buffer size
expected = null;
try {
new WriterOutputStream(writer, Charset.defaultCharset().newDecoder(), -15000);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
// zero buffer length
expected = null;
try {
new WriterOutputStream(writer, Charset.defaultCharset().newDecoder(), 0);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
@Test
public void writeBytes() throws IOException {
final StringWriter writer = new StringWriter();
final WriterOutputStream stream = new WriterOutputStream(writer);
stream.write('w');
stream.write('r');
stream.write('i');
stream.write('t');
stream.write('e');
assertEquals("", writer.getBuffer().toString());
stream.flush();
assertEquals("write", writer.getBuffer().toString());
closeStream(stream, writer, "write");
}
@Test
public void writeByteArray() throws IOException {
final StringWriter writer = new StringWriter();
final WriterOutputStream stream = new WriterOutputStream(writer, "UTF-8");
stream.write("write".getBytes("UTF-8"));
assertEquals("", writer.getBuffer().toString());
stream.flush();
assertEquals("write", writer.getBuffer().toString());
closeStream(stream, writer, "write");
}
@Test
public void writeOverflowsInternalBuffer() throws IOException {
final StringWriter writer = new StringWriter();
final WriterOutputStream stream = new WriterOutputStream(writer, Charset.defaultCharset().newDecoder(), 3);
stream.write('w');
stream.write('r');
stream.write('i');
assertEquals("", writer.getBuffer().toString());
stream.write('t');
assertEquals("wri", writer.getBuffer().toString());
stream.write('e');
assertEquals("wri", writer.getBuffer().toString());
stream.flush();
assertEquals("write", writer.getBuffer().toString());
closeStream(stream, writer, "write");
}
@Test
public void writeByteArrayOverflowsInternalBuffer() throws IOException {
final StringWriter writer = new StringWriter();
final WriterOutputStream stream = new WriterOutputStream(writer, Charset.defaultCharset().newDecoder(), 3);
stream.write("w r i t e".getBytes("UTF-8"), 2, 5);
assertEquals("r i", writer.getBuffer().toString());
stream.flush();
assertEquals("r i t", writer.getBuffer().toString());
closeStream(stream, writer, "r i t");
}
@Test
public void closeStream() throws IOException {
final StringWriter writer = new StringWriter();
final WriterOutputStream stream = new WriterOutputStream(writer, Charset.defaultCharset().newDecoder(), 10);
stream.write('a');
stream.write("bcd".getBytes("UTF-8"));
assertEquals("", writer.getBuffer().toString());
stream.flush();
assertEquals("abcd", writer.getBuffer().toString());
stream.write("eefghijklm".getBytes("UTF-8"), 1, 8);
assertEquals("abcd", writer.getBuffer().toString());
stream.write('m');
assertEquals("abcd", writer.getBuffer().toString());
stream.write('n');
assertEquals("abcd", writer.getBuffer().toString());
closeStream(stream, writer, "abcdefghijklmn");
}
@Test
public void closeEmptyStream() throws IOException {
final StringWriter writer = new StringWriter();
final WriterOutputStream stream = new WriterOutputStream(writer, Charset.defaultCharset().newDecoder(), 10);
closeStream(stream, writer, "");
}
private void closeStream(WriterOutputStream stream, StringWriter writer, String writtenString) throws IOException {
stream.close();
assertEquals(writtenString, writer.getBuffer().toString());
IOException expected = null;
try {
stream.write('a');
} catch (IOException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(writtenString, writer.getBuffer().toString());
expected = null;
try {
stream.write("abc".getBytes("UTF-8"));
} catch (IOException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(writtenString, writer.getBuffer().toString());
expected = null;
try {
stream.write("abc".getBytes("UTF-8"), 1, 1);
} catch (IOException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(writtenString, writer.getBuffer().toString());
expected = null;
try {
stream.flush();
} catch (IOException e) {
expected = e;
}
assertNotNull(expected);
assertEquals(writtenString, writer.getBuffer().toString());
assertNotNull(stream.toString());
}
}