/*
* JBoss, Home of Professional Open Source.
* Copyright 2010, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.process.protocol;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Random;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* @author <a href="mailto:david.lloyd@redhat.com">David M. Lloyd</a>
*/
public final class PipeTest {
private static final long SEED = 123L;
@Test
public void testClose() throws Exception {
Pipe pipe = new Pipe(8192);
InputStream in = pipe.getIn();
OutputStream out = pipe.getOut();
out.close();
try {
out.write(0);
fail("Expected exception");
} catch (IOException expected) {
}
assertEquals(-1, in.read());
// should be idempotent
out.close();
// should not throw exception
in.close();
// should return immediately
pipe.await();
}
static int[] ints(int... v) {
return v;
}
@Test
public void testIntegrity() throws Exception {
Thread thread = null;
try {
for (final int bufSize : ints(31, 256, 8192)) {
for (final int pieceSize : ints(31, 64, 127)) {
final int pieceCnt = (1 << 17) / pieceSize;
System.out.printf("Buffer size: %d; piece size: %d; piece count %d\n", Integer.valueOf(bufSize), Integer.valueOf(pieceSize), Integer.valueOf(pieceCnt));
final int finalSize = pieceCnt * pieceSize;
final Pipe pipe = new Pipe(bufSize);
InputStream in = pipe.getIn();
// fire up the write thread
thread = new Thread(new Runnable() {
public void run() {
final Random rng = new Random(SEED);
final byte[] piece = new byte[pieceSize];
try {
OutputStream out = pipe.getOut();
for (int i = 0; i < pieceCnt; i++) {
rng.nextBytes(piece);
out.write(piece);
}
out.close();
pipe.await();
} catch (IOException e) {
e.printStackTrace(System.err);
System.err.flush();
}
}
}, "Test write thread");
thread.setDaemon(true);
thread.start();
final Random rng1 = new Random(SEED);
int remaining = finalSize;
while (remaining > 0) {
byte[] buf1 = new byte[Math.min(pieceSize, remaining)];
byte[] buf2 = new byte[buf1.length];
try {
StreamUtils.readFully(in, buf1);
} catch (IOException e) {
thread.isDaemon();
}
rng1.nextBytes(buf2);
assertArrayEquals("Failure at remaining = " + remaining, buf1, buf2);
remaining -= buf1.length;
}
assertEquals(-1, in.read());
in.close();
}
}
} finally {
if (thread != null) {
thread.join(1000L);
}
}
}
}