FileDocCategorySizeDatePackage
TestInterruptedIO.javaAPI DocphoneME MR2 API (J2ME)6176Wed May 02 18:00:14 BST 2007com.sun.midp.io.j2me.socket

TestInterruptedIO.java

/*
 * 	
 *
 * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program 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
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */

package com.sun.midp.io.j2me.socket;

import java.io.*;
import javax.microedition.io.*;
import com.sun.midp.i3test.*;

/**
 * Test of SocketConnection function that unblocks a pending read
 * when the connection is closed.
 */
public class TestInterruptedIO extends TestCase implements Runnable {

    /**
     * URI to which the test will try to open connections.
     * Use any URI visible from your network, for example,
     * "socket://www.sun.com:80" will do in most cases;
     * "socket://localhost:80" will do if your computer is
     * running an http server. Please, contact your network
     * administrator if you have a problem that you cannot
     * resolve yourself.
     */
    static private final String otherSideUri =
            //"socket://www.sun.com:80";
            "socket://localhost:80";

    /** SocketConnection being tested. */
    SocketConnection connection;

    /** InputStream for the blocking read. */
    InputStream is;

    /** Thread that is blocked on the read. */
    Thread t1;

    /** Records if the expected InterruptedIOException is thrown. */
    boolean exceptionThrown = false;

    /** Records if the thread exited. */
    boolean done = false;

    /**
     * Run method to open the InputStream and block on a read.
     * When the stream/connection is closed the read should 
     * unblock with an InterruptedIOException.
     */
    public void run() {
        try {
            is = connection.openInputStream();

            // Notify indicating the InputStream is open
            synchronized (this) {
                notifyAll();
            }

            // Block on a read
            int ch = is.read();
            assertTrue("read should not have succeeded", false);
        } catch (InterruptedIOException ioe) {
            assertNotNull("Caught InterruptedIOException", ioe);
            exceptionThrown = true;
        } catch (IOException ioe) {
            assertNull("Unexpected IOException", ioe);
        } finally {
            synchronized (this) {
                done = true;     
                notifyAll();        
            }
        }
    }

    /**
     * Open the connection and start the thread to call the run
     * method.  It waits until the InputStream is open before returning.
     * @return false if testing cannot be continued
     */
    boolean setUp() {
        // Create a socket connection 
        try {
            connection = (SocketConnection)Connector.open(otherSideUri);
            //OutputStream os = connection.openOutputStream();
            //os.write("GET /midlets/midlet.jad HTTP/1.0\n\n".getBytes());
        } catch (IOException ioe) {
            assertNull("Exception during socket open", ioe);
        }
        
        assertNotNull("Verify socket open", connection);
        if (null == connection) {
            fail("Could not open connection to "+otherSideUri+
                 ".  If the host name cannot be resolved, you may " +
                 "need to change the i3test source to use a host name that" +
                 " is visible from your network.");
            return false;
        }

        // Launch a thread which would be blocked for some I/O operation
        // for above socket connection
        t1 = new Thread(this);
        t1.start();

        // Wait for the InputStream to have been opened
        synchronized (this) {
            while (is == null) {
                try {
                    wait(200);
                } catch (InterruptedException e) {
                    // Ignore interrupt
                }
            } 
        }
        return true;
    }
    
    /**
     * Close the open connection.
     */
    void closeConnection() {
        try {
	    if (is != null) {
		is.close();
		is = null;
	    }
	    if (connection != null) {
		connection.close();
		connection = null;
	    }
        } catch (IOException e) {
            assertNull("Exception closing a socket", e);
            e.printStackTrace();
        }
    }

    /**
     * This test creates another thread that tries to close a socket
     * connection that is in use by first thread. It is supposed to throw 
     * InterruptedIOException in this case.
     */
    void testForException() {
        closeConnection();

        synchronized (this) {
            if (!done) {
                try {
                    wait(2000);
                } catch (InterruptedException e) {
                    System.out.println("Catch interrupt");
                }
            } 
        }

        assertTrue("Verify InterruptedIOException", exceptionThrown);
    }

    /**
     * Clean up after the test. 
     */
    void tearDown() {
	    closeConnection();
    }

    /**
     * Run the test by setting up the connection, and starting
     * a thread to block on a read then  forcing the 
     * connection to be closed and checking that exception occurred.
     */
    public void runTests() {
        declare("Test InterruptedIOException");

        boolean setupSuccess = setUp();

        if (setupSuccess) {
            testForException();

            tearDown();
        }
    }

}