You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by fa...@apache.org on 2014/09/06 13:23:14 UTC

svn commit: r1622849 [9/9] - in /qpid/proton/branches/fadams-javascript-binding: ./ contrib/ contrib/proton-hawtdispatch/ contrib/proton-hawtdispatch/src/ contrib/proton-hawtdispatch/src/main/ contrib/proton-hawtdispatch/src/main/java/ contrib/proton-h...

Modified: qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/engine.py
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/engine.py?rev=1622849&r1=1622848&r2=1622849&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/engine.py (original)
+++ qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/engine.py Sat Sep  6 11:23:10 2014
@@ -389,7 +389,7 @@ class LinkTest(Test):
   def teardown(self):
     self.cleanup()
     gc.collect()
-    assert not gc.garbage
+    assert not gc.garbage, gc.garbage
 
   def test_open_close(self):
     assert self.snd.state == Endpoint.LOCAL_UNINIT | Endpoint.REMOTE_UNINIT
@@ -1081,11 +1081,9 @@ class IdleTimeoutTest(Test):
     # now expire sndr
     clock = 1.499
     t_snd.tick(clock)
-    try:
-      self.pump()
-      assert False, "Expected connection timeout did not happen!"
-    except TransportException:
-      pass
+    self.pump()
+    assert self.c2.state & Endpoint.REMOTE_CLOSED
+    assert self.c2.remote_condition.name == "amqp:resource-limit-exceeded"
 
 class CreditTest(Test):
 
@@ -2069,51 +2067,66 @@ class DeliveryTest(Test):
   def testCustom(self):
     self.testDisposition(type=0x12345, value=CustomValue([1, 2, 3]))
 
-class EventTest(Test):
+class CollectorTest(Test):
 
-  def teardown(self):
-    self.cleanup()
+  def setup(self):
+    self.collector = Collector()
 
-  def list(self, collector):
+  def drain(self):
     result = []
     while True:
-      e = collector.peek()
+      e = self.collector.peek()
       if e:
         result.append(e)
-        collector.pop()
+        self.collector.pop()
       else:
         break
     return result
 
-  def expect(self, collector, *types):
-    events = self.list(collector)
-    assert types == tuple([e.type for e in events]), (types, events)
-    if len(events) == 1:
-      return events[0]
-    elif len(events) > 1:
-      return events
+  def expect(self, *types):
+    return self.expect_oneof(types)
+
+  def expect_oneof(self, *sequences):
+    events = self.drain()
+    types = tuple([e.type for e in events])
+
+    for alternative in sequences:
+      if types == alternative:
+        if len(events) == 1:
+          return events[0]
+        elif len(events) > 1:
+          return events
+        else:
+          return
+
+    assert False, "actual events %s did not match any of the expected sequences: %s" % (events, sequences)
+
+class EventTest(CollectorTest):
+
+  def teardown(self):
+    self.cleanup()
 
   def testEndpointEvents(self):
     c1, c2 = self.connection()
-    coll = Collector()
-    c1.collect(coll)
-    self.expect(coll)
+    c1.collect(self.collector)
+    self.expect(Event.CONNECTION_INIT)
     self.pump()
-    self.expect(coll)
+    self.expect()
     c2.open()
     self.pump()
-    self.expect(coll, Event.CONNECTION_REMOTE_STATE)
+    self.expect(Event.CONNECTION_REMOTE_OPEN)
     self.pump()
-    self.expect(coll)
+    self.expect()
 
     ssn = c2.session()
     snd = ssn.sender("sender")
     ssn.open()
     snd.open()
 
-    self.expect(coll)
+    self.expect()
     self.pump()
-    self.expect(coll, Event.SESSION_REMOTE_STATE, Event.LINK_REMOTE_STATE)
+    self.expect(Event.SESSION_INIT, Event.SESSION_REMOTE_OPEN,
+                Event.LINK_INIT, Event.LINK_REMOTE_OPEN)
 
     c1.open()
     ssn2 = c1.session()
@@ -2121,61 +2134,188 @@ class EventTest(Test):
     rcv = ssn2.receiver("receiver")
     rcv.open()
     self.pump()
-    self.expect(coll,
-                Event.CONNECTION_LOCAL_STATE,
-                Event.TRANSPORT,
-                Event.SESSION_LOCAL_STATE,
-                Event.TRANSPORT,
-                Event.LINK_LOCAL_STATE,
+    self.expect(Event.CONNECTION_OPEN, Event.TRANSPORT,
+                Event.SESSION_INIT, Event.SESSION_OPEN,
+                Event.TRANSPORT, Event.LINK_INIT, Event.LINK_OPEN,
                 Event.TRANSPORT)
 
+    rcv.close()
+    self.expect(Event.LINK_CLOSE, Event.TRANSPORT)
+    self.pump()
+    rcv.free()
+    del rcv
+    self.expect(Event.LINK_FINAL)
+    ssn2.free()
+    del ssn2
+    self.pump()
+    c1.free()
+    c1._transport.unbind()
+    self.expect(Event.SESSION_FINAL, Event.LINK_FINAL, Event.SESSION_FINAL,
+                Event.CONNECTION_FINAL)
+
+  def testConnectionINIT_FINAL(self):
+    c = Connection()
+    c.collect(self.collector)
+    self.expect(Event.CONNECTION_INIT)
+    c.free()
+    self.expect(Event.CONNECTION_FINAL)
+
+  def testSessionINIT_FINAL(self):
+    c = Connection()
+    c.collect(self.collector)
+    self.expect(Event.CONNECTION_INIT)
+    s = c.session()
+    self.expect(Event.SESSION_INIT)
+    s.free()
+    self.expect(Event.SESSION_FINAL)
+    c.free()
+    self.expect(Event.CONNECTION_FINAL)
+
+  def testLinkINIT_FINAL(self):
+    c = Connection()
+    c.collect(self.collector)
+    self.expect(Event.CONNECTION_INIT)
+    s = c.session()
+    self.expect(Event.SESSION_INIT)
+    r = s.receiver("asdf")
+    self.expect(Event.LINK_INIT)
+    r.free()
+    self.expect(Event.LINK_FINAL)
+    c.free()
+    self.expect(Event.SESSION_FINAL, Event.CONNECTION_FINAL)
+
   def testFlowEvents(self):
     snd, rcv = self.link("test-link")
-    coll = Collector()
-    snd.session.connection.collect(coll)
+    snd.session.connection.collect(self.collector)
     rcv.open()
     rcv.flow(10)
     self.pump()
-    self.expect(coll, Event.LINK_REMOTE_STATE, Event.LINK_FLOW)
+    self.expect(Event.CONNECTION_INIT, Event.SESSION_INIT,
+                Event.LINK_INIT, Event.LINK_REMOTE_OPEN, Event.LINK_FLOW)
     rcv.flow(10)
     self.pump()
-    self.expect(coll, Event.LINK_FLOW)
-    return snd, rcv, coll
+    self.expect(Event.LINK_FLOW)
+    return snd, rcv
 
   def testDeliveryEvents(self):
     snd, rcv = self.link("test-link")
-    coll = Collector()
-    rcv.session.connection.collect(coll)
+    rcv.session.connection.collect(self.collector)
     rcv.open()
     rcv.flow(10)
     self.pump()
-    self.expect(coll, Event.LINK_LOCAL_STATE, Event.TRANSPORT, Event.TRANSPORT)
+    self.expect(Event.CONNECTION_INIT, Event.SESSION_INIT,
+                Event.LINK_INIT, Event.LINK_OPEN, Event.TRANSPORT)
     snd.delivery("delivery")
     snd.send("Hello World!")
     snd.advance()
     self.pump()
-    self.expect(coll)
+    self.expect()
     snd.open()
     self.pump()
-    self.expect(coll, Event.LINK_REMOTE_STATE, Event.DELIVERY)
+    self.expect(Event.LINK_REMOTE_OPEN, Event.DELIVERY)
+    rcv.session.connection._transport.unbind()
+    rcv.session.connection.free()
+    self.expect(Event.TRANSPORT, Event.LINK_FINAL, Event.SESSION_FINAL,
+                Event.CONNECTION_FINAL)
 
   def testDeliveryEventsDisp(self):
-    snd, rcv, coll = self.testFlowEvents()
+    snd, rcv = self.testFlowEvents()
     snd.open()
     dlv = snd.delivery("delivery")
     snd.send("Hello World!")
     assert snd.advance()
-    self.expect(coll,
-                Event.LINK_LOCAL_STATE,
-                Event.TRANSPORT,
-                Event.TRANSPORT,
-                Event.TRANSPORT)
+    self.expect(Event.LINK_OPEN, Event.TRANSPORT)
     self.pump()
-    self.expect(coll)
+    self.expect(Event.LINK_FLOW)
     rdlv = rcv.current
     assert rdlv != None
     assert rdlv.tag == "delivery"
     rdlv.update(Delivery.ACCEPTED)
     self.pump()
-    event = self.expect(coll, Event.DELIVERY)
+    event = self.expect(Event.DELIVERY)
     assert event.delivery == dlv
+
+class PeerTest(CollectorTest):
+
+  def setup(self):
+    CollectorTest.setup(self)
+    self.connection = Connection()
+    self.connection.collect(self.collector)
+    self.transport = Transport()
+    self.transport.bind(self.connection)
+    self.peer = Connection()
+    self.peer_transport = Transport()
+    self.peer_transport.bind(self.peer)
+    self.peer_transport.trace(Transport.TRACE_OFF)
+
+  def pump(self):
+    pump(self.transport, self.peer_transport)
+
+class TeardownLeakTest(PeerTest):
+
+  def doLeak(self, local, remote):
+    self.connection.open()
+    self.expect(Event.CONNECTION_INIT, Event.CONNECTION_OPEN, Event.TRANSPORT)
+
+    ssn = self.connection.session()
+    ssn.open()
+    self.expect(Event.SESSION_INIT, Event.SESSION_OPEN, Event.TRANSPORT)
+
+    snd = ssn.sender("sender")
+    snd.open()
+    self.expect(Event.LINK_INIT, Event.LINK_OPEN, Event.TRANSPORT)
+
+
+    self.pump()
+
+    self.peer.open()
+    self.peer.session_head(0).open()
+    self.peer.link_head(0).open()
+
+    self.pump()
+    self.expect_oneof((Event.CONNECTION_REMOTE_OPEN, Event.SESSION_REMOTE_OPEN,
+                       Event.LINK_REMOTE_OPEN, Event.LINK_FLOW),
+                      (Event.CONNECTION_REMOTE_OPEN, Event.SESSION_REMOTE_OPEN,
+                       Event.LINK_REMOTE_OPEN))
+
+    if local:
+      snd.close() # ha!!
+      self.expect(Event.LINK_CLOSE, Event.TRANSPORT)
+    ssn.close()
+    self.expect(Event.SESSION_CLOSE, Event.TRANSPORT)
+    self.connection.close()
+    self.expect(Event.CONNECTION_CLOSE, Event.TRANSPORT)
+
+    if remote:
+      self.peer.link_head(0).close() # ha!!
+    self.peer.session_head(0).close()
+    self.peer.close()
+
+    self.pump()
+
+    if remote:
+      self.expect_oneof((Event.LINK_REMOTE_CLOSE, Event.SESSION_REMOTE_CLOSE,
+                         Event.CONNECTION_REMOTE_CLOSE),
+                        (Event.LINK_REMOTE_CLOSE, Event.LINK_FINAL,
+                         Event.SESSION_REMOTE_CLOSE,
+                         Event.CONNECTION_REMOTE_CLOSE))
+    else:
+      self.expect(Event.SESSION_REMOTE_CLOSE, Event.CONNECTION_REMOTE_CLOSE)
+
+    self.connection.free()
+    self.transport.unbind()
+
+    self.expect_oneof((Event.LINK_FINAL, Event.SESSION_FINAL, Event.CONNECTION_FINAL),
+                      (Event.SESSION_FINAL, Event.CONNECTION_FINAL))
+
+  def testLocalRemoteLeak(self):
+    self.doLeak(True, True)
+
+  def testLocalLeak(self):
+    self.doLeak(True, False)
+
+  def testRemoteLeak(self):
+    self.doLeak(False, True)
+
+  def testLeak(self):
+    self.doLeak(False, False)

Modified: qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/messenger.py
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/messenger.py?rev=1622849&r1=1622848&r2=1622849&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/messenger.py (original)
+++ qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/messenger.py Sat Sep  6 11:23:10 2014
@@ -124,10 +124,13 @@ class MessengerTest(Test):
       self.server.put(msg)
       self.server.settle()
 
-  def testSendReceive(self, size=None):
+  def testSendReceive(self, size=None, address_size=None):
     self.start()
     msg = Message()
-    msg.address="amqp://0.0.0.0:12345"
+    if address_size:
+      msg.address="amqp://0.0.0.0:12345/%s" % ("x"*address_size)
+    else:
+      msg.address="amqp://0.0.0.0:12345"
     msg.reply_to = "~"
     msg.subject="Hello World!"
     body = "First the world, then the galaxy!"
@@ -166,6 +169,9 @@ class MessengerTest(Test):
   def testSendReceive1M(self):
     self.testSendReceive(1024*1024)
 
+  def testSendReceiveLargeAddress(self):
+    self.testSendReceive(address_size=2048)
+
   # PROTON-285 - prevent continually failing test
   def xtestSendBogus(self):
     self.start()
@@ -689,26 +695,37 @@ class NBMessengerTest(common.Test):
 
   def setup(self):
     self.client = Messenger("client")
+    self.client2 = Messenger("client2")
     self.server = Messenger("server")
+    self.messengers = [self.client, self.client2, self.server]
     self.client.blocking = False
+    self.client2.blocking = False
     self.server.blocking = False
     self.server.start()
     self.client.start()
+    self.client2.start()
     self.address = "amqp://0.0.0.0:12345"
     self.server.subscribe("amqp://~0.0.0.0:12345")
 
+  def _pump(self, timeout, work_triggers_exit):
+    for msgr in self.messengers:
+      if msgr.work(timeout) and work_triggers_exit:
+        return True
+    return False
+
   def pump(self, timeout=0):
-    while self.client.work(0) or self.server.work(0): pass
-    self.client.work(timeout)
-    self.server.work(timeout)
-    while self.client.work(0) or self.server.work(0): pass
+    while self._pump(0, True): pass
+    self._pump(timeout, False)
+    while self._pump(0, True): pass
 
   def teardown(self):
     self.server.stop()
     self.client.stop()
+    self.client2.stop()
     self.pump()
     assert self.server.stopped
     assert self.client.stopped
+    assert self.client2.stopped
 
   def testSmoke(self, count=1):
     self.server.recv()
@@ -842,16 +859,10 @@ class NBMessengerTest(common.Test):
     assert self.server.receiving == 8, self.server.receiving
 
     # and none for this new client
-    client2 = Messenger("client2")
-    client2.blocking = False
-    client2.start()
     msg3 = Message()
     msg3.address = self.address + "/msg3"
-    client2.put(msg3)
-    while client2.work(0):
-        self.pump()
-    assert self.server.incoming == 1, self.server.incoming
-    assert self.server.receiving == 8, self.server.receiving
+    self.client2.put(msg3)
+    self.pump()
 
     # eventually, credit will rebalance and all links will
     # send a message
@@ -859,7 +870,6 @@ class NBMessengerTest(common.Test):
     while time() < deadline:
         sleep(.1)
         self.pump()
-        client2.work(0)
         if self.server.incoming == 3:
             break;
     assert self.server.incoming == 3, self.server.incoming
@@ -867,7 +877,7 @@ class NBMessengerTest(common.Test):
 
     # now tear down client two, this should cause its outstanding credit to be
     # made available to the other links
-    client2.stop()
+    self.client2.stop()
     self.pump()
 
     for i in range(4):
@@ -1017,3 +1027,59 @@ class SelectableMessengerTest(common.Tes
 
   def testSelectable4096(self):
     self.testSelectable(count=4096)
+
+
+class IdleTimeoutTest(common.Test):
+
+  def testIdleTimeout(self):
+    """
+    Verify that a Messenger connection is kept alive using empty idle frames
+    when a idle_timeout is advertised by the remote peer.
+    """
+    if "java" in sys.platform:
+      raise Skipped()
+    idle_timeout_secs = self.delay
+
+    try:
+      idle_server = common.TestServerDrain(idle_timeout=idle_timeout_secs)
+      idle_server.timeout = self.timeout
+      idle_server.start()
+
+      idle_client = Messenger("idle_client")
+      idle_client.timeout = self.timeout
+      idle_client.start()
+
+      idle_client.subscribe("amqp://%s:%s/foo" %
+                            (idle_server.host, idle_server.port))
+      idle_client.work(idle_timeout_secs/10)
+
+      # wait up to 3x the idle timeout and hence verify that everything stays
+      # connected during that time by virtue of no Exception being raised
+      duration = 3 * idle_timeout_secs
+      deadline = time() + duration
+      while time() <= deadline:
+        idle_client.work(idle_timeout_secs/10)
+        continue
+
+      # confirm link is still active
+      cxtr = idle_server.driver.head_connector()
+      assert not cxtr.closed, "Connector has unexpectedly been closed"
+      conn = cxtr.connection
+      assert conn.state == (Endpoint.LOCAL_ACTIVE
+                            | Endpoint.REMOTE_ACTIVE
+                            ), "Connection has unexpectedly terminated"
+      link = conn.link_head(0)
+      while link:
+        assert link.state != (Endpoint.REMOTE_CLOSED
+                              ), "Link unexpectedly closed"
+        link = link.next(0)
+
+    finally:
+      try:
+        idle_client.stop()
+      except:
+        pass
+      try:
+        idle_server.stop()
+      except:
+        pass

Modified: qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/sasl.py
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/sasl.py?rev=1622849&r1=1622848&r2=1622849&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/sasl.py (original)
+++ qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/sasl.py Sat Sep  6 11:23:10 2014
@@ -45,16 +45,16 @@ class SaslTest(Test):
     self.s2.server()
     self.s2.done(SASL.OK)
 
-    out1 = self.t1.output(1024)
-    out2 = self.t2.output(1024)
+    out1 = self.t1.peek(1024)
+    self.t1.pop(len(out1))
+    out2 = self.t2.peek(1024)
+    self.t2.pop(len(out2))
 
-    n = self.t2.input(out1)
-    assert n == len(out1), (n, out1)
+    self.t2.push(out1)
 
     assert self.s1.outcome is None
 
-    n = self.t1.input(out2)
-    assert n == len(out2), (n, out2)
+    self.t1.push(out2)
 
     assert self.s2.outcome == SASL.OK
 
@@ -67,8 +67,9 @@ class SaslTest(Test):
     self.s2.done(SASL.OK)
 
     # send the server's OK to the client
-    out2 = self.t2.output(1024)
-    self.t1.input(out2)
+    out2 = self.t2.peek(1024)
+    self.t2.pop(len(out2))
+    self.t1.push(out2)
 
     # do some work to generate AMQP data
     c1 = Connection()
@@ -84,15 +85,17 @@ class SaslTest(Test):
     out1_sasl_and_amqp = ""
     t1_still_producing = True
     while t1_still_producing:
-      out1 = self.t1.output(1024)
+      out1 = self.t1.peek(1024)
+      self.t1.pop(len(out1))
       out1_sasl_and_amqp += out1
       t1_still_producing = out1
 
     t2_still_consuming = True
     while t2_still_consuming:
-      num_consumed = self.t2.input(out1_sasl_and_amqp)
-      out1_sasl_and_amqp = out1_sasl_and_amqp[num_consumed:]
-      t2_still_consuming = num_consumed > 0 and len(out1_sasl_and_amqp) > 0
+      num = min(self.t2.capacity(), len(out1_sasl_and_amqp))
+      self.t2.push(out1_sasl_and_amqp[:num])
+      out1_sasl_and_amqp = out1_sasl_and_amqp[num:]
+      t2_still_consuming = num > 0 and len(out1_sasl_and_amqp) > 0
 
     assert len(out1_sasl_and_amqp) == 0, (len(out1_sasl_and_amqp), out1_sasl_and_amqp)
 
@@ -129,9 +132,9 @@ class SaslTest(Test):
     self.s1.mechanisms("ANONYMOUS")
     self.s1.client()
 
-    out1 = self.t1.output(1024)
-    n = self.t2.input(out1)
-    assert n == len(out1)
+    out1 = self.t1.peek(1024)
+    self.t1.pop(len(out1))
+    self.t2.push(out1)
 
     self.s2.mechanisms("ANONYMOUS")
     self.s2.server()
@@ -140,11 +143,11 @@ class SaslTest(Test):
     c2.open()
     self.t2.bind(c2)
 
-    out2 = self.t2.output(1024)
-    n = self.t1.input(out2)
-    assert n == len(out2)
+    out2 = self.t2.peek(1024)
+    self.t2.pop(len(out2))
+    self.t1.push(out2)
 
-    out1 = self.t1.output(1024)
+    out1 = self.t1.peek(1024)
     assert len(out1) > 0
 
   def testFracturedSASL(self):
@@ -156,17 +159,23 @@ class SaslTest(Test):
 
     # self.t1.trace(Transport.TRACE_FRM)
 
-    out = self.t1.output(1024)
-    self.t1.input("AMQP\x03\x01\x00\x00")
-    out = self.t1.output(1024)
-    self.t1.input("\x00\x00\x00")
-    out = self.t1.output(1024)
-    self.t1.input("A\x02\x01\x00\x00\x00S@\xc04\x01\xe01\x06\xa3\x06GSSAPI\x05PLAIN\x0aDIGEST-MD5\x08AMQPLAIN\x08CRAM-MD5\x04NTLM")
-    out = self.t1.output(1024)
-    self.t1.input("\x00\x00\x00\x10\x02\x01\x00\x00\x00SD\xc0\x03\x01P\x00")
-    out = self.t1.output(1024)
+    out = self.t1.peek(1024)
+    self.t1.pop(len(out))
+    self.t1.push("AMQP\x03\x01\x00\x00")
+    out = self.t1.peek(1024)
+    self.t1.pop(len(out))
+    self.t1.push("\x00\x00\x00")
+    out = self.t1.peek(1024)
+    self.t1.pop(len(out))
+    self.t1.push("A\x02\x01\x00\x00\x00S@\xc04\x01\xe01\x06\xa3\x06GSSAPI\x05PLAIN\x0aDIGEST-MD5\x08AMQPLAIN\x08CRAM-MD5\x04NTLM")
+    out = self.t1.peek(1024)
+    self.t1.pop(len(out))
+    self.t1.push("\x00\x00\x00\x10\x02\x01\x00\x00\x00SD\xc0\x03\x01P\x00")
+    out = self.t1.peek(1024)
+    self.t1.pop(len(out))
     while out:
-      out = self.t1.output(1024)
+      out = self.t1.peek(1024)
+      self.t1.pop(len(out))
 
     assert self.s1.outcome == SASL.OK, self.s1.outcome
 
@@ -182,3 +191,13 @@ class SaslTest(Test):
       sasl1 = transport.sasl()
       sasl2 = SASL(transport)
       assert sasl1 is sasl2
+
+  def testSaslSkipped(self):
+    """Verify that the server (with SASL) correctly handles a client without SASL"""
+    self.t1 = Transport()
+    self.s2.mechanisms("ANONYMOUS")
+    self.s2.server()
+    self.s2.allow_skip(True)
+    self.pump()
+    assert self.s2.outcome == SASL.SKIPPED
+

Modified: qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/ssl.py
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/ssl.py?rev=1622849&r1=1622848&r2=1622849&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/ssl.py (original)
+++ qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/ssl.py Sat Sep  6 11:23:10 2014
@@ -73,6 +73,8 @@ class SslTest(common.Test):
         client.connection.open()
         server.connection.open()
         self._pump(client, server)
+        if client.transport.closed:
+            return
         assert client.ssl.protocol_name() is not None
         client.connection.close()
         server.connection.close()
@@ -214,11 +216,11 @@ class SslTest(common.Test):
 
         client.connection.open()
         server.connection.open()
-        try:
-            self._pump( client, server )
-            assert False, "Server failed to reject bad certificate."
-        except TransportException, e:
-            pass
+        self._pump( client, server )
+        assert client.transport.closed
+        assert server.transport.closed
+        assert client.connection.state & Endpoint.REMOTE_UNINIT
+        assert server.connection.state & Endpoint.REMOTE_UNINIT
 
     def test_client_authentication_fail_no_cert(self):
         """ Ensure that the server will fail a client that does not provide a
@@ -239,11 +241,11 @@ class SslTest(common.Test):
 
         client.connection.open()
         server.connection.open()
-        try:
-            self._pump( client, server )
-            assert False, "Server failed to reject bad certificate."
-        except TransportException, e:
-            pass
+        self._pump( client, server )
+        assert client.transport.closed
+        assert server.transport.closed
+        assert client.connection.state & Endpoint.REMOTE_UNINIT
+        assert server.connection.state & Endpoint.REMOTE_UNINIT
 
     def test_client_server_authentication(self):
         """ Require both client and server to mutually identify themselves.
@@ -314,11 +316,11 @@ class SslTest(common.Test):
 
         client.connection.open()
         server.connection.open()
-        try:
-            self._pump( client, server )
-            assert False, "Client failed to reject bad certificate."
-        except TransportException, e:
-            pass
+        self._pump( client, server )
+        assert client.transport.closed
+        assert server.transport.closed
+        assert client.connection.state & Endpoint.REMOTE_UNINIT
+        assert server.connection.state & Endpoint.REMOTE_UNINIT
 
         del server
         del client
@@ -409,11 +411,11 @@ class SslTest(common.Test):
 
         client.connection.open()
         server.connection.open()
-        try:
-            self._pump( client, server )
-            assert False, "Server did not reject client as expected."
-        except TransportException:
-            pass
+        self._pump( client, server )
+        assert client.transport.closed
+        assert server.transport.closed
+        assert client.connection.state & Endpoint.REMOTE_UNINIT
+        assert server.connection.state & Endpoint.REMOTE_UNINIT
 
     def test_session_resume(self):
         """ Test resume of client session.
@@ -563,11 +565,11 @@ class SslTest(common.Test):
         client = SslTest.SslTestConnection( self.client_domain )
 
         client.ssl.peer_hostname = "A1.Good.Server.domain.comX"
-        try:
-            self._do_handshake( client, server )
-            assert False, "Expected connection to fail due to hostname mismatch"
-        except TransportException:
-            pass
+        self._do_handshake( client, server )
+        assert client.transport.closed
+        assert server.transport.closed
+        assert client.connection.state & Endpoint.REMOTE_UNINIT
+        assert server.connection.state & Endpoint.REMOTE_UNINIT
         del server
         del client
         self.teardown()
@@ -659,11 +661,11 @@ class SslTest(common.Test):
         client = SslTest.SslTestConnection( self.client_domain )
 
         client.ssl.peer_hostname = "FOO.PREfi.domain.com"
-        try:
-            self._do_handshake( client, server )
-            assert False, "Expected connection to fail due to hostname mismatch"
-        except TransportException:
-            pass
+        self._do_handshake( client, server )
+        assert client.transport.closed
+        assert server.transport.closed
+        assert client.connection.state & Endpoint.REMOTE_UNINIT
+        assert server.connection.state & Endpoint.REMOTE_UNINIT
         del server
         del client
         self.teardown()
@@ -680,11 +682,11 @@ class SslTest(common.Test):
         client = SslTest.SslTestConnection( self.client_domain )
 
         client.ssl.peer_hostname = "PREfix.domain.COM"
-        try:
-            self._do_handshake( client, server )
-            assert False, "Expected connection to fail due to hostname mismatch"
-        except TransportException:
-            pass
+        self._do_handshake( client, server )
+        assert client.transport.closed
+        assert server.transport.closed
+        assert client.connection.state & Endpoint.REMOTE_UNINIT
+        assert server.connection.state & Endpoint.REMOTE_UNINIT
         self.teardown()
 
 

Modified: qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/transport.py
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/transport.py?rev=1622849&r1=1622848&r2=1622849&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/transport.py (original)
+++ qpid/proton/branches/fadams-javascript-binding/tests/python/proton_tests/transport.py Sat Sep  6 11:23:10 2014
@@ -27,37 +27,53 @@ class TransportTest(Test):
 
   def setup(self):
     self.transport = Transport()
+    self.peer = Transport()
+    self.conn = Connection()
+    self.peer.bind(self.conn)
 
   def teardown(self):
     self.transport = None
+    self.peer = None
+    self.conn = None
+
+  def drain(self):
+    while True:
+      p = self.transport.pending()
+      if p < 0:
+        return
+      elif p > 0:
+        bytes = self.transport.peek(p)
+        self.peer.push(bytes)
+        self.transport.pop(len(bytes))
+      else:
+        assert False
+
+  def assert_error(self, name):
+    assert self.conn.remote_container is None, self.conn.remote_container
+    self.drain()
+    # verify that we received an open frame
+    assert self.conn.remote_container is not None, self.conn.remote_container
+    # verify that we received a close frame
+    assert self.conn.state == Endpoint.LOCAL_UNINIT | Endpoint.REMOTE_CLOSED, self.conn.state
+    # verify that a framing error was reported
+    assert self.conn.remote_condition.name == name, self.conn.remote_condition
 
   def testEOS(self):
-    try:
-      n = self.transport.input("")
-      assert False, n
-    except TransportException:
-      pass
+    self.transport.push("") # should be a noop
+    self.transport.close_tail() # should result in framing error
+    self.assert_error(u'amqp:connection:framing-error')
 
   def testPartial(self):
-    n = self.transport.input("AMQ")
-    assert n == 3, n
-    try:
-      n = self.transport.input("")
-      assert False, n
-    except TransportException:
-      pass
+    self.transport.push("AMQ") # partial header
+    self.transport.close_tail() # should result in framing error
+    self.assert_error(u'amqp:connection:framing-error')
 
   def testGarbage(self, garbage="GARBAGE_"):
-    try:
-      n = self.transport.input(garbage)
-      assert False, n
-    except TransportException, e:
-      assert "AMQP header mismatch" in str(e), str(e)
-    try:
-      n = self.transport.input("")
-      assert False, n
-    except TransportException, e:
-      pass
+    self.transport.push(garbage)
+    self.assert_error(u'amqp:connection:framing-error')
+    assert self.transport.pending() < 0
+    self.transport.close_tail()
+    assert self.transport.pending() < 0
 
   def testSmallGarbage(self):
     self.testGarbage("XXX")
@@ -66,16 +82,12 @@ class TransportTest(Test):
     self.testGarbage("GARBAGE_XXX")
 
   def testHeader(self):
-    n = self.transport.input("AMQP\x00\x01\x00\x00")
-    assert n == 8, n
-    try:
-      n = self.transport.input("")
-      assert False, n
-    except TransportException, e:
-      assert "connection aborted" in str(e)
+    self.transport.push("AMQP\x00\x01\x00\x00")
+    self.transport.close_tail()
+    self.assert_error(u'amqp:connection:framing-error')
 
-  def testOutput(self):
-    out = self.transport.output(1024)
+  def testPeek(self):
+    out = self.transport.peek(1024)
     assert out is not None
 
   def testBindAfterOpen(self):
@@ -87,16 +99,10 @@ class TransportTest(Test):
     conn.hostname = "test-hostname"
     trn = Transport()
     trn.bind(conn)
-    out = trn.output(1024)
+    out = trn.peek(1024)
     assert "test-container" in out, repr(out)
     assert "test-hostname" in out, repr(out)
-    n = self.transport.input(out)
-    assert n > 0, n
-    out = out[n:]
-
-    if out:
-      n = self.transport.input(out)
-      assert n == 0
+    self.transport.push(out)
 
     c = Connection()
     assert c.remote_container == None
@@ -105,10 +111,6 @@ class TransportTest(Test):
     self.transport.bind(c)
     assert c.remote_container == "test-container"
     assert c.remote_hostname == "test-hostname"
-    if out:
-      assert c.session_head(0) == None
-      n = self.transport.input(out)
-      assert n == len(out), (n, out)
     assert c.session_head(0) != None
 
   def testCloseHead(self):
@@ -130,3 +132,32 @@ class TransportTest(Test):
       assert "aborted" in str(e), str(e)
     n = self.transport.capacity()
     assert n < 0, n
+
+  def testUnpairedPop(self):
+    conn = Connection()
+    self.transport.bind(conn)
+
+    conn.hostname = "hostname"
+    conn.open()
+
+    dat1 = self.transport.peek(1024)
+
+    ssn = conn.session()
+    ssn.open()
+
+    dat2 = self.transport.peek(1024)
+
+    assert dat2[:len(dat1)] == dat1
+
+    snd = ssn.sender("sender")
+    snd.open()
+
+    self.transport.pop(len(dat1))
+    self.transport.pop(len(dat2) - len(dat1))
+    dat3 = self.transport.peek(1024)
+    self.transport.pop(len(dat3))
+    assert self.transport.peek(1024) == ""
+
+    self.peer.push(dat1)
+    self.peer.push(dat2[len(dat1):])
+    self.peer.push(dat3)

Modified: qpid/proton/branches/fadams-javascript-binding/tests/tools/apps/c/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/tests/tools/apps/c/CMakeLists.txt?rev=1622849&r1=1622848&r2=1622849&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/tests/tools/apps/c/CMakeLists.txt (original)
+++ qpid/proton/branches/fadams-javascript-binding/tests/tools/apps/c/CMakeLists.txt Sat Sep  6 11:23:10 2014
@@ -19,6 +19,8 @@
 
 include(CheckIncludeFiles)
 
+include_directories(${CMAKE_SOURCE_DIR}/examples/include)
+
 CHECK_INCLUDE_FILES("inttypes.h" INTTYPES_AVAILABLE)
 if (INTTYPES_AVAILABLE)
   list(APPEND PLATFORM_DEFINITIONS "USE_INTTYPES")

Modified: qpid/proton/branches/fadams-javascript-binding/tests/tools/apps/c/msgr-common.h
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/tests/tools/apps/c/msgr-common.h?rev=1622849&r1=1622848&r2=1622849&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/tests/tools/apps/c/msgr-common.h (original)
+++ qpid/proton/branches/fadams-javascript-binding/tests/tools/apps/c/msgr-common.h Sat Sep  6 11:23:10 2014
@@ -28,9 +28,13 @@
 #endif
 
 #ifdef _MSC_VER
+#if !defined(PRIu64)
 #define PRIu64 "I64u"
+#endif
+#if !defined(SCNu64)
 #define SCNu64 "I64u"
 #endif
+#endif
 
 /* If still not defined, best guess */
 #if !defined(SCNu64)

Modified: qpid/proton/branches/fadams-javascript-binding/version.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/fadams-javascript-binding/version.txt?rev=1622849&r1=1622848&r2=1622849&view=diff
==============================================================================
--- qpid/proton/branches/fadams-javascript-binding/version.txt (original)
+++ qpid/proton/branches/fadams-javascript-binding/version.txt Sat Sep  6 11:23:10 2014
@@ -1 +1 @@
-0.7
+0.8



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org