blob: 75dab13f326846d321c2d5fc525429e60c7ec232 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.struts2.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import junit.framework.TestCase;
/**
* Basic tests of FastByteArrayOutputStream
*/
public class FastByteArrayOutputStreamTest extends TestCase {
final String utf16_String = new String("Standard string with accented characters \u00E7\u00E8\u00E9 in the middle");
final String utf8_String = new String(utf16_String.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
final String iso8859_1_String = new String(utf16_String.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.ISO_8859_1);
/**
* Test usage UTF8 to UTF8
*
* No Warn log output produced
*/
public void testUTF8WriteToUTF8() {
FastByteArrayOutputStream fbaos = new FastByteArrayOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
OutputStreamWriter osw = null;
try {
assertTrue("UTF-8 string length not same as UTF-16", utf16_String.length() == utf8_String.length());
fbaos.write(utf8_String.getBytes("UTF-8"));
osw = new OutputStreamWriter(baos, "UTF-8");
fbaos.writeTo(osw, "UTF-8");
osw.flush();
// Expect matching encodings will result in consistent output
assertTrue("Result is empty", baos.toString("UTF-8").length() > 0);
assertEquals("UTF8 string doesn't match buffer write result", utf8_String, baos.toString("UTF-8"));
}
catch(UnsupportedEncodingException ue) {
fail("Unexpected UnsupportedEncodingException during test: " + ue);
}
catch(IOException ioe) {
fail("Unexpected IOException during test: " + ioe);
}
finally {
if (osw != null) {
try {
osw.close();
}
catch (Exception ex) {}
}
if (baos != null) {
try {
baos.close();
}
catch (Exception ex) {}
}
if (fbaos != null) {
try {
fbaos.close();
}
catch (Exception ex) {}
}
}
}
/**
* Test Usage ISO8859-1 to ISO8859-1
*
* No Warn log output produced
*/
public void testISO8859_1WriteToISO8859_1() {
FastByteArrayOutputStream fbaos = new FastByteArrayOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
OutputStreamWriter osw = null;
try {
assertTrue("ISO-8859-1 string length not same as UTF-16", utf16_String.length() == iso8859_1_String.length());
fbaos.write(iso8859_1_String.getBytes("ISO-8859-1"));
osw = new OutputStreamWriter(baos, "ISO-8859-1");
fbaos.writeTo(osw, "ISO-8859-1");
osw.flush();
// Expect matching encodings will result in consistent output
assertTrue("Result is empty", baos.toString("ISO-8859-1").length() > 0);
assertEquals("ISO-8859-1 string doesn't match buffer write result", iso8859_1_String, baos.toString("ISO-8859-1"));
}
catch(UnsupportedEncodingException ue) {
fail("Unexpected UnsupportedEncodingException during test: " + ue);
}
catch(IOException ioe) {
fail("Unexpected IOException during test: " + ioe);
}
finally {
if (osw != null) {
try {
osw.close();
}
catch (Exception ex) {}
}
if (baos != null) {
try {
baos.close();
}
catch (Exception ex) {}
}
if (fbaos != null) {
try {
fbaos.close();
}
catch (Exception ex) {}
}
}
}
/**
* Test Usage UTF8 to ISO8859-1
*
* No Warn log output produced
*/
public void testUTF8WriteToISO8859_1() {
FastByteArrayOutputStream fbaos = new FastByteArrayOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
OutputStreamWriter osw = null;
try {
assertTrue("UTF-8 string length not same as UTF-16", utf16_String.length() == utf8_String.length());
fbaos.write(utf8_String.getBytes("UTF-8"));
osw = new OutputStreamWriter(baos, "ISO-8859-1");
fbaos.writeTo(osw, "ISO-8859-1");
osw.flush();
// Although encodings mismatch, decoding the test UTF-8 string into ISO-8859-1 does not result in truncation.
// Behaviour may be related to the CodingErrorAction.REPLACE setting for the CharsetDecoder.
assertTrue("Result is empty", baos.toString("UTF-8").length() > 0);
assertTrue("UTF-8 string does not match buffer write result (truncation)", utf8_String.equals(baos.toString("UTF-8")));
assertFalse("Buffer write result truncated", baos.toString("UTF-8").length() < utf8_String.length());
}
catch(UnsupportedEncodingException ue) {
fail("Unexpected UnsupportedEncodingException during test: " + ue);
}
catch(IOException ioe) {
fail("Unexpected IOException during test: " + ioe);
}
finally {
if (osw != null) {
try {
osw.close();
}
catch (Exception ex) {}
}
if (baos != null) {
try {
baos.close();
}
catch (Exception ex) {}
}
if (fbaos != null) {
try {
fbaos.close();
}
catch (Exception ex) {}
}
}
}
/**
* Test Usage ISO8859-1 to UTF8
*
* A single Warn log output produced
*/
public void testISO8859_1WriteToUTF8() {
FastByteArrayOutputStream fbaos = new FastByteArrayOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
OutputStreamWriter osw = null;
try {
assertTrue("ISO-8859-1 string length not same as UTF-16", utf16_String.length() == iso8859_1_String.length());
fbaos.write(iso8859_1_String.getBytes("ISO-8859-1"));
osw = new OutputStreamWriter(baos, "UTF-8");
fbaos.writeTo(osw, "UTF-8");
osw.flush();
// Expect mismatched encodings will result in inconsistent output.
// This will produce a Warn log output from FastByteArrayOutputStream
// The UTF-8 decoder interprets the accented characters (C0-FF) as malformed
// input and decoding halts (which results in truncation of the input string at
// the point of the accented characters).
assertTrue("Result is empty", baos.toString("UTF-8").length() > 0);
assertFalse("UTF-8 string matches buffer write result (no truncation)", utf8_String.equals(baos.toString("UTF-8")));
assertTrue("Buffer write result not truncated", baos.toString("UTF-8").length() < utf8_String.length());
}
catch(UnsupportedEncodingException ue) {
fail("Unexpected UnsupportedEncodingException during test: " + ue);
}
catch(IOException ioe) {
fail("Unexpected IOException during test: " + ioe);
}
finally {
if (osw != null) {
try {
osw.close();
}
catch (Exception ex) {}
}
if (baos != null) {
try {
baos.close();
}
catch (Exception ex) {}
}
if (fbaos != null) {
try {
fbaos.close();
}
catch (Exception ex) {}
}
}
}
}