示例#1
0
    def test_topic_is_archive_topic(self):
        """ This is a big hack to attempt to test the following in genLoopPackets
                if topic == self.archive_topic:
                    continue
        """

        topic = ''.join([
            random.choice(string.ascii_letters + string.digits)
            for n in range(32)
        ])

        config_dict = {}
        config_dict['topic'] = topic
        config_dict['archive_topic'] = topic

        packet = None

        with mock.patch('user.MQTTSubscribe.MQTTSubscriber') as mock_manager:
            with mock.patch('user.MQTTSubscribe.time') as mock_time:
                type(
                    mock_manager.return_value
                ).subscribed_topics = mock.PropertyMock(return_value=[topic])
                mock_time.sleep.side_effect = mock.Mock(
                    side_effect=SystemExit()
                )  # Hack one, use this to escape the infinit loop
                with self.assertRaises(SystemExit):
                    SUT = MQTTSubscribeDriver(**config_dict)

                    gen = SUT.genLoopPackets()
                    packet = next(gen)

                mock_time.sleep.assert_called_once()
                self.assertIsNone(
                    packet
                )  # hack two, the generator never really returns because of the side effect exception
示例#2
0
    def test_queue_empty(self):
        topic = ''.join([
            random.choice(string.ascii_letters + string.digits)
            for n in range(32)
        ])
        self.setup_queue_tests(topic)
        queue = dict({'name': topic})

        with mock.patch('user.MQTTSubscribe.MQTTSubscriber') as mock_manager:
            with mock.patch('user.MQTTSubscribe.time') as mock_time:
                type(mock_manager.return_value).queues = mock.PropertyMock(
                    return_value=[queue])
                type(mock_manager.return_value).get_data = mock.Mock(
                    side_effect=[
                        self.empty_generator(),
                        self.generator([self.queue_data])
                    ])

                SUT = MQTTSubscribeDriver(**self.config_dict)
                gen = SUT.genLoopPackets()
                next(gen, None)

                mock_time.sleep.assert_called_once()
                self.assertEqual(mock_manager.return_value.get_data.call_count,
                                 2)
    def test_queue_returns_none(self):
        topic = random_string()
        self.setup_queue_tests(topic)
        queue = dict(
            {'name': topic}
            )

        with mock.patch('user.MQTTSubscribe.MQTTSubscriber') as mock_manager:
            with mock.patch('user.MQTTSubscribe.time') as mock_time:
                type(mock_manager.return_value).queues = mock.PropertyMock(return_value=[queue])
                type(mock_manager.return_value).get_data = mock.Mock(side_effect=[self.generator([None]), self.generator([self.queue_data])])

                SUT = MQTTSubscribeDriver(**self.config_dict)
                gen = SUT.genLoopPackets()
                next(gen, None)

                mock_time.sleep.assert_called_once()
                self.assertEqual(mock_manager.return_value.get_data.call_count, 2)
    def test_queue(self):
        topic = 'foo/bar'
        self.setup_queue_tests(topic)

        with mock.patch('user.MQTTSubscribe.MQTTSubscribe') as mock_manager:
            with mock.patch('user.MQTTSubscribe.time') as mock_time:
                type(
                    mock_manager.return_value
                ).subscribed_topics = mock.PropertyMock(return_value=[topic])
                type(mock_manager.return_value).get_data = mock.Mock(
                    return_value=self.generator([self.queue_data]))

                SUT = MQTTSubscribeDriver(**self.config_dict)

                gen = SUT.genLoopPackets()
                packet = next(gen)

                mock_time.sleep.assert_not_called()
                self.assertDictEqual(packet, self.queue_data)
    def test_queue_empty(self):
        topic = 'foo/bar'
        self.setup_queue_tests(topic)

        with mock.patch('user.MQTTSubscribe.MQTTSubscribe') as mock_manager:
            with mock.patch('user.MQTTSubscribe.time') as mock_time:
                type(
                    mock_manager.return_value
                ).subscribed_topics = mock.PropertyMock(return_value=[topic])
                type(mock_manager.return_value).get_data = mock.Mock(
                    return_value=self.generator([None, self.queue_data]))

                SUT = MQTTSubscribeDriver(**self.config_dict)
                gen = SUT.genLoopPackets()
                next(gen, None)

                mock_time.sleep.assert_called_once()
                self.assertEqual(mock_manager.return_value.get_data.call_count,
                                 2)
示例#6
0
    def test_queue(self):
        topic = ''.join([
            random.choice(string.ascii_letters + string.digits)
            for n in range(32)
        ])
        self.setup_queue_tests(topic)
        queue = dict({'name': topic})

        with mock.patch('user.MQTTSubscribe.MQTTSubscriber') as mock_manager:
            with mock.patch('user.MQTTSubscribe.time') as mock_time:
                type(mock_manager.return_value).queues = mock.PropertyMock(
                    return_value=[queue])
                type(mock_manager.return_value).get_data = mock.Mock(
                    return_value=self.generator([self.queue_data]))

                SUT = MQTTSubscribeDriver(**self.config_dict)

                gen = SUT.genLoopPackets()
                packet = next(gen)

                mock_time.sleep.assert_not_called()
                self.assertDictEqual(packet, self.queue_data)
    def runit(self, payload, file_pointer, check_results=True):
        test_data = json.load(file_pointer, object_hook=utils.byteify)
        config_dict = configobj.ConfigObj(test_data['config'])
        testruns = test_data['testruns']

        cdict = config_dict['MQTTSubscribeService']
        if not 'message_callback' in config_dict['MQTTSubscribeService']:
            config_dict['MQTTSubscribeService']['message_callback'] = {}
        config_dict['MQTTSubscribeService']['message_callback'][
            'type'] = payload

        driver = MQTTSubscribeDriver(**cdict)

        host = 'localhost'
        port = 1883
        keepalive = 60

        userdata = {'topics': [], 'connected_flag': False}
        client = mqtt.Client(userdata=userdata)
        client.on_connect = utils.on_connect
        client.connect(host, port, keepalive)
        client.loop_start()

        max_connect_wait = 1  # ToDo - configure
        i = 1
        while not userdata['connected_flag']:
            if i > max_connect_wait:
                self.fail("Timed out waiting for connections.")
            time.sleep(1)
            i += 1

        userdata2 = {
            'topics': cdict['topics'].sections,
            'connected_flag': False,
            'msg': False,
            'max_msg_wait': 1  # ToDo - configure
        }
        client2 = mqtt.Client(userdata=userdata2)
        client2.on_connect = utils.on_connect
        client2.on_message = utils.on_message
        client2.connect(host, port, keepalive)
        client2.loop_start()

        max_connect2_wait = 1  # ToDo - configure
        i = 1
        while not userdata2['connected_flag']:
            #print("waiting to connect")
            if i > max_connect2_wait:
                self.fail("Timed out waiting for connection 2.")
            time.sleep(1)
            i += 1

        max_waits = 10
        for testrun in testruns:
            for topics in testrun['messages']:
                for topic in topics:
                    topic_info = topics[topic]
                    msg_count = utils.send_msg(utils.send_mqtt_msg, payload,
                                               client.publish, topic,
                                               topic_info, userdata2, self)
                    wait_count = utils.wait_on_queue(driver, msg_count,
                                                     max_waits, 1)

                    # If queue not filled, fail now
                    # otherwise will end up in 'infinite' loop in genLoopPackets
                    if wait_count >= max_waits:
                        self.fail("Could not fill queue.")

            records = []
            gen = driver.genLoopPackets()

            more_data = False
            # hack to check if there is more data in the queues
            for topics in testrun['messages']:
                for topic in driver.subscriber.manager.subscribed_topics:
                    if driver.subscriber.manager.has_data(topic):
                        more_data = True

            while more_data:
                data = next(gen, None)
                records.append(data)
                more_data = False
                # hack to check if there is more data in the queues
                for topics in testrun['messages']:
                    for topic in driver.subscriber.manager.subscribed_topics:
                        if driver.subscriber.manager.has_data(topic):
                            more_data = True

            if check_results:
                results = testrun['results']
                result = {}
                found = False
                for result in results:
                    if 'driver' in result['test']:
                        if payload in result['payloads']:
                            found = True
                            break
                self.assertTrue(found, "No results for %s" % payload)

                utils.check(self, payload, records, result['records'])
            else:
                for record in records:
                    print(record)

        driver.closePort()
        client.disconnect()
        client2.disconnect()