[poppler] qt4/tests

Albert Astals Cid aacid at kemper.freedesktop.org
Sun Jun 2 14:30:03 PDT 2013


 qt4/tests/CMakeLists.txt         |    1 
 qt4/tests/Makefile.am            |    9 +
 qt4/tests/stress-threads-qt4.cpp |  298 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 307 insertions(+), 1 deletion(-)

New commits:
commit 287afe2290d64ca63cdb75fef8f3fbdc20997970
Author: Adam Reichold <adamreichold at myopera.com>
Date:   Sun Jun 2 23:29:00 2013 +0200

    Add a thread stresser in qt4

diff --git a/qt4/tests/CMakeLists.txt b/qt4/tests/CMakeLists.txt
index 4d30fe6..69e9c49 100644
--- a/qt4/tests/CMakeLists.txt
+++ b/qt4/tests/CMakeLists.txt
@@ -43,6 +43,7 @@ qt4_add_simpletest(poppler-fonts poppler-fonts.cpp)
 qt4_add_simpletest(poppler_attachments poppler-attachments.cpp)
 qt4_add_simpletest(stress-poppler-qt4 stress-poppler-qt4.cpp)
 qt4_add_simpletest(stress-poppler-dir stress-poppler-dir.cpp)
+qt4_add_simpletest(stress-threads-qt4 stress-threads-qt4.cpp)
 qt4_add_simpletest(poppler-texts poppler-texts.cpp)
 
 qt4_add_qtest(check_attachments check_attachments.cpp)
diff --git a/qt4/tests/Makefile.am b/qt4/tests/Makefile.am
index e018f36..cc4853e 100644
--- a/qt4/tests/Makefile.am
+++ b/qt4/tests/Makefile.am
@@ -19,7 +19,8 @@ SUFFIXES: .moc
 
 noinst_PROGRAMS = test-poppler-qt4 stress-poppler-qt4 \
 	poppler-fonts test-password-qt4 stress-poppler-dir \
-	poppler-attachments poppler-texts poppler-forms
+	poppler-attachments poppler-texts poppler-forms \
+	stress-threads-qt4
 
 
 test_poppler_qt4_SOURCES =			\
@@ -65,6 +66,12 @@ stress_poppler_dir_SOURCES =			\
 
 stress_poppler_dir_LDADD = $(LDADDS)
 
+stress-threads-qt4_SOURCES =			\
+       stress-threads-qt4.cpp
+
+stress-threads-qt4_LDADD = $(LDADDS)
+
+
 clean-generic:
 	rm -f *.moc
 
diff --git a/qt4/tests/stress-threads-qt4.cpp b/qt4/tests/stress-threads-qt4.cpp
new file mode 100644
index 0000000..7e72728
--- /dev/null
+++ b/qt4/tests/stress-threads-qt4.cpp
@@ -0,0 +1,298 @@
+
+#include <unistd.h>
+
+#include <poppler-qt4.h>
+#include <poppler-form.h>
+
+#include <QtCore/QDebug>
+#include <QtCore/QMutex>
+#include <QtCore/QThread>
+#include <QtGui/QImage>
+
+class SillyThread : public QThread
+{
+public:
+    SillyThread(Poppler::Document* document, QObject* parent = 0);
+
+    void run();
+
+private:
+    Poppler::Document* m_document;
+    QVector< Poppler::Page* > m_pages;
+
+};
+
+class CrazyThread : public QThread
+{
+public:
+    CrazyThread(Poppler::Document* document, QMutex* annotationMutex, QObject* parent = 0);
+
+    void run();
+
+private:
+    Poppler::Document* m_document;
+    QMutex* m_annotationMutex;
+
+};
+
+static Poppler::Page* loadPage(Poppler::Document* document, int index)
+{
+    Poppler::Page* page = document->page(index);
+
+    if(page == 0)
+    {
+        qDebug() << "!Document::page";
+        
+        exit(EXIT_FAILURE);
+    }
+
+    return page;
+}
+
+static Poppler::Page* loadRandomPage(Poppler::Document* document)
+{
+    return loadPage(document, qrand() % document->numPages());
+}
+
+SillyThread::SillyThread(Poppler::Document* document, QObject* parent) : QThread(parent),
+    m_document(document),
+    m_pages()
+{
+    m_pages.reserve(m_document->numPages());
+
+    for(int index = 0; index < m_document->numPages(); ++index)
+    {
+        m_pages.append(loadPage(m_document, index));
+    }
+}
+
+
+void SillyThread::run()
+{
+    forever
+    {
+        foreach(Poppler::Page* page, m_pages)
+        {
+            QImage image = page->renderToImage();
+
+            if(image.isNull())
+            {
+                qDebug() << "!Page::renderToImage";
+                
+                ::exit(EXIT_FAILURE);
+            }
+        }
+    }
+}
+
+CrazyThread::CrazyThread(Poppler::Document* document, QMutex* annotationMutex, QObject* parent) : QThread(parent),
+    m_document(document),
+    m_annotationMutex(annotationMutex)
+{
+}
+
+void CrazyThread::run()
+{
+    typedef QScopedPointer< Poppler::Page > PagePointer;
+
+    qsrand(static_cast< uint >(currentThreadId()));
+
+    forever
+    {
+        if(qrand() % 2 == 0)
+        {
+            qDebug() << "search...";
+
+            PagePointer page(loadRandomPage(m_document));
+
+            page->search("c", Poppler::Page::CaseInsensitive);
+            page->search("r", Poppler::Page::CaseSensitive);
+            page->search("a", Poppler::Page::CaseInsensitive);
+            page->search("z", Poppler::Page::CaseSensitive);
+            page->search("y", Poppler::Page::CaseInsensitive);
+        }
+
+        if(qrand() % 2 == 0)
+        {
+            qDebug() << "links...";
+
+            PagePointer page(loadRandomPage(m_document));
+
+            QList< Poppler::Link* > links = page->links();
+
+            qDeleteAll(links);
+        }
+
+        if(qrand() % 2 == 0)
+        {
+            qDebug() << "form fields...";
+
+            PagePointer page(loadRandomPage(m_document));
+
+            QList< Poppler::FormField* > formFields = page->formFields();
+
+            qDeleteAll(formFields);
+        }
+
+        if(qrand() % 2 == 0)
+        {
+            qDebug() << "thumbnail...";
+
+            PagePointer page(loadRandomPage(m_document));
+
+            page->thumbnail();
+        }
+
+        if(qrand() % 2 == 0)
+        {
+            qDebug() << "text...";
+
+            PagePointer page(loadRandomPage(m_document));
+
+            page->text(QRectF(QPointF(), page->pageSizeF()));
+        }
+
+        if(qrand() % 2 == 0)
+        {
+            QMutexLocker mutexLocker(m_annotationMutex);
+            
+            qDebug() << "add annotation...";
+
+            PagePointer page(loadRandomPage(m_document));
+
+            Poppler::Annotation* annotation = 0;
+
+            switch(qrand() % 3)
+            {
+            default:
+            case 0:
+                annotation = new Poppler::TextAnnotation(qrand() % 2 == 0 ? Poppler::TextAnnotation::Linked : Poppler::TextAnnotation::InPlace);
+                break;
+            case 1:
+                annotation = new Poppler::HighlightAnnotation();
+                break;
+            case 2:
+                annotation = new Poppler::InkAnnotation();
+                break;
+            }
+
+            annotation->setBoundary(QRectF(0.0, 0.0, 0.5, 0.5));
+            annotation->setContents("crazy");
+
+            page->addAnnotation(annotation);
+
+            delete annotation;
+        }
+
+        if(qrand() % 2 == 0)
+        {
+            QMutexLocker mutexLocker(m_annotationMutex);
+            
+            for(int index = 0; index < m_document->numPages(); ++index)
+            {
+                PagePointer page(loadPage(m_document, index));
+
+                QList< Poppler::Annotation* > annotations = page->annotations();
+
+                if(!annotations.isEmpty())
+                {
+                    qDebug() << "modify annotation...";
+
+                    annotations.at(qrand() % annotations.size())->setBoundary(QRectF(0.5, 0.5, 0.25, 0.25));
+                    annotations.at(qrand() % annotations.size())->setAuthor("foo");
+                    annotations.at(qrand() % annotations.size())->setContents("bar");
+                    annotations.at(qrand() % annotations.size())->setCreationDate(QDateTime::currentDateTime());
+                    annotations.at(qrand() % annotations.size())->setModificationDate(QDateTime::currentDateTime());
+                }
+
+                qDeleteAll(annotations);
+
+                if(!annotations.isEmpty())
+                {
+                    break;
+                }
+            }
+        }
+
+        if(qrand() % 2 == 0)
+        {
+            QMutexLocker mutexLocker(m_annotationMutex);
+            
+            for(int index = 0; index < m_document->numPages(); ++index)
+            {
+                PagePointer page(loadPage(m_document, index));
+
+                QList< Poppler::Annotation* > annotations = page->annotations();
+
+                if(!annotations.isEmpty())
+                {
+                    qDebug() << "remove annotation...";
+
+                    page->removeAnnotation(annotations.takeAt(qrand() % annotations.size()));
+                }
+
+                qDeleteAll(annotations);
+
+                if(!annotations.isEmpty())
+                {
+                    break;
+                }
+            }
+        }
+
+        if(qrand() % 2 == 0)
+        {
+            qDebug() << "fonts...";
+
+            m_document->fonts();
+        }
+    }
+}
+
+int main(int argc, char** argv)
+{
+    if(argc < 3)
+    {
+        qDebug() << "usage: stress-threads-qt duration sillyCount crazyCount file(s)";
+        
+        return EXIT_FAILURE;
+    }
+
+    const int duration = atoi(argv[1]);
+    const int sillyCount = atoi(argv[2]);
+    const int crazyCount = atoi(argv[3]);
+
+    for(int argi = 4; argi < argc; ++argi)
+    {
+        const QString file = QFile::decodeName(argv[argi]);
+        Poppler::Document* document = Poppler::Document::load(file);
+
+        if(document == 0)
+        {
+            qDebug() << "Could not load" << file;            
+            continue;
+        }
+        
+        if(document->isLocked())
+        {
+            qDebug() << file << "is locked";
+            continue;
+        }
+        
+        for(int i = 0; i < sillyCount; ++i)
+        {
+            (new SillyThread(document))->start();
+        }
+        
+        QMutex* annotationMutex = new QMutex();
+
+        for(int i = 0; i < crazyCount; ++i)
+        {
+            (new CrazyThread(document, annotationMutex))->start();
+        }
+    }
+
+    sleep(duration);
+
+    return EXIT_SUCCESS;
+}


More information about the poppler mailing list