def test_simple_sessionized_push_pop(self):
        sender1 = Sender(self.conn, "/test.sessionized2")
        sender1.start()
        sender1.send("test", headers={"COOKIE": "xyz"})

        sender2 = Sender(self.conn, "/test.sessionized2")
        sender2.start()
        sender2.send("diff", headers={"COOKIE": "diff"})

        msgs1 = []
        sem1 = Semaphore(0)
        receiver1 = Receiver(self.conn, "/test.sessionized2", cookie="xyz")
        receiver1.on_message = make_receiver(2, msgs1, sem1, receiver1)
        receiver1.start()
        Thread(target=receiver1.run).start()

        msgs2 = []
        sem2 = Semaphore(0)
        receiver2 = Receiver(self.conn, "/test.sessionized2", cookie="diff")
        receiver2.on_message = make_receiver(2, msgs2, sem2, receiver2)
        receiver2.start()
        Thread(target=receiver2.run).start()

        assert sem1.acquire(timeout=10)
        assert sem2.acquire(timeout=10)
        assert msgs1[0] == "test"
        assert msgs2[0] == "diff"

        # Test retrieving items for the second time.
        sender1.send("test2", headers={"COOKIE": "xyz"})
        assert sem1.acquire(timeout=10)
        assert msgs1[1] == "test2"

        assert not sem2.acquire(timeout=5)
    def test_multiple_push_pop(self):
        obj = {"foo": "bar"}

        s = Sender(self.conn, "/a.b.c")
        r = Receiver(self.conn, "/a.b.c")

        s.start()
        for _ in range(10):
            s.send(obj)

        expected_message_count = 10

        def on_message(msg, headers):
            assert msg == obj
            nonlocal expected_message_count
            if expected_message_count == 1:
                r.stop()
            expected_message_count -= 1

        r.start()
        r.on_message = on_message
        thread = Thread(target=r.run)
        thread.start()

        thread.join()
    def test_fifo_push_pop(self):
        msgs1 = []
        sem1 = Semaphore(0)
        receiver1 = Receiver(self.conn, "/test.fifo/simple")
        receiver1.on_message = make_receiver(2, msgs1, sem1, receiver1)
        receiver1.start()
        Thread(target=receiver1.run).start()

        msgs2 = []
        sem2 = Semaphore(0)
        receiver2 = Receiver(self.conn, "/test.fifo/simple")
        receiver2.on_message = make_receiver(2, msgs2, sem2, receiver2)
        receiver2.start()
        Thread(target=receiver2.run).start()

        sender1 = Sender(self.conn, "/test.fifo/simple")
        sender1.start()

        sender1.send("test")

        assert sem1.acquire(timeout=10)
        assert msgs1[-1] == "test"
        assert not sem2.acquire(timeout=2)

        sender1.send("test2")

        assert sem2.acquire(timeout=10)
        assert msgs2[-1] == "test2"
        assert not sem1.acquire(timeout=2)

        sender1.send("test3")

        assert sem1.acquire(timeout=10)
        assert msgs1[-1] == "test3"
        assert not sem2.acquire(timeout=2)

        sender1.send("test4")

        assert sem2.acquire(timeout=10)
        assert msgs2[-1] == "test4"
        assert not sem1.acquire(timeout=2)
    def test_queue_waits_removed_after_client_disconnects(self, queue_name):
        conn1 = WeaveConnection.local()
        conn2 = WeaveConnection.local()
        conn3 = WeaveConnection.local()
        conn1.connect()
        conn2.connect()
        conn3.connect()

        msgs1 = []
        sem1 = Semaphore(0)
        receiver1 = Receiver(conn1, queue_name, cookie="a")
        receiver1.on_message = make_receiver(1, msgs1, sem1, receiver1)
        receiver1.start()
        Thread(target=receiver1.run).start()

        msgs2 = []
        sem2 = Semaphore(0)
        receiver2 = Receiver(conn2, queue_name, cookie="b")
        receiver2.on_message = make_receiver(1, msgs2, sem2, receiver2)
        receiver2.start()
        Thread(target=receiver2.run).start()

        conn1.close()

        import time
        time.sleep(1)

        sender1 = Sender(conn3, queue_name)
        sender1.start()

        sender1.send("test", headers={"COOKIE": "b"})

        assert sem2.acquire(timeout=5)
        assert msgs2[-1] == "test"

        conn2.close()
        conn3.close()
    def test_multicast_with_synonym(self):
        msgs = []
        sem = Semaphore(0)
        receiver = Receiver(self.conn, "/synonyms/multi")
        receiver.on_message = make_receiver(1, msgs, sem, receiver)
        receiver.start()
        Thread(target=receiver.run).start()

        sender = Sender(self.conn, "/synonyms/multi")
        sender.start()
        sender.send("test")

        assert sem.acquire(timeout=10)
        assert msgs[-1] == "test"
        assert not sem.acquire(timeout=2)
    def test_simple_push_pop(self):
        msgs = []

        s = Sender(self.conn, "/a.b.c")
        r = Receiver(self.conn, "/a.b.c")
        s.start()
        r.start()
        r.on_message = lambda msg, hdrs: msgs.append(msg) or r.stop()

        s.send({"foo": "bar"})
        thread = Thread(target=r.run)
        thread.start()

        thread.join()

        assert msgs == [{"foo": "bar"}]