QPIDJMS-207 Add additional test coverage, update ConnectionMetaData
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionMetaData.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionMetaData.java
index 1fc940d..7fa79f6 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionMetaData.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionMetaData.java
@@ -40,7 +40,7 @@
      */
     @Override
     public String getJMSVersion() {
-        return "1.1";
+        return "2.0";
     }
 
     /**
@@ -50,7 +50,7 @@
      */
     @Override
     public int getJMSMajorVersion() {
-        return 1;
+        return 2;
     }
 
     /**
@@ -60,7 +60,7 @@
      */
     @Override
     public int getJMSMinorVersion() {
-        return 1;
+        return 0;
     }
 
     /**
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsConnectionFactoryTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsConnectionFactoryTest.java
index ea8c867..8184acb 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsConnectionFactoryTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsConnectionFactoryTest.java
@@ -36,6 +36,7 @@
 
 import javax.jms.Connection;
 import javax.jms.ExceptionListener;
+import javax.jms.JMSContext;
 import javax.jms.JMSException;
 
 import org.apache.qpid.jms.policy.JmsDefaultDeserializationPolicy;
@@ -756,4 +757,40 @@
 
         assertTrue(connection.getDeserializationPolicy() instanceof SerializationTestSupport.TestJmsDeserializationPolicy);
     }
+
+    @Test
+    public void testCreateContext() {
+        JmsConnectionFactory factory = new JmsConnectionFactory("mock://127.0.0.1:5672");
+
+        JMSContext context = factory.createContext();
+        assertNotNull(context);
+        assertEquals(JMSContext.AUTO_ACKNOWLEDGE, context.getSessionMode());
+    }
+
+    @Test
+    public void testCreateContextWithUserAndPassword() {
+        JmsConnectionFactory factory = new JmsConnectionFactory("mock://127.0.0.1:5672");
+
+        JMSContext context = factory.createContext(USER, PASSWORD);
+        assertNotNull(context);
+        assertEquals(JMSContext.AUTO_ACKNOWLEDGE, context.getSessionMode());
+    }
+
+    @Test
+    public void testCreateContextWithUserAndPasswordAndSessionMode() {
+        JmsConnectionFactory factory = new JmsConnectionFactory("mock://127.0.0.1:5672");
+
+        JMSContext context = factory.createContext(USER, PASSWORD, JMSContext.CLIENT_ACKNOWLEDGE);
+        assertNotNull(context);
+        assertEquals(JMSContext.CLIENT_ACKNOWLEDGE, context.getSessionMode());
+    }
+
+    @Test
+    public void testCreateContextWithSessionMode() {
+        JmsConnectionFactory factory = new JmsConnectionFactory("mock://127.0.0.1:5672");
+
+        JMSContext context = factory.createContext(JMSContext.CLIENT_ACKNOWLEDGE);
+        assertNotNull(context);
+        assertEquals(JMSContext.CLIENT_ACKNOWLEDGE, context.getSessionMode());
+    }
 }
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsConnectionTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsConnectionTest.java
index 329b541..412ee73 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsConnectionTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsConnectionTest.java
@@ -27,6 +27,7 @@
 import java.io.IOException;
 import java.net.URI;
 
+import javax.jms.ConnectionMetaData;
 import javax.jms.ExceptionListener;
 import javax.jms.IllegalStateException;
 import javax.jms.InvalidClientIDException;
@@ -36,6 +37,7 @@
 import javax.jms.TemporaryTopic;
 
 import org.apache.qpid.jms.policy.JmsDefaultPrefetchPolicy;
+import org.apache.qpid.jms.provider.ProviderConstants.ACK_TYPE;
 import org.apache.qpid.jms.provider.mock.MockProvider;
 import org.apache.qpid.jms.provider.mock.MockProviderFactory;
 import org.apache.qpid.jms.util.IdGenerator;
@@ -266,6 +268,35 @@
         }
     }
 
+    @Test(timeout=30000)
+    public void testConnectionCreatedSessionRespectsAcknowledgementMode() throws Exception {
+        connection = new JmsConnection("ID:TEST:1", provider, clientIdGenerator);
+        connection.start();
+
+        JmsSession session = (JmsSession) connection.createSession(Session.SESSION_TRANSACTED);
+        try {
+            session.acknowledge(ACK_TYPE.ACCEPTED);
+            fail("Should be in TX mode and not allow explicit ACK.");
+        } catch (IllegalStateException ise) {
+        }
+    }
+
+    @Test(timeout=30000)
+    public void testConnectionMetaData() throws Exception {
+        connection = new JmsConnection("ID:TEST:1", provider, clientIdGenerator);
+
+        ConnectionMetaData metaData = connection.getMetaData();
+
+        assertNotNull(metaData);
+        assertEquals(2, metaData.getJMSMajorVersion());
+        assertEquals(0, metaData.getJMSMinorVersion());
+        assertEquals("2.0", metaData.getJMSVersion());
+        assertNotNull(metaData.getJMSXPropertyNames());
+
+        assertNotNull(metaData.getProviderVersion());
+        assertNotNull(metaData.getJMSProviderName());
+    }
+
     //----- Currently these are unimplemented, these will fail after that ----//
 
     @Test(timeout=30000, expected=JMSException.class)
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java
index c16a0b7..9dee268 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java
@@ -17,8 +17,12 @@
 package org.apache.qpid.jms.consumer;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 
+import java.util.Enumeration;
+
+import javax.jms.Message;
 import javax.jms.Queue;
 import javax.jms.QueueBrowser;
 import javax.jms.Session;
@@ -59,4 +63,16 @@
         browser.close();
         browser.close();  // Should not throw on multiple close.
     }
+
+    @Test(timeout = 30000)
+    public void testHasMoreElementsOnClosedBrowser() throws Exception {
+        browser = session.createBrowser(queue);
+
+        @SuppressWarnings("unchecked")
+        Enumeration<Message> browse = browser.getEnumeration();
+
+        assertFalse(browse.hasMoreElements());
+        browser.close();
+        assertFalse(browse.hasMoreElements());
+    }
 }
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionTest.java
index c4f78d4..6cbc308 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionTest.java
@@ -284,7 +284,7 @@
         } catch (InvalidDestinationException idex) {}
     }
 
-    @Test//(timeout = 10000)
+    @Test(timeout = 10000)
     public void testCannotCreateConsumerOnDeletedTemporaryDestination() throws JMSException {
         JmsSession session = (JmsSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
         TemporaryQueue tempQueue = session.createTemporaryQueue();
@@ -303,4 +303,59 @@
             fail("Should not be able to send to this temporary destination");
         } catch (IllegalStateException ise) {}
     }
+
+    @Test(timeout = 10000)
+    public void testSessionRunFailsWhenSessionIsClosed() throws Exception {
+        JmsSession session = (JmsSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+        try {
+            session.run();
+            fail("Not implemented");
+        } catch (UnsupportedOperationException usoe) {}
+
+        session.close();
+
+        try {
+            session.run();
+            fail("Session is closed.");
+        } catch (RuntimeException re) {}
+    }
+
+    //----- Not yet implemented, should all be cleared on implementation -----//
+
+    @Test(timeout = 10000)
+    public void testCreateSharedConsumer() throws Exception {
+        JmsSession session = (JmsSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        try {
+            session.createSharedConsumer(session.createTopic("test"), "subscription");
+            fail("Should fail until implemented.");
+        } catch (JMSException ex) {}
+    }
+
+    @Test(timeout = 10000)
+    public void testCreateSharedConsumerWithSelector() throws Exception {
+        JmsSession session = (JmsSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        try {
+            session.createSharedConsumer(session.createTopic("test"), "subscription", "a = b");
+            fail("Should fail until implemented.");
+        } catch (JMSException ex) {}
+    }
+
+    @Test(timeout = 10000)
+    public void testCreateSharedDurableConsumer() throws Exception {
+        JmsSession session = (JmsSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        try {
+            session.createSharedDurableConsumer(session.createTopic("test"), "subscription");
+            fail("Should fail until implemented.");
+        } catch (JMSException ex) {}
+    }
+
+    @Test(timeout = 10000)
+    public void testCreateSharedDurableConsumerWithSelector() throws Exception {
+        JmsSession session = (JmsSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        try {
+            session.createSharedDurableConsumer(session.createTopic("test"), "subscription", "a = b");
+            fail("Should fail until implemented.");
+        } catch (JMSException ex) {}
+    }
 }