blob: 564b337df42aa6f00f1d0dca55bba7309767e2bf [file] [log] [blame]
/*
* Copyright (C) 2007 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 android.core;
import junit.framework.TestCase;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
class Fibonacci {
int n1 = -1;
int n2;
public int next() {
if (n1 < 0) {
n1 = 0;
return 0;
} else if (n1 == 0) {
n2 = 0;
n1 = 1;
return 1;
} else {
int ret = n1 + n2;
n2 = n1;
n1 = ret;
return ret;
}
}
}
public class PipedStreamTest extends TestCase {
private abstract static class TestThread extends Thread {
public abstract void runTest() throws Exception;
public final void run() {
try {
runTest();
} catch (Throwable e) {
android.util.Log.e("PST", "Got exception " + e, e);
android.util.Log.e("PST", android.util.Log.getStackTraceString(e));
exception = e;
}
}
Throwable exception;
int countRead = 0;
}
@MediumTest
public void testA() throws Exception {
final PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
assertEquals(0, in.available());
TestThread reader, writer;
reader = new TestThread() {
Fibonacci fib = new Fibonacci();
@Override
public void runTest() throws Exception {
int readInt;
byte readByte;
for (; ;) {
readInt = in.read();
if (readInt == -1) {
return;
}
readByte = (byte) readInt;
assertEquals(readByte, (byte) fib.next());
countRead++;
}
}
};
reader.start();
writer = new TestThread() {
Fibonacci fib = new Fibonacci();
@Override
public void runTest() throws Exception {
for (int i = 0; i < 2000; i++) {
int toWrite = fib.next();
out.write(toWrite);
}
out.close();
}
};
writer.start();
for (; ;) {
try {
reader.join(60 * 1000);
writer.join(1 * 1000);
break;
} catch (InterruptedException ex) {
}
}
assertEquals(2000, reader.countRead);
if (writer.exception != null) {
throw new Exception(writer.exception);
}
if (reader.exception != null) {
throw new Exception(reader.exception);
}
}
@MediumTest
public void testB() throws Exception {
final PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
assertEquals(0, in.available());
TestThread reader, writer;
reader = new TestThread() {
Fibonacci fib = new Fibonacci();
@Override
public void runTest() throws Exception {
byte readBytes[] = new byte[5];
int ret;
for (; ;) {
int nread = 0;
while (nread < 5) {
ret = in.read(readBytes, nread, readBytes.length - nread);
if (ret == -1) {
return;
}
nread += ret;
}
assertEquals(5, nread);
int readInt = (((int) readBytes[0] & 0xff) << 24)
| (((int) readBytes[1] & 0xff) << 16)
| (((int) readBytes[2] & 0xff) << 8)
| (((int) readBytes[3] & 0xff) << 0);
assertEquals(readInt, fib.next());
assertEquals(0, readBytes[4]);
countRead++;
}
}
};
reader.start();
writer = new TestThread() {
Fibonacci fib = new Fibonacci();
@Override
public void runTest() throws Exception {
byte writeBytes[] = new byte[5];
for (int i = 0; i < 2000; i++) {
int toWrite = fib.next();
writeBytes[0] = (byte) (toWrite >> 24);
writeBytes[1] = (byte) (toWrite >> 16);
writeBytes[2] = (byte) (toWrite >> 8);
writeBytes[3] = (byte) (toWrite >> 0);
writeBytes[4] = 0;
out.write(writeBytes, 0, writeBytes.length);
}
out.close();
}
};
writer.start();
for (; ;) {
try {
reader.join(60 * 1000);
writer.join(1 * 1000);
break;
} catch (InterruptedException ex) {
}
}
assertEquals(2000, reader.countRead);
if (writer.exception != null) {
throw new Exception(writer.exception);
}
if (reader.exception != null) {
throw new Exception(reader.exception);
}
}
@SmallTest
public void testC() throws Exception {
final PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
assertEquals(0, in.available());
TestThread reader, writer;
reader = new TestThread() {
Fibonacci fib = new Fibonacci();
@Override
public void runTest() throws Exception {
byte readBytes[] = new byte[1024 * 2];
int ret;
for (; ;) {
int nread = 0;
while (nread < readBytes.length) {
ret = in.read(readBytes, nread, readBytes.length - nread);
if (ret == -1) {
return;
}
nread += ret;
}
assertEquals(nread, readBytes.length);
for (int i = 0; i < (readBytes.length - 4); i += 4) {
int readInt = (((int) readBytes[i + 0] & 0xff) << 24)
| (((int) readBytes[i + 1] & 0xff) << 16)
| (((int) readBytes[i + 2] & 0xff) << 8)
| (((int) readBytes[i + 3] & 0xff) << 0);
assertEquals(readInt, fib.next());
}
}
}
};
reader.start();
writer = new TestThread() {
Fibonacci fib = new Fibonacci();
@Override
public void runTest() throws Exception {
byte writeBytes[] = new byte[1024 * 2];
for (int i = 0; i < (writeBytes.length - 4); i += 4) {
int toWrite = fib.next();
writeBytes[i + 0] = (byte) (toWrite >> 24);
writeBytes[i + 1] = (byte) (toWrite >> 16);
writeBytes[i + 2] = (byte) (toWrite >> 8);
writeBytes[i + 3] = (byte) (toWrite >> 0);
}
out.write(writeBytes, 0, writeBytes.length);
out.close();
}
};
writer.start();
for (; ;) {
try {
reader.join(60 * 1000);
writer.join(1 * 100);
break;
} catch (InterruptedException ex) {
}
}
if (writer.exception != null) {
throw new Exception(writer.exception);
}
if (reader.exception != null) {
throw new Exception(reader.exception);
}
}
}