/* * 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.harmony.tests.java.io; import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter; public class PipedWriterTest extends junit.framework.TestCase { static class PReader implements Runnable { public PipedReader pr; public char[] buf = new char[10]; public PReader(PipedWriter pw) { try { pr = new PipedReader(pw); } catch (IOException e) { fail(); } } public PReader(PipedReader pr) { this.pr = pr; } public void run() { try { int r = 0; for (int i = 0; i < buf.length; i++) { r = pr.read(); if (r == -1) break; buf[i] = (char) r; } } catch (Exception e) { fail(); } } } Thread rdrThread; PReader reader; PipedWriter pw; /** * java.io.PipedWriter#PipedWriter() */ public void test_Constructor() { // Test for method java.io.PipedWriter() // Used in tests } /** * java.io.PipedWriter#PipedWriter(java.io.PipedReader) */ public void test_ConstructorLjava_io_PipedReader() throws Exception { // Test for method java.io.PipedWriter(java.io.PipedReader) char[] buf = new char[10]; "HelloWorld".getChars(0, 10, buf, 0); PipedReader rd = new PipedReader(); pw = new PipedWriter(rd); rdrThread = new Thread(reader = new PReader(rd), "Constructor(Reader)"); rdrThread.start(); pw.write(buf); pw.close(); rdrThread.join(); assertEquals("Failed to construct writer", "HelloWorld", new String( reader.buf)); } /** * java.io.PipedWriter#close() */ public void test_close() throws Exception { // Test for method void java.io.PipedWriter.close() char[] buf = new char[10]; "HelloWorld".getChars(0, 10, buf, 0); PipedReader rd = new PipedReader(); pw = new PipedWriter(rd); reader = new PReader(rd); pw.close(); try { pw.write(buf); fail("Should have thrown exception when attempting to write to closed writer."); } catch (Exception e) { // correct } } /** * java.io.PipedWriter#connect(java.io.PipedReader) */ public void test_connectLjava_io_PipedReader() throws Exception { // Test for method void java.io.PipedWriter.connect(java.io.PipedReader) char[] buf = new char[10]; "HelloWorld".getChars(0, 10, buf, 0); PipedReader rd = new PipedReader(); pw = new PipedWriter(); pw.connect(rd); rdrThread = new Thread(reader = new PReader(rd), "connect"); rdrThread.start(); pw.write(buf); pw.close(); rdrThread.join(); assertEquals("Failed to write correct chars", "HelloWorld", new String( reader.buf)); } /** * java.io.PipedWriter#flush() */ public void test_flush() throws Exception { // Test for method void java.io.PipedWriter.flush() char[] buf = new char[10]; "HelloWorld".getChars(0, 10, buf, 0); pw = new PipedWriter(); rdrThread = new Thread(reader = new PReader(pw), "flush"); rdrThread.start(); pw.write(buf); pw.flush(); rdrThread.join(); assertEquals("Failed to flush chars", "HelloWorld", new String( reader.buf)); } /** * java.io.PipedWriter#flush() * Regression HARMONY-6293 */ public void test_flushAfterClose() throws Exception { PipedReader pr = new PipedReader(); pw = new PipedWriter(pr); pw.close(); try { pw.flush(); fail("should throw IOException"); } catch (IOException e) { // expected } pr = new PipedReader(); pw = new PipedWriter(pr); pr.close(); try { pw.flush(); fail("should throw IOException"); } catch (IOException e) { // expected } } /** * java.io.PipedWriter#write(char[], int, int) */ public void test_write$CII() throws Exception { // Test for method void java.io.PipedWriter.write(char [], int, int) char[] buf = new char[10]; "HelloWorld".getChars(0, 10, buf, 0); pw = new PipedWriter(); rdrThread = new Thread(reader = new PReader(pw), "writeCII"); rdrThread.start(); pw.write(buf, 0, 10); pw.close(); rdrThread.join(); assertEquals("Failed to write correct chars", "HelloWorld", new String( reader.buf)); } /** * java.io.PipedWriter#write(char[], int, int) Regression for * HARMONY-387 */ public void test_write$CII_2() throws IOException { PipedReader pr = new PipedReader(); PipedWriter obj = null; try { obj = new java.io.PipedWriter(pr); obj.write(new char[0], (int) 0, (int) -1); fail("IndexOutOfBoundsException expected"); } catch (IndexOutOfBoundsException expected) { } } /** * java.io.PipedWriter#write(char[], int, int) */ public void test_write$CII_3() throws IOException { PipedReader pr = new PipedReader(); PipedWriter obj = null; try { obj = new java.io.PipedWriter(pr); obj.write(new char[0], (int) -1, (int) 0); fail(); } catch (IndexOutOfBoundsException expected) { } } /** * java.io.PipedWriter#write(char[], int, int) */ public void test_write$CII_4() throws IOException { PipedReader pr = new PipedReader(); PipedWriter obj = null; try { obj = new java.io.PipedWriter(pr); obj.write(new char[0], (int) -1, (int) -1); fail(); } catch (IndexOutOfBoundsException expected) { } } /** * java.io.PipedWriter#write(char[], int, int) */ public void test_write$CII_5() throws IOException { PipedReader pr = new PipedReader(); PipedWriter obj = null; try { obj = new PipedWriter(pr); obj.write((char[]) null, (int) -1, (int) 0); fail("NullPointerException expected"); } catch (IndexOutOfBoundsException t) { fail("NullPointerException expected"); } catch (NullPointerException t) { } } /** * java.io.PipedWriter#write(char[], int, int) */ public void test_write$CII_6() throws IOException { PipedReader pr = new PipedReader(); PipedWriter obj = null; try { obj = new PipedWriter(pr); obj.write((char[]) null, (int) -1, (int) -1); fail("NullPointerException expected"); } catch (IndexOutOfBoundsException t) { fail("NullPointerException expected"); } catch (NullPointerException t) { } } /** * java.io.PipedWriter#write(char[], int, int) */ public void test_write$CII_notConnected() throws IOException { // Regression test for Harmony-2404 // create not connected pipe PipedWriter obj = new PipedWriter(); // char array is null try { obj.write((char[]) null, 0, 1); fail("IOException expected"); } catch (IOException ioe) { // expected } // negative offset try { obj.write(new char[] { 1 }, -10, 1); fail("IOException expected"); } catch (IOException ioe) { // expected } // wrong offset try { obj.write(new char[] { 1 }, 10, 1); fail("IOException expected"); } catch (IOException ioe) { // expected } // negative length try { obj.write(new char[] { 1 }, 0, -10); fail("IOException expected"); } catch (IOException ioe) { // expected } // all valid params try { obj.write(new char[] { 1, 1 }, 0, 1); fail("IOException expected"); } catch (IOException ioe) { // expected } } /** * java.io.PipedWriter#write(int) */ public void test_write_I_MultiThread() throws IOException { final PipedReader pr = new PipedReader(); final PipedWriter pw = new PipedWriter(); // test if writer recognizes dead reader pr.connect(pw); class WriteRunnable implements Runnable { boolean pass = false; volatile boolean readerAlive = true; public void run() { try { pw.write(1); while (readerAlive) { // wait the reader thread dead } try { // should throw exception since reader thread // is now dead pw.write(1); } catch (IOException e) { pass = true; } } catch (IOException e) { //ignore } } } WriteRunnable writeRunnable = new WriteRunnable(); Thread writeThread = new Thread(writeRunnable); class ReadRunnable implements Runnable { boolean pass; public void run() { try { pr.read(); pass = true; } catch (IOException e) { //ignore } } } ReadRunnable readRunnable = new ReadRunnable(); Thread readThread = new Thread(readRunnable); writeThread.start(); readThread.start(); while (readThread.isAlive()) { //wait the reader thread dead } writeRunnable.readerAlive = false; assertTrue("reader thread failed to read", readRunnable.pass); while (writeThread.isAlive()) { //wait the writer thread dead } assertTrue("writer thread failed to recognize dead reader", writeRunnable.pass); } /** * java.io.PipedWriter#write(char[], int, int) */ public void test_write_$CII_MultiThread() throws Exception { final PipedReader pr = new PipedReader(); final PipedWriter pw = new PipedWriter(); // test if writer recognizes dead reader pr.connect(pw); class WriteRunnable implements Runnable { boolean pass = false; volatile boolean readerAlive = true; public void run() { try { pw.write(1); while (readerAlive) { // wait the reader thread dead } try { // should throw exception since reader thread // is now dead char[] buf = new char[10]; pw.write(buf, 0, 10); } catch (IOException e) { pass = true; } } catch (IOException e) { //ignore } } } WriteRunnable writeRunnable = new WriteRunnable(); Thread writeThread = new Thread(writeRunnable); class ReadRunnable implements Runnable { boolean pass; public void run() { try { pr.read(); pass = true; } catch (IOException e) { //ignore } } } ReadRunnable readRunnable = new ReadRunnable(); Thread readThread = new Thread(readRunnable); writeThread.start(); readThread.start(); while (readThread.isAlive()) { //wait the reader thread dead } writeRunnable.readerAlive = false; assertTrue("reader thread failed to read", readRunnable.pass); while (writeThread.isAlive()) { //wait the writer thread dead } assertTrue("writer thread failed to recognize dead reader", writeRunnable.pass); } /** * java.io.PipedWriter#write(int) */ public void test_writeI() throws Exception { // Test for method void java.io.PipedWriter.write(int) pw = new PipedWriter(); rdrThread = new Thread(reader = new PReader(pw), "writeI"); rdrThread.start(); pw.write(1); pw.write(2); pw.write(3); pw.close(); rdrThread.join(1000); assertTrue("Failed to write correct chars: " + (int) reader.buf[0] + " " + (int) reader.buf[1] + " " + (int) reader.buf[2], reader.buf[0] == 1 && reader.buf[1] == 2 && reader.buf[2] == 3); } /** * Tears down the fixture, for example, close a network connection. This * method is called after a test is executed. */ protected void tearDown() throws Exception { try { if (rdrThread != null) { rdrThread.interrupt(); } } catch (Exception ignore) { } try { if (pw != null) { pw.close(); } } catch (Exception ignore) { } super.tearDown(); } }