国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

netty使用EmbeddedChannel對(duì)channel的出入站進(jìn)行單元測(cè)試

妤鋒シ / 2118人閱讀

摘要:一種特殊的實(shí)現(xiàn),它是專門(mén)為改進(jìn)針對(duì)的單元測(cè)試而提供的。名稱職責(zé)將入站消息寫(xiě)到中。如果沒(méi)有任何可供讀取的,則返回將標(biāo)記為完成,如果有可讀取的入站或出站數(shù)據(jù),則返回。這個(gè)方法還將會(huì)調(diào)用上的方法測(cè)試入站消息測(cè)試出站消息測(cè)試異常處理

一種特殊的Channel實(shí)現(xiàn)----EmbeddedChannel,它是Netty專門(mén)為改進(jìn)針對(duì)ChannelHandler的單元測(cè)試而提供的。

名稱 職責(zé)
writeInbound 將入站消息寫(xiě)到EmbeddedChannel中。如果可以通過(guò)readInbound方法從EmbeddedChannel中讀取數(shù)據(jù),則返回true
readInbound 從EmbeddedChannel中讀取入站消息。任何返回東西都經(jīng)過(guò)整個(gè)ChannelPipeline。如果沒(méi)有任何可供讀取的,則返回null
writeOutbound 將出站消息寫(xiě)到EmbeddedChannel中,如果現(xiàn)在可以通過(guò)readOutbound從EmbeddedChannel中讀取到東西,則返回true
readOutbound 從EmbeddedChannel中讀取出站消息。任何返回東西都經(jīng)過(guò)整個(gè)ChannelPipeline。如果沒(méi)有任何可供讀取的,則返回null
finish 將EmbeddedChannel標(biāo)記為完成,如果有可讀取的入站或出站數(shù)據(jù),則返回true。這個(gè)方法還將會(huì)調(diào)用EmbeddedChannel上的close方法
測(cè)試入站消息
public class FixedLengthFrameDecoder extends ByteToMessageDecoder {
    private final int frameLength;

    public FixedLengthFrameDecoder(int frameLength) {
        if (frameLength <= 0) {
            throw new IllegalArgumentException("frameLength must be positive integer: " + frameLength);
        }
        this.frameLength = frameLength;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception {
        while (in.readableBytes() >= frameLength) {
            ByteBuf buf = in.readBytes(frameLength);
            out.add(buf);
        }
    }
}
public class FixedLengthFrameDecoderTest {
    @Test
    public void testFramesDecoded() {
        ByteBuf buf = Unpooled.buffer();
        for (int i = 0; i < 9; i++) {
            buf.writeByte(i);
        }
        ByteBuf input = buf.duplicate();
        EmbeddedChannel channel = new EmbeddedChannel(new FixedLengthFrameDecoder(3));
        Assert.assertTrue(channel.writeInbound(input.retain()));
        Assert.assertTrue(channel.finish());

        ByteBuf read = channel.readInbound();
        Assert.assertEquals(buf.readSlice(3), read);
        read.release();

        read = channel.readInbound();
        Assert.assertEquals(buf.readSlice(3), read);
        read.release();

        read = channel.readInbound();
        Assert.assertEquals(buf.readSlice(3), read);
        read.release();

        Assert.assertNull(channel.readInbound());
        buf.release();
    }

    @Test
    public void testFramesDecoded2() {
        ByteBuf buf = Unpooled.buffer();
        for (int i = 0; i < 9; i++) {
            buf.writeByte(i);
        }
        ByteBuf input = buf.duplicate();
        EmbeddedChannel channel = new EmbeddedChannel(new FixedLengthFrameDecoder(3));
        Assert.assertFalse(channel.writeInbound(input.readBytes(2)));
        Assert.assertTrue(channel.writeInbound(input.readBytes(7)));
        Assert.assertTrue(channel.finish());
        ByteBuf read = channel.readInbound();
        Assert.assertEquals(buf.readSlice(3), read);
        read.release();

        read = channel.readInbound();
        Assert.assertEquals(buf.readSlice(3), read);
        read.release();

        read = channel.readInbound();
        Assert.assertEquals(buf.readSlice(3), read);
        read.release();

        Assert.assertNull(channel.readInbound());
        buf.release();
    }
}
測(cè)試出站消息
public class AbsIntegerEncoder extends MessageToMessageEncoder {
    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List out) throws Exception {
        while (in.readableBytes() >= 4) {
            int value = Math.abs(in.readInt());
            out.add(value);
        }
    }
}
public class AbsIntegerEncoderTest {
    @Test
    public void testEncoded() {
        ByteBuf buf = Unpooled.buffer();
        for (int i = 0; i < 10; i++) {
            buf.writeInt(i * -1);
        }
        EmbeddedChannel channel = new EmbeddedChannel(new AbsIntegerEncoder());
        Assert.assertTrue(channel.writeOutbound(buf));
        Assert.assertTrue(channel.finish());

        for (int i = 0; i < 10; i++) {
            Assert.assertEquals(Integer.valueOf(i), channel.readOutbound());
        }
        Assert.assertNull(channel.readOutbound());
    }
}
測(cè)試異常處理
public class FrameChunkDecoder extends ByteToMessageDecoder {
    private final int maxFrameSize;

    public FrameChunkDecoder(int maxFrameSize) {
        this.maxFrameSize = maxFrameSize;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception {
        int readableBytes = in.readableBytes();
        if (readableBytes > maxFrameSize) {
            in.clear();
            throw new TooLongFrameException();
        }
        ByteBuf buf = in.readBytes(readableBytes);
        out.add(buf);
    }
}
public class FrameChunkDecoderTest {
    @Test
    public void testFramesDecoded() {
        ByteBuf buf = Unpooled.buffer();
        for (int i = 0; i < 9; i++) {
            buf.writeByte(i);
        }
        ByteBuf input = buf.duplicate();
        EmbeddedChannel channel = new EmbeddedChannel(new FrameChunkDecoder(3));
        Assert.assertTrue(channel.writeInbound(input.readBytes(2)));
        try {
            channel.writeInbound(input.readBytes(4));
            Assert.fail();
        } catch (TooLongFrameException e) {

        }
        Assert.assertTrue(channel.writeInbound(input.readBytes(3)));
        Assert.assertTrue(channel.finish());

        ByteBuf read = channel.readInbound();
        Assert.assertEquals(buf.readSlice(2), read);
        read.release();

        read = channel.readInbound();
        Assert.assertEquals(buf.skipBytes(4).readSlice(3), read);
        read.release();
        buf.release();
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/75743.html

相關(guān)文章

  • Netty學(xué)習(xí)筆記(二)

    摘要:支持很多協(xié)議,并且提供用于數(shù)據(jù)處理的容器。我們已經(jīng)知道由特定事件觸發(fā)。可專用于幾乎所有的動(dòng)作,包括將一個(gè)對(duì)象轉(zhuǎn)為字節(jié)或相反,執(zhí)行過(guò)程中拋出的異常處理。提供了一個(gè)容器給鏈并提供了一個(gè)用于管理沿著鏈入站和出站事件的流動(dòng)。子類通過(guò)進(jìn)行注冊(cè)。 前兩天寫(xiě)了一點(diǎn)netty相關(guān)的知識(shí),并寫(xiě)了一個(gè)demo,但是對(duì)其原理還是沒(méi)有深入,今天我們來(lái)做一次研究吧 首先讓我們來(lái)認(rèn)識(shí)一下netty的幾個(gè)核心人物吧...

    0x584a 評(píng)論0 收藏0
  • Netty組件入門(mén)學(xué)習(xí)

    摘要:可以用來(lái)接收入站事件和數(shù)據(jù),隨后使用應(yīng)用程序的業(yè)務(wù)邏輯進(jìn)行處理。因?yàn)橛脩舨⒉皇顷P(guān)心所有的事件,因此提供了抽象類和。抽象類最常見(jiàn)的一個(gè)情況,你的應(yīng)用程序會(huì)利用一個(gè)來(lái)接受解碼消息,并對(duì)該數(shù)據(jù)應(yīng)用業(yè)務(wù)邏輯。 Channel、EventLoop和ChannelFuture Channel——Socket; EventLoop——控制流、多線程處理、并發(fā) ChannelFuture異步通知 ...

    qpal 評(píng)論0 收藏0
  • Netty ByteBuf 誰(shuí)負(fù)責(zé)誰(shuí)釋放

    摘要:轉(zhuǎn)發(fā)自 轉(zhuǎn)發(fā)自 http://netty.io/wiki/referenc... Since Netty version 4, the life cycle of certain objects are managed by their reference counts, so that Netty can return them (or their shared resources)...

    Lyux 評(píng)論0 收藏0
  • Netty-ChannelHandler-ChannelPipeline

    摘要:只有在詳盡的測(cè)試之后才應(yīng)設(shè)置為這值使用的默認(rèn)采樣率檢測(cè)并報(bào)告任何發(fā)現(xiàn)的泄漏。這是默認(rèn)級(jí)別,適合絕大部分情況使用默認(rèn)的采樣率,報(bào)告所發(fā)現(xiàn)的任何的泄漏以及對(duì)應(yīng)的消息被訪問(wèn)的位置類似于但是其將會(huì)對(duì)每次對(duì)消息的訪問(wèn)都進(jìn)行采樣。 ChannelHandler Channel生命周期 狀態(tài) 描述 ChannelUnregistered Channel已經(jīng)被創(chuàng)建,但未注冊(cè)到EventLoo...

    warkiz 評(píng)論0 收藏0
  • Netty學(xué)習(xí)-Echo服務(wù)器客戶端

    摘要:服務(wù)器構(gòu)成至少一個(gè)該組件實(shí)現(xiàn)了服務(wù)器對(duì)從客戶端接受的數(shù)據(jù)的處理,即它的業(yè)務(wù)邏輯引導(dǎo)配置服務(wù)器的啟動(dòng)代碼。至少,它會(huì)將服務(wù)器綁定到它要監(jiān)聽(tīng)連接請(qǐng)求的端口上。需要注意的是,由服務(wù)器發(fā)送的消息可能會(huì)被分塊接受。 Netty服務(wù)器構(gòu)成 至少一個(gè)ChannelHandler——該組件實(shí)現(xiàn)了服務(wù)器對(duì)從客戶端接受的數(shù)據(jù)的處理,即它的業(yè)務(wù)邏輯 引導(dǎo)——配置服務(wù)器的啟動(dòng)代碼。至少,它會(huì)將服務(wù)器綁定...

    dreamGong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<