| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // and Apache License v2.0 which accompanies this distribution. |
| // |
| // The Eclipse Public License is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| // |
| // The Apache License v2.0 is available at |
| // http://www.opensource.org/licenses/apache2.0.php |
| // |
| // You may elect to redistribute this code under either of these licenses. |
| // ======================================================================== |
| // |
| |
| package org.eclipse.jetty.http2.hpack; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import java.nio.ByteBuffer; |
| |
| import org.eclipse.jetty.util.BufferUtil; |
| import org.eclipse.jetty.util.TypeUtil; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| public class NBitIntegerTest |
| { |
| |
| @Test |
| public void testOctetsNeeded() |
| { |
| assertEquals(0,NBitInteger.octectsNeeded(5,10)); |
| assertEquals(2,NBitInteger.octectsNeeded(5,1337)); |
| assertEquals(1,NBitInteger.octectsNeeded(8,42)); |
| assertEquals(3,NBitInteger.octectsNeeded(8,1337)); |
| |
| assertEquals(0,NBitInteger.octectsNeeded(6,62)); |
| assertEquals(1,NBitInteger.octectsNeeded(6,63)); |
| assertEquals(1,NBitInteger.octectsNeeded(6,64)); |
| assertEquals(2,NBitInteger.octectsNeeded(6,63+0x00+0x80*0x01)); |
| assertEquals(3,NBitInteger.octectsNeeded(6,63+0x00+0x80*0x80)); |
| assertEquals(4,NBitInteger.octectsNeeded(6,63+0x00+0x80*0x80*0x80)); |
| } |
| |
| @Test |
| public void testEncode() |
| { |
| testEncode(6,0,"00"); |
| testEncode(6,1,"01"); |
| testEncode(6,62,"3e"); |
| testEncode(6,63,"3f00"); |
| testEncode(6,63+1,"3f01"); |
| testEncode(6,63+0x7e,"3f7e"); |
| testEncode(6,63+0x7f,"3f7f"); |
| testEncode(6,63+0x00+0x80*0x01,"3f8001"); |
| testEncode(6,63+0x01+0x80*0x01,"3f8101"); |
| testEncode(6,63+0x7f+0x80*0x01,"3fFf01"); |
| testEncode(6,63+0x00+0x80*0x02,"3f8002"); |
| testEncode(6,63+0x01+0x80*0x02,"3f8102"); |
| testEncode(6,63+0x7f+0x80*0x7f,"3fFf7f"); |
| testEncode(6,63+0x00+0x80*0x80, "3f808001"); |
| testEncode(6,63+0x7f+0x80*0x80*0x7f,"3fFf807f"); |
| testEncode(6,63+0x00+0x80*0x80*0x80,"3f80808001"); |
| |
| testEncode(8,0,"00"); |
| testEncode(8,1,"01"); |
| testEncode(8,128,"80"); |
| testEncode(8,254,"Fe"); |
| testEncode(8,255,"Ff00"); |
| testEncode(8,255+1,"Ff01"); |
| testEncode(8,255+0x7e,"Ff7e"); |
| testEncode(8,255+0x7f,"Ff7f"); |
| testEncode(8,255+0x80,"Ff8001"); |
| testEncode(8,255+0x00+0x80*0x80,"Ff808001"); |
| } |
| |
| public void testEncode(int n,int i,String expected) |
| { |
| ByteBuffer buf = BufferUtil.allocate(16); |
| int p=BufferUtil.flipToFill(buf); |
| if (n<8) |
| buf.put((byte)0x00); |
| NBitInteger.encode(buf,n,i); |
| BufferUtil.flipToFlush(buf,p); |
| String r=TypeUtil.toHexString(BufferUtil.toArray(buf)); |
| assertEquals(expected,r); |
| |
| assertEquals(expected.length()/2,(n<8?1:0)+NBitInteger.octectsNeeded(n,i)); |
| } |
| |
| @Test |
| public void testDecode() |
| { |
| testDecode(6,0,"00"); |
| testDecode(6,1,"01"); |
| testDecode(6,62,"3e"); |
| testDecode(6,63,"3f00"); |
| testDecode(6,63+1,"3f01"); |
| testDecode(6,63+0x7e,"3f7e"); |
| testDecode(6,63+0x7f,"3f7f"); |
| testDecode(6,63+0x80,"3f8001"); |
| testDecode(6,63+0x81,"3f8101"); |
| testDecode(6,63+0x7f+0x80*0x01,"3fFf01"); |
| testDecode(6,63+0x00+0x80*0x02,"3f8002"); |
| testDecode(6,63+0x01+0x80*0x02,"3f8102"); |
| testDecode(6,63+0x7f+0x80*0x7f,"3fFf7f"); |
| testDecode(6,63+0x00+0x80*0x80, "3f808001"); |
| testDecode(6,63+0x7f+0x80*0x80*0x7f,"3fFf807f"); |
| testDecode(6,63+0x00+0x80*0x80*0x80,"3f80808001"); |
| |
| testDecode(8,0,"00"); |
| testDecode(8,1,"01"); |
| testDecode(8,128,"80"); |
| testDecode(8,254,"Fe"); |
| testDecode(8,255,"Ff00"); |
| testDecode(8,255+1,"Ff01"); |
| testDecode(8,255+0x7e,"Ff7e"); |
| testDecode(8,255+0x7f,"Ff7f"); |
| testDecode(8,255+0x80,"Ff8001"); |
| testDecode(8,255+0x00+0x80*0x80,"Ff808001"); |
| } |
| |
| |
| public void testDecode(int n,int expected,String encoded) |
| { |
| ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString(encoded)); |
| buf.position(n==8?0:1); |
| Assert.assertEquals(expected,NBitInteger.decode(buf,n)); |
| } |
| |
| @Test |
| public void testEncodeExampleD_1_1() |
| { |
| ByteBuffer buf = BufferUtil.allocate(16); |
| int p=BufferUtil.flipToFill(buf); |
| buf.put((byte)0x77); |
| buf.put((byte)0xFF); |
| NBitInteger.encode(buf,5,10); |
| BufferUtil.flipToFlush(buf,p); |
| |
| String r=TypeUtil.toHexString(BufferUtil.toArray(buf)); |
| |
| assertEquals("77Ea",r); |
| |
| } |
| |
| @Test |
| public void testDecodeExampleD_1_1() |
| { |
| ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString("77EaFF")); |
| buf.position(2); |
| |
| Assert.assertEquals(10,NBitInteger.decode(buf,5)); |
| } |
| |
| |
| @Test |
| public void testEncodeExampleD_1_2() |
| { |
| ByteBuffer buf = BufferUtil.allocate(16); |
| int p=BufferUtil.flipToFill(buf); |
| buf.put((byte)0x88); |
| buf.put((byte)0x00); |
| NBitInteger.encode(buf,5,1337); |
| BufferUtil.flipToFlush(buf,p); |
| |
| String r=TypeUtil.toHexString(BufferUtil.toArray(buf)); |
| |
| Assert.assertEquals("881f9a0a",r); |
| |
| } |
| |
| @Test |
| public void testDecodeExampleD_1_2() |
| { |
| ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString("881f9a0aff")); |
| buf.position(2); |
| |
| Assert.assertEquals(1337,NBitInteger.decode(buf,5)); |
| } |
| |
| |
| @Test |
| public void testEncodeExampleD_1_3() |
| { |
| ByteBuffer buf = BufferUtil.allocate(16); |
| int p=BufferUtil.flipToFill(buf); |
| buf.put((byte)0x88); |
| buf.put((byte)0xFF); |
| NBitInteger.encode(buf,8,42); |
| BufferUtil.flipToFlush(buf,p); |
| |
| String r=TypeUtil.toHexString(BufferUtil.toArray(buf)); |
| |
| Assert.assertEquals("88Ff2a",r); |
| |
| } |
| |
| |
| @Test |
| public void testDecodeExampleD_1_3() |
| { |
| ByteBuffer buf = ByteBuffer.wrap(TypeUtil.fromHexString("882aFf")); |
| buf.position(1); |
| |
| Assert.assertEquals(42,NBitInteger.decode(buf,8)); |
| } |
| |
| |
| } |