Skip to content

Commit

Permalink
8299813: java/nio/channels/DatagramChannel/Disconnect.java fails with…
Browse files Browse the repository at this point in the history
… jtreg test timeout due to lost datagram

Backport-of: 49eb00da8dc66cff3ca430f06ab21357ee6180ef
  • Loading branch information
Andrew Lu committed Aug 21, 2024
1 parent 61e0a11 commit 27c92b6
Showing 1 changed file with 32 additions and 13 deletions.
45 changes: 32 additions & 13 deletions test/jdk/java/nio/channels/DatagramChannel/Disconnect.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -34,6 +34,7 @@
import java.nio.*;
import java.nio.channels.*;
import java.io.IOException;

import jdk.test.lib.net.IPSupport;

public class Disconnect {
Expand All @@ -42,43 +43,61 @@ public static void main(String[] args) throws IOException {

// test with default protocol family
try (DatagramChannel dc = DatagramChannel.open()) {
test(dc);
test(dc);
InetAddress lo = InetAddress.getLoopbackAddress();
System.out.println("Testing with default family and " + lo);
test(dc, lo);
test(dc, lo);
}

if (IPSupport.hasIPv4()) {
// test with IPv4 only
try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)) {
test(dc);
test(dc);
InetAddress lo4 = InetAddress.ofLiteral("127.0.0.1");
System.out.println("Testing with INET family and " + lo4);
test(dc, lo4);
test(dc, lo4);
}
}

if (IPSupport.hasIPv6()) {
// test with IPv6 only
try (DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET6)) {
test(dc);
test(dc);
InetAddress lo6 = InetAddress.ofLiteral("::1");
System.out.println("Testing with INET6 family and " + lo6);
test(dc, lo6);
test(dc, lo6);
}
}
}

static int getLocalPort(DatagramChannel ch) throws IOException {
return ((InetSocketAddress) ch.getLocalAddress()).getPort();
}

/**
* Connect DatagramChannel to a server, write a datagram and disconnect. Invoke
* a second or subsequent time with the same DatagramChannel instance to check
* that disconnect works as expected.
*/
static void test(DatagramChannel dc) throws IOException {
static void test(DatagramChannel dc, InetAddress lo) throws IOException {
try (DatagramChannel server = DatagramChannel.open()) {
server.bind(new InetSocketAddress(0));
server.bind(new InetSocketAddress(lo, 0));

InetAddress lh = InetAddress.getLocalHost();
dc.connect(new InetSocketAddress(lh, server.socket().getLocalPort()));
SocketAddress dcbound = dc.getLocalAddress();
dc.connect(new InetSocketAddress(lo, server.socket().getLocalPort()));
System.out.println("dc bound to " + dcbound + " and connected from " +
dc.getLocalAddress() + " to " + dc.getRemoteAddress());

dc.write(ByteBuffer.wrap("hello".getBytes()));

ByteBuffer bb = ByteBuffer.allocate(100);
server.receive(bb);
if (getLocalPort(dc) != getLocalPort(server)) {
ByteBuffer bb = ByteBuffer.allocate(100);
server.receive(bb);
} else {
// some systems may allow dc and server to bind to the same port.
// when that happen the datagram may never be received
System.out.println("Server and clients are bound to the same port: skipping receive");
}

dc.disconnect();

Expand Down

1 comment on commit 27c92b6

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.