/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.util.stream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.util.Random;
import org.testng.annotations.Test;
/**
* Tests StreamUtil.
*
* @author John Mazzitelli
*/
@Test
public class StreamUtilTest {
public void testEscapeHtml() {
String dataString = "string with chars to be HTML-escaped: <>&|,'\"\\";
String escapedString = "string with chars to be HTML-escaped: <>&|,'"\";
// baseline check - see that not escaping works as usual
ByteArrayInputStream in = new ByteArrayInputStream(dataString.getBytes());
ByteArrayOutputStream out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, true, false) == dataString.length();
assert out.toString().equals(dataString);
// now see that escaping works making sure copy() returns the proper count, too
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
long bytesRead = StreamUtil.copy(in, out, true, true);
assert bytesRead == escapedString.length() : "bad count: " + bytesRead + "<->" + escapedString.length();
assert out.toString().equals(escapedString);
}
public void testCopyStreamRange() {
String dataString = "a test string that will be copied";
ByteArrayInputStream in;
ByteArrayOutputStream out;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 5, 5) == 5;
assert out.toString().equals(dataString.substring(5, 10));
// make sure StreamUtil didn't read ahead too many bytes
assert in.read() == dataString.charAt(10);
assert in.read() == dataString.charAt(11);
assert in.read() == dataString.charAt(12);
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 4, 20) == 20;
assert out.toString().equals(dataString.substring(4, 24));
assert in.read() == dataString.charAt(24);
assert in.read() == dataString.charAt(25);
assert in.read() == dataString.charAt(26);
// ask for more than what the string has - allow it
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 7, 100) == (dataString.length() - 7);
assert out.toString().equals(dataString.substring(7));
assert in.read() == -1;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 5, -1) == (dataString.length() - 5);
assert out.toString().equals(dataString.substring(5));
assert in.read() == -1;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 0, 1) == 1;
assert out.toString().equals(dataString.substring(0, 1));
assert in.read() == dataString.charAt(1);
assert in.read() == dataString.charAt(2);
assert in.read() == dataString.charAt(3);
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 0, -1) == dataString.length();
assert out.toString().equals(dataString);
assert in.read() == -1;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, dataString.length() - 1, 1) == 1;
assert out.toString().equals(dataString.substring(dataString.length() - 1));
assert in.read() == -1;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
try {
StreamUtil.copy(in, out, -1, 1);
assert false : "should not allow negative start byte";
} catch (RuntimeException ok) {
}
}
/**
* Tests copying stream whose contents is larger than the internal buffer used by StreamUtil.copy.
*/
public void testCopyStreamRangeLarge() {
final String letters = "abcdefghijklmnopqrstuvwxyz";
final int lettersLength = letters.length();
final Random rand = new Random();
byte[] dataStringBytes = new byte[100000];
for (int i = 0; i < dataStringBytes.length; i++) {
dataStringBytes[i] = (byte) letters.charAt(rand.nextInt(lettersLength));
}
String dataString = new String(dataStringBytes);
ByteArrayInputStream in;
ByteArrayOutputStream out;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 5, 5) == 5;
assert out.toString().equals(dataString.substring(5, 10));
// make sure StreamUtil didn't read ahead too many bytes
assert in.read() == dataString.charAt(10);
assert in.read() == dataString.charAt(11);
assert in.read() == dataString.charAt(12);
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 4, 20) == 20;
assert out.toString().equals(dataString.substring(4, 24));
assert in.read() == dataString.charAt(24);
assert in.read() == dataString.charAt(25);
assert in.read() == dataString.charAt(26);
// skip past the first full buffer (which is 32K, see StreamUtil)
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 50000, 40000) == 40000;
assert out.toString().equals(dataString.substring(50000, 90000));
assert in.read() == dataString.charAt(90000);
assert in.read() == dataString.charAt(90001);
assert in.read() == dataString.charAt(90002);
// ask for more than what the string has - allow it
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 7, dataStringBytes.length + 100) == (dataString.length() - 7);
assert out.toString().equals(dataString.substring(7));
assert in.read() == -1;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 5, -1) == (dataString.length() - 5);
assert out.toString().equals(dataString.substring(5));
assert in.read() == -1;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 0, 1) == 1;
assert out.toString().equals(dataString.substring(0, 1));
assert in.read() == dataString.charAt(1);
assert in.read() == dataString.charAt(2);
assert in.read() == dataString.charAt(3);
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, 0, -1) == dataString.length();
assert out.toString().equals(dataString);
assert in.read() == -1;
in = new ByteArrayInputStream(dataString.getBytes());
out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out, dataString.length() - 1, 1) == 1;
assert out.toString().equals(dataString.substring(dataString.length() - 1));
assert in.read() == -1;
}
public void testCopyStream() {
String dataString = "a test string that will be copied";
ByteArrayInputStream in = new ByteArrayInputStream(dataString.getBytes());
ByteArrayOutputStream out = new ByteArrayOutputStream();
assert StreamUtil.copy(in, out) == dataString.length();
assert out.toString().equals(dataString);
}
/**
* Test serialization methods.
*/
public void testSerialize() {
assert serializeDeserialize(new String("hello there")).equals("hello there");
}
/**
* Serializes and then deserializes object and returns the reconstituted object. After the deserialization, this
* method does not check for object equality but it does check that the reconstituted object is not the same as
* <code>o</code> (that is, the returned object != <code>o</code>).
*
* @param o object to test
*
* @return the object after its been serialized and then deserialized
*/
private Object serializeDeserialize(Serializable o) {
byte[] b = StreamUtil.serialize(o);
assert b != null;
Object o2 = StreamUtil.deserialize(b);
assert o2 != null;
assert o != o2;
return o2;
}
}