コード例 #1
0
class TestBroker(unittest.TestCase):
    def setUp(self):
        r = rconfig.Read()
        self.broker = Broker("TestBroker")
        self.redis = redis.StrictRedis(host=r.host,
                                       port=r.port,
                                       db=r.db,
                                       password=r.password)

    def test_ping(self):
        self.assertTrue(self.broker.ping())

    def test_write(self):
        oldLen = self.redis.llen(input_channel_key("TestBroker"))
        pck = self.write("This is a test message")
        len = self.redis.llen(input_channel_key("TestBroker")) - oldLen
        self.redis.lpop(input_channel_key("TestBroker"))
        self.assertEquals(1, len)
        self.redis.lrem(input_channel_key("TestBroker"), 0, str(pck))

    def test_write_read_ack(self):
        pck = self.write("Test WriteRead")
        input = self.broker.get_input_channel("consumer1")
        rst = input.read(10)
        self.assertEquals(str(pck), str(rst))
        self.assertEquals(
            1,
            self.redis.llen(working_channel_key(self.broker.name,
                                                "consumer1")))
        rst.ack()

    def test_write_read_fail(self):
        cName = "TestWriteReadAndFail"
        self.write("Test write read and failed")

        cnt = self.redis.llen(failed_channel_key(self.broker.name, cName))
        input = self.broker.get_input_channel(cName)
        rst = input.read(10)
        self.assertTrue(rst != None)
        self.assertEquals(
            0,
            self.redis.llen(failed_channel_key(self.broker.name, cName)) - cnt)
        rst.fail()
        self.assertEquals(
            1,
            self.redis.llen(failed_channel_key(self.broker.name, cName)) - cnt)
        self.redis.lrem(rst.failed_channel_key, 0, rst.get_failed_package())

    def test_write_asyncread(self):
        cName = "TestWriteAsncRead"
        input = self.broker.get_input_channel(cName)
        flag = [True]
        exception = [None]
        exit_event = threading.Event()

        def on_resolve(data):
            data.ack()
            exit_event.set()

        def on_reject(ex):
            flag[0] = False
            exception[0] = ex
            exit_event.set()

        input.async_read(10).then(on_resolve, on_reject)
        self.write("Test async Read")
        exit_event.wait(5)
        self.assertTrue(flag[0], "Get Ex: " + str(exception[0]))

    def test_respond(self):
        cName = "TestRespond"
        pck = self.write("Test respond")
        input = self.broker.get_input_channel(cName)
        flag = [True]
        exception = [None]
        exit_event = threading.Event()

        def on_resolve(data):
            try:
                data.respond("respond to " + data.ID)
                data.ack()
            except Exception as e:
                flag[0] = False
                exception[0] = e
            exit_event.set()

        def on_reject(ex):
            flag[0] = False
            exception[0] = ex
            exit_event.set()

        input.async_read(10).then(on_resolve, on_reject)
        exit_event.wait(5)
        self.assertTrue(flag[0], "Get Ex: " + str(exception[0]))
        response_channel = self.broker.get_response_channel(pck.ID)
        rst = response_channel.read(5)
        self.assertIsNotNone(rst)

    def write(self, msg):
        output = self.broker.get_output_channel()
        pck = Package(payload=msg, created_at=datetime.now().isoformat())
        output.write(pck)
        return pck