blob: 312c45d6eaa016ca62681ffdfc8e07654032252b [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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 com.android.tradefed.util;
import com.android.tradefed.result.ByteArrayInputStreamSource;
import com.android.tradefed.result.InputStreamSource;
import junit.framework.TestCase;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
/** Unit tests for the {@link com.android.tradefed.util.StreamUtil} utility class */
public class StreamUtilTest extends TestCase {
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#getByteArrayListFromSource} works as
* expected.
*/
public void testGetByteArrayListFromSource() throws Exception {
final String contents = "this is a string";
final byte[] contentBytes = contents.getBytes();
try (final InputStreamSource source = new ByteArrayInputStreamSource(contentBytes)) {
final InputStream stream = source.createInputStream();
final ByteArrayList output = StreamUtil.getByteArrayListFromStream(stream);
final byte[] outputBytes = output.getContents();
assertEquals(contentBytes.length, outputBytes.length);
for (int i = 0; i < contentBytes.length; ++i) {
assertEquals(contentBytes[i], outputBytes[i]);
}
}
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#getByteArrayListFromStream} works as
* expected.
*/
public void testGetByteArrayListFromStream() throws Exception {
final String contents = "this is a string";
final byte[] contentBytes = contents.getBytes();
final ByteArrayList output = StreamUtil.getByteArrayListFromStream(
new ByteArrayInputStream(contentBytes));
final byte[] outputBytes = output.getContents();
assertEquals(contentBytes.length, outputBytes.length);
for (int i = 0; i < contentBytes.length; ++i) {
assertEquals(contentBytes[i], outputBytes[i]);
}
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#getStringFromSource} works as
* expected.
*/
public void testGetStringFromSource() throws Exception {
final String contents = "this is a string";
try (InputStreamSource source = new ByteArrayInputStreamSource(contents.getBytes())) {
final InputStream stream = source.createInputStream();
final String output = StreamUtil.getStringFromStream(stream);
assertEquals(contents, output);
}
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#getBufferedReaderFromStreamSrc} works
* as expected.
*/
public void testGetBufferedReaderFromInputStream() throws Exception {
final String contents = "this is a string";
BufferedReader output = null;
try (InputStreamSource source = new ByteArrayInputStreamSource(contents.getBytes())) {
output = StreamUtil.getBufferedReaderFromStreamSrc(source);
assertEquals(contents, output.readLine());
} finally {
if (null != output) {
output.close();
}
}
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#countLinesFromSource} works as
* expected.
*/
public void testCountLinesFromSource() throws Exception {
final String contents = "foo\nbar\n\foo\n";
final InputStreamSource source = new ByteArrayInputStreamSource(contents.getBytes());
assertEquals(3, StreamUtil.countLinesFromSource(source));
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#getStringFromStream(InputStream)}
* works as expected.
*/
public void testGetStringFromStream() throws Exception {
final String contents = "this is a string";
final String output = StreamUtil.getStringFromStream(
new ByteArrayInputStream(contents.getBytes()));
assertEquals(contents, output);
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#getStringFromStream(InputStream,
* long)} works as expected.
*/
public void testGetStringFromStream_withLength() throws Exception {
final String contents = "this is a string";
final String output =
StreamUtil.getStringFromStream(new ByteArrayInputStream(contents.getBytes()), 5);
assertEquals("this ", output);
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#calculateCrc32(InputStream)} works as
* expected.
*
* @throws IOException
*/
public void testCalculateCrc32() throws IOException {
final String source = getLargeText();
final long crc32 = 3023941728L;
ByteArrayInputStream inputSource = new ByteArrayInputStream(source.getBytes());
long actualCrc32 = StreamUtil.calculateCrc32(inputSource);
assertEquals(crc32, actualCrc32);
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#calculateMd5(InputStream)} works as
* expected.
*
* @throws IOException
*/
public void testCalculateMd5() throws IOException {
final String source = "testtesttesttesttest";
final String md5 = "f317f682fafe0309c6a423af0b4efa59";
ByteArrayInputStream inputSource = new ByteArrayInputStream(source.getBytes());
String actualMd5 = StreamUtil.calculateMd5(inputSource);
assertEquals(md5, actualMd5);
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#calculateBase64Md5(InputStream)}
* works as expected.
*
* @throws IOException
*/
public void testCalculateBase64Md5() throws IOException {
final String source = "testtesttesttesttest";
final String base64Md5 = "8xf2gvr+AwnGpCOvC076WQ==";
ByteArrayInputStream inputSource = new ByteArrayInputStream(source.getBytes());
String actualBase64Md5 = StreamUtil.calculateBase64Md5(inputSource);
assertEquals(base64Md5, actualBase64Md5);
}
public void testCopyStreams() throws Exception {
String text = getLargeText();
ByteArrayInputStream bais = new ByteArrayInputStream(text.getBytes());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
StreamUtil.copyStreams(bais, baos);
bais.close();
baos.close();
assertEquals(text, baos.toString());
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#copyStreams(InputStream,
* OutputStream, int, int)} can copy partial content.
*/
public void testCopyStreams_partialSuccess() throws Exception {
String text = getLargeText();
StringBuilder builder = new StringBuilder(33 * 1024);
// Create a string longer than StreamUtil.BUF_SIZE
while (builder.length() < 32 * 1024) {
builder.append(text);
}
ByteArrayInputStream bais = new ByteArrayInputStream(builder.toString().getBytes());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Skip the first 1kB, and read longer than StreamUtil.BUF_SIZE
StreamUtil.copyStreams(bais, baos, 1024, 20 * 1024);
bais.close();
baos.close();
assertEquals(builder.toString().substring(1024, 21 * 1024), baos.toString());
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#copyStreams(InputStream,
* OutputStream, int, int)} cannot copy partial content if requested size is larger than what's
* available.
*/
public void testCopyStreams_partialFail() throws Exception {
ByteArrayInputStream bais = null;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
String text = getLargeText();
bais = new ByteArrayInputStream(text.getBytes());
// Skip the first 1kB, and read longer than the size of text
StreamUtil.copyStreams(bais, baos, 10, text.length() + 1024);
fail("IOException should be thrown when reading too much data.");
} catch (IOException e) {
// Ignore expected error.
} finally {
StreamUtil.close(bais);
}
}
public void testCopyStreamToWriter() throws Exception {
String text = getLargeText();
ByteArrayInputStream bais = new ByteArrayInputStream(text.getBytes());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(baos);
StreamUtil.copyStreamToWriter(bais, writer);
bais.close();
writer.close();
baos.close();
assertEquals(text, baos.toString());
}
/**
* Verify that {@link com.android.tradefed.util.StreamUtil#copyFileToStream(File, OutputStream)}
* works as expected.
*
* @throws IOException
*/
public void testCopyFileToStream() throws IOException {
String text = getLargeText();
File file = File.createTempFile("testCopyFileToStream", ".txt");
try {
FileUtil.writeToFile(text, file);
try (ByteArrayOutputStream outStream = new ByteArrayOutputStream()) {
StreamUtil.copyFileToStream(file, outStream);
assertEquals(text, outStream.toString());
}
} finally {
file.delete();
}
}
/**
* Returns a large chunk of text that's at least 16K in size
*/
private String getLargeText() {
String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, "
+ "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "
+ "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut "
+ "aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in "
+ "voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint "
+ "occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit "
+ "anim id est laborum."; // 446 bytes
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 40; i ++) {
sb.append(text);
}
return sb.toString();
}
}