1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage tests.api.java.net;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargets;
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.TestCase;
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.InputStream;
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.OutputStream;
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.Field;
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.InetAddress;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.Socket;
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.SocketAddress;
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.SocketException;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.SocketImpl;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.SocketImplFactory;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(SocketImplFactory.class)
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class SocketImplFactoryTest extends TestCase {
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SocketImplFactory oldFactory = null;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Field factoryField = null;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    boolean isTestable = false;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    boolean iSocketImplCalled = false;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    boolean isCreateSocketImpl = false;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets ({
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "createSocketImpl",
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Verifies positive case, and SocketException.",
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = Socket.class,
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "setSocketImplFactory",
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.net.SocketImplFactory.class}
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_createSocketImpl() throws IOException {
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MockSocketImplFactory factory = new MockSocketImplFactory();
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if(isTestable) {
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertFalse(isCreateSocketImpl);
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Socket.setSocketImplFactory(factory);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Socket ds = new Socket();
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue(isCreateSocketImpl);
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue(iSocketImplCalled);
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (Exception e) {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("Exception during test : " + e.getMessage());
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Socket.setSocketImplFactory(factory);
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("SocketException was not thrown.");
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch(SocketException se) {
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                //expected
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Socket.setSocketImplFactory(null);
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("SocketException was not thrown.");
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch(SocketException se) {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                //expected
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            SocketImpl si = factory.createSocketImpl();
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               assertNull(si.getOption(0));
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (SocketException e) {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("SocketException was thrown.");
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setUp() {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Field [] fields = Socket.class.getDeclaredFields();
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int counter = 0;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (Field field : fields) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (SocketImplFactory.class.equals(field.getType())) {
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                counter++;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                factoryField = field;
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if(counter == 1) {
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            isTestable = true;
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            factoryField.setAccessible(true);
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                oldFactory = (SocketImplFactory) factoryField.get(null);
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException was thrown during setUp: "
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + e.getMessage());
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalAccessException e) {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalAccessException was thrown during setUp: "
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + e.getMessage());
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void tearDown() {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if(isTestable) {
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                factoryField.set(null, oldFactory);
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException was thrown during tearDown: "
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + e.getMessage());
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalAccessException e) {
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalAccessException was thrown during tearDown: "
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        + e.getMessage());
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    class MockSocketImplFactory implements SocketImplFactory {
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public SocketImpl createSocketImpl() {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            isCreateSocketImpl = true;
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new MockSocketImpl();
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    class MockSocketImpl extends SocketImpl {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public MockSocketImpl() {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super();
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            iSocketImplCalled = true;
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void accept(SocketImpl arg0) throws IOException {
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected int available() throws IOException {
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void bind(InetAddress arg0, int arg1) throws IOException {
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void close() throws IOException {
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void connect(String arg0, int arg1) throws IOException {
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void connect(InetAddress arg0, int arg1) throws IOException {
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void connect(SocketAddress arg0, int arg1) throws IOException {
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void create(boolean arg0) throws IOException {
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected InputStream getInputStream() throws IOException {
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected OutputStream getOutputStream() throws IOException {
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void listen(int arg0) throws IOException {
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected void sendUrgentData(int arg0) throws IOException {
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public Object getOption(int arg0) throws SocketException {
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void setOption(int arg0, Object arg1) throws SocketException {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
212