Home / Class/ DatagramConnectedWriteExceptionTest Class — netty Architecture

DatagramConnectedWriteExceptionTest Class — netty Architecture

Architecture documentation for the DatagramConnectedWriteExceptionTest class in DatagramConnectedWriteExceptionTest.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  5f881dbc_d5ec_8d0c_c925_038dbabd44d6["DatagramConnectedWriteExceptionTest"]
  1d40046b_1422_700b_a383_614b0a5b95ac["DatagramConnectedWriteExceptionTest.java"]
  5f881dbc_d5ec_8d0c_c925_038dbabd44d6 -->|defined in| 1d40046b_1422_700b_a383_614b0a5b95ac
  f35590dd_a796_57e4_ef9c_24fd31020b28["newFactories()"]
  5f881dbc_d5ec_8d0c_c925_038dbabd44d6 -->|method| f35590dd_a796_57e4_ef9c_24fd31020b28
  ef4b756e_deb2_0160_c0e0_90764c84bc2f["testWriteThrowsPortUnreachableException()"]
  5f881dbc_d5ec_8d0c_c925_038dbabd44d6 -->|method| ef4b756e_deb2_0160_c0e0_90764c84bc2f
  7c82fbfb_230e_b60e_9bea_a9c5a458f583["testWriteExceptionAfterServerStop()"]
  5f881dbc_d5ec_8d0c_c925_038dbabd44d6 -->|method| 7c82fbfb_230e_b60e_9bea_a9c5a458f583

Relationship Graph

Source Code

testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramConnectedWriteExceptionTest.java lines 46–128

public class DatagramConnectedWriteExceptionTest extends AbstractClientSocketTest {

    @Override
    protected List<TestsuitePermutation.BootstrapFactory<Bootstrap>> newFactories() {
        return SocketTestPermutation.INSTANCE.datagramSocket();
    }

    @Test
    @Timeout(value = 10000, unit = TimeUnit.MILLISECONDS)
    @DisabledOnOs(OS.WINDOWS)
    public void testWriteThrowsPortUnreachableException(TestInfo testInfo) throws Throwable {
        run(testInfo, (Runner<Bootstrap>) this::testWriteExceptionAfterServerStop);
    }

    protected void testWriteExceptionAfterServerStop(Bootstrap clientBootstrap) throws Throwable {
        CountDownLatch serverReceivedLatch = new CountDownLatch(1);
        Bootstrap serverBootstrap = clientBootstrap.clone()
                .option(ChannelOption.SO_BROADCAST, false)
                .handler(new SimpleChannelInboundHandler<DatagramPacket>() {

                    @Override
                    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) {
                        serverReceivedLatch.countDown();
                    }
                });

        Channel serverChannel = serverBootstrap.bind(new InetSocketAddress(NetUtil.LOCALHOST, 0)).sync().channel();
        InetSocketAddress serverAddress = (InetSocketAddress) serverChannel.localAddress();

        clientBootstrap.option(ChannelOption.AUTO_READ, false)
                .handler(new SimpleChannelInboundHandler<DatagramPacket>() {

                    @Override
                    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) {
                        // no-op
                    }
                });

        Channel clientChannel = clientBootstrap.connect(serverAddress).sync().channel();

        CountDownLatch clientFirstSendLatch = new CountDownLatch(1);
        try {
            ByteBuf firstMessage = Unpooled.wrappedBuffer("First message".getBytes(CharsetUtil.UTF_8));
            clientChannel.writeAndFlush(firstMessage)
                    .addListener(future -> {
                        if (future.isSuccess()) {
                            clientFirstSendLatch.countDown();
                        }
                    });

            assertTrue(serverReceivedLatch.await(5, TimeUnit.SECONDS), "Server should receive first message");
            assertTrue(clientFirstSendLatch.await(5, TimeUnit.SECONDS), "Client should send first message");

            serverChannel.close().sync();

            AtomicReference<Throwable> writeException = new AtomicReference<>();
            CountDownLatch writesCompleteLatch = new CountDownLatch(10);

            for (int i = 0; i < 10; i++) {
                ByteBuf message = Unpooled.wrappedBuffer(("Message " + i).getBytes(CharsetUtil.UTF_8));
                clientChannel.writeAndFlush(message)
                        .addListener(future -> {
                            if (!future.isSuccess()) {
                                writeException.compareAndSet(null, future.cause());
                            }
                            writesCompleteLatch.countDown();
                        });
                Thread.sleep(50);
            }

            assertTrue(writesCompleteLatch.await(5, TimeUnit.SECONDS), "All writes should complete");

            assertNotNull(writeException.get(), "Should have captured a write exception");

            assertInstanceOf(PortUnreachableException.class, writeException.get(), "Expected " +
                    "PortUnreachableException but got: " + writeException.get().getClass().getName());
        } finally {
            if (clientChannel != null) {
                clientChannel.close().sync();
            }
        }

Frequently Asked Questions

What is the DatagramConnectedWriteExceptionTest class?
DatagramConnectedWriteExceptionTest is a class in the netty codebase, defined in testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramConnectedWriteExceptionTest.java.
Where is DatagramConnectedWriteExceptionTest defined?
DatagramConnectedWriteExceptionTest is defined in testsuite/src/main/java/io/netty/testsuite/transport/socket/DatagramConnectedWriteExceptionTest.java at line 46.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free