// *************************************************************************************************************************** | |
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * | |
// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * | |
// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * | |
// * with the License. You may obtain a copy of the License at * | |
// * * | |
// * http://www.apache.org/licenses/LICENSE-2.0 * | |
// * * | |
// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * | |
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * | |
// * specific language governing permissions and limitations under the License. * | |
// *************************************************************************************************************************** | |
package org.apache.juneau.msgpack; | |
import static org.junit.Assert.*; | |
import org.apache.juneau.*; | |
import org.apache.juneau.internal.*; | |
import org.junit.*; | |
@SuppressWarnings({}) | |
public class MsgPackSerializerTest { | |
//==================================================================================================== | |
// testBasic | |
//==================================================================================================== | |
@Test | |
public void testBasic() throws Exception { | |
test(null, "C0"); | |
test(false, "C2"); | |
test(true, "C3"); | |
// positive fixnum stores 7-bit positive integer | |
// +--------+ | |
// |0XXXXXXX| | |
// +--------+ | |
// | |
// int 8 stores a 8-bit signed integer | |
// +--------+--------+ | |
// | 0xd0 |ZZZZZZZZ| | |
// +--------+--------+ | |
// | |
// int 16 stores a 16-bit big-endian signed integer | |
// +--------+--------+--------+ | |
// | 0xd1 |ZZZZZZZZ|ZZZZZZZZ| | |
// +--------+--------+--------+ | |
// | |
// int 32 stores a 32-bit big-endian signed integer | |
// +--------+--------+--------+--------+--------+ | |
// | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| | |
// +--------+--------+--------+--------+--------+ | |
// | |
// int 64 stores a 64-bit big-endian signed integer | |
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+ | |
// | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| | |
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+ | |
// | |
// negative fixnum stores 5-bit negative integer | |
// +--------+ | |
// |111YYYYY| | |
// +--------+ | |
// | |
// * 0XXXXXXX is 8-bit unsigned integer | |
// * 111YYYYY is 8-bit signed integer | |
// | |
test(0, "00"); | |
test(0x7F, "7F"); | |
test(0x80, "D1 00 80"); | |
test(0x0100, "D1 01 00"); | |
test(0x7FFF, "D1 7F FF"); | |
test(0x8000, "D2 00 00 80 00"); | |
test(0xFFFF, "D2 00 00 FF FF"); | |
test(0x00010000, "D2 00 01 00 00"); | |
test(Long.decode("0x000000007FFFFFFF").longValue(), "D2 7F FF FF FF"); | |
test(Long.decode("0x0000000080000000").longValue(), "D3 00 00 00 00 80 00 00 00"); | |
test(Long.decode("0x0000000100000000").longValue(), "D3 00 00 00 01 00 00 00 00"); | |
test(Long.decode("0x7FFFFFFFFFFFFFFF").longValue(), "D3 7F FF FF FF FF FF FF FF"); | |
test(-Long.decode("0x7FFFFFFFFFFFFFFF").longValue(), "D3 80 00 00 00 00 00 00 01"); | |
test(-1, "E1"); | |
test(-63, "FF"); | |
test(-64, "D0 C0"); | |
test(-0x7F, "D0 81"); | |
test(-0x80, "D1 FF 80"); | |
test(-0x0100, "D1 FF 00"); | |
test(-0x7FFF, "D1 80 01"); | |
test(-0x8000, "D2 FF FF 80 00"); | |
test(-0xFFFF, "D2 FF FF 00 01"); | |
test(-0x00010000, "D2 FF FF 00 00"); | |
test(-Long.decode("0x000000007FFFFFFF").longValue(), "D2 80 00 00 01"); | |
test(-Long.decode("0x0000000080000000").longValue(), "D3 FF FF FF FF 80 00 00 00"); | |
test(-Long.decode("0x0000000100000000").longValue(), "D3 FF FF FF FF 00 00 00 00"); | |
test(-Long.decode("0x7FFFFFFFFFFFFFFF").longValue(), "D3 80 00 00 00 00 00 00 01"); | |
// float 32 stores a floating point number in IEEE 754 single precision floating point number format: | |
// +--------+--------+--------+--------+--------+ | |
// | 0xca |XXXXXXXX|XXXXXXXX|XXXXXXXX|XXXXXXXX| | |
// +--------+--------+--------+--------+--------+ | |
// | |
// float 64 stores a floating point number in IEEE 754 double precision floating point number format: | |
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+ | |
// | 0xcb |YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY|YYYYYYYY| | |
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+ | |
// | |
// where | |
// * XXXXXXXX_XXXXXXXX_XXXXXXXX_XXXXXXXX is a big-endian IEEE 754 single precision floating point number. | |
// Extension of precision from single-precision to double-precision does not lose precision. | |
// * YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY_YYYYYYYY is a big-endian | |
// IEEE 754 double precision floating point number | |
test(0f, "CA 00 00 00 00"); | |
test(1f, "CA 3F 80 00 00"); | |
test(-1f, "CA BF 80 00 00"); | |
test(1d, "CB 3F F0 00 00 00 00 00 00"); | |
test(-1d, "CB BF F0 00 00 00 00 00 00"); | |
// fixstr stores a byte array whose length is upto 31 bytes: | |
// +--------+========+ | |
// |101XXXXX| data | | |
// +--------+========+ | |
// | |
// str 8 stores a byte array whose length is upto (2^8)-1 bytes: | |
// +--------+--------+========+ | |
// | 0xd9 |YYYYYYYY| data | | |
// +--------+--------+========+ | |
// | |
// str 16 stores a byte array whose length is upto (2^16)-1 bytes: | |
// +--------+--------+--------+========+ | |
// | 0xda |ZZZZZZZZ|ZZZZZZZZ| data | | |
// +--------+--------+--------+========+ | |
// | |
// str 32 stores a byte array whose length is upto (2^32)-1 bytes: | |
// +--------+--------+--------+--------+--------+========+ | |
// | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data | | |
// +--------+--------+--------+--------+--------+========+ | |
// | |
// where | |
// * XXXXX is a 5-bit unsigned integer which represents N | |
// * YYYYYYYY is a 8-bit unsigned integer which represents N | |
// * ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N | |
// * AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N | |
// * N is the length of data | |
test("", "A0"); | |
test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "BF 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61"); | |
test("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "D9 20 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61"); | |
// fixarray stores an array whose length is upto 15 elements: | |
// +--------+~~~~~~~~~~~~~~~~~+ | |
// |1001XXXX| N objects | | |
// +--------+~~~~~~~~~~~~~~~~~+ | |
// | |
// array 16 stores an array whose length is upto (2^16)-1 elements: | |
// +--------+--------+--------+~~~~~~~~~~~~~~~~~+ | |
// | 0xdc |YYYYYYYY|YYYYYYYY| N objects | | |
// +--------+--------+--------+~~~~~~~~~~~~~~~~~+ | |
// | |
// array 32 stores an array whose length is upto (2^32)-1 elements: | |
// +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ | |
// | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects | | |
// +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ | |
// | |
// where | |
// * XXXX is a 4-bit unsigned integer which represents N | |
// * YYYYYYYY_YYYYYYYY is a 16-bit big-endian unsigned integer which represents N | |
// * ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ is a 32-bit big-endian unsigned integer which represents N | |
// N is the size of a array | |
test(new int[0], "90"); | |
test(new int[]{1}, "91 01"); | |
test(new int[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, "9F 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01"); | |
test(new int[]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, "DC 00 10 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01"); | |
// fixmap stores a map whose length is upto 15 elements | |
// +--------+~~~~~~~~~~~~~~~~~+ | |
// |1000XXXX| N*2 objects | | |
// +--------+~~~~~~~~~~~~~~~~~+ | |
// | |
// map 16 stores a map whose length is upto (2^16)-1 elements | |
// +--------+--------+--------+~~~~~~~~~~~~~~~~~+ | |
// | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects | | |
// +--------+--------+--------+~~~~~~~~~~~~~~~~~+ | |
// | |
// map 32 stores a map whose length is upto (2^32)-1 elements | |
// +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ | |
// | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects | | |
// +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+ | |
// | |
// where | |
// * XXXX is a 4-bit unsigned integer which represents N | |
// * YYYYYYYY_YYYYYYYY is a 16-bit big-endian unsigned integer which represents N | |
// * ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ is a 32-bit big-endian unsigned integer which represents N | |
// * N is the size of a map | |
// * odd elements in objects are keys of a map | |
// * the next element of a key is its associated value | |
test(new ObjectMap("{}"), "80"); | |
test(new ObjectMap("{1:1}"), "81 A1 31 01"); | |
test(new ObjectMap("{1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1,9:1,a:1,b:1,c:1,d:1,e:1,f:1}"), "8F A1 31 01 A1 32 01 A1 33 01 A1 34 01 A1 35 01 A1 36 01 A1 37 01 A1 38 01 A1 39 01 A1 61 01 A1 62 01 A1 63 01 A1 64 01 A1 65 01 A1 66 01"); | |
test(new ObjectMap("{1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1,9:1,a:1,b:1,c:1,d:1,e:1,f:1,g:1}"), "DE 00 10 A1 31 01 A1 32 01 A1 33 01 A1 34 01 A1 35 01 A1 36 01 A1 37 01 A1 38 01 A1 39 01 A1 61 01 A1 62 01 A1 63 01 A1 64 01 A1 65 01 A1 66 01 A1 67 01"); | |
} | |
public static class Person { | |
public String name = "John Smith"; | |
public int age = 21; | |
} | |
private void test(Object input, String expected) throws Exception { | |
byte[] b = MsgPackSerializer.DEFAULT.serialize(input); | |
assertEquals(expected, StringUtils.toSpacedHex(b)); | |
} | |
} |