19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.core;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.Assert;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.InetAddress;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.InetSocketAddress;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.ServerSocket;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.SocketException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.SocketTimeoutException;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.channels.SocketChannel;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.concurrent.Semaphore;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.Suppress;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Regression tests for various socket related problems. And a few general
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * socket tests.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SocketTest extends TestCase {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String NON_EXISTING_ADDRESS = "123.123.123.123";
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String KNOW_GOOD_ADDRESS = "209.85.129.147";
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PACKAGE_DROPPING_ADDRESS = "191.167.0.1";
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test for basic bind/connect/accept behavior.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testSocketSimple() throws Exception {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServerSocket ss;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Socket s, s1;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int port;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IOException lastEx = null;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ss = new ServerSocket();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (port = 9900; port < 9999; port++) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss.bind(new InetSocketAddress("127.0.0.1", port));
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastEx = null;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException ex) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                lastEx = ex;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (lastEx != null) {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw lastEx;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s = new Socket("127.0.0.1", port);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s1 = ss.accept();
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s.getOutputStream().write(0xa5);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0xa5, s1.getInputStream().read());
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s1.getOutputStream().write(0x5a);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(0x5a, s.getInputStream().read());
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Regression test for #820068: Wildcard address
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testWildcardAddress() throws Exception {
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Socket s2 = new Socket();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s2.bind(new InetSocketAddress((InetAddress) null, 12345));
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] addr = s2.getLocalAddress().getAddress();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < 4; i++) {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertEquals("Not the wildcard address", 0, addr[i]);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Regression test for #865753: server sockets not closing properly
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testServerSocketClose() throws Exception {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServerSocket s3 = new ServerSocket(23456);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s3.close();
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServerSocket s4 = new ServerSocket(23456);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s4.close();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Regression test for #876985: SO_REUSEADDR not working properly
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Exception serverError = null;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testSetReuseAddress() throws IOException {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InetSocketAddress addr = new InetSocketAddress(8383);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ServerSocket serverSock = new ServerSocket();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        serverSock.setReuseAddress(true);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        serverSock.bind(addr);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Semaphore semThreadEnd = new Semaphore(0);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Thread() {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void run() {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Socket sock = serverSock.accept();
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sock.getInputStream().read();
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sock.close();
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serverError = e;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                semThreadEnd.release();
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }.start();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Give the server a bit of time for startup
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(2000);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException ex) {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignored.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Socket client = new Socket("localhost", 8383);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        client.getOutputStream().write(1);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Just leave this connection open from the client side. It will be
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // closed from the server side so the server stays in the TIME_WAIT
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // state for a while. setReuseAddress() should be able to handle this.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            semThreadEnd.acquire();
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (InterruptedException e) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        serverSock.close();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServerSocket serverSock2 = new ServerSocket();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        serverSock2.setReuseAddress(true);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        serverSock2.bind(addr);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        serverSock2.close();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (serverError != null) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("Server must complete without error", serverError);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Regression for 916701, a wrong exception was thrown after timeout of
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // a ServerSocket.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testTimeoutException() throws IOException {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServerSocket s = new ServerSocket(9800);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        s.setSoTimeout(2000);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            s.accept();
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SocketTimeoutException e) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // this is ok.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Regression for issue 1001980, openening a SocketChannel threw an Exception
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testNativeSocketChannelOpen() throws IOException {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SocketChannel.open();
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18125f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann// Regression test for issue 1018016, connecting ignored a set timeout.
18225f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//
18325f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann// Disabled because test behaves differently depending on networking
18425f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann// environment. It works fine in the emulator and one the device with
18525f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann// WLAN, but when 3G comes into play, the possible existence of a
18625f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann// proxy makes it fail.
18725f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//
18825f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//    @LargeTest
18925f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//    public void testSocketSetSOTimeout() throws IOException {
19025f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//        Socket sock = new Socket();
19125f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//        int timeout = 5000;
19225f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//        long start = System.currentTimeMillis();
19325f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//        try {
19425f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//            sock.connect(new InetSocketAddress(NON_EXISTING_ADDRESS, 80), timeout);
19525f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//        } catch (SocketTimeoutException e) {
19625f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//            // expected
19725f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//            long delay = System.currentTimeMillis() - start;
19825f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//            if (Math.abs(delay - timeout) > 1000) {
19925f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//                fail("timeout was not accurate. expected: " + timeout
20025f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//                        + " actual: " + delay + " miliseconds.");
20125f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//            }
20225f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//        } finally {
20325f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//            try {
20425f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//                sock.close();
20525f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//            } catch (IOException ioe) {
20625f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//                // ignore
20725f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//            }
20825f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//        }
20925f963753ea762c12c74c0dcb861b023ac92177aJorg Pleumann//    }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Regression test for 1062928: Dotted IP addresses (e.g., 192.168.100.1)
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * appear to be broken in the M5 SDK.
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tests that a connection given a ip-addressv4 such as 192.168.100.100 does
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not fail - sdk m5 seems only to accept dns names instead of ip numbers.
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ip 209.85.129.147 (one address of www.google.com) on port 80 (http) is
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * used to test the connection.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Commenting out this test since it is flaky, even at the best of times.  See
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// #1191317 for Info.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Suppress
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disable_testConnectWithIP4IPAddr() {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // call a Google Web server
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InetSocketAddress scktAddrss = new InetSocketAddress(KNOW_GOOD_ADDRESS,
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                80);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Socket clntSckt = new Socket();
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            clntSckt.connect(scktAddrss, 5000);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Throwable e) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("connection problem:" + e.getClass().getName() + ": "
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + e.getMessage());
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clntSckt.close();
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // ignore
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Regression test for #1058962: Socket.close() does not cause
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // socket.connect() to return immediately.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Socket client;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Exception error;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean connected;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This test isn't working now, but really should work.
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// TODO Enable this test again.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Suppress
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disable_testSocketConnectClose() {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            client = new Socket();
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new Thread() {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void run() {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        client.connect(new InetSocketAddress(PACKAGE_DROPPING_ADDRESS, 1357));
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (Exception ex) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        error = ex;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    connected = true;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }.start();
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(1000);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertNull("Connect must not fail immediately. Maybe try different address.", error);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Assert.assertFalse("Connect must not succeed. Maybe try different address.", connected);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            client.close();
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.sleep(1000);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (error == null) {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fail("Socket connect still ongoing");
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (!(error instanceof SocketException)) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fail("Socket connect interrupted with wrong error: " + error.toString());
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception ex) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(ex);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
295