Esempio n. 1
0
 def setUp(self):
     self.tmpdir = tempfile.mkdtemp(prefix="test-connector-")
     self.base = os.path.join(self.tmpdir, "backup.sqlite")
     self.bp = BackupProvider(self.base, "tobus")
     return self.bp.startService()
Esempio n. 2
0
class BackupProviderTestCase(unittest.TestCase):
    """Teste la sauvegarde locale de messages en cas d'erreur."""


    @deferred(timeout=30)
    def setUp(self):
        self.tmpdir = tempfile.mkdtemp(prefix="test-connector-")
        self.base = os.path.join(self.tmpdir, "backup.sqlite")
        self.bp = BackupProvider(self.base, "tobus")
        return self.bp.startService()

    @deferred(timeout=30)
    def tearDown(self):
        d = self.bp.stopService()
        d.addCallback(lambda _x: shutil.rmtree(self.tmpdir))
        return d


    @deferred(timeout=30)
    @defer.inlineCallbacks
    def test_store_message(self):
        """Stockage local d'un message lorsque le bus est indisponible."""
        msg = {"type": "perf"}
        self.bp.paused = True

        before = yield self.bp.retry.qsize()
        self.bp.queue.append(msg)
        yield self.bp.processQueue()
        after = yield self.bp.retry.qsize()
        self.assertEqual(after, before + 1)


    @deferred(timeout=30)
    @defer.inlineCallbacks
    def test_unstore_order(self):
        msg1 = {"type": "perf", "value": "1"}
        self.bp.paused = True
        consumer = ConsumerStub()
        self.bp.consumer = consumer
        self.bp.queue.append(msg1)
        yield self.bp.processQueue()
        # Le message est maintenant en base de backup
        backup_size = yield self.bp.retry.qsize()
        self.assertEqual(backup_size, 1)
        # On se connecte
        self.bp.resumeProducing()
        # On attend un peu
        yield wait(0.5)
        # On en envoie un deuxième
        msg2 = {"type": "perf", "value": "2"}
        self.bp.queue.append(msg2)
        yield self.bp.processQueue()
        # On attend un peu
        yield wait(0.5)
        # On vérifie que les deux messages ont bien été envoyés dans le bon
        # ordre
        self.assertEqual(len(consumer.written), 2)
        for index, msg in enumerate([msg1, msg2]):
            msg_out = consumer.written[index]
            self.assertEqual(msg_out, msg)

    @deferred(timeout=30)
    @defer.inlineCallbacks
    def test_begin_with_backup(self):
        """
        Les messages sauvegardés doivent être prioritaires sur les messages temps-réel
        """
        msg1 = {"type": "perf", "value": "1"}
        msg2 = {"type": "perf", "value": "2"}
        yield self.bp.retry.put(json.dumps(msg1))
        self.bp.queue.append(msg2)
        #yield self.bp.processQueue()
        # On attend un peu
        #yield wait(0.5)
        for msg in [msg1, msg2]:
            next_msg = yield self.bp._getNextMsg()
            self.assertEqual(next_msg, msg)

    @deferred(timeout=30)
    @defer.inlineCallbacks
    def test_save_to_db(self):
        self.bp.paused = True
        count = 42
        for _i in range(count):
            msg = {"type": "perf", "value": "dummy"}
            self.bp.queue.append(msg)
        yield self.bp._saveToDb()
        self.assertEqual(len(self.bp.queue), 0)
        db_size = yield self.bp.retry.qsize()
        self.assertEqual(db_size, count)

    @deferred(timeout=30)
    @defer.inlineCallbacks
    def test_stats_1(self):
        msg = {"type": "perf", "value": "dummy"}
        # On se connecte
        consumer = ConsumerStub()
        self.bp.consumer = consumer
        yield self.bp.resumeProducing()
        # On envoie des messages
        print "envoi 1"
        for _i in range(10):
            self.bp.queue.append(msg)
        yield self.bp.processQueue()
        self.assertEqual(len(self.bp.queue), 0)
        # On se déconnecte (ça flushe les messages)
        yield self.bp.pauseProducing()
        # On envoie des messages (-> backup)
        print "envoi 2"
        for _i in range(20):
            self.bp.queue.append(msg)
        yield self.bp.processQueue()
        self.assertEqual(len(self.bp.queue), 0)
        # Les messages sont maintenant soit envoyés soit en base de backup
        # on vide les buffers (pour fiabiliser le test)
        yield self.bp.retry.flush()
        backup_size = yield self.bp.retry.qsize()
        print (self.bp.retry._cache_isempty,
               len(self.bp.retry.buffer_in),
               len(self.bp.retry.buffer_out),
               len(consumer.written), backup_size)
        LOGGER.debug("Beginning assertions")
        self.assertEqual(backup_size, 20)
        self.assertEqual(len(consumer.written), 10)
        stats = yield self.bp.getStats()
        print stats
        self.assertEqual(stats, {
            "queue": 0,
            "backup": 20,
            "backup_in_buf": 0,
            "backup_out_buf": 0,
            })