QPID-8074: [JMS AMQP 0-x][System Tests] Copy client specific test AMQPEncodedMapMessageTest from Broker-J sources
diff --git a/systests/src/test/java/org/apache/qpid/systest/message/AMQPEncodedMapMessageTest.java b/systests/src/test/java/org/apache/qpid/systest/message/AMQPEncodedMapMessageTest.java
new file mode 100644
index 0000000..5ab23ae
--- /dev/null
+++ b/systests/src/test/java/org/apache/qpid/systest/message/AMQPEncodedMapMessageTest.java
@@ -0,0 +1,280 @@
+/*
+ *
+ * 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.systest.message;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.jms.Connection;
+import javax.jms.JMSException;
+import javax.jms.MapMessage;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.qpid.client.message.AMQPEncodedMapMessage;
+import org.apache.qpid.client.message.AbstractJMSMessage;
+import org.apache.qpid.systest.core.JmsTestBase;
+
+
+public class AMQPEncodedMapMessageTest extends JmsTestBase
+{
+    private Connection _connection;
+    private Session _session;
+    private MessageConsumer _consumer;
+    private MessageProducer _producer;
+    private UUID myUUID = UUID.randomUUID();
+
+    @Before
+    public void setUp() throws Exception
+    {
+
+        //Create Connection
+        _connection = getConnection();
+
+        //Create Session
+        _session = _connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+        //Create Queue
+        String queueName = getTestQueueName();
+        Queue queue = _session.createQueue(queueName);
+
+        //Create Consumer
+        _consumer = _session.createConsumer(queue);
+
+        //Create Producer
+        _producer = _session.createProducer(queue);
+
+        _connection.start();
+    }
+
+    @After
+    public void tearDown() throws Exception
+    {
+        if (_connection != null)
+        {
+            _connection.close();
+        }
+    }
+
+    @Test
+    public void testEmptyMessage() throws JMSException
+    {
+        MapMessage m = _session.createMapMessage();
+        _producer.send(m);
+        AMQPEncodedMapMessage msg = (AMQPEncodedMapMessage)_consumer.receive(getReceiveTimeout());
+        assertNotNull("Message was not received on time",msg);
+        assertEquals("Message content-type is incorrect",
+                     AMQPEncodedMapMessage.MIME_TYPE,
+                     msg.getContentType());
+
+        assertEquals("Message content should be an empty map",
+                Collections.EMPTY_MAP,
+                msg.getMap());
+    }
+
+    @Test
+    public void testMessageWithContent() throws JMSException
+    {
+        MapMessage m = _session.createMapMessage();
+        m.setBoolean("Boolean", true);
+        m.setByte("Byte", (byte)5);
+        byte[] bytes = new byte[]{(byte)5,(byte)8};
+        m.setBytes("Bytes", bytes);
+        m.setChar("Char", 'X');
+        m.setDouble("Double", 56.84);
+        m.setFloat("Float", Integer.MAX_VALUE + 5000);
+        m.setInt("Int", Integer.MAX_VALUE - 5000);
+        m.setShort("Short", (short)58);
+        m.setString("String", "Hello");
+        m.setObject("uuid", myUUID);
+        _producer.send(m);
+
+        AMQPEncodedMapMessage msg = (AMQPEncodedMapMessage)_consumer.receive(getReceiveTimeout());
+        assertNotNull("Message was not received on time",msg);
+        assertEquals("Message content-type is incorrect",
+                     AMQPEncodedMapMessage.MIME_TYPE,
+                     ((AbstractJMSMessage)msg).getContentType());
+
+        assertEquals(true,m.getBoolean("Boolean"));
+        assertEquals((byte)5,m.getByte("Byte"));
+        byte[] bytesRcv = m.getBytes("Bytes");
+        assertNotNull("Byte array is null",bytesRcv);
+        assertEquals((byte)5,bytesRcv[0]);
+        assertEquals((byte)8,bytesRcv[1]);
+        assertEquals('X',m.getChar("Char"));
+        assertEquals(56.84,m.getDouble("Double"), 0.01);
+        //assertEquals(Integer.MAX_VALUE + 5000,m.getFloat("Float"));
+        assertEquals(Integer.MAX_VALUE - 5000,m.getInt("Int"));
+        assertEquals((short)58,m.getShort("Short"));
+        assertEquals("Hello",m.getString("String"));
+        assertEquals(myUUID,(UUID)m.getObject("uuid"));
+    }
+
+    @Test
+    public void testMessageWithListEntries() throws JMSException
+    {
+        MapMessage m = _session.createMapMessage();
+
+        List<Integer> myList = getList();
+
+        m.setObject("List", myList);
+
+        List<UUID> uuidList = new ArrayList<UUID>();
+        uuidList.add(myUUID);
+        m.setObject("uuid-list", uuidList);
+        _producer.send(m);
+
+        AMQPEncodedMapMessage msg = (AMQPEncodedMapMessage)_consumer.receive(getReceiveTimeout());
+        assertNotNull("Message was not received on time",msg);
+        assertEquals("Message content-type is incorrect",
+                     AMQPEncodedMapMessage.MIME_TYPE,
+                     msg.getContentType());
+        @SuppressWarnings("unchecked")
+        List<Integer> list = (List<Integer>)msg.getObject("List");
+        assertNotNull("List not received",list);
+        Collections.sort(list);
+        int i = 1;
+        for (Integer j: list)
+        {
+            assertEquals(i,j.intValue());
+            i++;
+        }
+
+        @SuppressWarnings("unchecked")
+        List<UUID> list2 = (List<UUID>)msg.getObject("uuid-list");
+        assertNotNull("UUID List not received",list2);
+        assertEquals(myUUID,list2.get(0));
+    }
+
+    @Test
+    public void testMessageWithMapEntries() throws JMSException
+    {
+        MapMessage m = _session.createMapMessage();
+
+        Map<String,String> myMap = getMap();
+        m.setObject("Map", myMap);
+
+        Map<String,UUID> uuidMap = new HashMap<String,UUID>();
+        uuidMap.put("uuid", myUUID);
+        m.setObject("uuid-map", uuidMap);
+
+        _producer.send(m);
+
+        AMQPEncodedMapMessage msg = (AMQPEncodedMapMessage)_consumer.receive(getReceiveTimeout());
+        assertNotNull("Message was not received on time",msg);
+        assertEquals("Message content-type is incorrect",
+                     AMQPEncodedMapMessage.MIME_TYPE,
+                     msg.getContentType());
+
+        @SuppressWarnings("unchecked")
+        Map<String,String> map = (Map<String,String>)msg.getObject("Map");
+        assertNotNull("Map not received",map);
+        for (int i=1; i <4; i++ )
+        {
+            assertEquals("String" + i,map.get("Key" + i));
+            i++;
+        }
+
+        @SuppressWarnings("unchecked")
+        Map<String,UUID> map2 = (Map<String,UUID>)msg.getObject("uuid-map");
+        assertNotNull("Map not received",map2);
+        assertEquals(myUUID,map2.get("uuid"));
+    }
+
+    @Test
+    public void testMessageWithNestedListsAndMaps() throws JMSException
+    {
+        MapMessage m = _session.createMapMessage();
+
+        Map<String,Object> myMap = new HashMap<String,Object>();
+        myMap.put("map", getMap());
+        myMap.put("list", getList());
+
+        m.setObject("Map", myMap);
+        _producer.send(m);
+
+        AMQPEncodedMapMessage msg = (AMQPEncodedMapMessage)_consumer.receive(getReceiveTimeout());
+        assertNotNull("Message was not received on time",msg);
+        assertEquals("Message content-type is incorrect",
+                     AMQPEncodedMapMessage.MIME_TYPE,
+                     ((AbstractJMSMessage)msg).getContentType());
+
+        @SuppressWarnings("unchecked")
+        Map<String,Object> mainMap = (Map<String,Object>)msg.getObject("Map");
+        assertNotNull("Main Map not received",mainMap);
+
+        @SuppressWarnings("unchecked")
+        Map<String,String> map = (Map<String,String>)mainMap.get("map");
+        assertNotNull("Nested Map not received",map);
+        for (int i=1; i <4; i++ )
+        {
+            assertEquals("String" + i,map.get("Key" + i));
+            i++;
+        }
+
+        @SuppressWarnings("unchecked")
+        List<Integer> list = (List<Integer>)mainMap.get("list");
+        assertNotNull("Nested List not received",list);
+        Collections.sort(list);
+
+        int i = 1;
+        for (Integer j: list)
+        {
+            assertEquals(i,j.intValue());
+            i++;
+        }
+    }
+
+    private List<Integer> getList()
+    {
+        List<Integer> myList = new ArrayList<>();
+        myList.add(1);
+        myList.add(2);
+        myList.add(3);
+
+        return myList;
+    }
+
+    private Map<String,String> getMap()
+    {
+        Map<String,String> myMap = new HashMap<>();
+        myMap.put("Key1","String1");
+        myMap.put("Key2","String2");
+        myMap.put("Key3","String3");
+
+        return myMap;
+    }
+
+}