/*
* 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.sshd.common.util.io;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import org.apache.sshd.util.test.BaseTestSupport;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
/**
* @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class LimitInputStreamTest extends BaseTestSupport {
public LimitInputStreamTest() {
super();
}
@Test
public void testReadLimit() throws IOException {
Path targetPath = detectTargetFolder();
Path rootFolder = assertHierarchyTargetFolderExists(targetPath.resolve(getClass().getSimpleName()));
Path inputFile = rootFolder.resolve(getCurrentTestName() + ".bin");
byte[] data = (getClass().getName() + "#" + getCurrentTestName()).getBytes(StandardCharsets.UTF_8);
Files.write(inputFile, data);
try (InputStream in = Files.newInputStream(inputFile)) {
int maxLen = data.length / 2;
byte[] expected = new byte[maxLen];
System.arraycopy(data, 0, expected, 0, expected.length);
byte[] actual = new byte[expected.length];
try (LimitInputStream limited = new LimitInputStream(in, expected.length)) {
assertTrue("Limited stream not marked as open", limited.isOpen());
assertEquals("Mismatched initial available data size", expected.length, limited.available());
int readLen = limited.read(actual);
assertEquals("Incomplete actual data read", actual.length, readLen);
assertArrayEquals("Mismatched read data", expected, actual);
assertEquals("Mismatched remaining available data size", 0, limited.available());
readLen = limited.read();
assertTrue("Unexpected success to read one more byte: " + readLen, readLen < 0);
readLen = limited.read(actual);
assertTrue("Unexpected success to read extra buffer: " + readLen, readLen < 0);
limited.close();
assertFalse("Limited stream still marked as open", limited.isOpen());
try {
readLen = limited.read();
fail("Unexpected one byte read success after close");
} catch (IOException e) {
// expected
}
try {
readLen = limited.read(actual);
fail("Unexpected buffer read success after close: " + readLen);
} catch (IOException e) {
// expected
}
try {
readLen = limited.read(actual);
fail("Unexpected buffer read success after close: " + readLen);
} catch (IOException e) {
// expected
}
try {
readLen = (int) limited.skip(Byte.SIZE);
fail("Unexpected skip success after close: " + readLen);
} catch (IOException e) {
// expected
}
try {
readLen = limited.available();
fail("Unexpected available success after close: " + readLen);
} catch (IOException e) {
// expected
}
}
// make sure underlying stream not closed
int readLen = in.read(actual);
assertEquals("Incomplete extra data read", Math.min(actual.length, data.length - expected.length), readLen);
}
}
}