In message <aanlktimsn8peujvw3jgmhyakdahuslwptsfcmhdt1...@mail.gmail.com>, Charles Lee writes: > > 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? > > It seems the original one transfer packet in two directions, but the > new version only transfer the packet in one way.
The original does a send then receive in the testing thread. But the other thread does only a receive which times out with an exception but the exception is ignored so it is not testing anything. I assume the intention was for the two threads to send each other a packet but the original test does not do that. The new version only has the original testing thread. I don't think anything is lost. (Except perhaps that the test would hang if the receive in the second thread did not timeout but there are more obvious/sane ways to test this.) > > Sadly they both fail on FreeBSD. I know why the fail on FreeBSD now. Regards, Mark.