JavaNetDatagramSocketTest.java revision 5d709784bbf5001012d7f25172927d46f6c1abe1
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package tests.security.permissions;
18
19import dalvik.annotation.TestTargets;
20import dalvik.annotation.TestLevel;
21import dalvik.annotation.TestTargetNew;
22import dalvik.annotation.TestTargetClass;
23
24import junit.framework.TestCase;
25
26import tests.support.Support_PortManager;
27
28import java.io.IOException;
29import java.net.DatagramPacket;
30import java.net.DatagramSocket;
31import java.net.InetAddress;
32import java.net.InetSocketAddress;
33import java.security.Permission;
34
35/*
36 * This class tests the security permissions which are documented in
37 * http://java.sun.com/j2se/1.5.0/docs/guide/security/permissions.html#PermsAndMethods
38 * for class java.net.DatagramSocket
39 */
40@TestTargetClass(DatagramSocket.class)
41public class JavaNetDatagramSocketTest extends TestCase {
42
43    SecurityManager old;
44
45    @Override
46    protected void setUp() throws Exception {
47        old = System.getSecurityManager();
48        super.setUp();
49    }
50
51    @Override
52    protected void tearDown() throws Exception {
53        System.setSecurityManager(old);
54        super.tearDown();
55    }
56
57    @TestTargets({
58        @TestTargetNew(
59            level = TestLevel.PARTIAL,
60            notes = "Verifies that java.net.DatagramSocket constructor calls checkListen of security manager.",
61            method = "DatagramSocket",
62            args = {int.class}
63        ),
64        @TestTargetNew(
65            level = TestLevel.PARTIAL,
66            notes = "Verifies that java.net.DatagramSocket constructor calls checkListen of security manager.",
67            method = "DatagramSocket",
68            args = {java.net.SocketAddress.class}
69        ),
70        @TestTargetNew(
71            level = TestLevel.PARTIAL,
72            notes = "Verifies that java.net.DatagramSocket constructor calls checkListen of security manager.",
73            method = "DatagramSocket",
74            args = {int.class, java.net.InetAddress.class}
75        )
76    })
77    public void test_ctor() throws IOException {
78        class TestSecurityManager extends SecurityManager {
79            boolean called = false;
80            int port = 0;
81            void reset(){
82                called = false;
83                port = 0;
84            }
85            @Override
86            public void checkListen(int port) {
87                called = true;
88                this.port = port;
89            }
90            @Override
91            public void checkPermission(Permission p) {
92
93            }
94        }
95
96        TestSecurityManager s = new TestSecurityManager();
97        System.setSecurityManager(s);
98
99        int port = Support_PortManager.getNextPortForUDP();
100        s.reset();
101        DatagramSocket s1 = new DatagramSocket(port);
102        assertTrue("java.net.DatagramSocket ctor must call checkListen on security manager", s.called);
103        assertEquals("Argument of checkListen is not correct", port, s.port);
104
105        s.reset();
106        DatagramSocket s2 = new DatagramSocket();
107        assertTrue("java.net.DatagramSocket ctor must call checkListen on security manager", s.called);
108        assertEquals("Argument of checkListen is not correct", 0, s.port);
109
110        port = Support_PortManager.getNextPortForUDP();
111        s.reset();
112        DatagramSocket s3 = new DatagramSocket(new InetSocketAddress(port));
113        assertTrue("java.net.DatagramSocket ctor must call checkListen on security manager", s.called);
114        assertEquals("Argument of checkListen is not correct", port, s.port);
115
116        port = Support_PortManager.getNextPortForUDP();
117        s.reset();
118        DatagramSocket s4 = new DatagramSocket(port, InetAddress.getLocalHost());
119        assertTrue("java.net.DatagramSocket ctor must call checkListen on security manager", s.called);
120        assertEquals("Argument of checkListen is not correct", port, s.port);
121
122    }
123
124
125    @TestTargetNew(
126        level = TestLevel.PARTIAL,
127        notes = "Verifies that java.net.DatagramSocket receive calls checkAccept of security manager.",
128        method = "receive",
129        args = {java.net.DatagramPacket.class}
130    )
131    public void test_receive() throws IOException {
132        class TestSecurityManager extends SecurityManager {
133            boolean called = false;
134            void reset(){
135                called = false;
136            }
137            @Override
138            public void checkAccept(String host, int port) {
139                this.called = true;
140                super.checkAccept(host, port);
141            }
142            @Override
143            public void checkPermission(Permission p) {
144
145            }
146        }
147
148        final int port = Support_PortManager.getNextPortForUDP();
149        DatagramSocket s1 = new DatagramSocket(port);
150        //s1.setSoTimeout(100);
151
152        Thread sender = new Thread(){
153            public void run(){
154                try {
155                    DatagramPacket sendPacket = new DatagramPacket(new byte[256], 256, InetAddress.getLocalHost(), port);
156                    DatagramSocket sender = new DatagramSocket();
157                    while(!isInterrupted()){
158                        sender.send(sendPacket);
159                        Thread.sleep(10);
160                    }
161                }
162                catch(InterruptedException e){
163                    // expected
164                }
165                catch(Exception e){
166                    fail("unexpected exception " + e);
167                }
168            }
169        };
170        sender.start();
171
172        DatagramPacket p = new DatagramPacket(new byte[256], 0, 256);
173
174        TestSecurityManager s = new TestSecurityManager();
175        System.setSecurityManager(s);
176
177        s.reset();
178        assertTrue(s1.getInetAddress()==null);
179        try {
180            s1.receive(p);
181        } catch(Exception e) {
182            fail("unexpected exception " + e);
183        }
184        sender.interrupt();
185        assertTrue("java.net.DatagramSocket.receive must call checkAccept on security manager", s.called);
186    }
187
188}
189