1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.harmony.tests.java.nio.channels; 19 20 import android.system.ErrnoException; 21 import android.system.OsConstants; 22 import java.io.IOException; 23 import java.net.DatagramPacket; 24 import java.net.DatagramSocket; 25 import java.net.Inet6Address; 26 import java.net.InetSocketAddress; 27 import java.net.SocketAddress; 28 import java.net.SocketException; 29 import java.nio.ByteBuffer; 30 import java.nio.channels.AsynchronousCloseException; 31 import java.nio.channels.ClosedChannelException; 32 import java.nio.channels.DatagramChannel; 33 import java.nio.channels.IllegalBlockingModeException; 34 import java.nio.channels.NotYetConnectedException; 35 import java.nio.channels.UnresolvedAddressException; 36 import java.nio.channels.UnsupportedAddressTypeException; 37 import java.nio.channels.spi.SelectorProvider; 38 import java.util.concurrent.atomic.AtomicReference; 39 import junit.framework.TestCase; 40 import libcore.io.IoUtils; 41 import libcore.io.Libcore; 42 43 /** 44 * Test for DatagramChannel 45 */ 46 public class DatagramChannelTest extends TestCase { 47 48 private static final int CAPACITY_NORMAL = 200; 49 50 private static final int CAPACITY_1KB = 1024; 51 52 private static final int CAPACITY_64KB = 65536; 53 54 private static final int CAPACITY_ZERO = 0; 55 56 private static final int CAPACITY_ONE = 1; 57 58 private static final int TIME_UNIT = 500; 59 60 private InetSocketAddress datagramSocket1Address; 61 private InetSocketAddress datagramSocket2Address; 62 63 private InetSocketAddress channel1Address; 64 private InetSocketAddress channel2Address; 65 66 private DatagramChannel channel1; 67 private DatagramChannel channel2; 68 69 private DatagramSocket datagramSocket1; 70 private DatagramSocket datagramSocket2; 71 72 protected void setUp() throws Exception { 73 super.setUp(); 74 75 channel1 = DatagramChannel.open(); 76 channel2 = DatagramChannel.open(); 77 78 channel1.socket().bind(new InetSocketAddress(Inet6Address.LOOPBACK, 0)); 79 channel2.socket().bind(new InetSocketAddress(Inet6Address.LOOPBACK, 0)); 80 81 channel1Address = (InetSocketAddress) channel1.socket().getLocalSocketAddress(); 82 channel2Address = (InetSocketAddress) channel2.socket().getLocalSocketAddress(); 83 84 this.datagramSocket1 = new DatagramSocket(0, Inet6Address.LOOPBACK); 85 this.datagramSocket2 = new DatagramSocket(0, Inet6Address.LOOPBACK); 86 87 datagramSocket1Address = (InetSocketAddress) datagramSocket1.getLocalSocketAddress(); 88 datagramSocket2Address = (InetSocketAddress) datagramSocket2.getLocalSocketAddress(); 89 } 90 91 protected void tearDown() throws Exception { 92 IoUtils.closeQuietly(channel1); 93 IoUtils.closeQuietly(channel2); 94 IoUtils.closeQuietly(datagramSocket1); 95 IoUtils.closeQuietly(datagramSocket2); 96 97 datagramSocket1Address = null; 98 datagramSocket2Address = null; 99 super.tearDown(); 100 } 101 102 // ------------------------------------------------------------------- 103 // Test for methods in abstract class. 104 // ------------------------------------------------------------------- 105 /* 106 * Test method for 'java.nio.channels.DatagramChannel.validOps()' 107 */ 108 public void testValidOps() { 109 MockDatagramChannel testMock = new MockDatagramChannel(SelectorProvider 110 .provider()); 111 MockDatagramChannel testMocknull = new MockDatagramChannel(null); 112 int val = this.channel1.validOps(); 113 assertEquals(5, val); 114 assertEquals(val, testMock.validOps()); 115 assertEquals(val, testMocknull.validOps()); 116 } 117 118 /* 119 * Test method for 'java.nio.channels.DatagramChannel.open()' 120 */ 121 public void testOpen() { 122 MockDatagramChannel testMock = new MockDatagramChannel(SelectorProvider 123 .provider()); 124 MockDatagramChannel testMocknull = new MockDatagramChannel(null); 125 assertNull(testMocknull.provider()); 126 assertNotNull(testMock.provider()); 127 assertEquals(this.channel1.provider(), testMock.provider()); 128 assertEquals(5, testMock.validOps()); 129 } 130 131 /* 132 * Test method for 'java.nio.channels.DatagramChannel.read(ByteBuffer)' 133 */ 134 public void testReadByteBufferArray() throws IOException { 135 final int testNum = 0; 136 MockDatagramChannel testMock = new MockDatagramChannel(SelectorProvider 137 .provider()); 138 MockDatagramChannel testMocknull = new MockDatagramChannel(null); 139 int bufSize = 10; 140 ByteBuffer[] readBuf = null; 141 try { 142 this.channel1.read(readBuf); 143 fail("Should throw NPE"); 144 } catch (NullPointerException e) { 145 // correct 146 } 147 148 long readres; 149 try { 150 readres = testMock.read(readBuf); 151 fail("Should throw NPE"); 152 } catch (NullPointerException e) { 153 // correct 154 } 155 readBuf = new ByteBuffer[bufSize]; 156 try { 157 readres = this.channel1.read(readBuf); 158 fail("Should throw NotYetConnectedException"); 159 } catch (NotYetConnectedException expected) { 160 } 161 162 readres = testMock.read(readBuf); 163 assertEquals(testNum, readres); 164 readres = testMocknull.read(readBuf); 165 assertEquals(testNum, readres); 166 } 167 168 /* 169 * Test method for 'java.nio.channels.DatagramChannel.read(ByteBuffer)' 170 */ 171 public void testReadByteBufferArray_BufNull() throws IOException { 172 MockDatagramChannel testMock = new MockDatagramChannel(SelectorProvider 173 .provider()); 174 MockDatagramChannel testMocknull = new MockDatagramChannel(null); 175 176 ByteBuffer[] readBuf = null; 177 try { 178 this.channel1.read(readBuf); 179 fail("Should throw NPE"); 180 } catch (NullPointerException expected) { 181 } 182 try { 183 testMock.read(readBuf); 184 fail("Should throw NPE"); 185 } catch (NullPointerException expected) { 186 } 187 try { 188 testMocknull.read(readBuf); 189 fail("Should throw NPE"); 190 } catch (NullPointerException expected) { 191 } 192 } 193 194 /* 195 * Test method for 'java.nio.channels.DatagramChannel.write(ByteBuffer)' 196 */ 197 public void testWriteByteBuffer() throws IOException { 198 MockDatagramChannel testMock = new MockDatagramChannel(SelectorProvider 199 .provider()); 200 MockDatagramChannel testMocknull = new MockDatagramChannel(null); 201 int bufSize = 10; 202 ByteBuffer[] readBuf = null; 203 try { 204 this.channel1.write(readBuf); 205 fail("Should throw NPE"); 206 } catch (NullPointerException e) { 207 // correct 208 } 209 try { 210 testMock.write(readBuf); 211 fail("Should throw NPE"); 212 } catch (NullPointerException e) { 213 // correct 214 } 215 readBuf = new ByteBuffer[bufSize]; 216 try { 217 this.channel1.write(readBuf); 218 fail("Should throw NotYetConnectedException"); 219 } catch (NotYetConnectedException e) { 220 // correct 221 } 222 long writeres = 0; 223 writeres = testMock.write(readBuf); 224 225 assertEquals(0, writeres); 226 writeres = testMocknull.write(readBuf); 227 assertEquals(0, writeres); 228 } 229 230 /* 231 * Test method for 'java.nio.channels.DatagramChannel.write(ByteBuffer)' 232 */ 233 public void testWriteByteBuffer_Bufnull() throws IOException { 234 MockDatagramChannel testMock = new MockDatagramChannel(SelectorProvider 235 .provider()); 236 MockDatagramChannel testMocknull = new MockDatagramChannel(null); 237 ByteBuffer[] readBuf = null; 238 try { 239 this.channel1.write(readBuf); 240 fail("Should throw NPE"); 241 } catch (NullPointerException e) { 242 // correct 243 } 244 try { 245 testMock.write(readBuf); 246 fail("Should throw NPE"); 247 } catch (NullPointerException e) { 248 // correct 249 } 250 try { 251 testMocknull.write(readBuf); 252 fail("Should throw NPE"); 253 } catch (NullPointerException e) { 254 // correct 255 } 256 } 257 258 // ------------------------------------------------------------------- 259 // Test for socket() 260 // ------------------------------------------------------------------- 261 262 /** 263 * Test method for 'DatagramChannelImpl.socket()' 264 */ 265 public void testSocket_BasicStatusBeforeConnect() throws Exception { 266 final DatagramChannel dc = DatagramChannel.open(); 267 268 assertFalse(dc.isConnected());// not connected 269 DatagramSocket s1 = dc.socket(); 270 271 assertFalse(s1.isBound()); 272 assertFalse(s1.isClosed()); 273 assertFalse(s1.isConnected()); 274 assertFalse(s1.getBroadcast()); 275 assertFalse(s1.getReuseAddress()); 276 assertNull(s1.getInetAddress()); 277 assertTrue(s1.getLocalAddress().isAnyLocalAddress()); 278 assertEquals(s1.getLocalPort(), 0); 279 assertNull(s1.getLocalSocketAddress()); 280 assertEquals(s1.getPort(), -1); 281 assertTrue(s1.getReceiveBufferSize() >= 8192); 282 assertNull(s1.getRemoteSocketAddress()); 283 assertFalse(s1.getReuseAddress()); 284 assertTrue(s1.getSendBufferSize() >= 8192); 285 assertEquals(s1.getSoTimeout(), 0); 286 assertEquals(s1.getTrafficClass(), 0); 287 288 DatagramSocket s2 = dc.socket(); 289 // same 290 assertSame(s1, s2); 291 292 dc.close(); 293 } 294 295 /** 296 * Test method for 'DatagramChannelImpl.socket()' 297 */ 298 public void testSocket_Block_BasicStatusAfterConnect() throws IOException { 299 final DatagramChannel dc = DatagramChannel.open(); 300 301 dc.connect(datagramSocket1Address); 302 DatagramSocket s1 = dc.socket(); 303 assertSocketAfterConnect(s1); 304 DatagramSocket s2 = dc.socket(); 305 // same 306 assertSame(s1, s2); 307 308 dc.close(); 309 } 310 311 public void testSocket_NonBlock_BasicStatusAfterConnect() throws IOException { 312 final DatagramChannel dc = DatagramChannel.open(); 313 dc.connect(datagramSocket1Address); 314 dc.configureBlocking(false); 315 316 DatagramSocket s1 = dc.socket(); 317 assertSocketAfterConnect(s1); 318 DatagramSocket s2 = dc.socket(); 319 // same 320 assertSame(s1, s2); 321 322 dc.close(); 323 } 324 325 private void assertSocketAfterConnect(DatagramSocket s) throws SocketException { 326 assertTrue(s.isBound()); 327 assertFalse(s.isClosed()); 328 assertTrue(s.isConnected()); 329 assertFalse(s.getBroadcast()); 330 assertFalse(s.getReuseAddress()); 331 assertNotNull(s.getLocalSocketAddress()); 332 assertEquals(s.getPort(), datagramSocket1Address.getPort()); 333 assertTrue(s.getReceiveBufferSize() >= 8192); 334 // not same , but equals 335 assertNotSame(s.getRemoteSocketAddress(), datagramSocket1Address); 336 assertEquals(s.getRemoteSocketAddress(), datagramSocket1Address); 337 assertFalse(s.getReuseAddress()); 338 assertTrue(s.getSendBufferSize() >= 8192); 339 assertEquals(s.getSoTimeout(), 0); 340 assertEquals(s.getTrafficClass(), 0); 341 } 342 343 /** 344 * Test method for 'DatagramChannelImpl.socket()' 345 */ 346 public void testSocket_ActionsBeforeConnect() throws IOException { 347 assertFalse(channel1.isConnected());// not connected 348 assertTrue(channel1.isBlocking()); 349 DatagramSocket s = channel1.socket(); 350 351 s.connect(datagramSocket2Address); 352 assertTrue(channel1.isConnected()); 353 assertTrue(s.isConnected()); 354 355 s.disconnect(); 356 assertFalse(channel1.isConnected()); 357 assertFalse(s.isConnected()); 358 359 s.close(); 360 assertTrue(s.isClosed()); 361 assertFalse(channel1.isOpen()); 362 } 363 364 /** 365 * Test method for 'DatagramChannelImpl.socket()' 366 */ 367 public void testSocket_Block_ActionsAfterConnect() throws IOException { 368 assertFalse(this.channel1.isConnected());// not connected 369 this.channel1.connect(datagramSocket1Address); 370 DatagramSocket s = this.channel1.socket(); 371 assertSocketActionAfterConnect(s); 372 } 373 374 public void testSocket_NonBlock_ActionsAfterConnect() throws IOException { 375 this.channel1.connect(datagramSocket1Address); 376 this.channel1.configureBlocking(false); 377 DatagramSocket s = this.channel1.socket(); 378 assertSocketActionAfterConnect(s); 379 } 380 381 private void assertSocketActionAfterConnect(DatagramSocket s) throws IOException { 382 assertEquals(s.getPort(), datagramSocket1Address.getPort()); 383 try { 384 s.connect(datagramSocket2Address); 385 fail(); 386 } catch (IllegalStateException expected) { 387 } 388 389 assertTrue(this.channel1.isConnected()); 390 assertTrue(s.isConnected()); 391 // not changed 392 assertEquals(s.getPort(), datagramSocket1Address.getPort()); 393 394 s.disconnect(); 395 assertFalse(this.channel1.isConnected()); 396 assertFalse(s.isConnected()); 397 398 s.close(); 399 assertTrue(s.isClosed()); 400 assertFalse(this.channel1.isOpen()); 401 } 402 403 // ------------------------------------------------------------------- 404 // Test for isConnected() 405 // ------------------------------------------------------------------- 406 407 /** 408 * Test method for 'DatagramChannelImpl.isConnected()' 409 */ 410 public void testIsConnected_WithServer() throws IOException { 411 connectLocalServer(); 412 disconnectAfterConnected(); 413 this.datagramSocket1.close(); 414 this.channel1.close(); 415 assertFalse(this.channel1.isConnected()); 416 } 417 418 // ------------------------------------------------------------------- 419 // Test for connect() 420 // ------------------------------------------------------------------- 421 422 /** 423 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 424 */ 425 public void testConnect_BlockWithServer() throws IOException { 426 // blocking mode 427 assertTrue(this.channel1.isBlocking()); 428 connectLocalServer(); 429 datagramSocket1.close(); 430 disconnectAfterConnected(); 431 } 432 433 /** 434 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 435 */ 436 public void testConnect_BlockNoServer() throws IOException { 437 connectWithoutServer(); 438 disconnectAfterConnected(); 439 } 440 441 /** 442 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 443 */ 444 public void testConnect_NonBlockWithServer() throws IOException { 445 // Non blocking mode 446 this.channel1.configureBlocking(false); 447 connectLocalServer(); 448 datagramSocket1.close(); 449 disconnectAfterConnected(); 450 } 451 452 /** 453 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 454 */ 455 public void testConnect_Null() throws IOException { 456 assertFalse(this.channel1.isConnected()); 457 try { 458 this.channel1.connect(null); 459 fail("Should throw an IllegalArgumentException here."); //$NON-NLS-1$ 460 } catch (IllegalArgumentException e) { 461 // OK. 462 } 463 } 464 465 /** 466 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 467 */ 468 public void testConnect_UnsupportedType() throws IOException { 469 assertFalse(this.channel1.isConnected()); 470 class SubSocketAddress extends SocketAddress { 471 private static final long serialVersionUID = 1L; 472 473 public SubSocketAddress() { 474 super(); 475 } 476 } 477 SocketAddress newTypeAddress = new SubSocketAddress(); 478 try { 479 this.channel1.connect(newTypeAddress); 480 fail("Should throw an UnsupportedAddressTypeException here."); 481 } catch (UnsupportedAddressTypeException e) { 482 // OK. 483 } 484 } 485 486 /** 487 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 488 */ 489 public void testConnect_Unresolved() throws IOException { 490 assertFalse(this.channel1.isConnected()); 491 InetSocketAddress unresolved = new InetSocketAddress( 492 "unresolved address", 1080); 493 try { 494 this.channel1.connect(unresolved); 495 fail("Should throw an UnresolvedAddressException here."); //$NON-NLS-1$ 496 } catch (UnresolvedAddressException e) { 497 // OK. 498 } 499 } 500 501 public void testConnect_EmptyHost() throws Exception { 502 assertFalse(this.channel1.isConnected()); 503 504 assertEquals(this.channel1, this.channel1 505 .connect(new InetSocketAddress("", 1081))); 506 507 } 508 509 /** 510 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 511 */ 512 public void testConnect_ClosedChannelException() throws IOException { 513 assertFalse(this.channel1.isConnected()); 514 this.channel1.close(); 515 assertFalse(this.channel1.isOpen()); 516 try { 517 this.channel1.connect(datagramSocket1Address); 518 fail("Should throw ClosedChannelException."); //$NON-NLS-1$ 519 } catch (ClosedChannelException e) { 520 // OK. 521 } 522 } 523 524 /** 525 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 526 */ 527 public void testConnect_IllegalStateException() throws IOException { 528 assertFalse(this.channel1.isConnected()); 529 this.channel1.connect(datagramSocket1Address); 530 assertTrue(this.channel1.isConnected()); 531 // connect after connected. 532 try { 533 this.channel1.connect(datagramSocket1Address); 534 fail("Should throw IllegalStateException."); //$NON-NLS-1$ 535 } catch (IllegalStateException e) { 536 // OK. 537 } 538 } 539 540 /** 541 * Test method for 'DatagramChannelImpl.connect(SocketAddress)' 542 */ 543 public void testConnect_CheckOpenBeforeStatus() throws IOException { 544 assertFalse(this.channel1.isConnected()); 545 this.channel1.connect(datagramSocket1Address); 546 assertTrue(this.channel1.isConnected()); 547 // connect after connected. 548 this.channel1.close(); 549 assertFalse(this.channel1.isOpen()); 550 // checking open is before checking status. 551 try { 552 this.channel1.connect(datagramSocket1Address); 553 fail("Should throw ClosedChannelException."); //$NON-NLS-1$ 554 } catch (ClosedChannelException e) { 555 // OK. 556 } 557 } 558 559 private void disconnectAfterConnected() throws IOException { 560 assertTrue(this.channel1.isConnected()); 561 this.channel1.disconnect(); 562 assertFalse(this.channel1.isConnected()); 563 } 564 565 private void disconnectAfterClosed() throws IOException { 566 assertFalse(this.channel1.isOpen()); 567 assertFalse(this.channel1.isConnected()); 568 this.channel1.disconnect(); 569 assertFalse(this.channel1.isConnected()); 570 } 571 572 private void connectLocalServer() throws IOException { 573 assertFalse(this.channel1.isConnected()); 574 assertTrue(this.datagramSocket1.isBound()); 575 assertSame(this.channel1, this.channel1.connect(datagramSocket1Address)); 576 assertTrue(this.channel1.isConnected()); 577 } 578 579 private void connectWithoutServer() throws IOException { 580 assertFalse(this.channel1.isConnected()); 581 this.datagramSocket1.close(); 582 assertTrue(this.datagramSocket1.isClosed()); 583 assertSame(this.channel1, this.channel1.connect(datagramSocket1Address)); 584 assertTrue(this.channel1.isConnected()); 585 } 586 587 // ------------------------------------------------------------------- 588 // Test for disconnect() 589 // ------------------------------------------------------------------- 590 591 /** 592 * Test method for 'DatagramChannelImpl.disconnect()' 593 */ 594 public void testDisconnect_BeforeConnect() throws IOException { 595 assertFalse(this.channel1.isConnected()); 596 assertEquals(this.channel1, this.channel1.disconnect()); 597 assertFalse(this.channel1.isConnected()); 598 } 599 600 /** 601 * Test method for 'DatagramChannelImpl.disconnect()' 602 */ 603 public void testDisconnect_UnconnectedClosed() throws IOException { 604 assertFalse(this.channel1.isConnected()); 605 this.channel1.close(); 606 assertFalse(this.channel1.isOpen()); 607 assertEquals(this.channel1, this.channel1.disconnect()); 608 assertFalse(this.channel1.isConnected()); 609 } 610 611 /** 612 * Test method for 'DatagramChannelImpl.disconnect()' 613 */ 614 public void testDisconnect_BlockWithServerChannelClosed() 615 throws IOException { 616 assertTrue(this.channel1.isBlocking()); 617 connectLocalServer(); 618 // disconnect after channel close 619 this.channel1.close(); 620 disconnectAfterClosed(); 621 } 622 623 /** 624 * Test method for 'DatagramChannelImpl.disconnect()' 625 */ 626 public void testDisconnect_NonBlockWithServerChannelClosed() 627 throws IOException { 628 this.channel1.configureBlocking(false); 629 connectLocalServer(); 630 // disconnect after channel close 631 this.channel1.close(); 632 disconnectAfterClosed(); 633 } 634 635 /** 636 * Test method for 'DatagramChannelImpl.disconnect()' 637 */ 638 public void testDisconnect_BlockWithServerServerClosed() throws IOException { 639 assertTrue(this.channel1.isBlocking()); 640 connectLocalServer(); 641 // disconnect after server close 642 this.datagramSocket1.close(); 643 assertTrue(this.channel1.isOpen()); 644 assertTrue(this.channel1.isConnected()); 645 disconnectAfterConnected(); 646 } 647 648 /** 649 * Test method for 'DatagramChannelImpl.disconnect()' 650 */ 651 public void testDisconnect_NonBlockWithServerServerClosed() 652 throws IOException { 653 this.channel1.configureBlocking(false); 654 assertFalse(this.channel1.isBlocking()); 655 connectLocalServer(); 656 // disconnect after server close 657 this.datagramSocket1.close(); 658 assertTrue(this.channel1.isOpen()); 659 assertTrue(this.channel1.isConnected()); 660 disconnectAfterConnected(); 661 } 662 663 // ------------------------------------------------------------------- 664 // Test for receive(): Behavior Without Server. 665 // ------------------------------------------------------------------- 666 667 /** 668 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 669 */ 670 public void testReceive_UnconnectedNull() throws Exception { 671 assertFalse(this.channel1.isConnected()); 672 try { 673 this.channel1.receive(null); 674 fail("Should throw a NPE here."); //$NON-NLS-1$ 675 } catch (NullPointerException e) { 676 // OK. 677 } 678 } 679 680 /** 681 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 682 */ 683 public void testReceive_UnconnectedReadonly() throws Exception { 684 assertFalse(this.channel1.isConnected()); 685 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL) 686 .asReadOnlyBuffer(); 687 assertTrue(dst.isReadOnly()); 688 try { 689 this.channel1.receive(dst); 690 fail("Should throw an IllegalArgumentException here."); //$NON-NLS-1$ 691 } catch (IllegalArgumentException e) { 692 // OK. 693 } 694 } 695 696 /** 697 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 698 */ 699 public void testReceive_UnconnectedBufEmpty() throws Exception { 700 this.channel1.configureBlocking(false); 701 assertFalse(this.channel1.isConnected()); 702 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 703 assertNull(this.channel1.receive(dst)); 704 } 705 706 public void testReceive_UnboundBufZero() throws Exception { 707 DatagramChannel dc = DatagramChannel.open(); 708 709 assertFalse(dc.isConnected()); 710 assertFalse(dc.socket().isBound()); 711 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_ZERO); 712 assertNull(dc.receive(dst)); 713 714 dc.close(); 715 } 716 717 public void testReceive_UnboundBufNotEmpty() throws Exception { 718 DatagramChannel dc = DatagramChannel.open(); 719 assertFalse(dc.isConnected()); 720 assertFalse(dc.socket().isBound()); 721 722 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 723 // buf is not empty 724 dst.put((byte) 88); 725 assertEquals(dst.position() + CAPACITY_NORMAL - 1, dst.limit()); 726 assertNull(dc.receive(dst)); 727 728 dc.close(); 729 } 730 731 public void testReceive_UnboundBufFull() throws Exception { 732 DatagramChannel dc = DatagramChannel.open(); 733 734 assertFalse(dc.isConnected()); 735 assertFalse(dc.socket().isBound()); 736 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_ONE); 737 738 // buf is full 739 dst.put((byte) 88); 740 assertEquals(dst.position(), dst.limit()); 741 assertNull(dc.receive(dst)); 742 743 dc.close(); 744 } 745 746 /** 747 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 748 */ 749 public void testReceive_UnconnectedClose() throws Exception { 750 assertFalse(this.channel1.isConnected()); 751 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 752 this.channel1.close(); 753 assertFalse(this.channel1.isOpen()); 754 try { 755 assertNull(this.channel1.receive(dst)); 756 fail("Should throw a ClosedChannelException here."); //$NON-NLS-1$ 757 } catch (ClosedChannelException e) { 758 // OK. 759 } 760 } 761 762 /** 763 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 764 */ 765 public void testReceive_UnconnectedCloseNull() throws Exception { 766 assertFalse(this.channel1.isConnected()); 767 this.channel1.close(); 768 assertFalse(this.channel1.isOpen()); 769 // checking buffer before checking open 770 try { 771 this.channel1.receive(null); 772 fail("Should throw a NPE here."); //$NON-NLS-1$ 773 } catch (NullPointerException e) { 774 // OK. 775 } 776 } 777 778 /** 779 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 780 */ 781 public void testReceive_UnconnectedCloseReadonly() throws Exception { 782 assertFalse(this.channel1.isConnected()); 783 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL) 784 .asReadOnlyBuffer(); 785 assertTrue(dst.isReadOnly()); 786 this.channel1.close(); 787 assertFalse(this.channel1.isOpen()); 788 try { 789 this.channel1.receive(dst); 790 fail("Should throw an IllegalArgumentException here."); //$NON-NLS-1$ 791 } catch (IllegalArgumentException e) { 792 // OK. 793 } 794 } 795 796 /** 797 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 798 */ 799 public void testReceive_NonBlockNoServerBufEmpty() throws Exception { 800 this.channel1.configureBlocking(false); 801 receiveNonBlockNoServer(CAPACITY_NORMAL); 802 } 803 804 /** 805 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 806 */ 807 public void testReceive_BlockNoServerNull() throws Exception { 808 assertTrue(this.channel1.isBlocking()); 809 receiveNoServerNull(); 810 } 811 812 /** 813 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 814 */ 815 public void testReceive_NonBlockNoServerNull() throws Exception { 816 this.channel1.configureBlocking(false); 817 receiveNoServerNull(); 818 } 819 820 /** 821 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 822 */ 823 public void testReceive_BlockNoServerReadonly() throws Exception { 824 assertTrue(this.channel1.isBlocking()); 825 receiveNoServerReadonly(); 826 } 827 828 /** 829 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 830 */ 831 public void testReceive_NonBlockNoServerReadonly() throws Exception { 832 this.channel1.configureBlocking(false); 833 receiveNoServerReadonly(); 834 } 835 836 /** 837 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 838 */ 839 public void testReceive_NonBlockNoServerBufZero() throws Exception { 840 this.channel1.configureBlocking(false); 841 receiveNonBlockNoServer(CAPACITY_ZERO); 842 } 843 844 /** 845 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 846 */ 847 public void testReceive_NonBlockNoServerBufNotEmpty() throws Exception { 848 this.channel1.configureBlocking(false); 849 connectWithoutServer(); 850 ByteBuffer dst = allocateNonEmptyBuf(); 851 assertNull(this.channel1.receive(dst)); 852 } 853 854 855 /** 856 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 857 */ 858 public void testReceive_NonBlockNoServerBufFull() throws Exception { 859 this.channel1.configureBlocking(false); 860 connectWithoutServer(); 861 ByteBuffer dst = allocateFullBuf(); 862 assertNull(this.channel1.receive(dst)); 863 } 864 865 /** 866 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 867 */ 868 public void testReceive_BlockNoServerChannelClose() throws Exception { 869 assertTrue(this.channel1.isBlocking()); 870 receiveNoServerChannelClose(); 871 } 872 873 /** 874 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 875 */ 876 public void testReceive_NonBlockNoServerChannelClose() throws Exception { 877 this.channel1.configureBlocking(false); 878 receiveNoServerChannelClose(); 879 } 880 881 /** 882 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 883 */ 884 public void testReceive_BlockNoServerCloseNull() throws Exception { 885 assertTrue(this.channel1.isBlocking()); 886 receiveNoServerChannelCloseNull(); 887 } 888 889 /** 890 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 891 */ 892 public void testReceive_NonBlockNoServerCloseNull() throws Exception { 893 this.channel1.configureBlocking(false); 894 receiveNoServerChannelCloseNull(); 895 } 896 897 /** 898 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 899 */ 900 public void testReceive_NonBlockNoServerCloseReadonly() throws Exception { 901 this.channel1.configureBlocking(false); 902 receiveNoServerChannelCloseReadonly(); 903 } 904 905 /** 906 * Test method for 'DatagramChannelImpl.receive(ByteBuffer)' 907 */ 908 public void testReceive_BlockNoServerCloseReadonly() throws Exception { 909 assertTrue(this.channel1.isBlocking()); 910 receiveNoServerChannelCloseReadonly(); 911 } 912 913 private void receiveNoServerNull() throws IOException { 914 connectWithoutServer(); 915 try { 916 this.channel1.receive(null); 917 fail("Should throw a NPE here."); //$NON-NLS-1$ 918 } catch (NullPointerException e) { 919 // OK. 920 } 921 } 922 923 private void receiveNoServerReadonly() throws IOException { 924 connectWithoutServer(); 925 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL) 926 .asReadOnlyBuffer(); 927 assertTrue(dst.isReadOnly()); 928 try { 929 this.channel1.receive(dst); 930 fail("Should throw an IllegalArgumentException here."); //$NON-NLS-1$ 931 } catch (IllegalArgumentException e) { 932 // OK. 933 } 934 } 935 936 private void receiveNonBlockNoServer(int size) throws IOException { 937 connectWithoutServer(); 938 ByteBuffer dst = ByteBuffer.allocateDirect(size); 939 assertNull(this.channel1.receive(dst)); 940 } 941 942 private void receiveNoServerChannelClose() throws IOException { 943 connectWithoutServer(); 944 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 945 this.channel1.close(); 946 assertFalse(this.channel1.isOpen()); 947 try { 948 assertNull(this.channel1.receive(dst)); 949 fail("Should throw a ClosedChannelException here."); //$NON-NLS-1$ 950 } catch (ClosedChannelException e) { 951 // OK. 952 } 953 } 954 955 private void receiveNoServerChannelCloseNull() throws IOException { 956 connectWithoutServer(); 957 this.channel1.close(); 958 assertFalse(this.channel1.isOpen()); 959 try { 960 this.channel1.receive(null); 961 fail("Should throw a NPE here."); //$NON-NLS-1$ 962 } catch (NullPointerException e) { 963 // OK. 964 } 965 } 966 967 private void receiveNoServerChannelCloseReadonly() throws IOException { 968 connectWithoutServer(); 969 this.channel1.close(); 970 assertFalse(this.channel1.isOpen()); 971 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL) 972 .asReadOnlyBuffer(); 973 assertTrue(dst.isReadOnly()); 974 try { 975 this.channel1.receive(dst); 976 fail("Should throw an IllegalArgumentException here."); //$NON-NLS-1$ 977 } catch (IllegalArgumentException e) { 978 // OK. 979 } 980 } 981 982 private ByteBuffer allocateFullBuf() { 983 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_ONE); 984 // buf is full 985 dst.put((byte) 88); 986 assertEquals(dst.position(), dst.limit()); 987 return dst; 988 } 989 990 private ByteBuffer allocateNonEmptyBuf() { 991 ByteBuffer dst = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 992 // buf is not empty 993 dst.put((byte) 88); 994 dst.put((byte) 99); 995 assertEquals(dst.position() + CAPACITY_NORMAL - 2, dst.limit()); 996 return dst; 997 } 998 999 // ------------------------------------------------------------------- 1000 // Test for send(): Behavior without server. 1001 // ------------------------------------------------------------------- 1002 1003 private void sendDataBlocking(InetSocketAddress addr, ByteBuffer writeBuf) 1004 throws IOException { 1005 InetSocketAddress ipAddr = addr; 1006 assertEquals(CAPACITY_NORMAL, this.channel1.send(writeBuf, ipAddr)); 1007 assertTrue(this.channel1.isOpen()); 1008 assertTrue(this.channel1.isBlocking()); 1009 this.channel1.connect(ipAddr); 1010 assertTrue(this.channel1.isConnected()); 1011 } 1012 1013 private void sendDataNonBlocking(InetSocketAddress addr, ByteBuffer writeBuf) 1014 throws IOException { 1015 InetSocketAddress ipAddr = addr; 1016 this.channel1.configureBlocking(false); 1017 assertEquals(CAPACITY_NORMAL, this.channel1.send(writeBuf, ipAddr)); 1018 assertTrue(this.channel1.isOpen()); 1019 assertFalse(this.channel1.isBlocking()); 1020 this.channel1.connect(ipAddr); 1021 assertTrue(this.channel1.isConnected()); 1022 } 1023 1024 /* 1025 * Test method for 'DatagramChannelImpl.send(ByteBuffer, SocketAddress)' 1026 */ 1027 public void testSend_NoServerBlockingCommon() throws IOException { 1028 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1029 sendDataBlocking(datagramSocket1Address, writeBuf); 1030 } 1031 1032 public void testSend_NoServerNonblockingCommon() throws IOException { 1033 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1034 sendDataNonBlocking(datagramSocket1Address, writeBuf); 1035 } 1036 1037 public void testSend_NoServerTwice() throws IOException { 1038 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1039 sendDataBlocking(datagramSocket1Address, writeBuf); 1040 // can not buffer twice! 1041 assertEquals(0, this.channel1.send(writeBuf, datagramSocket1Address)); 1042 try { 1043 channel1.send(writeBuf, datagramSocket2Address); 1044 fail("Should throw IllegalArgumentException"); 1045 } catch (IllegalArgumentException e) { 1046 // correct 1047 } 1048 } 1049 1050 public void testSend_NoServerNonBlockingTwice() throws IOException { 1051 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1052 sendDataNonBlocking(datagramSocket1Address, writeBuf); 1053 // can not buffer twice! 1054 assertEquals(0, this.channel1.send(writeBuf, datagramSocket1Address)); 1055 try { 1056 channel1.send(writeBuf, datagramSocket2Address); 1057 fail("Should throw IllegalArgumentException"); 1058 } catch (IllegalArgumentException e) { 1059 // correct 1060 } 1061 } 1062 1063 public void testSend_NoServerBufNull() throws IOException { 1064 try { 1065 sendDataBlocking(datagramSocket1Address, null); 1066 fail("Should throw a NPE here."); 1067 } catch (NullPointerException e) { 1068 // correct 1069 } 1070 } 1071 1072 public void testSend_NoServerBufNullTwice() throws IOException { 1073 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1074 try { 1075 sendDataBlocking(datagramSocket1Address, null); 1076 fail("Should throw a NPE here."); 1077 } catch (NullPointerException e) { 1078 // correct 1079 } 1080 sendDataBlocking(datagramSocket1Address, writeBuf); 1081 try { 1082 channel1.send(null, datagramSocket2Address); 1083 fail("Should throw NPE"); 1084 } catch (NullPointerException e) { 1085 // correct 1086 } 1087 } 1088 1089 public void testSend_NoServerAddrNull() throws IOException { 1090 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1091 try { 1092 sendDataBlocking(null, writeBuf); 1093 fail("Should throw a IAE here."); 1094 } catch (IllegalArgumentException expected) { 1095 } 1096 } 1097 1098 public void testSend_NoServerAddrNullTwice() throws IOException { 1099 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1100 try { 1101 sendDataBlocking(null, writeBuf); 1102 fail("Should throw a IAE here."); 1103 } catch (IllegalArgumentException expected) { 1104 } 1105 1106 sendDataBlocking(datagramSocket1Address, writeBuf); 1107 try { 1108 channel1.send(writeBuf, null); 1109 fail("Should throw a IAE here."); 1110 } catch (IllegalArgumentException expected) { 1111 } 1112 } 1113 1114 // ------------------------------------------------------------------- 1115 // Test for receive()and send(): Send and Receive with Real Data 1116 // ------------------------------------------------------------------- 1117 1118 public void testReceiveSend_Block_Normal() throws Exception { 1119 sendOnChannel2("some normal string in testReceiveSend_Normal", 1120 channel1Address); 1121 receiveOnChannel1AndClose(CAPACITY_NORMAL, channel2Address, 1122 "some normal string in testReceiveSend_Normal"); 1123 } 1124 1125 public void testReceiveSend_NonBlock_NotBound() throws Exception { 1126 // not bound 1127 this.channel1.configureBlocking(false); 1128 this.channel2.configureBlocking(false); 1129 sendOnChannel2("some normal string in testReceiveSend_Normal", 1130 datagramSocket2Address); 1131 ByteBuffer buf = ByteBuffer.wrap(new byte[CAPACITY_NORMAL]); 1132 assertNull(this.channel1.receive(buf)); 1133 } 1134 1135 public void testReceiveSend_Block_Normal_S2C() throws Exception { 1136 sendOnDatagramSocket1( 1137 "some normal string in testReceiveSend_Normal_S2C", channel1Address); 1138 receiveOnChannel1AndClose(CAPACITY_NORMAL, datagramSocket1Address, 1139 "some normal string in testReceiveSend_Normal_S2C"); 1140 } 1141 1142 public void testReceiveSend_Block_Normal_C2S() throws Exception { 1143 String str1 = "some normal string in testReceiveSend_Normal_C2S"; 1144 sendOnChannel2(str1, datagramSocket1Address); 1145 receiveOnDatagramSocket1(CAPACITY_NORMAL, str1); 1146 } 1147 1148 public void testReceiveSend_NonBlock_Normal_C2S() throws Exception { 1149 this.channel1.configureBlocking(false); 1150 this.channel2.configureBlocking(false); 1151 String str1 = "some normal string in testReceiveSend_Normal_C2S"; 1152 sendOnChannel2(str1, datagramSocket1Address); 1153 receiveOnDatagramSocket1(CAPACITY_NORMAL, str1); 1154 } 1155 1156 public void testReceiveSend_Normal_S2S() throws Exception { 1157 String msg = "normal string in testReceiveSend_Normal_S2S"; 1158 DatagramPacket rdp = new DatagramPacket(msg.getBytes(), msg.length(), 1159 datagramSocket2Address); 1160 this.datagramSocket1.send(rdp); 1161 byte[] buf = new byte[CAPACITY_NORMAL]; 1162 this.datagramSocket2.setSoTimeout(TIME_UNIT); 1163 rdp = new DatagramPacket(buf, buf.length); 1164 this.datagramSocket2.receive(rdp); 1165 assertEquals(new String(buf, 0, CAPACITY_NORMAL).trim(), msg); 1166 } 1167 1168 public void testReceiveSend_Block_Empty() throws Exception { 1169 sendOnChannel2("", channel1Address); 1170 receiveOnChannel1AndClose(CAPACITY_NORMAL, channel2Address, ""); 1171 } 1172 1173 public void testReceiveSend_NonBlock_Empty() throws Exception { 1174 this.channel1.configureBlocking(false); 1175 this.channel2.configureBlocking(false); 1176 sendOnChannel2("", channel1Address); 1177 receiveOnChannel1AndClose(CAPACITY_NORMAL, channel2Address, ""); 1178 } 1179 1180 public void testReceiveSend_Block_Empty_S2C() throws Exception { 1181 sendOnDatagramSocket1("", channel1Address); 1182 receiveOnChannel1AndClose(CAPACITY_NORMAL, datagramSocket1Address, ""); 1183 } 1184 1185 public void testReceiveSend_NonBlock_Empty_S2C() throws Exception { 1186 this.channel1.configureBlocking(false); 1187 this.channel2.configureBlocking(false); 1188 sendOnDatagramSocket1("", channel1Address); 1189 receiveOnChannel1AndClose(CAPACITY_NORMAL, datagramSocket1Address, ""); 1190 } 1191 1192 public void testReceiveSend_Block_Empty_C2S() throws Exception { 1193 sendOnChannel2("", datagramSocket1Address); 1194 receiveOnDatagramSocket1(CAPACITY_NORMAL, ""); 1195 } 1196 1197 public void testReceiveSend_NonBlock_Empty_C2S() throws Exception { 1198 this.channel1.configureBlocking(false); 1199 this.channel2.configureBlocking(false); 1200 sendOnChannel2("", datagramSocket1Address); 1201 receiveOnDatagramSocket1(CAPACITY_NORMAL, ""); 1202 } 1203 1204 public void testReceiveSend_Empty_S2S() throws Exception { 1205 String msg = ""; 1206 DatagramPacket rdp = new DatagramPacket(msg.getBytes(), msg.length(), 1207 datagramSocket2Address); 1208 this.datagramSocket1.send(rdp); 1209 byte[] buf = new byte[CAPACITY_NORMAL]; 1210 this.datagramSocket2.setSoTimeout(TIME_UNIT); 1211 rdp = new DatagramPacket(buf, buf.length); 1212 this.datagramSocket2.receive(rdp); 1213 assertEquals(new String(buf, 0, CAPACITY_NORMAL).trim(), msg); 1214 } 1215 1216 public void testReceiveSend_Block_Oversize() throws Exception { 1217 sendOnChannel2("0123456789", channel1Address); 1218 receiveOnChannel1AndClose(5, channel2Address, "01234"); 1219 } 1220 1221 public void testReceiveSend_Block_Oversize_C2S() throws Exception { 1222 sendOnChannel2("0123456789", datagramSocket1Address); 1223 receiveOnDatagramSocket1(5, "01234"); 1224 } 1225 1226 public void testReceiveSend_NonBlock_Oversize_C2S() throws Exception { 1227 this.channel1.configureBlocking(false); 1228 this.channel2.configureBlocking(false); 1229 sendOnChannel2("0123456789", datagramSocket1Address); 1230 receiveOnDatagramSocket1(5, "01234"); 1231 } 1232 1233 public void testReceiveSend_Block_Oversize_S2C() throws Exception { 1234 sendOnDatagramSocket1("0123456789", channel1Address); 1235 receiveOnChannel1AndClose(5, datagramSocket1Address, "01234"); 1236 } 1237 1238 public void testReceiveSend_8K() throws Exception { 1239 StringBuffer str8k = new StringBuffer(); 1240 for (int i = 0; i < 8 * CAPACITY_1KB; i++) { 1241 str8k.append('a'); 1242 } 1243 String str = str8k.toString(); 1244 1245 sendOnChannel2(str, channel1Address); 1246 receiveOnChannel1AndClose(8 * CAPACITY_1KB, channel2Address, str); 1247 } 1248 1249 public void testReceiveSend_64K() throws Exception { 1250 StringBuffer str64k = new StringBuffer(); 1251 for (int i = 0; i < CAPACITY_64KB; i++) { 1252 str64k.append('a'); 1253 } 1254 String str = str64k.toString(); 1255 try { 1256 Thread.sleep(TIME_UNIT); 1257 channel2.send(ByteBuffer.wrap(str.getBytes()), datagramSocket1Address); 1258 fail("Should throw SocketException!"); 1259 } catch (SocketException expected) { 1260 } 1261 } 1262 1263 private void sendOnChannel2(String data, SocketAddress address) 1264 throws IOException { 1265 assertEquals(data.length(), channel2.send(ByteBuffer.wrap(data.getBytes()), address)); 1266 } 1267 1268 private void sendOnDatagramSocket1(String data, InetSocketAddress address) 1269 throws Exception { 1270 DatagramPacket rdp = new DatagramPacket(data.getBytes(), data.length(), address); 1271 this.datagramSocket1.send(rdp); 1272 } 1273 1274 private void receiveOnChannel1AndClose(int bufSize, 1275 InetSocketAddress expectedAddress, String expectedString) throws IOException { 1276 try { 1277 ByteBuffer buf = ByteBuffer.wrap(new byte[bufSize]); 1278 InetSocketAddress senderAddr; 1279 long startTime = System.currentTimeMillis(); 1280 do { 1281 senderAddr = (InetSocketAddress) this.channel1.receive(buf); 1282 // continue loop when channel1 is non-blocking and no data was 1283 // received. 1284 if (channel1.isBlocking() || senderAddr != null) { 1285 break; 1286 } 1287 // avoid dead loop 1288 assertTimeout(startTime, 10000); 1289 } while (true); 1290 1291 assertEquals(senderAddr.getAddress(), Inet6Address.LOOPBACK); 1292 assertEquals(expectedAddress.getPort(), senderAddr.getPort()); 1293 assertEquals(new String(buf.array(), 0, buf.position()), expectedString); 1294 } finally { 1295 this.channel1.close(); 1296 } 1297 } 1298 1299 /* 1300 * Fails if the difference between current time and start time is greater 1301 * than timeout. 1302 */ 1303 private void assertTimeout(long startTime, long timeout) { 1304 long currentTime = System.currentTimeMillis(); 1305 if ((currentTime - startTime) > timeout) { 1306 fail("Timeout"); 1307 } 1308 } 1309 1310 private void receiveOnDatagramSocket1(int bufSize, String expectedString) 1311 throws IOException { 1312 byte[] buf = new byte[bufSize]; 1313 this.datagramSocket1.setSoTimeout(6000); 1314 DatagramPacket rdp = new DatagramPacket(buf, buf.length); 1315 this.datagramSocket1.receive(rdp); 1316 assertEquals(new String(buf, 0, bufSize).trim(), expectedString); 1317 } 1318 1319 public void testRead_fromSend() throws Exception { 1320 ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL); 1321 String strHello = "hello"; 1322 1323 this.channel1.connect(channel2Address); 1324 this.channel2.send(ByteBuffer.wrap(strHello.getBytes()), channel1Address); 1325 1326 assertEquals(strHello.length(), this.channel1.read(buf)); 1327 assertAscii(buf, strHello); 1328 } 1329 1330 public void testReceive_Peek_NoSecurity_Nonblocking() throws Exception { 1331 String strHello = "hello"; 1332 1333 sendOnChannel2(strHello, channel1Address); 1334 this.channel1.configureBlocking(false); 1335 // for accepted addr, no problem. 1336 ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL); 1337 1338 InetSocketAddress source = (InetSocketAddress) this.channel1.receive(buf); 1339 assertEquals(channel2Address, source); 1340 assertAscii(buf, strHello); 1341 } 1342 1343 private static void assertAscii(ByteBuffer b, String s) { 1344 assertEquals(s.length(), b.position()); 1345 for (int i = 0; i < s.length(); ++i) { 1346 assertEquals(s.charAt(i), b.get(i)); 1347 } 1348 } 1349 1350 // ------------------------------------------------------------------- 1351 // Test for write() 1352 // ------------------------------------------------------------------- 1353 1354 private void connectWriteBuf(InetSocketAddress ipAddr, ByteBuffer buf) 1355 throws IOException { 1356 this.channel1.connect(ipAddr); 1357 assertTrue(this.channel1.isConnected()); 1358 assertEquals(CAPACITY_NORMAL, this.channel1.write(buf)); 1359 assertEquals(0, this.channel1.write(buf)); 1360 } 1361 1362 private void noconnectWrite(ByteBuffer buf) throws IOException { 1363 try { 1364 this.channel1.write(buf); 1365 fail("should throw NotYetConnectedException"); 1366 } catch (NotYetConnectedException e) { 1367 // correct 1368 } 1369 } 1370 1371 /* 1372 * Test method for 'DatagramChannelImpl.write(ByteBuffer)' 1373 */ 1374 public void testWriteByteBuffer_Block() throws IOException { 1375 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1376 connectWriteBuf(datagramSocket1Address, writeBuf); 1377 } 1378 1379 public void testWriteByteBuffer_NonBlock() throws IOException { 1380 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1381 this.channel1.configureBlocking(false); 1382 connectWriteBuf(datagramSocket1Address, writeBuf); 1383 } 1384 1385 public void testWriteByteBuffer_Block_closed() throws IOException { 1386 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1387 InetSocketAddress ipAddr = datagramSocket1Address; 1388 noconnectWrite(writeBuf); 1389 this.channel1.connect(ipAddr); 1390 assertTrue(this.channel1.isConnected()); 1391 this.channel1.close(); 1392 try { 1393 channel1.write(writeBuf); 1394 fail("should throw ClosedChannelException"); 1395 } catch (ClosedChannelException e) { 1396 // correct 1397 } 1398 } 1399 1400 public void testWriteByteBuffer_NonBlock_closed() throws IOException { 1401 ByteBuffer writeBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1402 InetSocketAddress ipAddr = datagramSocket1Address; 1403 // non block mode 1404 this.channel1.configureBlocking(false); 1405 noconnectWrite(writeBuf); 1406 this.channel1.connect(ipAddr); 1407 assertTrue(this.channel1.isConnected()); 1408 this.channel1.close(); 1409 try { 1410 channel1.write(writeBuf); 1411 fail("should throw ClosedChannelException"); 1412 } catch (ClosedChannelException e) { 1413 // correct 1414 } 1415 } 1416 1417 public void testWriteByteBuffer_Block_BufNull() throws IOException { 1418 ByteBuffer writeBuf = ByteBuffer.allocateDirect(0); 1419 InetSocketAddress ipAddr = datagramSocket1Address; 1420 try { 1421 this.channel1.write((ByteBuffer) null); 1422 fail("Should throw NPE."); 1423 } catch (NullPointerException e) { 1424 // correct 1425 } 1426 this.channel1.connect(ipAddr); 1427 assertTrue(this.channel1.isConnected()); 1428 try { 1429 this.channel1.write((ByteBuffer) null); 1430 fail("Should throw NPE."); 1431 } catch (NullPointerException e) { 1432 // correct 1433 } 1434 assertEquals(0, this.channel1.write(writeBuf)); 1435 datagramSocket1.close(); 1436 try { 1437 this.channel1.write((ByteBuffer) null); 1438 fail("Should throw NPE."); 1439 } catch (NullPointerException e) { 1440 // correct 1441 } 1442 } 1443 1444 public void testWriteByteBuffer_NonBlock_BufNull() throws IOException { 1445 ByteBuffer writeBuf = ByteBuffer.allocateDirect(0); 1446 InetSocketAddress ipAddr = datagramSocket1Address; 1447 1448 // non block mode 1449 this.channel1.configureBlocking(false); 1450 1451 try { 1452 this.channel1.write((ByteBuffer) null); 1453 fail("Should throw NPE."); 1454 } catch (NullPointerException e) { 1455 // correct 1456 } 1457 this.channel1.connect(ipAddr); 1458 assertTrue(this.channel1.isConnected()); 1459 try { 1460 this.channel1.write((ByteBuffer) null); 1461 fail("Should throw NPE."); 1462 } catch (NullPointerException e) { 1463 // correct 1464 } 1465 assertEquals(0, this.channel1.write(writeBuf)); 1466 datagramSocket1.close(); 1467 try { 1468 this.channel1.write((ByteBuffer) null); 1469 fail("Should throw NPE."); 1470 } catch (NullPointerException e) { 1471 // correct 1472 } 1473 } 1474 1475 /* 1476 * Test method for 'DatagramChannelImpl.write(ByteBuffer[], int, int)' 1477 */ 1478 public void testWriteByteBufferArrayIntInt_Block() throws IOException { 1479 ByteBuffer[] writeBuf = new ByteBuffer[2]; 1480 writeBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1481 writeBuf[1] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1482 InetSocketAddress ipAddr = datagramSocket1Address; 1483 try { 1484 this.channel1.write(writeBuf, 0, 2); 1485 fail("Should throw NotYetConnectedException."); 1486 } catch (NotYetConnectedException e) { 1487 // correct 1488 } 1489 this.channel1.connect(ipAddr); 1490 assertTrue(this.channel1.isConnected()); 1491 assertEquals(CAPACITY_NORMAL * 2, this.channel1.write(writeBuf, 0, 2)); 1492 // cannot be buffered again! 1493 assertEquals(0, this.channel1.write(writeBuf, 0, 1)); 1494 1495 } 1496 1497 public void testWriteByteBufferArrayIntInt_NonBlock() throws IOException { 1498 ByteBuffer[] writeBuf = new ByteBuffer[2]; 1499 writeBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1500 writeBuf[1] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1501 InetSocketAddress ipAddr = datagramSocket1Address; 1502 // non-block mode 1503 this.channel1.configureBlocking(false); 1504 try { 1505 this.channel1.write(writeBuf, 0, 2); 1506 fail("Should throw NotYetConnectedException."); 1507 } catch (NotYetConnectedException e) { 1508 // correct 1509 } 1510 this.channel1.connect(ipAddr); 1511 assertTrue(this.channel1.isConnected()); 1512 assertEquals(CAPACITY_NORMAL * 2, this.channel1.write(writeBuf, 0, 2)); 1513 // cannot be buffered again! 1514 assertEquals(0, this.channel1.write(writeBuf, 0, 1)); 1515 1516 } 1517 1518 public void testWriteByteBufferArrayIntInt_NoConnectIndexBad() 1519 throws IOException { 1520 ByteBuffer[] writeBuf = new ByteBuffer[2]; 1521 writeBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1522 writeBuf[1] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1523 InetSocketAddress ipAddr = datagramSocket1Address; 1524 try { 1525 this.channel1.write(writeBuf, -1, 2); 1526 fail("should throw IndexOutOfBoundsException"); 1527 } catch (IndexOutOfBoundsException e) { 1528 // correct 1529 } 1530 try { 1531 this.channel1.write(writeBuf, 0, -1); 1532 fail("should throw IndexOutOfBoundsException"); 1533 } catch (IndexOutOfBoundsException e) { 1534 // correct 1535 } 1536 this.channel1.connect(ipAddr); 1537 assertTrue(this.channel1.isConnected()); 1538 assertEquals(CAPACITY_NORMAL * 2, this.channel1.write(writeBuf, 0, 2)); 1539 // cannot be buffered again! 1540 assertEquals(0, this.channel1.write(writeBuf, 0, 1)); 1541 } 1542 1543 public void testWriteByteBufferArrayIntInt_ConnectedIndexBad() 1544 throws IOException { 1545 ByteBuffer[] writeBuf = new ByteBuffer[2]; 1546 writeBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1547 writeBuf[1] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1548 InetSocketAddress ipAddr = datagramSocket1Address; 1549 this.channel1.connect(ipAddr); 1550 assertTrue(this.channel1.isConnected()); 1551 try { 1552 this.channel1.write(writeBuf, -1, 2); 1553 fail("should throw IndexOutOfBoundsException"); 1554 } catch (IndexOutOfBoundsException e) { 1555 // correct 1556 } 1557 try { 1558 this.channel1.write(writeBuf, 0, -1); 1559 fail("should throw IndexOutOfBoundsException"); 1560 } catch (IndexOutOfBoundsException e) { 1561 // correct 1562 } 1563 } 1564 1565 public void testWriteByteBufferArrayIntInt_BufNullNoConnect() 1566 throws IOException { 1567 ByteBuffer[] writeBuf = new ByteBuffer[2]; 1568 writeBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1569 try { 1570 this.channel1.write(null, 0, 2); 1571 fail(); 1572 } catch (NullPointerException expected) { 1573 } 1574 try { 1575 this.channel1.write(writeBuf, -1, 2); 1576 fail(); 1577 } catch (IndexOutOfBoundsException expected) { 1578 } 1579 try { 1580 this.channel1.write(writeBuf, 0, 3); 1581 fail(); 1582 } catch (IndexOutOfBoundsException expected) { 1583 } 1584 } 1585 1586 public void testWriteByteBufferArrayIntInt_BufNullConnect() 1587 throws IOException { 1588 ByteBuffer[] writeBuf = new ByteBuffer[2]; 1589 writeBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1590 InetSocketAddress ipAddr = datagramSocket1Address; 1591 this.channel1.connect(ipAddr); 1592 assertTrue(this.channel1.isConnected()); 1593 try { 1594 this.channel1.write(null, 0, 2); 1595 fail("should throw NPE"); 1596 } catch (NullPointerException e) { 1597 // correct 1598 } 1599 try { 1600 this.channel1.write(writeBuf, 0, 3); 1601 fail("should throw IndexOutOfBoundsException"); 1602 } catch (IndexOutOfBoundsException e) { 1603 // correct 1604 } 1605 datagramSocket1.close(); 1606 try { 1607 this.channel1.write(null, 0, 2); 1608 fail("should throw NPE"); 1609 } catch (NullPointerException e) { 1610 // correct 1611 } 1612 } 1613 1614 // ------------------------------------------------------------------- 1615 // Test for read() 1616 // ------------------------------------------------------------------- 1617 1618 /* 1619 * Test method for 'DatagramChannelImpl.read(ByteBuffer)' 1620 */ 1621 public void testReadByteBuffer() throws IOException { 1622 ByteBuffer readBuf = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1623 try { 1624 this.channel1.read(readBuf); 1625 fail("should throw NotYetConnectedException"); 1626 } catch (NotYetConnectedException e) { 1627 // correct 1628 } 1629 this.channel1.connect(datagramSocket1Address); 1630 assertTrue(this.channel1.isConnected()); 1631 this.channel1.configureBlocking(false); 1632 // note : blocking-mode will make the read process endless! 1633 assertEquals(0, this.channel1.read(readBuf)); 1634 this.channel1.close(); 1635 try { 1636 this.channel1.read(readBuf); 1637 fail("Should throw ClosedChannelException"); 1638 } catch (ClosedChannelException e) { 1639 // OK. 1640 } 1641 } 1642 1643 public void testReadByteBuffer_bufNull() throws IOException { 1644 ByteBuffer readBuf = ByteBuffer.allocateDirect(0); 1645 InetSocketAddress ipAddr = datagramSocket1Address; 1646 try { 1647 this.channel1.read(readBuf); 1648 fail("should throw NotYetConnectedException"); 1649 } catch (NotYetConnectedException e) { 1650 // correct 1651 } 1652 this.channel1.connect(ipAddr); 1653 assertTrue(this.channel1.isConnected()); 1654 try { 1655 channel1.read((ByteBuffer) null); 1656 fail("should throw NPE"); 1657 } catch (NullPointerException e) { 1658 // correct 1659 } 1660 this.channel1.configureBlocking(false); 1661 // note : blocking-mode will make the read process endless! 1662 assertEquals(0, this.channel1.read(readBuf)); 1663 datagramSocket1.close(); 1664 } 1665 1666 /* 1667 * Test method for 'DatagramChannelImpl.read(ByteBuffer[], int, int)' 1668 */ 1669 public void testReadByteBufferArrayIntInt() throws IOException { 1670 ByteBuffer[] readBuf = new ByteBuffer[2]; 1671 readBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1672 readBuf[1] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1673 InetSocketAddress ipAddr = datagramSocket1Address; 1674 try { 1675 this.channel1.read(readBuf, 0, 2); 1676 fail("should throw NotYetConnectedException"); 1677 } catch (NotYetConnectedException e) { 1678 // correct 1679 } 1680 this.channel1.connect(ipAddr); 1681 assertTrue(this.channel1.isConnected()); 1682 this.channel1.configureBlocking(false); 1683 // note : blocking-mode will make the read process endless! 1684 assertEquals(0, this.channel1.read(readBuf, 0, 1)); 1685 assertEquals(0, this.channel1.read(readBuf, 0, 2)); 1686 datagramSocket1.close(); 1687 } 1688 1689 public void testReadByteBufferArrayIntInt_exceptions() throws IOException { 1690 //regression test for HARMONY-932 1691 try { 1692 DatagramChannel.open().read(new ByteBuffer[] {}, 2, Integer.MAX_VALUE); 1693 fail(); 1694 } catch (IndexOutOfBoundsException expected) { 1695 } 1696 try { 1697 DatagramChannel.open().read(new ByteBuffer[] {}, -1, 0); 1698 fail(); 1699 } catch (IndexOutOfBoundsException expected) { 1700 } 1701 try { 1702 DatagramChannel.open().read((ByteBuffer[]) null, 0, 0); 1703 fail(); 1704 } catch (NullPointerException expected) { 1705 } 1706 } 1707 1708 public void testReadByteBufferArrayIntInt_BufNull() throws IOException { 1709 ByteBuffer[] readBuf = new ByteBuffer[2]; 1710 readBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 1711 InetSocketAddress ipAddr = datagramSocket1Address; 1712 try { 1713 this.channel1.read(null, 0, 0); 1714 fail("should throw NPE"); 1715 } catch (NullPointerException e) { 1716 // correct 1717 } 1718 this.channel1.connect(ipAddr); 1719 assertTrue(this.channel1.isConnected()); 1720 this.channel1.configureBlocking(false); 1721 // note : blocking-mode will make the read process endless! 1722 try { 1723 this.channel1.read(null, 0, 0); 1724 fail("should throw NPE"); 1725 } catch (NullPointerException e) { 1726 // correct 1727 } 1728 assertEquals(0, this.channel1.read(readBuf, 0, 1)); 1729 try { 1730 this.channel1.read(readBuf, 0, 2); 1731 fail("should throw NPE"); 1732 } catch (NullPointerException e) { 1733 // correct 1734 } 1735 try { 1736 this.channel1.read(readBuf, 0, 3); 1737 fail("should throw IndexOutOfBoundsException"); 1738 } catch (IndexOutOfBoundsException e) { 1739 // correct 1740 } 1741 datagramSocket1.close(); 1742 } 1743 1744 // ------------------------------------------------------------------- 1745 // test read and write 1746 // ------------------------------------------------------------------- 1747 1748 public static class A { 1749 protected int z; 1750 } 1751 1752 public static class B extends A { 1753 protected int z; 1754 1755 void foo() { 1756 super.z+=1; 1757 } 1758 } 1759 1760 1761 public void testReadWrite_asyncClose() throws Exception { 1762 byte[] targetArray = new byte[2]; 1763 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 1764 1765 channel2.connect(channel1Address); 1766 channel1.connect(channel2Address); 1767 1768 new Thread() { 1769 public void run() { 1770 try { 1771 Thread.sleep(TIME_UNIT); 1772 channel1.close(); 1773 } catch (Exception e) { 1774 //ignore 1775 } 1776 } 1777 }.start(); 1778 1779 try { 1780 this.channel1.read(targetBuf); 1781 fail("should throw AsynchronousCloseException"); 1782 } catch (AsynchronousCloseException e) { 1783 // ok 1784 } 1785 } 1786 1787 public void testReadWrite_Block_Zero() throws Exception { 1788 byte[] sourceArray = new byte[0]; 1789 byte[] targetArray = new byte[0]; 1790 1791 channel1.connect(channel2Address); 1792 channel2.connect(channel1Address); 1793 1794 // write 1795 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 1796 assertEquals(0, this.channel1.write(sourceBuf)); 1797 1798 // read 1799 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 1800 int readCount = this.channel2.read(targetBuf); 1801 1802 assertEquals(0, readCount); 1803 } 1804 1805 public void testReadWrite_Block_Normal() throws Exception { 1806 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 1807 byte[] targetArray = new byte[CAPACITY_NORMAL]; 1808 for (int i = 0; i < sourceArray.length; i++) { 1809 sourceArray[i] = (byte) i; 1810 } 1811 1812 channel1.connect(channel2Address); 1813 channel2.connect(channel1Address); 1814 1815 readWriteReadData(this.channel1, sourceArray, this.channel2, 1816 targetArray, CAPACITY_NORMAL, "testReadWrite_Block_Normal"); 1817 } 1818 1819 public void testReadWrite_Block_Empty() throws Exception { 1820 // empty buf 1821 byte[] sourceArray = "".getBytes(); 1822 byte[] targetArray = new byte[CAPACITY_NORMAL]; 1823 1824 channel1.connect(channel2Address); 1825 channel2.connect(channel1Address); 1826 1827 // write 1828 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 1829 assertEquals(0, this.channel1.write(sourceBuf)); 1830 1831 // read 1832 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 1833 // empty message let the reader blocked 1834 closeBlockedReaderChannel2(targetBuf); 1835 } 1836 1837 public void testReadWrite_changeBlock_Empty() throws Exception { 1838 // empty buf 1839 byte[] sourceArray = "".getBytes(); 1840 byte[] targetArray = new byte[CAPACITY_NORMAL]; 1841 1842 channel1.connect(channel2Address); 1843 channel2.connect(channel1Address); 1844 1845 // write 1846 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 1847 assertEquals(0, this.channel1.write(sourceBuf)); 1848 1849 // read 1850 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 1851 // empty message let the reader blocked 1852 new Thread() { 1853 public void run() { 1854 try { 1855 Thread.sleep(TIME_UNIT); 1856 channel2.configureBlocking(false); 1857 Thread.sleep(TIME_UNIT * 5); 1858 channel2.close(); 1859 } catch (Exception e) { 1860 // do nothing 1861 } 1862 } 1863 }.start(); 1864 try { 1865 assertTrue(this.channel2.isBlocking()); 1866 this.channel2.read(targetBuf); 1867 fail("Should throw AsynchronousCloseException"); 1868 } catch (AsynchronousCloseException e) { 1869 assertFalse(this.channel2.isBlocking()); 1870 // OK. 1871 } 1872 } 1873 1874 public void testReadWrite_Block_8KB() throws Exception { 1875 byte[] sourceArray = new byte[CAPACITY_1KB * 8]; 1876 byte[] targetArray = new byte[CAPACITY_1KB * 8]; 1877 for (int i = 0; i < sourceArray.length; i++) { 1878 sourceArray[i] = (byte) i; 1879 } 1880 1881 channel1.connect(channel2Address); 1882 channel2.connect(channel1Address); 1883 1884 readWriteReadData(this.channel1, sourceArray, this.channel2, 1885 targetArray, 8 * CAPACITY_1KB, "testReadWrite_Block_8KB"); 1886 } 1887 1888 /* 1889 * sender write the sourceArray whose size is dataSize, and receiver read 1890 * the data into targetArray 1891 */ 1892 private void readWriteReadData(DatagramChannel sender, byte[] sourceArray, 1893 DatagramChannel receiver, byte[] targetArray, int dataSize, 1894 String methodName) throws IOException { 1895 // write 1896 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 1897 assertEquals(dataSize, sender.write(sourceBuf)); 1898 1899 // read 1900 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 1901 1902 int count = 0; 1903 int total = 0; 1904 long beginTime = System.currentTimeMillis(); 1905 while (total < dataSize && (count = receiver.read(targetBuf)) != -1) { 1906 total = total + count; 1907 // 3s timeout to avoid dead loop 1908 if (System.currentTimeMillis() - beginTime > 3000){ 1909 break; 1910 } 1911 } 1912 1913 assertEquals(dataSize, total); 1914 assertEquals(targetBuf.position(), total); 1915 targetBuf.flip(); 1916 targetArray = targetBuf.array(); 1917 for (int i = 0; i < targetArray.length; i++) { 1918 assertEquals(targetArray[i], (byte) i); 1919 } 1920 } 1921 1922 public void testReadWrite_Block_64K() throws Exception { 1923 byte[] sourceArray = new byte[CAPACITY_64KB]; 1924 for (int i = 0; i < sourceArray.length; i++) { 1925 sourceArray[i] = (byte) i; 1926 } 1927 1928 channel1.connect(channel2Address); 1929 1930 // write 1931 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 1932 try { 1933 channel1.write(sourceBuf); 1934 fail("Should throw IOException"); 1935 } catch (IOException expected) { 1936 // too big 1937 } 1938 } 1939 1940 public void testReadWrite_Block_DifferentAddr() throws Exception { 1941 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 1942 byte[] targetArray = new byte[CAPACITY_NORMAL]; 1943 for (int i = 0; i < sourceArray.length; i++) { 1944 sourceArray[i] = (byte) i; 1945 } 1946 1947 this.channel1.connect(channel1.socket().getLocalSocketAddress()); 1948 this.channel2.connect(datagramSocket1Address); // the different addr 1949 1950 // write 1951 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 1952 assertEquals(CAPACITY_NORMAL, this.channel1.write(sourceBuf)); 1953 1954 // read 1955 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 1956 // the wrong connected addr will make the read blocked. 1957 // we close the blocked channel 1958 closeBlockedReaderChannel2(targetBuf); 1959 } 1960 1961 public void testReadWrite_Block_WriterNotBound() throws Exception { 1962 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 1963 byte[] targetArray = new byte[CAPACITY_NORMAL]; 1964 for (int i = 0; i < sourceArray.length; i++) { 1965 sourceArray[i] = (byte) i; 1966 } 1967 1968 DatagramChannel dc = DatagramChannel.open(); 1969 // The writer isn't bound, but is connected. 1970 dc.connect(channel1Address); 1971 1972 // write 1973 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 1974 assertEquals(CAPACITY_NORMAL, dc.write(sourceBuf)); 1975 1976 // Connect channel2 after data has been written. 1977 channel2.connect(dc.socket().getLocalSocketAddress()); 1978 1979 // read 1980 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 1981 closeBlockedReaderChannel2(targetBuf); 1982 1983 dc.close(); 1984 } 1985 1986 // NOTE: The original harmony test tested that things still work 1987 // if there's no socket bound at the the address we're connecting to. 1988 // 1989 // It isn't really feasible to implement that in a non-racy way. 1990 public void testReadWrite_Block_WriterConnectLater() throws Exception { 1991 1992 byte[] targetArray = new byte[CAPACITY_NORMAL]; 1993 1994 // The reader is bound & connected to channel1. 1995 channel2.connect(channel1Address); 1996 1997 // read 1998 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 1999 new Thread() { 2000 public void run() { 2001 try { 2002 Thread.sleep(TIME_UNIT); 2003 // bind later 2004 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 2005 for (int i = 0; i < sourceArray.length; i++) { 2006 sourceArray[i] = (byte) i; 2007 } 2008 2009 channel1.connect(channel2Address); 2010 // write later 2011 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 2012 assertEquals(CAPACITY_NORMAL, channel1.write(sourceBuf)); 2013 } catch (Exception e) { 2014 // do nothing 2015 } 2016 } 2017 }.start(); 2018 2019 int count = 0; 2020 int total = 0; 2021 long beginTime = System.currentTimeMillis(); 2022 2023 while (total < CAPACITY_NORMAL && (count = channel2.read(targetBuf)) != -1) { 2024 total = total + count; 2025 // 3s timeout to avoid dead loop 2026 if (System.currentTimeMillis() - beginTime > 3000){ 2027 break; 2028 } 2029 } 2030 2031 assertEquals(CAPACITY_NORMAL, total); 2032 assertEquals(targetBuf.position(), total); 2033 targetBuf.flip(); 2034 targetArray = targetBuf.array(); 2035 for (int i = 0; i < targetArray.length; i++) { 2036 assertEquals(targetArray[i], (byte) i); 2037 } 2038 } 2039 2040 // NOTE: The original harmony test tested that things still work 2041 // if there's no socket bound at the the address we're connecting to. 2042 // 2043 // It isn't really feasible to implement that in a non-racy way. 2044 public void testReadWrite_Block_ReaderNotConnected() throws Exception { 2045 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 2046 byte[] targetArray = new byte[CAPACITY_NORMAL]; 2047 for (int i = 0; i < sourceArray.length; i++) { 2048 sourceArray[i] = (byte) i; 2049 } 2050 2051 // reader channel2 is not connected. 2052 this.channel1.connect(channel2Address); 2053 2054 // write 2055 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 2056 assertEquals(CAPACITY_NORMAL, this.channel1.write(sourceBuf)); 2057 2058 // read 2059 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 2060 try { 2061 this.channel2.read(targetBuf); 2062 fail(); 2063 } catch (NotYetConnectedException expected) { 2064 } 2065 } 2066 2067 private void closeBlockedReaderChannel2(ByteBuffer targetBuf) 2068 throws IOException { 2069 assertTrue(this.channel2.isBlocking()); 2070 2071 new Thread() { 2072 public void run() { 2073 try { 2074 Thread.sleep(TIME_UNIT); 2075 } catch (InterruptedException ie) { 2076 fail(); 2077 } 2078 IoUtils.closeQuietly(channel2); 2079 } 2080 }.start(); 2081 2082 try { 2083 this.channel2.read(targetBuf); 2084 fail("Should throw AsynchronousCloseException"); 2085 } catch (AsynchronousCloseException e) { 2086 // OK. 2087 } 2088 } 2089 2090 // ------------------------------------------------------------------- 2091 // Test read and write in non-block mode. 2092 // ------------------------------------------------------------------- 2093 public void testReadWrite_NonBlock_Normal() throws Exception { 2094 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 2095 byte[] targetArray = new byte[CAPACITY_NORMAL]; 2096 for (int i = 0; i < sourceArray.length; i++) { 2097 sourceArray[i] = (byte) i; 2098 } 2099 2100 this.channel1.configureBlocking(false); 2101 this.channel2.configureBlocking(false); 2102 2103 channel1.connect(channel2Address); 2104 channel2.connect(channel1Address); 2105 2106 readWriteReadData(this.channel1, sourceArray, this.channel2, 2107 targetArray, CAPACITY_NORMAL, "testReadWrite_NonBlock_Normal"); 2108 } 2109 2110 public void testReadWrite_NonBlock_8KB() throws Exception { 2111 byte[] sourceArray = new byte[CAPACITY_1KB * 8]; 2112 byte[] targetArray = new byte[CAPACITY_1KB * 8]; 2113 for (int i = 0; i < sourceArray.length; i++) { 2114 sourceArray[i] = (byte) i; 2115 } 2116 2117 this.channel1.configureBlocking(false); 2118 this.channel2.configureBlocking(false); 2119 2120 // bind and connect 2121 channel1.connect(channel2Address); 2122 channel2.connect(channel1Address); 2123 2124 readWriteReadData(this.channel1, sourceArray, this.channel2, 2125 targetArray, 8 * CAPACITY_1KB, "testReadWrite_NonBlock_8KB"); 2126 } 2127 2128 public void testReadWrite_NonBlock_DifferentAddr() throws Exception { 2129 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 2130 byte[] targetArray = new byte[CAPACITY_NORMAL]; 2131 for (int i = 0; i < sourceArray.length; i++) { 2132 sourceArray[i] = (byte) i; 2133 } 2134 2135 this.channel1.configureBlocking(false); 2136 this.channel2.configureBlocking(false); 2137 2138 channel1.connect(channel2Address); 2139 channel2.connect(datagramSocket1Address);// the different addr 2140 2141 // write 2142 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 2143 assertEquals(CAPACITY_NORMAL, this.channel1.write(sourceBuf)); 2144 2145 // read 2146 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 2147 assertEquals(0, this.channel2.read(targetBuf)); 2148 } 2149 2150 2151 public void testReadWrite_NonBlock_WriterNotBound() throws Exception { 2152 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 2153 byte[] targetArray = new byte[CAPACITY_NORMAL]; 2154 for (int i = 0; i < sourceArray.length; i++) { 2155 sourceArray[i] = (byte) i; 2156 } 2157 2158 DatagramChannel dc = DatagramChannel.open(); 2159 // The writer isn't bound, but is connected. 2160 dc.connect(channel1Address); 2161 dc.configureBlocking(false); 2162 channel2.configureBlocking(false); 2163 2164 // write 2165 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 2166 assertEquals(CAPACITY_NORMAL, dc.write(sourceBuf)); 2167 2168 // Connect channel2 after data has been written. 2169 channel2.connect(dc.socket().getLocalSocketAddress()); 2170 2171 // read 2172 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 2173 assertEquals(0, this.channel2.read(targetBuf)); 2174 2175 dc.close(); 2176 } 2177 2178 // NOTE: The original harmony test tested that things still work 2179 // if there's no socket bound at the the address we're connecting to. 2180 // 2181 // It isn't really feasible to implement that in a non-racy way. 2182 public void testReadWrite_NonBlock_ReaderNotConnected() throws Exception { 2183 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 2184 byte[] targetArray = new byte[CAPACITY_NORMAL]; 2185 for (int i = 0; i < sourceArray.length; i++) { 2186 sourceArray[i] = (byte) i; 2187 } 2188 2189 this.channel1.configureBlocking(false); 2190 this.channel2.configureBlocking(false); 2191 2192 channel1.connect(channel2Address); 2193 2194 // write 2195 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 2196 assertEquals(CAPACITY_NORMAL, this.channel1.write(sourceBuf)); 2197 2198 // read 2199 ByteBuffer targetBuf = ByteBuffer.wrap(targetArray); 2200 2201 try { 2202 assertEquals(0, this.channel2.read(targetBuf)); 2203 fail(); 2204 } catch (NotYetConnectedException expected) { 2205 } 2206 } 2207 2208 public void test_write_LBuffer_positioned() throws Exception { 2209 // Regression test for Harmony-683 2210 int position = 16; 2211 DatagramChannel dc = DatagramChannel.open(); 2212 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 2213 dc.connect(datagramSocket1Address); 2214 // write 2215 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 2216 sourceBuf.position(position); 2217 assertEquals(CAPACITY_NORMAL - position, dc.write(sourceBuf)); 2218 } 2219 2220 public void test_send_LBuffer_LSocketAddress_PositionNotZero() 2221 throws Exception { 2222 // regression test for Harmony-701 2223 int CAPACITY_NORMAL = 256; 2224 int position = 16; 2225 DatagramChannel dc = DatagramChannel.open(); 2226 byte[] sourceArray = new byte[CAPACITY_NORMAL]; 2227 // send ByteBuffer whose position is not zero 2228 ByteBuffer sourceBuf = ByteBuffer.wrap(sourceArray); 2229 sourceBuf.position(position); 2230 int ret = dc.send(sourceBuf, datagramSocket1Address); 2231 // assert send (256 - 16) bytes 2232 assertEquals(CAPACITY_NORMAL - position, ret); 2233 // assert the position of ByteBuffer has been set 2234 assertEquals(CAPACITY_NORMAL, sourceBuf.position()); 2235 } 2236 2237 /** 2238 * @tests DatagramChannel#read(ByteBuffer[]) 2239 */ 2240 public void test_read_$LByteBuffer() throws Exception { 2241 channel1.connect(channel2Address); 2242 channel2.connect(channel1Address); 2243 2244 // regression test for Harmony-754 2245 channel2.write(ByteBuffer.allocate(CAPACITY_NORMAL)); 2246 2247 ByteBuffer[] readBuf = new ByteBuffer[2]; 2248 readBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 2249 readBuf[1] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 2250 2251 channel1.configureBlocking(true); 2252 assertEquals(CAPACITY_NORMAL, channel1.read(readBuf)); 2253 } 2254 2255 /** 2256 * @tests DatagramChannel#read(ByteBuffer[],int,int) 2257 */ 2258 public void test_read_$LByteBufferII() throws Exception { 2259 channel1.connect(channel2Address); 2260 channel2.connect(channel1Address); 2261 2262 // regression test for Harmony-754 2263 channel2.write(ByteBuffer.allocate(CAPACITY_NORMAL)); 2264 2265 ByteBuffer[] readBuf = new ByteBuffer[2]; 2266 readBuf[0] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 2267 readBuf[1] = ByteBuffer.allocateDirect(CAPACITY_NORMAL); 2268 2269 channel1.configureBlocking(true); 2270 assertEquals(CAPACITY_NORMAL, channel1.read(readBuf, 0, 2)); 2271 } 2272 2273 /** 2274 * @tests DatagramChannel#read(ByteBuffer) 2275 */ 2276 public void test_read_LByteBuffer_closed_nullBuf() throws Exception { 2277 // regression test for Harmony-754 2278 ByteBuffer c = null; 2279 DatagramChannel channel = DatagramChannel.open(); 2280 channel.close(); 2281 try{ 2282 channel.read(c); 2283 fail("Should throw NullPointerException"); 2284 } catch (NullPointerException e){ 2285 // expected 2286 } 2287 } 2288 2289 /** 2290 * @tests DatagramChannel#read(ByteBuffer) 2291 */ 2292 public void test_read_LByteBuffer_NotConnected_nullBuf() throws Exception { 2293 // regression test for Harmony-754 2294 ByteBuffer c = null; 2295 DatagramChannel channel = DatagramChannel.open(); 2296 try{ 2297 channel.read(c); 2298 fail("Should throw NullPointerException"); 2299 } catch (NullPointerException e){ 2300 // expected 2301 } 2302 } 2303 2304 /** 2305 * @tests DatagramChannel#read(ByteBuffer) 2306 */ 2307 public void test_read_LByteBuffer_readOnlyBuf() throws Exception { 2308 // regression test for Harmony-754 2309 ByteBuffer c = ByteBuffer.allocate(1); 2310 DatagramChannel channel = DatagramChannel.open(); 2311 try{ 2312 channel.read(c.asReadOnlyBuffer()); 2313 fail("Should throw NotYetConnectedException"); 2314 } catch (NotYetConnectedException e){ 2315 } catch (IllegalArgumentException e){ 2316 // expected 2317 } 2318 channel.connect(datagramSocket1Address); 2319 try{ 2320 channel.read(c.asReadOnlyBuffer()); 2321 fail("Should throw IllegalArgumentException"); 2322 } catch (IllegalArgumentException e){ 2323 // expected 2324 } 2325 } 2326 2327 /** 2328 * @tests DatagramChannel#send(ByteBuffer, SocketAddress) 2329 */ 2330 public void test_send_LByteBuffer_LSocketAddress_closed() throws IOException{ 2331 // regression test for Harmony-913 2332 channel1.close(); 2333 ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL); 2334 try { 2335 channel1.send(buf, datagramSocket1Address); 2336 fail("Should throw ClosedChannelException"); 2337 } catch (ClosedChannelException e) { 2338 //pass 2339 } 2340 try { 2341 channel1.send(null, datagramSocket1Address); 2342 fail("Should throw NullPointerException"); 2343 } catch (NullPointerException e) { 2344 //pass 2345 } 2346 try { 2347 channel1.send(buf, null); 2348 fail("Should throw ClosedChannelException"); 2349 } catch (ClosedChannelException e) { 2350 //pass 2351 } 2352 try { 2353 channel1.send(null, null); 2354 fail("Should throw NullPointerException"); 2355 } catch (NullPointerException e) { 2356 //pass 2357 } 2358 } 2359 2360 /** 2361 * @tests DatagramChannel#socket() 2362 */ 2363 public void test_socket_IllegalBlockingModeException() throws Exception { 2364 // regression test for Harmony-1036 2365 DatagramChannel channel = DatagramChannel.open(); 2366 channel.configureBlocking(false); 2367 DatagramSocket socket = channel.socket(); 2368 try { 2369 socket.send(null); 2370 fail("should throw IllegalBlockingModeException"); 2371 } catch (IllegalBlockingModeException e) { 2372 // expected 2373 } 2374 try { 2375 socket.receive(null); 2376 fail("should throw IllegalBlockingModeException"); 2377 } catch (IllegalBlockingModeException e) { 2378 // expected 2379 } 2380 2381 channel.close(); 2382 } 2383 2384 public void test_bounded_harmony6493() throws IOException { 2385 DatagramChannel server = DatagramChannel.open(); 2386 InetSocketAddress addr = new InetSocketAddress("localhost", 0); 2387 server.socket().bind(addr); 2388 SocketAddress boundedAddress = server.socket().getLocalSocketAddress(); 2389 2390 DatagramChannel client = DatagramChannel.open(); 2391 ByteBuffer sent = ByteBuffer.allocate(1024); 2392 sent.put("test".getBytes()); 2393 sent.flip(); 2394 client.send(sent, boundedAddress); 2395 assertTrue(client.socket().isBound()); 2396 2397 server.close(); 2398 client.close(); 2399 } 2400 2401 public void test_bind_null() throws Exception { 2402 DatagramChannel dc = DatagramChannel.open(); 2403 try { 2404 assertNull(dc.socket().getLocalSocketAddress()); 2405 2406 dc.socket().bind(null); 2407 2408 InetSocketAddress localAddress = (InetSocketAddress) dc.socket().getLocalSocketAddress(); 2409 assertTrue(localAddress.getAddress().isAnyLocalAddress()); 2410 assertTrue(localAddress.getPort() > 0); 2411 } finally { 2412 dc.close(); 2413 } 2414 } 2415 2416 public void test_bind_failure() throws Exception { 2417 DatagramChannel dc = DatagramChannel.open(); 2418 try { 2419 // Bind to a local address that is in use 2420 dc.socket().bind(channel1Address); 2421 fail(); 2422 } catch (IOException expected) { 2423 } finally { 2424 dc.close(); 2425 } 2426 } 2427 2428 public void test_bind_closed() throws Exception { 2429 DatagramChannel dc = DatagramChannel.open(); 2430 dc.close(); 2431 2432 try { 2433 dc.socket().bind(null); 2434 fail(); 2435 } catch (IOException expected) { 2436 } finally { 2437 dc.close(); 2438 } 2439 } 2440 2441 public void test_bind_explicitPort() throws Exception { 2442 InetSocketAddress address = (InetSocketAddress) channel1.socket().getLocalSocketAddress(); 2443 assertTrue(address.getPort() > 0); 2444 2445 DatagramChannel dc = DatagramChannel.open(); 2446 // Allow the socket to bind to a port we know is already in use. 2447 dc.socket().setReuseAddress(true); 2448 InetSocketAddress bindAddress = new InetSocketAddress("localhost", address.getPort()); 2449 dc.socket().bind(bindAddress); 2450 2451 InetSocketAddress boundAddress = (InetSocketAddress) dc.socket().getLocalSocketAddress(); 2452 assertEquals(bindAddress.getHostName(), boundAddress.getHostName()); 2453 assertEquals(bindAddress.getPort(), boundAddress.getPort()); 2454 2455 dc.close(); 2456 channel1.close(); 2457 } 2458 2459 /** Checks that the SocketChannel and associated Socket agree on the socket state. */ 2460 public void test_bind_socketSync() throws IOException { 2461 DatagramChannel dc = DatagramChannel.open(); 2462 assertNull(dc.socket().getLocalSocketAddress()); 2463 2464 DatagramSocket socket = dc.socket(); 2465 assertNull(socket.getLocalSocketAddress()); 2466 assertFalse(socket.isBound()); 2467 2468 InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0); 2469 dc.socket().bind(bindAddr); 2470 2471 InetSocketAddress actualAddr = (InetSocketAddress) dc.socket().getLocalSocketAddress(); 2472 assertEquals(actualAddr, socket.getLocalSocketAddress()); 2473 assertEquals(bindAddr.getHostName(), actualAddr.getHostName()); 2474 assertTrue(socket.isBound()); 2475 assertFalse(socket.isConnected()); 2476 assertFalse(socket.isClosed()); 2477 2478 dc.close(); 2479 2480 assertFalse(dc.isOpen()); 2481 assertTrue(socket.isClosed()); 2482 } 2483 2484 /** 2485 * Checks that the SocketChannel and associated Socket agree on the socket state, even if 2486 * the Socket object is requested/created after bind(). 2487 */ 2488 public void test_bind_socketSyncAfterBind() throws IOException { 2489 DatagramChannel dc = DatagramChannel.open(); 2490 assertNull(dc.socket().getLocalSocketAddress()); 2491 2492 InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0); 2493 dc.socket().bind(bindAddr); 2494 2495 // Socket creation after bind(). 2496 DatagramSocket socket = dc.socket(); 2497 InetSocketAddress actualAddr = (InetSocketAddress) dc.socket().getLocalSocketAddress(); 2498 assertEquals(actualAddr, socket.getLocalSocketAddress()); 2499 assertEquals(bindAddr.getHostName(), actualAddr.getHostName()); 2500 assertTrue(socket.isBound()); 2501 assertFalse(socket.isConnected()); 2502 assertFalse(socket.isClosed()); 2503 2504 dc.close(); 2505 2506 assertFalse(dc.isOpen()); 2507 assertTrue(socket.isClosed()); 2508 } 2509 2510 public void test_getLocalSocketAddress_afterClose() throws IOException { 2511 DatagramChannel dc = DatagramChannel.open(); 2512 assertNull(dc.socket().getLocalSocketAddress()); 2513 2514 InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0); 2515 dc.socket().bind(bindAddr); 2516 2517 assertNotNull(dc.socket().getLocalSocketAddress()); 2518 2519 dc.close(); 2520 2521 assertFalse(dc.isOpen()); 2522 2523 dc.socket().getLocalSocketAddress(); 2524 } 2525 2526 // b/27294715 2527 public void test_concurrentShutdown() throws Exception { 2528 DatagramChannel dc = DatagramChannel.open(); 2529 dc.configureBlocking(true); 2530 dc.bind(new InetSocketAddress(Inet6Address.LOOPBACK, 0)); 2531 // Set 4s timeout 2532 dc.socket().setSoTimeout(4000); 2533 2534 final AtomicReference<Exception> killerThreadException = new AtomicReference<Exception>(null); 2535 final Thread killer = new Thread(new Runnable() { 2536 public void run() { 2537 try { 2538 Thread.sleep(2000); 2539 try { 2540 Libcore.os.shutdown(dc.socket().getFileDescriptor$(), OsConstants.SHUT_RDWR); 2541 } catch (ErrnoException expected) { 2542 if (OsConstants.ENOTCONN != expected.errno) { 2543 killerThreadException.set(expected); 2544 } 2545 } 2546 } catch (Exception ex) { 2547 killerThreadException.set(ex); 2548 } 2549 } 2550 }); 2551 killer.start(); 2552 2553 ByteBuffer dst = ByteBuffer.allocate(CAPACITY_NORMAL); 2554 assertEquals(null, dc.receive(dst)); 2555 assertEquals(0, dst.position()); 2556 dc.close(); 2557 2558 killer.join(); 2559 assertNull(killerThreadException.get()); 2560 } 2561 } 2562