blob: f67790babd1c09da4e7bc6982390e4e9a00cf83e [file] [log] [blame]
/*
* 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 tests.api.java.io;
import dalvik.annotation.TestTargets;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargetClass;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
@TestTargetClass(PipedReader.class)
public class PipedReaderTest extends junit.framework.TestCase {
static class PWriter implements Runnable {
public PipedWriter pw;
public PWriter(PipedReader reader) {
try {
pw = new PipedWriter(reader);
} catch (Exception e) {
System.out.println("Couldn't create writer");
}
}
public PWriter() {
pw = new PipedWriter();
}
public void run() {
try {
char[] c = new char[11];
"Hello World".getChars(0, 11, c, 0);
pw.write(c);
Thread.sleep(10000);
} catch (InterruptedException e) {
} catch (Exception e) {
System.out.println("Exception occurred: " + e.toString());
}
}
}
static class PWriter2 implements Runnable {
PipedWriter pw;
public boolean keepRunning = true;
public void run() {
try {
pw.write('H');
pw.close();
while (keepRunning) {
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace(System.out);
System.out.println("Error while running the writer thread.");
}
}
public PWriter2(PipedWriter writer) {
pw = writer;
}
}
PipedReader preader;
PWriter pwriter;
Thread t;
/**
* @tests java.io.PipedReader#PipedReader()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "PipedReader",
args = {}
)
public void test_Constructor() {
preader = new PipedReader();
assertNotNull(preader);
try {
preader.close();
} catch (IOException e) {
fail("Unexpeceted IOException");
}
}
/**
* @tests java.io.PipedReader#PipedReader(java.io.PipedWriter)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "PipedReader",
args = {java.io.PipedWriter.class}
)
public void test_ConstructorLjava_io_PipedWriter() throws IOException {
// Test for method java.io.PipedReader(java.io.PipedWriter)
try {
preader = new PipedReader(new PipedWriter());
} catch (Exception e) {
fail("Test 1: Constructor failed: " + e.getMessage());
}
preader.close();
PipedWriter pw = new PipedWriter(new PipedReader());
try {
preader = new PipedReader(pw);
fail("Test 2: IOException expected because the writer is already connected.");
} catch (IOException e) {
// Expected.
}
}
/**
* @tests java.io.PipedReader#close()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "No IOException checking because it is never thrown in the source code.",
method = "close",
args = {}
)
public void test_close() throws Exception {
// Test for method void java.io.PipedReader.close()
char[] c = null;
preader = new PipedReader();
t = new Thread(new PWriter(preader), "");
t.start();
Thread.sleep(500); // Allow writer to start
c = new char[11];
preader.read(c, 0, 5);
preader.close();
try {
preader.read(c, 0, 5);
fail("IOException expected because the reader is closed.");
} catch (IOException e) {
// Expected.
}
}
/**
* @tests java.io.PipedReader#connect(java.io.PipedWriter)
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "connect",
args = {java.io.PipedWriter.class}
)
public void test_connectLjava_io_PipedWriter() throws Exception {
// Test for method void java.io.PipedReader.connect(java.io.PipedWriter)
char[] c = null;
preader = new PipedReader();
t = new Thread(pwriter = new PWriter(), "");
preader.connect(pwriter.pw);
t.start();
Thread.sleep(500); // Allow writer to start
c = new char[11];
preader.read(c, 0, 11);
assertEquals("Test 1: Wrong characters read. ", "Hello World", new String(c));
try {
preader.connect(new PipedWriter());
fail("Test 2: IOException expected because the reader is already connected.");
} catch (IOException e) {
// Expected.
}
}
/**
* @tests java.io.PipedReader#read()
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "read",
args = {}
)
public void test_read_1() throws Exception {
// Test for method int java.io.PipedReader.read()
char[] c = null;
preader = new PipedReader();
t = new Thread(new PWriter(preader), "");
t.start();
Thread.sleep(500); // Allow writer to start
c = new char[11];
for (int i = 0; i < c.length; i++) {
c[i] = (char) preader.read();
}
assertEquals("Test 1: Wrong characters read. ", "Hello World", new String(c));
try {
preader.read();
fail("Test 2: IOException expected since the thread that has " +
"written to the pipe is no longer alive.");
} catch (IOException e) {
// Expected.
}
preader.close();
try {
preader.read();
fail("Test 3: IOException expected.");
} catch (IOException e) {
// Expected.
}
}
/**
* @tests java.io.PipedReader#read()
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks that read() returns -1 if the PipedWriter connectedto this PipedReader is closed.",
method = "read",
args = {}
)
public void test_read_2() throws Exception {
Thread writerThread;
PipedWriter pw;
PWriter2 pwriter;
preader = new PipedReader();
pw = new PipedWriter(preader);
writerThread = new Thread(pwriter = new PWriter2(pw), "PWriter2");
writerThread.start();
Thread.sleep(500); // Allow writer to start
preader.read();
assertEquals("Test 1: No more data indication expected. ", -1, preader.read());
pwriter.keepRunning = false;
}
/**
* @tests java.io.PipedReader#read(char[], int, int)
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "IOException checking missed.",
method = "read",
args = {char[].class, int.class, int.class}
)
public void test_read$CII_1() throws Exception {
// Test for method int java.io.PipedReader.read(char [], int, int)
char[] c = null;
preader = new PipedReader();
t = new Thread(new PWriter(preader), "");
t.start();
Thread.sleep(500); // Allow writer to start
c = new char[11];
int n = 0;
int x = n;
while (x < 11) {
n = preader.read(c, x, 11 - x);
x = x + n;
}
assertEquals("Test 1: Wrong characters read. ", "Hello World", new String(c));
preader.close();
try {
preader.read(c, 8, 7);
fail("Test 2: IOException expected.");
} catch (IOException e) {
// Expected.
}
}
/**
* @tests java.io.PipedReader#read(char[], int, int)
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "",
method = "read",
args = {char[].class, int.class, int.class}
)
public void test_read$CII_Exception() throws IOException{
PipedWriter pw = new PipedWriter();
PipedReader obj = new PipedReader(pw);
try {
obj.read(new char[10], 0, -1);
fail("IndexOutOfBoundsException expected.");
} catch (IndexOutOfBoundsException e) {
// Expected.
}
try {
obj.read(new char[10], -1, 1);
fail("IndexOutOfBoundsException expected.");
} catch (IndexOutOfBoundsException e) {
// Expected.
}
try {
obj.read(new char[10], 2, 9);
fail("IndexOutOfBoundsException expected.");
} catch (IndexOutOfBoundsException e) {
// Expected.
}
try {
obj.read(null, 0, 1);
fail("NullPointerException expected.");
} catch (NullPointerException e) {
// Expected.
}
}
/**
* @tests java.io.PipedReader#read()
*/
@TestTargetNew(
level = TestLevel.PARTIAL_COMPLETE,
notes = "Checks that read() returns -1 if the PipedWriter connectedto this PipedReader is closed.",
method = "read",
args = {}
)
public void test_read$CII_2() throws Exception {
Thread writerThread;
PipedWriter pw;
PWriter2 pwriter;
char[] c = new char[1];
preader = new PipedReader();
pw = new PipedWriter(preader);
writerThread = new Thread(pwriter = new PWriter2(pw), "PWriter2");
writerThread.start();
Thread.sleep(500); // Allow writer to start
preader.read(c, 0, 1);
assertEquals("Test 1: No more data indication expected. ",
-1, preader.read(c, 0, 1));
pwriter.keepRunning = false;
}
/**
* @tests java.io.PipedReader#ready()
*/
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "ready",
args = {}
)
public void test_ready() throws Exception {
// Test for method boolean java.io.PipedReader.ready()
char[] c = null;
preader = new PipedReader();
try {
preader.ready();
fail("Test 1: IOException expected.");
} catch (IOException e) {
// Expected.
}
t = new Thread(new PWriter(preader), "");
t.start();
Thread.sleep(500); // Allow writer to start
assertTrue("Test 2: Reader should be ready", preader.ready());
c = new char[11];
for (int i = 0; i < c.length; i++)
c[i] = (char) preader.read();
assertFalse("Test 3: Reader should not be ready after reading all chars",
preader.ready());
preader.close();
try {
preader.ready();
fail("Test 4: IOException expected.");
} catch (IOException e) {
// Expected.
}
}
/**
* Tears down the fixture, for example, close a network connection. This
* method is called after a test is executed.
*/
protected void tearDown() throws Exception {
if (t != null) {
t.interrupt();
}
super.tearDown();
}
}