blob: 03a7e44afc545da653663ee40a030134efa433b2 [file] [log] [blame]
//
// ========================================================================
// 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));
}
}