It seems the original one transfer packet in two directions, but the new version only transfer the packet in one way.
On Tue, Jun 8, 2010 at 3:18 PM, Mark Hindess <mark.hind...@googlemail.com>wrote: > > I was looking at failing tests on FreeBSD and I spotted the following > test in DatagramPacketTest.java: > > public void test_getPort() throws IOException { > DatagramPacket dp = new DatagramPacket("Hello".getBytes(), 5, > InetAddress.getLocalHost(), 1000); > assertEquals("Incorrect port returned", 1000, dp.getPort()); > > final InetAddress localhost = InetAddress.getLocalHost(); > DatagramSocket socket = new DatagramSocket(0, localhost); > final int port = socket.getLocalPort(); > > final Object lock = new Object(); > > Thread thread = new Thread(new Runnable() { > public void run() { > DatagramSocket socket = null; > try { > socket = new DatagramSocket(0, localhost); > synchronized (lock) { > started = true; > lock.notifyAll(); > } > socket.setSoTimeout(3000); > DatagramPacket packet = new DatagramPacket(new > byte[256], > 256); > socket.receive(packet); > socket.send(packet); > socket.close(); > } catch (IOException e) { > System.out.println("thread exception: " + e); > if (socket != null) > socket.close(); > } > } > }); > thread.start(); > > socket.setSoTimeout(3000); > DatagramPacket packet = new DatagramPacket(new byte[] { 1, 2, 3, 4, > 5, > 6 }, 6, localhost, port); > synchronized (lock) { > while (!started) { > try { > lock.wait(); > } catch (InterruptedException e) { > } > } > } > socket.send(packet); > socket.receive(packet); > socket.close(); > assertTrue("datagram received wrong port: " + packet.getPort(), > packet > .getPort() == port); > } > > Notice that main threads socket is being used to send to itself - not to > the other socket which is left waiting until timeout for a packet from > itself that it hasn't sent yet! I think this can be more simply written > as: > > public void test_getPort() throws IOException { > DatagramPacket dp = new DatagramPacket("Hello".getBytes(), 5, > InetAddress.getLocalHost(), 1000); > assertEquals("Incorrect port returned", 1000, dp.getPort()); > > final InetAddress localhost = InetAddress.getLocalHost(); > DatagramSocket socket = new DatagramSocket(0, localhost); > final int port = socket.getLocalPort(); > > socket.setSoTimeout(3000); > DatagramPacket packet = new DatagramPacket(new byte[] { 1, 2, 3, 4, > 5, > 6 }, 6, localhost, port); > socket.send(packet); > socket.receive(packet); > socket.close(); > assertTrue("datagram received wrong port: " + packet.getPort(), > packet > .getPort() == port); > } > > Does that make sense or am I missing something? > > Sadly they both fail on FreeBSD. > > Regards, > Mark. > > > -- Yours sincerely, Charles Lee