170882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes/*
270882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
370882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  this work for additional information regarding copyright ownership.
570882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
670882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  (the "License"); you may not use this file except in compliance with
770882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  the License.  You may obtain a copy of the License at
870882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *
970882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
1070882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *
1170882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  Unless required by applicable law or agreed to in writing, software
1270882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
1370882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  See the License for the specific language governing permissions and
1570882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes *  limitations under the License.
1670882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes */
1770882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
184557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.java.net;
1970882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
2070882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.io.IOException;
2170882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.io.InputStream;
2270882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.io.OutputStream;
2370882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.net.ConnectException;
2470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.net.InetAddress;
2570882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.net.InetSocketAddress;
2670882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.net.ServerSocket;
2770882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.net.Socket;
2870882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport java.net.SocketException;
2970882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughesimport junit.framework.TestCase;
3070882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
314e4000ed98f9056639fba0713a3fd3caacf9746cElliott Hughespublic class OldUnixSocketTest extends TestCase {
3270882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
3370882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes    public void test_getInputStream() throws IOException {
3470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        // Simple read/write test over the IO streams
3570882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        final ServerSocket pingServer = new ServerSocket(0);
3655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        Socket pingClient = new Socket();
3770882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
3855392539fea537abfb6581b474918f9d611fba27Jesse Wilson        try {
3955392539fea537abfb6581b474918f9d611fba27Jesse Wilson            pingClient.connect(new InetSocketAddress(
4055392539fea537abfb6581b474918f9d611fba27Jesse Wilson                    InetAddress.getLocalHost(), pingServer.getLocalPort()));
4170882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
4255392539fea537abfb6581b474918f9d611fba27Jesse Wilson            Socket worker = pingServer.accept();
4355392539fea537abfb6581b474918f9d611fba27Jesse Wilson            pingServer.close();
4470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
4555392539fea537abfb6581b474918f9d611fba27Jesse Wilson            // Write some data to the server to provoke it
4655392539fea537abfb6581b474918f9d611fba27Jesse Wilson            OutputStream clientOut = pingClient.getOutputStream();
4755392539fea537abfb6581b474918f9d611fba27Jesse Wilson            clientOut.write(new byte[256]);
4855392539fea537abfb6581b474918f9d611fba27Jesse Wilson            InputStream in = worker.getInputStream();
4970882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes            in.read();
5070882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
5155392539fea537abfb6581b474918f9d611fba27Jesse Wilson            OutputStream out = worker.getOutputStream();
5255392539fea537abfb6581b474918f9d611fba27Jesse Wilson            out.write(new byte[42]);
5355392539fea537abfb6581b474918f9d611fba27Jesse Wilson            worker.close();
5455392539fea537abfb6581b474918f9d611fba27Jesse Wilson            InputStream clientIn = pingClient.getInputStream();
5555392539fea537abfb6581b474918f9d611fba27Jesse Wilson            clientIn.read(new byte[42]);
5655392539fea537abfb6581b474918f9d611fba27Jesse Wilson
5755392539fea537abfb6581b474918f9d611fba27Jesse Wilson            try {
584e4000ed98f9056639fba0713a3fd3caacf9746cElliott Hughes                int i = clientIn.read();
594e4000ed98f9056639fba0713a3fd3caacf9746cElliott Hughes                fail("Should throw SocketException; got i=" + i);
6055392539fea537abfb6581b474918f9d611fba27Jesse Wilson            } catch (SocketException e) {
6155392539fea537abfb6581b474918f9d611fba27Jesse Wilson                // expected
6255392539fea537abfb6581b474918f9d611fba27Jesse Wilson            }
6355392539fea537abfb6581b474918f9d611fba27Jesse Wilson            clientIn.close();
6470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
6555392539fea537abfb6581b474918f9d611fba27Jesse Wilson            try {
6655392539fea537abfb6581b474918f9d611fba27Jesse Wilson                clientIn.read();
6755392539fea537abfb6581b474918f9d611fba27Jesse Wilson                fail("Should throw SocketException");
6855392539fea537abfb6581b474918f9d611fba27Jesse Wilson            } catch (SocketException e) {
6955392539fea537abfb6581b474918f9d611fba27Jesse Wilson                // expected
7055392539fea537abfb6581b474918f9d611fba27Jesse Wilson            }
7155392539fea537abfb6581b474918f9d611fba27Jesse Wilson            try {
7255392539fea537abfb6581b474918f9d611fba27Jesse Wilson                clientIn.read(new byte[5]);
7355392539fea537abfb6581b474918f9d611fba27Jesse Wilson                fail("Should throw SocketException");
7455392539fea537abfb6581b474918f9d611fba27Jesse Wilson            } catch (SocketException e) {
7555392539fea537abfb6581b474918f9d611fba27Jesse Wilson                // expected
7655392539fea537abfb6581b474918f9d611fba27Jesse Wilson            }
7755392539fea537abfb6581b474918f9d611fba27Jesse Wilson        } finally {
7855392539fea537abfb6581b474918f9d611fba27Jesse Wilson            pingClient.close();
7955392539fea537abfb6581b474918f9d611fba27Jesse Wilson            pingServer.close();
8055392539fea537abfb6581b474918f9d611fba27Jesse Wilson        }
8170882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes    }
8270882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
8370882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes    public void test_connectLjava_net_SocketAddressI() throws Exception {
8470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        // Now validate that we get a interrupted exception if we try to connect
8570882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        // to an address on which nobody is accepting connections and the
8670882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        // timeout expired
8770882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        Socket theSocket = new Socket();
8870882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        try {
8970882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes            theSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(),
9070882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes                    1), 200);
9170882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes            fail("No interrupted exception when connecting to address nobody listening on with short timeout 200");
9270882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        } catch (ConnectException e) {
9370882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes            // Expected
9470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        }
9570882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        theSocket.close();
9670882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes    }
9770882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes
9870882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes    public void test_getOutputStream() throws Exception {
9970882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        // Regression test for HARMONY-2934
100f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // Port 0 is not allowed to be used in connect() on some platforms,
10155392539fea537abfb6581b474918f9d611fba27Jesse Wilson        // get a free port here
10255392539fea537abfb6581b474918f9d611fba27Jesse Wilson        ServerSocket ss = new ServerSocket(0);
10355392539fea537abfb6581b474918f9d611fba27Jesse Wilson        int port = ss.getLocalPort();
10455392539fea537abfb6581b474918f9d611fba27Jesse Wilson        ss.close();
105f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
10655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        Socket socket = new Socket("127.0.0.1", port, false);
10770882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        OutputStream o = socket.getOutputStream();
10870882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        try {
10970882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes            o.write(1);
11070882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        } catch (SocketException e) {
11170882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes            // expected
11270882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        } finally {
11370882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes            socket.close();
11470882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes        }
11570882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes    }
11670882923fb227de7a54a9b1a2a4dd2c6ec8b51aeElliott Hughes}
117