Got it. Thanks Mark. On Wed, Jun 9, 2010 at 1:55 PM, Mark Hindess <mark.hind...@googlemail.com>wrote:
> > 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. > > > -- Yours sincerely, Charles Lee