Bug 1277 - Move ByteBuffUtils to separate bundle
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / OF10StatsRequestInputFactoryTest.java
1 /*\r
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
9 \r
10 import io.netty.buffer.ByteBuf;\r
11 import io.netty.buffer.UnpooledByteBufAllocator;\r
12 \r
13 import org.junit.Assert;\r
14 import org.junit.Before;\r
15 import org.junit.Test;\r
16 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;\r
17 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;\r
18 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
19 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;\r
20 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
21 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
22 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.desc._case.MultipartRequestDescBuilder;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.experimenter._case.MultipartRequestExperimenterBuilder;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table._case.MultipartRequestTableBuilder;\r
43 \r
44 /**\r
45  * @author michal.polkorab\r
46  *\r
47  */\r
48 public class OF10StatsRequestInputFactoryTest {\r
49 \r
50     private SerializerRegistry registry;\r
51     private OFSerializer<MultipartRequestInput> multipartFactory;\r
52 \r
53     /**\r
54      * Initializes serializer registry and stores correct factory in field\r
55      */\r
56     @Before\r
57     public void startUp() {\r
58         registry = new SerializerRegistryImpl();\r
59         registry.init();\r
60         multipartFactory = registry.getSerializer(\r
61                 new MessageTypeKey<>(EncodeConstants.OF10_VERSION_ID, MultipartRequestInput.class));\r
62     }\r
63 \r
64     /**\r
65      * Testing OF10StatsRequestInputFactory (Desc) for correct serialization\r
66      * @throws Exception\r
67      */\r
68     @Test\r
69     public void testDesc() throws Exception {\r
70         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
71         BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);\r
72         builder.setType(MultipartType.OFPMPDESC);\r
73         builder.setFlags(new MultipartRequestFlags(false));\r
74         MultipartRequestDescCaseBuilder caseBuilder = new MultipartRequestDescCaseBuilder();\r
75         MultipartRequestDescBuilder descBuilder = new MultipartRequestDescBuilder();\r
76         caseBuilder.setMultipartRequestDesc(descBuilder.build());\r
77         builder.setMultipartRequestBody(caseBuilder.build());\r
78         MultipartRequestInput message = builder.build();\r
79         \r
80         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
81         multipartFactory.serialize(message, out);\r
82         \r
83         BufferHelper.checkHeaderV10(out, (byte) 16, 12);\r
84         Assert.assertEquals("Wrong type", 0, out.readUnsignedShort());\r
85         Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());\r
86         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
87     }\r
88     \r
89     /**\r
90      * Testing OF10StatsRequestInputFactory (Flow) for correct serialization\r
91      * @throws Exception\r
92      */\r
93     @Test\r
94     public void testFlow() throws Exception {\r
95         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
96         BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);\r
97         builder.setType(MultipartType.OFPMPFLOW);\r
98         builder.setFlags(new MultipartRequestFlags(false));\r
99         MultipartRequestFlowCaseBuilder caseBuilder = new MultipartRequestFlowCaseBuilder();\r
100         MultipartRequestFlowBuilder flowBuilder = new MultipartRequestFlowBuilder();\r
101         MatchV10Builder matchBuilder = new MatchV10Builder();\r
102         matchBuilder.setWildcards(new FlowWildcardsV10(true, true, true, true, true, true,\r
103                 true, true, true, true));\r
104         matchBuilder.setNwSrcMask((short) 8);\r
105         matchBuilder.setNwDstMask((short) 16);\r
106         matchBuilder.setInPort(51);\r
107         matchBuilder.setDlSrc(new MacAddress("00:01:02:03:04:05"));\r
108         matchBuilder.setDlDst(new MacAddress("05:04:03:02:01:00"));\r
109         matchBuilder.setDlVlan(52);\r
110         matchBuilder.setDlVlanPcp((short) 53);\r
111         matchBuilder.setDlType(54);\r
112         matchBuilder.setNwTos((short) 55);\r
113         matchBuilder.setNwProto((short) 56);\r
114         matchBuilder.setNwSrc(new Ipv4Address("10.0.0.1"));\r
115         matchBuilder.setNwDst(new Ipv4Address("10.0.0.2"));\r
116         matchBuilder.setTpSrc(57);\r
117         matchBuilder.setTpDst(58);\r
118         flowBuilder.setMatchV10(matchBuilder.build());\r
119         flowBuilder.setTableId((short) 1);\r
120         flowBuilder.setOutPort(42L);\r
121         caseBuilder.setMultipartRequestFlow(flowBuilder.build());\r
122         builder.setMultipartRequestBody(caseBuilder.build());\r
123         MultipartRequestInput message = builder.build();\r
124         \r
125         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
126         multipartFactory.serialize(message, out);\r
127         \r
128         BufferHelper.checkHeaderV10(out, (byte) 16, 56);\r
129         Assert.assertEquals("Wrong type", 1, out.readUnsignedShort());\r
130         Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());\r
131         Assert.assertEquals("Wrong wildcards", 3414271, out.readUnsignedInt());\r
132         Assert.assertEquals("Wrong in-port", 51, out.readUnsignedShort());\r
133         byte[] dlSrc = new byte[6];\r
134         out.readBytes(dlSrc);\r
135         Assert.assertEquals("Wrong dl-src", "00:01:02:03:04:05", ByteBufUtils.macAddressToString(dlSrc));\r
136         byte[] dlDst = new byte[6];\r
137         out.readBytes(dlDst);\r
138         Assert.assertEquals("Wrong dl-dst", "05:04:03:02:01:00", ByteBufUtils.macAddressToString(dlDst));\r
139         Assert.assertEquals("Wrong dl-vlan", 52, out.readUnsignedShort());\r
140         Assert.assertEquals("Wrong dl-vlan-pcp", 53, out.readUnsignedByte());\r
141         out.skipBytes(1);\r
142         Assert.assertEquals("Wrong dl-type", 54, out.readUnsignedShort());\r
143         Assert.assertEquals("Wrong nw-tos", 55, out.readUnsignedByte());\r
144         Assert.assertEquals("Wrong nw-proto", 56, out.readUnsignedByte());\r
145         out.skipBytes(2);\r
146         Assert.assertEquals("Wrong nw-src", 167772161, out.readUnsignedInt());\r
147         Assert.assertEquals("Wrong nw-dst", 167772162, out.readUnsignedInt());\r
148         Assert.assertEquals("Wrong tp-src", 57, out.readUnsignedShort());\r
149         Assert.assertEquals("Wrong tp-dst", 58, out.readUnsignedShort());\r
150         Assert.assertEquals("Wrong table-id", 1, out.readUnsignedByte());\r
151         out.skipBytes(1);\r
152         Assert.assertEquals("Wrong out-port", 42, out.readUnsignedShort());\r
153         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
154     }\r
155     \r
156     /**\r
157      * Testing OF10StatsRequestInputFactory (Aggregate) for correct serialization\r
158      * @throws Exception\r
159      */\r
160     @Test\r
161     public void testAggregate() throws Exception {\r
162         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
163         BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);\r
164         builder.setType(MultipartType.OFPMPAGGREGATE);\r
165         builder.setFlags(new MultipartRequestFlags(false));\r
166         MultipartRequestFlowCaseBuilder caseBuilder = new MultipartRequestFlowCaseBuilder();\r
167         MultipartRequestFlowBuilder flowBuilder = new MultipartRequestFlowBuilder();\r
168         MatchV10Builder matchBuilder = new MatchV10Builder();\r
169         matchBuilder.setWildcards(new FlowWildcardsV10(false, false, false, false,\r
170                 false, false, false, false, false, false));\r
171         matchBuilder.setNwSrcMask((short) 32);\r
172         matchBuilder.setNwDstMask((short) 32);\r
173         matchBuilder.setInPort(51);\r
174         matchBuilder.setDlSrc(new MacAddress("00:01:02:03:04:05"));\r
175         matchBuilder.setDlDst(new MacAddress("05:04:03:02:01:00"));\r
176         matchBuilder.setDlVlan(52);\r
177         matchBuilder.setDlVlanPcp((short) 53);\r
178         matchBuilder.setDlType(54);\r
179         matchBuilder.setNwTos((short) 55);\r
180         matchBuilder.setNwProto((short) 56);\r
181         matchBuilder.setNwSrc(new Ipv4Address("10.0.0.1"));\r
182         matchBuilder.setNwDst(new Ipv4Address("10.0.0.2"));\r
183         matchBuilder.setTpSrc(57);\r
184         matchBuilder.setTpDst(58);\r
185         flowBuilder.setMatchV10(matchBuilder.build());\r
186         flowBuilder.setTableId((short) 42);\r
187         flowBuilder.setOutPort(6653L);\r
188         caseBuilder.setMultipartRequestFlow(flowBuilder.build());\r
189         builder.setMultipartRequestBody(caseBuilder.build());\r
190         MultipartRequestInput message = builder.build();\r
191         \r
192         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
193         multipartFactory.serialize(message, out);\r
194         \r
195         BufferHelper.checkHeaderV10(out, (byte) 16, 56);\r
196         Assert.assertEquals("Wrong type", 2, out.readUnsignedShort());\r
197         Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());\r
198         Assert.assertEquals("Wrong wildcards", 0, out.readUnsignedInt());\r
199         Assert.assertEquals("Wrong in-port", 51, out.readUnsignedShort());\r
200         byte[] dlSrc = new byte[6];\r
201         out.readBytes(dlSrc);\r
202         Assert.assertEquals("Wrong dl-src", "00:01:02:03:04:05", ByteBufUtils.macAddressToString(dlSrc));\r
203         byte[] dlDst = new byte[6];\r
204         out.readBytes(dlDst);\r
205         Assert.assertEquals("Wrong dl-dst", "05:04:03:02:01:00", ByteBufUtils.macAddressToString(dlDst));\r
206         Assert.assertEquals("Wrong dl-vlan", 52, out.readUnsignedShort());\r
207         Assert.assertEquals("Wrong dl-vlan-pcp", 53, out.readUnsignedByte());\r
208         out.skipBytes(1);\r
209         Assert.assertEquals("Wrong dl-type", 54, out.readUnsignedShort());\r
210         Assert.assertEquals("Wrong nw-tos", 55, out.readUnsignedByte());\r
211         Assert.assertEquals("Wrong nw-proto", 56, out.readUnsignedByte());\r
212         out.skipBytes(2);\r
213         Assert.assertEquals("Wrong nw-src", 167772161, out.readUnsignedInt());\r
214         Assert.assertEquals("Wrong nw-dst", 167772162, out.readUnsignedInt());\r
215         Assert.assertEquals("Wrong tp-src", 57, out.readUnsignedShort());\r
216         Assert.assertEquals("Wrong tp-dst", 58, out.readUnsignedShort());\r
217         Assert.assertEquals("Wrong table-id", 42, out.readUnsignedByte());\r
218         out.skipBytes(1);\r
219         Assert.assertEquals("Wrong out-port", 6653, out.readUnsignedShort());\r
220         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
221     }\r
222     \r
223     /**\r
224      * Testing OF10StatsRequestInputFactory (Table) for correct serialization\r
225      * @throws Exception\r
226      */\r
227     @Test\r
228     public void testTable() throws Exception {\r
229         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
230         BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);\r
231         builder.setType(MultipartType.OFPMPTABLE);\r
232         builder.setFlags(new MultipartRequestFlags(false));\r
233         MultipartRequestTableCaseBuilder caseBuilder = new MultipartRequestTableCaseBuilder();\r
234         MultipartRequestTableBuilder tableBuilder = new MultipartRequestTableBuilder();\r
235         caseBuilder.setMultipartRequestTable(tableBuilder.build());\r
236         builder.setMultipartRequestBody(caseBuilder.build());\r
237         MultipartRequestInput message = builder.build();\r
238         \r
239         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
240         multipartFactory.serialize(message, out);\r
241         \r
242         BufferHelper.checkHeaderV10(out, (byte) 16, 12);\r
243         Assert.assertEquals("Wrong type", 3, out.readUnsignedShort());\r
244         Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());\r
245         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
246     }\r
247     \r
248     /**\r
249      * Testing OF10StatsRequestInputFactory (Port) for correct serialization\r
250      * @throws Exception\r
251      */\r
252     @Test\r
253     public void testPort() throws Exception {\r
254         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
255         BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);\r
256         builder.setType(MultipartType.OFPMPPORTSTATS);\r
257         builder.setFlags(new MultipartRequestFlags(false));\r
258         MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();\r
259         MultipartRequestPortStatsBuilder portBuilder = new MultipartRequestPortStatsBuilder();\r
260         portBuilder.setPortNo(15L);\r
261         caseBuilder.setMultipartRequestPortStats(portBuilder.build());\r
262         builder.setMultipartRequestBody(caseBuilder.build());\r
263         MultipartRequestInput message = builder.build();\r
264         \r
265         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
266         multipartFactory.serialize(message, out);\r
267         \r
268         BufferHelper.checkHeaderV10(out, (byte) 16, 20);\r
269         Assert.assertEquals("Wrong type", 4, out.readUnsignedShort());\r
270         Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());\r
271         Assert.assertEquals("Wrong port-no", 15, out.readUnsignedShort());\r
272         out.skipBytes(6);\r
273         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
274     }\r
275 \r
276     /**\r
277      * Testing OF10StatsRequestInputFactory (Queue) for correct serialization\r
278      * @throws Exception\r
279      */\r
280     @Test\r
281     public void testQueue() throws Exception {\r
282         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
283         BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);\r
284         builder.setType(MultipartType.OFPMPQUEUE);\r
285         builder.setFlags(new MultipartRequestFlags(false));\r
286         MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();\r
287         MultipartRequestQueueBuilder queueBuilder = new MultipartRequestQueueBuilder();\r
288         queueBuilder.setPortNo(15L);\r
289         queueBuilder.setQueueId(16L);\r
290         caseBuilder.setMultipartRequestQueue(queueBuilder.build());\r
291         builder.setMultipartRequestBody(caseBuilder.build());\r
292         MultipartRequestInput message = builder.build();\r
293         \r
294         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
295         multipartFactory.serialize(message, out);\r
296         \r
297         BufferHelper.checkHeaderV10(out, (byte) 16, 20);\r
298         Assert.assertEquals("Wrong type", 5, out.readUnsignedShort());\r
299         Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());\r
300         Assert.assertEquals("Wrong port-no", 15, out.readUnsignedShort());\r
301         out.skipBytes(2);\r
302         Assert.assertEquals("Wrong queue-id", 16, out.readUnsignedInt());\r
303         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
304     }\r
305     \r
306     /**\r
307      * Testing OF10StatsRequestInputFactory (Vendor) for correct serialization\r
308      * @throws Exception\r
309      */\r
310     @Test\r
311     public void testExperimenter() throws Exception {\r
312         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
313         BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);\r
314         builder.setType(MultipartType.OFPMPEXPERIMENTER);\r
315         builder.setFlags(new MultipartRequestFlags(false));\r
316         MultipartRequestExperimenterCaseBuilder caseBuilder = new MultipartRequestExperimenterCaseBuilder();\r
317         MultipartRequestExperimenterBuilder expBuilder = new MultipartRequestExperimenterBuilder();\r
318         expBuilder.setExperimenter(56L);\r
319         byte[] expData = new byte[]{0, 1, 2, 3, 4, 5, 6, 7};\r
320         expBuilder.setData(expData);\r
321         caseBuilder.setMultipartRequestExperimenter(expBuilder.build());\r
322         builder.setMultipartRequestBody(caseBuilder.build());\r
323         MultipartRequestInput message = builder.build();\r
324         \r
325         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
326         multipartFactory.serialize(message, out);\r
327         \r
328         BufferHelper.checkHeaderV10(out, (byte) 16, 24);\r
329         Assert.assertEquals("Wrong type", 0xFFFF, out.readUnsignedShort());\r
330         Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());\r
331         Assert.assertEquals("Wrong experimenter", 56, out.readUnsignedInt());\r
332         byte[] temp = new byte[8];\r
333         out.readBytes(temp);\r
334         Assert.assertArrayEquals("Wrong data", expData, temp);\r
335         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
336     }\r
337 \r
338     /**\r
339      * Testing OF10StatsRequestInputFactory (Vendor) for correct serialization\r
340      * @throws Exception\r
341      */\r
342     @Test\r
343     public void testExperimenterWithoutData() throws Exception {\r
344         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
345         BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);\r
346         builder.setType(MultipartType.OFPMPEXPERIMENTER);\r
347         builder.setFlags(new MultipartRequestFlags(false));\r
348         MultipartRequestExperimenterCaseBuilder caseBuilder = new MultipartRequestExperimenterCaseBuilder();\r
349         MultipartRequestExperimenterBuilder expBuilder = new MultipartRequestExperimenterBuilder();\r
350         expBuilder.setExperimenter(56L);\r
351         caseBuilder.setMultipartRequestExperimenter(expBuilder.build());\r
352         builder.setMultipartRequestBody(caseBuilder.build());\r
353         MultipartRequestInput message = builder.build();\r
354         \r
355         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
356         multipartFactory.serialize(message, out);\r
357         \r
358         BufferHelper.checkHeaderV10(out, (byte) 16, 16);\r
359         Assert.assertEquals("Wrong type", 0xFFFF, out.readUnsignedShort());\r
360         Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());\r
361         Assert.assertEquals("Wrong experimenter", 56, out.readUnsignedInt());\r
362         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
363     }\r
364 }\r