/*
* Copyright 2010-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* 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://aws.amazon.com/apache2.0
*
* This file 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.amazonaws.util;
import static com.amazonaws.util.LengthCheckInputStream.EXCLUDE_SKIPPED_BYTES;
import static com.amazonaws.util.LengthCheckInputStream.INCLUDE_SKIPPED_BYTES;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import com.amazonaws.AmazonClientException;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class LengthCheckInputStreamTest {
String sampleData = "__________1234567890__________12345678901234567890"
+ "12345678901234567890123456789012345678901234567890"
+ "12345678901234567890123456789012345678901234567890"
+ "12345678901234567890123456789012345678901234567890"
+ "12345678901234567890123456789012345678909876543210";
/**
* Tests if the content length set in the stream equals the bytes read from
* the stream. If any exception is thrown, then the test fails.
*/
@Test
public void testContentLength() throws Exception {
InputStream in = new ByteArrayInputStream(sampleData.getBytes(StringUtils.UTF8));
LengthCheckInputStream rvis = new LengthCheckInputStream(in,
sampleData.getBytes(StringUtils.UTF8).length, INCLUDE_SKIPPED_BYTES);
try {
StreamUtils.consumeInputStream(rvis);
} catch (Exception e) {
fail();
}
rvis.close();
}
/**
* This test case initiates a mark at the start, reads the first 100 bytes
* from the stream. Now the stream is reset and it is drained. At the last
* read, the length validation must be success.
*/
@Test
public void testMarkInitiallyAndReset() throws Exception {
InputStream in = new ByteArrayInputStream(sampleData.getBytes(StringUtils.UTF8));
LengthCheckInputStream rvis = new LengthCheckInputStream(in,
sampleData.getBytes(StringUtils.UTF8).length, INCLUDE_SKIPPED_BYTES);
rvis.mark(100);
rvis.read(new byte[100]);
rvis.reset();
rvis.read(new byte[sampleData.getBytes(StringUtils.UTF8).length]);
try {
rvis.read();
} catch (Exception e) {
fail();
}
rvis.close();
StreamUtils.consumeInputStream(rvis);
}
/**
* This test case initiates a mark after reading 100 bytes from the stream.
* Reads the next 100 bytes from the stream. Now the stream is reset and it
* is drained. At the last read, the length validation must fail because the
* stream was initialized with wrong expected length.
*/
@Test
public void testMarkAndResetWithWrongExpectedLength() throws Exception {
InputStream in = new ByteArrayInputStream(sampleData.getBytes(StringUtils.UTF8));
LengthCheckInputStream rvis = new LengthCheckInputStream(in,
sampleData.getBytes(StringUtils.UTF8).length + 1, INCLUDE_SKIPPED_BYTES);
rvis.read(new byte[100]);
rvis.mark(100);
rvis.read(new byte[100]);
rvis.reset();
rvis.read(new byte[sampleData.getBytes(StringUtils.UTF8).length - 100]);
try {
rvis.read();
fail();
} catch (Exception e) {
System.out
.println("Exception occurred. Message: " + e.getMessage());
}
rvis.close();
}
/**
* This test case initiates a marks the stream initially, drains the whole
* stream. Resets the stream and drains again.
*/
@Test
public void testMarkAndResetAtEnd() throws Exception {
InputStream in = new ByteArrayInputStream(sampleData.getBytes(StringUtils.UTF8));
LengthCheckInputStream rvis = new LengthCheckInputStream(in,
sampleData.getBytes(StringUtils.UTF8).length, INCLUDE_SKIPPED_BYTES);
rvis.mark(100);
StreamUtils.consumeInputStream(rvis);
rvis.reset();
StreamUtils.consumeInputStream(rvis);
try {
rvis.read();
} catch (Exception e) {
fail();
}
rvis.close();
}
/**
* Actual number of bytes consumed is exactly what's expected, when skipped
* bytes are included.
*/
@Test
public void testSkipIncluded() throws IOException {
byte[] bytes = new byte[100];
InputStream is = new LengthCheckInputStream(
new ByteArrayInputStream(bytes), 100, INCLUDE_SKIPPED_BYTES);
assertTrue(10 == is.skip(10));
StreamUtils.consumeInputStream(is);
is.close();
}
/**
* Actual number of bytes consumed is more than what's expected, when
* skipped bytes are included.
*/
@Test
public void testSkipIncludedFailure() throws IOException {
byte[] bytes = new byte[100];
InputStream is = new LengthCheckInputStream(
new ByteArrayInputStream(bytes), 90, INCLUDE_SKIPPED_BYTES);
assertTrue(10 == is.skip(10));
try {
StreamUtils.consumeInputStream(is);
fail();
} catch (AmazonClientException ex) {
// expected
}
is.close();
}
/**
* Actual number of bytes consumed is exactly what's expected, when skipped
* bytes are excluded.
*/
@Test
public void testSkipExcluded() throws IOException {
byte[] bytes = new byte[100];
InputStream is = new LengthCheckInputStream(
new ByteArrayInputStream(bytes), 90, EXCLUDE_SKIPPED_BYTES);
assertTrue(10 == is.skip(10));
StreamUtils.consumeInputStream(is);
is.close();
}
/**
* Actual number of bytes consumed is less than what's expected, when
* skipped bytes are excluded.
*/
@Test
public void testSkipExcludedFailure() throws IOException {
byte[] bytes = new byte[100];
LengthCheckInputStream is = new LengthCheckInputStream(
new ByteArrayInputStream(bytes), 100, EXCLUDE_SKIPPED_BYTES);
assertTrue(10 == is.skip(10));
try {
StreamUtils.consumeInputStream(is);
fail();
} catch (AmazonClientException ex) {
// expected
}
is.close();
}
/**
* Skipped more than what's expected.
*/
@Test
public void testOverSkipped() throws IOException {
byte[] bytes = new byte[100];
LengthCheckInputStream is = new LengthCheckInputStream(
new ByteArrayInputStream(bytes), 99, INCLUDE_SKIPPED_BYTES);
try {
is.skip(100);
fail();
} catch (AmazonClientException ex) {
// expected
}
is.close();
}
}