| /* |
| * |
| * 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.qpid.framing; |
| |
| import java.io.IOException; |
| import java.nio.ByteBuffer; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.Iterator; |
| |
| import org.junit.Assert; |
| |
| import org.apache.qpid.AMQPInvalidClassException; |
| import org.apache.qpid.test.utils.QpidTestCase; |
| |
| public class FieldTableTest extends QpidTestCase |
| { |
| /** |
| * Test that setting a similar named value replaces any previous value set on that name |
| */ |
| public void testReplacement() |
| { |
| FieldTable table1 = new FieldTable(); |
| // Set a boolean value |
| table1.setBoolean("value", true); |
| // Check length of table is correct (<Value length> + <type> + <Boolean length>) |
| int size = EncodingUtils.encodedShortStringLength("value") + 1 + EncodingUtils.encodedBooleanLength(); |
| Assert.assertEquals(size, table1.getEncodedSize()); |
| |
| // reset value to an integer |
| table1.setInteger("value", Integer.MAX_VALUE); |
| |
| // Check the length has changed accordingly (<Value length> + <type> + <Integer length>) |
| size = EncodingUtils.encodedShortStringLength("value") + 1 + EncodingUtils.encodedIntegerLength(); |
| Assert.assertEquals(size, table1.getEncodedSize()); |
| |
| // Check boolean value is null |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| // ... and integer value is good |
| Assert.assertEquals((Integer) Integer.MAX_VALUE, table1.getInteger("value")); |
| } |
| |
| /** |
| * Set a boolean and check that we can only get it back as a boolean and a string |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testBoolean() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setBoolean("value", true); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Test Getting right value back |
| Assert.assertEquals((Boolean) true, table1.getBoolean("value")); |
| |
| // Check we don't get anything back for other gets |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| |
| // except value as a string |
| Assert.assertEquals("true", table1.getString("value")); |
| |
| table1.remove("value"); |
| |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getBoolean("Rubbish")); |
| } |
| |
| /** |
| * Set a byte and check that we can only get it back as a byte and a string |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testByte() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setByte("value", Byte.MAX_VALUE); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Tests lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(Byte.valueOf(Byte.MAX_VALUE), table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| |
| // ... and a the string value of it. |
| Assert.assertEquals("" + Byte.MAX_VALUE, table1.getString("value")); |
| |
| table1.remove("value"); |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getByte("Rubbish")); |
| } |
| |
| /** |
| * Set a short and check that we can only get it back as a short and a string |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testShort() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setShort("value", Short.MAX_VALUE); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Tests lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(Short.valueOf(Short.MAX_VALUE), table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| |
| // ... and a the string value of it. |
| Assert.assertEquals("" + Short.MAX_VALUE, table1.getString("value")); |
| |
| table1.remove("value"); |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getShort("Rubbish")); |
| } |
| |
| /** |
| * Set a char and check that we can only get it back as a char |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testChar() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setChar("value", 'c'); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Tests lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(Character.valueOf('c'), table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| |
| // ... and a the string value of it. |
| Assert.assertEquals("c", table1.getString("value")); |
| |
| table1.remove("value"); |
| |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getCharacter("Rubbish")); |
| } |
| |
| /** |
| * Set a double and check that we can only get it back as a double |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testDouble() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setDouble("value", Double.MAX_VALUE); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Tests lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(Double.valueOf(Double.MAX_VALUE), table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| |
| // ... and a the string value of it. |
| Assert.assertEquals("" + Double.MAX_VALUE, table1.getString("value")); |
| table1.remove("value"); |
| // but after a removeKey it doesn't |
| Assert.assertFalse(table1.containsKey("value")); |
| |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getDouble("Rubbish")); |
| } |
| |
| /** |
| * Set a float and check that we can only get it back as a float |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testFloat() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setFloat("value", Float.MAX_VALUE); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Tests lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(Float.valueOf(Float.MAX_VALUE), table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| |
| // ... and a the string value of it. |
| Assert.assertEquals("" + Float.MAX_VALUE, table1.getString("value")); |
| |
| table1.remove("value"); |
| // but after a removeKey it doesn't |
| Assert.assertFalse(table1.containsKey("value")); |
| |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getFloat("Rubbish")); |
| } |
| |
| /** |
| * Set an int and check that we can only get it back as an int |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testInt() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setInteger("value", Integer.MAX_VALUE); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Tets lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(Integer.valueOf(Integer.MAX_VALUE), table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| |
| // ... and a the string value of it. |
| Assert.assertEquals("" + Integer.MAX_VALUE, table1.getString("value")); |
| |
| table1.remove("value"); |
| // but after a removeKey it doesn't |
| Assert.assertFalse(table1.containsKey("value")); |
| |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getInteger("Rubbish")); |
| } |
| |
| /** |
| * Set a long and check that we can only get it back as a long |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testLong() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setLong("value", Long.MAX_VALUE); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Tets lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(Long.valueOf(Long.MAX_VALUE), table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| |
| // ... and a the string value of it. |
| Assert.assertEquals("" + Long.MAX_VALUE, table1.getString("value")); |
| |
| table1.remove("value"); |
| // but after a removeKey it doesn't |
| Assert.assertFalse(table1.containsKey("value")); |
| |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getLong("Rubbish")); |
| } |
| |
| /** |
| * Set a double and check that we can only get it back as a double |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testBytes() |
| { |
| byte[] bytes = { 99, 98, 97, 96, 95 }; |
| |
| FieldTable table1 = new FieldTable(); |
| table1.setBytes("value", bytes); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Tets lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| assertBytesEqual(bytes, table1.getBytes("value")); |
| |
| // ... and a the string value of it is null |
| Assert.assertEquals(null, table1.getString("value")); |
| |
| table1.remove("value"); |
| // but after a removeKey it doesn't |
| Assert.assertFalse(table1.containsKey("value")); |
| |
| // Table should now have zero length for encoding |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getBytes("Rubbish")); |
| } |
| |
| /** |
| * Calls all methods that can be used to check the table is empty |
| * - getEncodedSize |
| * - isEmpty |
| * - length |
| * |
| * @param table to check is empty |
| */ |
| private void checkEmpty(FieldTable table) |
| { |
| Assert.assertEquals(0, table.getEncodedSize()); |
| Assert.assertTrue(table.isEmpty()); |
| Assert.assertEquals(0, table.size()); |
| |
| Assert.assertEquals(0, table.keySet().size()); |
| } |
| |
| /** |
| * Set a String and check that we can only get it back as a String |
| * Check that attempting to lookup a non existent value returns null |
| */ |
| public void testString() |
| { |
| FieldTable table1 = new FieldTable(); |
| table1.setString("value", "Hello"); |
| Assert.assertTrue(table1.propertyExists("value")); |
| |
| // Test lookups we shouldn't get anything back for other gets |
| // we should get right value back for this type .... |
| Assert.assertEquals(null, table1.getBoolean("value")); |
| Assert.assertEquals(null, table1.getByte("value")); |
| Assert.assertEquals(null, table1.getShort("value")); |
| Assert.assertEquals(null, table1.getCharacter("value")); |
| Assert.assertEquals(null, table1.getDouble("value")); |
| Assert.assertEquals(null, table1.getFloat("value")); |
| Assert.assertEquals(null, table1.getInteger("value")); |
| Assert.assertEquals(null, table1.getLong("value")); |
| Assert.assertEquals(null, table1.getBytes("value")); |
| Assert.assertEquals("Hello", table1.getString("value")); |
| |
| // Try setting a null value and read it back |
| table1.setString("value", null); |
| |
| Assert.assertEquals(null, table1.getString("value")); |
| |
| // but still contains the value |
| Assert.assertTrue(table1.containsKey("value")); |
| |
| table1.remove("value"); |
| // but after a removeKey it doesn't |
| Assert.assertFalse(table1.containsKey("value")); |
| |
| checkEmpty(table1); |
| |
| // Looking up an invalid value returns null |
| Assert.assertEquals(null, table1.getString("Rubbish")); |
| |
| // Additional Test that haven't been covered for string |
| table1.setObject("value", "Hello"); |
| // Check that it was set correctly |
| Assert.assertEquals("Hello", table1.getString("value")); |
| } |
| |
| /** Check that a nested field table parameter correctly encodes and decodes to a byte buffer. */ |
| public void testNestedFieldTable() throws IOException |
| { |
| byte[] testBytes = new byte[] { 0, 1, 2, 3, 4, 5 }; |
| |
| FieldTable outerTable = new FieldTable(); |
| FieldTable innerTable = new FieldTable(); |
| |
| // Put some stuff in the inner table. |
| innerTable.setBoolean("bool", true); |
| innerTable.setByte("byte", Byte.MAX_VALUE); |
| innerTable.setBytes("bytes", testBytes); |
| innerTable.setChar("char", 'c'); |
| innerTable.setDouble("double", Double.MAX_VALUE); |
| innerTable.setFloat("float", Float.MAX_VALUE); |
| innerTable.setInteger("int", Integer.MAX_VALUE); |
| innerTable.setLong("long", Long.MAX_VALUE); |
| innerTable.setShort("short", Short.MAX_VALUE); |
| innerTable.setString("string", "hello"); |
| innerTable.setString("null-string", null); |
| innerTable.setFieldArray("field-array",Arrays.asList("hello",Integer.valueOf(42), Collections.emptyList())); |
| |
| // Put the inner table in the outer one. |
| outerTable.setFieldTable("innerTable", innerTable); |
| |
| // Write the outer table into the buffer. |
| ByteBuffer buf = ByteBuffer.allocate(EncodingUtils.encodedFieldTableLength(outerTable)); |
| |
| outerTable.writeToBuffer(buf); |
| |
| buf.flip(); |
| |
| // Extract the table back from the buffer again. |
| try |
| { |
| FieldTable extractedOuterTable = EncodingUtils.readFieldTable(buf); |
| |
| FieldTable extractedTable = extractedOuterTable.getFieldTable("innerTable"); |
| |
| Assert.assertEquals(Boolean.TRUE, extractedTable.getBoolean("bool")); |
| Assert.assertEquals(Byte.valueOf(Byte.MAX_VALUE), extractedTable.getByte("byte")); |
| assertBytesEqual(testBytes, extractedTable.getBytes("bytes")); |
| Assert.assertEquals(Character.valueOf('c'), extractedTable.getCharacter("char")); |
| Assert.assertEquals(Double.valueOf(Double.MAX_VALUE), extractedTable.getDouble("double")); |
| Assert.assertEquals(Float.valueOf(Float.MAX_VALUE), extractedTable.getFloat("float")); |
| Assert.assertEquals(Integer.valueOf(Integer.MAX_VALUE), extractedTable.getInteger("int")); |
| Assert.assertEquals(Long.valueOf(Long.MAX_VALUE), extractedTable.getLong("long")); |
| Assert.assertEquals(Short.valueOf(Short.MAX_VALUE), extractedTable.getShort("short")); |
| Assert.assertEquals("hello", extractedTable.getString("string")); |
| Assert.assertNull(extractedTable.getString("null-string")); |
| Collection fieldArray = (Collection) extractedTable.get("field-array"); |
| Assert.assertEquals(3, fieldArray.size()); |
| Iterator iter = fieldArray.iterator(); |
| assertEquals("hello",iter.next()); |
| assertEquals(Integer.valueOf(42), iter.next()); |
| assertTrue(((Collection)iter.next()).isEmpty()); |
| } |
| catch (AMQFrameDecodingException e) |
| { |
| fail("Failed to decode field table with nested inner table."); |
| } |
| } |
| |
| public void testValues() |
| { |
| FieldTable table = new FieldTable(); |
| table.setBoolean("bool", true); |
| table.setByte("byte", Byte.MAX_VALUE); |
| byte[] bytes = { 99, 98, 97, 96, 95 }; |
| table.setBytes("bytes", bytes); |
| table.setChar("char", 'c'); |
| table.setDouble("double", Double.MAX_VALUE); |
| table.setFloat("float", Float.MAX_VALUE); |
| table.setInteger("int", Integer.MAX_VALUE); |
| table.setLong("long", Long.MAX_VALUE); |
| table.setShort("short", Short.MAX_VALUE); |
| table.setString("string", "Hello"); |
| table.setString("null-string", null); |
| |
| table.setObject("object-bool", true); |
| table.setObject("object-byte", Byte.MAX_VALUE); |
| table.setObject("object-bytes", bytes); |
| table.setObject("object-char", 'c'); |
| table.setObject("object-double", Double.MAX_VALUE); |
| table.setObject("object-float", Float.MAX_VALUE); |
| table.setObject("object-int", Integer.MAX_VALUE); |
| table.setObject("object-long", Long.MAX_VALUE); |
| table.setObject("object-short", Short.MAX_VALUE); |
| table.setObject("object-string", "Hello"); |
| |
| try |
| { |
| table.setObject("Null-object", null); |
| fail("null values are not allowed"); |
| } |
| catch (AMQPInvalidClassException aice) |
| { |
| assertEquals("Null values are not allowed to be set", |
| AMQPInvalidClassException.INVALID_OBJECT_MSG + "null", aice.getMessage()); |
| } |
| |
| try |
| { |
| table.setObject("Unsupported-object", new Exception()); |
| fail("Non primitive values are not allowed"); |
| } |
| catch (AMQPInvalidClassException aice) |
| { |
| assertEquals("Non primitive values are not allowed to be set", |
| AMQPInvalidClassException.INVALID_OBJECT_MSG + Exception.class, aice.getMessage()); |
| } |
| |
| Assert.assertEquals(Boolean.TRUE, table.getBoolean("bool")); |
| Assert.assertEquals(Byte.valueOf(Byte.MAX_VALUE), table.getByte("byte")); |
| assertBytesEqual(bytes, table.getBytes("bytes")); |
| Assert.assertEquals(Character.valueOf('c'), table.getCharacter("char")); |
| Assert.assertEquals(Double.valueOf(Double.MAX_VALUE), table.getDouble("double")); |
| Assert.assertEquals(Float.valueOf(Float.MAX_VALUE), table.getFloat("float")); |
| Assert.assertEquals(Integer.valueOf(Integer.MAX_VALUE), table.getInteger("int")); |
| Assert.assertEquals(Long.valueOf(Long.MAX_VALUE), table.getLong("long")); |
| Assert.assertEquals(Short.valueOf(Short.MAX_VALUE), table.getShort("short")); |
| Assert.assertEquals("Hello", table.getString("string")); |
| Assert.assertNull(table.getString("null-string")); |
| |
| Assert.assertEquals(true, table.getObject("object-bool")); |
| Assert.assertEquals(Byte.MAX_VALUE, table.getObject("object-byte")); |
| assertBytesEqual(bytes, (byte[]) table.getObject("object-bytes")); |
| Assert.assertEquals('c', table.getObject("object-char")); |
| Assert.assertEquals(Double.MAX_VALUE, table.getObject("object-double")); |
| Assert.assertEquals(Float.MAX_VALUE, table.getObject("object-float")); |
| Assert.assertEquals(Integer.MAX_VALUE, table.getObject("object-int")); |
| Assert.assertEquals(Long.MAX_VALUE, table.getObject("object-long")); |
| Assert.assertEquals(Short.MAX_VALUE, table.getObject("object-short")); |
| Assert.assertEquals("Hello", table.getObject("object-string")); |
| } |
| |
| public void testWriteBuffer() throws IOException |
| { |
| byte[] bytes = { 99, 98, 97, 96, 95 }; |
| |
| FieldTable table = new FieldTable(); |
| table.setBoolean("bool", true); |
| table.setByte("byte", Byte.MAX_VALUE); |
| |
| table.setBytes("bytes", bytes); |
| table.setChar("char", 'c'); |
| table.setInteger("int", Integer.MAX_VALUE); |
| table.setLong("long", Long.MAX_VALUE); |
| table.setDouble("double", Double.MAX_VALUE); |
| table.setFloat("float", Float.MAX_VALUE); |
| table.setShort("short", Short.MAX_VALUE); |
| table.setString("string", "hello"); |
| table.setString("null-string", null); |
| |
| |
| ByteBuffer buf = ByteBuffer.allocate((int) table.getEncodedSize() + 4); |
| table.writeToBuffer(buf); |
| |
| buf.flip(); |
| |
| long length = buf.getInt() & 0xFFFFFFFFL; |
| buf = buf.slice(); |
| buf.limit((int)length); |
| |
| |
| FieldTable table2 = new FieldTable(buf); |
| |
| Assert.assertEquals((Boolean) true, table2.getBoolean("bool")); |
| Assert.assertEquals((Byte) Byte.MAX_VALUE, table2.getByte("byte")); |
| assertBytesEqual(bytes, table2.getBytes("bytes")); |
| Assert.assertEquals((Character) 'c', table2.getCharacter("char")); |
| Assert.assertEquals(Double.valueOf(Double.MAX_VALUE), table2.getDouble("double")); |
| Assert.assertEquals(Float.valueOf(Float.MAX_VALUE), table2.getFloat("float")); |
| Assert.assertEquals(Integer.valueOf(Integer.MAX_VALUE), table2.getInteger("int")); |
| Assert.assertEquals(Long.valueOf(Long.MAX_VALUE), table2.getLong("long")); |
| Assert.assertEquals(Short.valueOf(Short.MAX_VALUE), table2.getShort("short")); |
| Assert.assertEquals("hello", table2.getString("string")); |
| Assert.assertNull(table2.getString("null-string")); |
| } |
| |
| public void testEncodingSize() |
| { |
| FieldTable result = new FieldTable(); |
| int size = 0; |
| |
| result.setBoolean("boolean", true); |
| size += 1 + EncodingUtils.encodedShortStringLength("boolean") + EncodingUtils.encodedBooleanLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setByte("byte", (byte) Byte.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("byte") + EncodingUtils.encodedByteLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| byte[] _bytes = { 99, 98, 97, 96, 95 }; |
| |
| result.setBytes("bytes", _bytes); |
| size += 1 + EncodingUtils.encodedShortStringLength("bytes") + 4 + _bytes.length; |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setChar("char", (char) 'c'); |
| size += 1 + EncodingUtils.encodedShortStringLength("char") + EncodingUtils.encodedCharLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setDouble("double", (double) Double.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("double") + EncodingUtils.encodedDoubleLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setFloat("float", (float) Float.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("float") + EncodingUtils.encodedFloatLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setInteger("int", (int) Integer.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("int") + EncodingUtils.encodedIntegerLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setLong("long", (long) Long.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("long") + EncodingUtils.encodedLongLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setShort("short", (short) Short.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("short") + EncodingUtils.encodedShortLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setString("result", "Hello"); |
| size += 1 + EncodingUtils.encodedShortStringLength("result") + EncodingUtils.encodedLongStringLength("Hello"); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-bool", true); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-bool") + EncodingUtils.encodedBooleanLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-byte", Byte.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-byte") + EncodingUtils.encodedByteLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-bytes", _bytes); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-bytes") + 4 + _bytes.length; |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-char", 'c'); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-char") + EncodingUtils.encodedCharLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-double", Double.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-double") + EncodingUtils.encodedDoubleLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-float", Float.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-float") + EncodingUtils.encodedFloatLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-int", Integer.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-int") + EncodingUtils.encodedIntegerLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-long", Long.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-long") + EncodingUtils.encodedLongLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| |
| result.setObject("object-short", Short.MAX_VALUE); |
| size += 1 + EncodingUtils.encodedShortStringLength("object-short") + EncodingUtils.encodedShortLength(); |
| Assert.assertEquals(size, result.getEncodedSize()); |
| } |
| |
| /** |
| * Additional test for setObject |
| */ |
| public void testSetObject() |
| { |
| FieldTable table = new FieldTable(); |
| |
| // Try setting a non primative object |
| |
| try |
| { |
| table.setObject("value", this); |
| fail("Only primative values allowed in setObject"); |
| } |
| catch (AMQPInvalidClassException iae) |
| { |
| // normal path |
| } |
| // so length should be zero |
| Assert.assertEquals(0, table.getEncodedSize()); |
| } |
| |
| /** |
| * Additional test checkPropertyName doesn't accept Null |
| */ |
| public void testCheckPropertyNameasNull() |
| { |
| FieldTable table = new FieldTable(); |
| |
| try |
| { |
| table.setObject((String) null, "String"); |
| fail("Null property name is not allowed"); |
| } |
| catch (IllegalArgumentException iae) |
| { |
| // normal path |
| } |
| // so length should be zero |
| Assert.assertEquals(0, table.getEncodedSize()); |
| } |
| |
| /** |
| * Additional test checkPropertyName doesn't accept an empty String |
| */ |
| public void testCheckPropertyNameasEmptyString() |
| { |
| FieldTable table = new FieldTable(); |
| |
| try |
| { |
| table.setObject("", "String"); |
| fail("empty property name is not allowed"); |
| } |
| catch (IllegalArgumentException iae) |
| { |
| // normal path |
| } |
| // so length should be zero |
| Assert.assertEquals(0, table.getEncodedSize()); |
| } |
| |
| /** |
| * Additional test checkPropertyName doesn't accept an empty String |
| */ |
| public void testCheckPropertyNamehasMaxLength() |
| { |
| FieldTable table = new FieldTable(true); |
| |
| StringBuffer longPropertyName = new StringBuffer(129); |
| |
| for (int i = 0; i < 129; i++) |
| { |
| longPropertyName.append("x"); |
| } |
| |
| try |
| { |
| table.setObject(longPropertyName.toString(), "String"); |
| fail("property name must be < 128 characters"); |
| } |
| catch (IllegalArgumentException iae) |
| { |
| // normal path |
| } |
| // so length should be zero |
| Assert.assertEquals(0, table.getEncodedSize()); |
| } |
| |
| /** |
| * Additional test checkPropertyName starts with a letter |
| */ |
| public void testCheckPropertyNameStartCharacterIsLetter() |
| { |
| FieldTable table = new FieldTable(true); |
| |
| // Try a name that starts with a number |
| try |
| { |
| table.setObject("1", "String"); |
| fail("property name must start with a letter"); |
| } |
| catch (IllegalArgumentException iae) |
| { |
| // normal path |
| } |
| // so length should be zero |
| Assert.assertEquals(0, table.getEncodedSize()); |
| } |
| |
| /** |
| * Additional test checkPropertyName starts with a hash or a dollar |
| */ |
| public void testCheckPropertyNameStartCharacterIsHashorDollar() |
| { |
| FieldTable table = new FieldTable(true); |
| |
| // Try a name that starts with a number |
| try |
| { |
| table.setObject("#", "String"); |
| table.setObject("$", "String"); |
| } |
| catch (IllegalArgumentException iae) |
| { |
| fail("property name are allowed to start with # and $s"); |
| } |
| } |
| |
| /** |
| * Additional test to test the contents of the table |
| */ |
| public void testContents() |
| { |
| FieldTable table = new FieldTable(); |
| |
| table.setObject("StringProperty", "String"); |
| |
| Assert.assertEquals("String", table.getString("StringProperty")); |
| |
| // Test Clear |
| |
| table.clear(); |
| |
| checkEmpty(table); |
| } |
| |
| /** |
| * Test the contents of the sets |
| */ |
| public void testSets() |
| { |
| |
| FieldTable table = new FieldTable(); |
| |
| table.setObject("n1", "1"); |
| table.setObject("n2", "2"); |
| table.setObject("n3", "3"); |
| |
| Assert.assertEquals("1", table.getObject("n1")); |
| Assert.assertEquals("2", table.getObject("n2")); |
| Assert.assertEquals("3", table.getObject("n3")); |
| } |
| |
| public void testAddAll() |
| { |
| final FieldTable table1 = new FieldTable(); |
| table1.setInteger("int1", 1); |
| table1.setInteger("int2", 2); |
| assertEquals("Unexpected number of entries in table1", 2, table1.size()); |
| |
| final FieldTable table2 = new FieldTable(); |
| table2.setInteger("int3", 3); |
| table2.setInteger("int4", 4); |
| assertEquals("Unexpected number of entries in table2", 2, table2.size()); |
| |
| table1.addAll(table2); |
| assertEquals("Unexpected number of entries in table1 after addAll", 4, table1.size()); |
| assertEquals(Integer.valueOf(3), table1.getInteger("int3")); |
| } |
| |
| public void testAddAllWithEmptyFieldTable() |
| { |
| final FieldTable table1 = new FieldTable(); |
| table1.setInteger("int1", 1); |
| table1.setInteger("int2", 2); |
| assertEquals("Unexpected number of entries in table1", 2, table1.size()); |
| |
| final FieldTable emptyFieldTable = new FieldTable(); |
| |
| table1.addAll(emptyFieldTable); |
| assertEquals("Unexpected number of entries in table1 after addAll", 2, table1.size()); |
| } |
| |
| /** |
| * Tests that when copying properties into a new FielTable using the addAll() method, the |
| * properties are successfully added to the destination table when the source FieldTable |
| * was created from encoded input bytes, |
| */ |
| public void testAddingAllFromFieldTableCreatedUsingEncodedBytes() throws Exception |
| { |
| AMQShortString myBooleanTestProperty = new AMQShortString("myBooleanTestProperty"); |
| |
| //Create a new FieldTable and use it to encode data into a byte array. |
| FieldTable encodeTable = new FieldTable(); |
| encodeTable.put(myBooleanTestProperty, true); |
| byte[] data = encodeTable.getDataAsBytes(); |
| int length = data.length; |
| |
| //Verify we got the expected mount of encoded data (1B type hdr + 21B for name + 1B type hdr + 1B for boolean) |
| assertEquals("unexpected data length", 24, length); |
| |
| //Create a second FieldTable from the encoded bytes |
| FieldTable tableFromBytes = new FieldTable(ByteBuffer.wrap(data)); |
| |
| //Create a final FieldTable and addAll() from the table created with encoded bytes |
| FieldTable destinationTable = new FieldTable(); |
| assertTrue("unexpected size", destinationTable.isEmpty()); |
| destinationTable.addAll(tableFromBytes); |
| |
| //Verify that the destination table now contains the expected entry |
| assertEquals("unexpected size", 1, destinationTable.size()); |
| assertTrue("expected property not present", destinationTable.containsKey(myBooleanTestProperty)); |
| assertTrue("unexpected property value", destinationTable.getBoolean(myBooleanTestProperty)); |
| } |
| |
| private void assertBytesEqual(byte[] expected, byte[] actual) |
| { |
| Assert.assertEquals(expected.length, actual.length); |
| |
| for (int index = 0; index < expected.length; index++) |
| { |
| Assert.assertEquals(expected[index], actual[index]); |
| } |
| } |
| |
| public static junit.framework.Test suite() |
| { |
| return new junit.framework.TestSuite(FieldTableTest.class); |
| } |
| |
| } |