1d895999858db47e6f2d090a94b29749fa39278c2Erik Kline/*
2d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * Copyright (C) 2015 The Android Open Source Project
3d895999858db47e6f2d090a94b29749fa39278c2Erik Kline *
4d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * Licensed under the Apache License, Version 2.0 (the "License");
5d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * you may not use this file except in compliance with the License.
6d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * You may obtain a copy of the License at
7d895999858db47e6f2d090a94b29749fa39278c2Erik Kline *
8d895999858db47e6f2d090a94b29749fa39278c2Erik Kline *      http://www.apache.org/licenses/LICENSE-2.0
9d895999858db47e6f2d090a94b29749fa39278c2Erik Kline *
10d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * Unless required by applicable law or agreed to in writing, software
11d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * distributed under the License is distributed on an "AS IS" BASIS,
12d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * See the License for the specific language governing permissions and
14d895999858db47e6f2d090a94b29749fa39278c2Erik Kline * limitations under the License.
15d895999858db47e6f2d090a94b29749fa39278c2Erik Kline */
16d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
17d895999858db47e6f2d090a94b29749fa39278c2Erik Klinepackage android.net;
18d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
19e1a6cf2caa628a02032be9b26462958f3769bd70Erik Klineimport static android.test.MoreAsserts.assertNotEqual;
20e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
21d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport android.net.LocalServerSocket;
22d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport android.net.LocalSocket;
23d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport android.net.LocalSocketAddress;
24d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport android.net.Network;
25d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport android.test.suitebuilder.annotation.SmallTest;
26e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
27d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport java.io.File;
28d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport java.io.FileDescriptor;
29d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport java.io.FileInputStream;
30d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport java.io.IOException;
31d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport java.net.DatagramSocket;
32d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport java.net.InetAddress;
33d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport java.net.Inet6Address;
34d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport java.net.SocketException;
35e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
36d895999858db47e6f2d090a94b29749fa39278c2Erik Klineimport junit.framework.TestCase;
37d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
38d895999858db47e6f2d090a94b29749fa39278c2Erik Klinepublic class NetworkTest extends TestCase {
39d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    final Network mNetwork = new Network(99);
40d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
41d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    @SmallTest
42d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    public void testBindSocketOfInvalidFdThrows() throws Exception {
43d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
44d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        final FileDescriptor fd = new FileDescriptor();
45d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        assertFalse(fd.valid());
46d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
47d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        try {
48d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            mNetwork.bindSocket(fd);
49d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            fail("SocketException not thrown");
50d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        } catch (SocketException expected) {}
51d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    }
52d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
53d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    @SmallTest
54d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    public void testBindSocketOfNonSocketFdThrows() throws Exception {
55d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        final File devNull = new File("/dev/null");
56d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        assertTrue(devNull.canRead());
57d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
58d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        final FileInputStream fis = new FileInputStream(devNull);
59d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        assertTrue(null != fis.getFD());
60d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        assertTrue(fis.getFD().valid());
61d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
62d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        try {
63d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            mNetwork.bindSocket(fis.getFD());
64d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            fail("SocketException not thrown");
65d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        } catch (SocketException expected) {}
66d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    }
67d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
68d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    @SmallTest
69d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    public void testBindSocketOfConnectedDatagramSocketThrows() throws Exception {
70d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        final DatagramSocket mDgramSocket = new DatagramSocket(0, (InetAddress) Inet6Address.ANY);
71d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        mDgramSocket.connect((InetAddress) Inet6Address.LOOPBACK, 53);
72d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        assertTrue(mDgramSocket.isConnected());
73d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
74d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        try {
75d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            mNetwork.bindSocket(mDgramSocket);
76d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            fail("SocketException not thrown");
77d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        } catch (SocketException expected) {}
78d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    }
79d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
80d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    @SmallTest
81d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    public void testBindSocketOfLocalSocketThrows() throws Exception {
82d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        final LocalSocket mLocalClient = new LocalSocket();
83d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        mLocalClient.bind(new LocalSocketAddress("testClient"));
84d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        assertTrue(mLocalClient.getFileDescriptor().valid());
85d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
86d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        try {
87d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            mNetwork.bindSocket(mLocalClient.getFileDescriptor());
88d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            fail("SocketException not thrown");
89d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        } catch (SocketException expected) {}
90d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
91d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        final LocalServerSocket mLocalServer = new LocalServerSocket("testServer");
92d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        mLocalClient.connect(mLocalServer.getLocalSocketAddress());
93d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        assertTrue(mLocalClient.isConnected());
94d895999858db47e6f2d090a94b29749fa39278c2Erik Kline
95d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        try {
96d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            mNetwork.bindSocket(mLocalClient.getFileDescriptor());
97d895999858db47e6f2d090a94b29749fa39278c2Erik Kline            fail("SocketException not thrown");
98d895999858db47e6f2d090a94b29749fa39278c2Erik Kline        } catch (SocketException expected) {}
99d895999858db47e6f2d090a94b29749fa39278c2Erik Kline    }
100e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
101e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline    @SmallTest
102e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline    public void testZeroIsObviousForDebugging() {
103e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        Network zero = new Network(0);
104e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertEquals(0, zero.hashCode());
105e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertEquals(0, zero.getNetworkHandle());
106e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertEquals("0", zero.toString());
107e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline    }
108e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
109e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline    @SmallTest
110e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline    public void testGetNetworkHandle() {
111e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        Network one = new Network(1);
112e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        Network two = new Network(2);
113e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        Network three = new Network(3);
114e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
115e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        // None of the hashcodes are zero.
116e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(0, one.hashCode());
117e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(0, two.hashCode());
118e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(0, three.hashCode());
119e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
120e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        // All the hashcodes are distinct.
121e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(one.hashCode(), two.hashCode());
122e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(one.hashCode(), three.hashCode());
123e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(two.hashCode(), three.hashCode());
124e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
125e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        // None of the handles are zero.
126e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(0, one.getNetworkHandle());
127e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(0, two.getNetworkHandle());
128e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(0, three.getNetworkHandle());
129e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
130e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        // All the handles are distinct.
131e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(one.getNetworkHandle(), two.getNetworkHandle());
132e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(one.getNetworkHandle(), three.getNetworkHandle());
133e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(two.getNetworkHandle(), three.getNetworkHandle());
134e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
135e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        // The handles are not equal to the hashcodes.
136e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(one.hashCode(), one.getNetworkHandle());
137e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(two.hashCode(), two.getNetworkHandle());
138e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertNotEqual(three.hashCode(), three.getNetworkHandle());
139e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline
140e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        // Adjust as necessary to test an implementation's specific constants.
141e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        // When running with runtest, "adb logcat -s TestRunner" can be useful.
142e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertEquals(4311403230L, one.getNetworkHandle());
143e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertEquals(8606370526L, two.getNetworkHandle());
144e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline        assertEquals(12901337822L, three.getNetworkHandle());
145e1a6cf2caa628a02032be9b26462958f3769bd70Erik Kline    }
146d895999858db47e6f2d090a94b29749fa39278c2Erik Kline}
147