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