[poppler] Branch 'qt5' - qt5/src qt5/tests
Albert Astals Cid
aacid at kemper.freedesktop.org
Tue Jun 18 14:19:47 PDT 2013
qt5/src/Doxyfile | 2
qt5/src/poppler-private.h | 2
qt5/tests/CMakeLists.txt | 1
qt5/tests/Makefile.am | 13 +
qt5/tests/stress-threads-qt5.cpp | 304 +++++++++++++++++++++++++++++++++++++++
qt5/tests/test-poppler-qt5.cpp | 2
6 files changed, 320 insertions(+), 4 deletions(-)
New commits:
commit 9d0a5b6afb25a1273504383e108bdb95ca82f099
Author: Albert Astals Cid <aacid at kde.org>
Date: Tue Jun 18 23:19:30 2013 +0200
Bring changes from the qt4 dir
diff --git a/qt5/src/Doxyfile b/qt5/src/Doxyfile
index f89d5f7..8a6e6d9 100644
--- a/qt5/src/Doxyfile
+++ b/qt5/src/Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME = "Poppler Qt5"
# This could be handy for archiving the generated documentation or
# if some version control system is used.
-PROJECT_NUMBER = 0.23.0
+PROJECT_NUMBER = 0.23.2
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
diff --git a/qt5/src/poppler-private.h b/qt5/src/poppler-private.h
index 172c988..0a132f0 100644
--- a/qt5/src/poppler-private.h
+++ b/qt5/src/poppler-private.h
@@ -88,7 +88,7 @@ namespace Poppler {
wchar_t *fileName = new WCHAR[filePath.length()];
int length = filePath.toWCharArray(fileName);
doc = new PDFDoc(fileName, length, ownerPassword, userPassword);
- delete fileName;
+ delete[] fileName;
#else
GooString *fileName = new GooString(QFile::encodeName(filePath));
doc = new PDFDoc(fileName, ownerPassword, userPassword);
diff --git a/qt5/tests/CMakeLists.txt b/qt5/tests/CMakeLists.txt
index 4e2d05f..dfeb1fb 100644
--- a/qt5/tests/CMakeLists.txt
+++ b/qt5/tests/CMakeLists.txt
@@ -52,6 +52,7 @@ qt5_add_simpletest(poppler-fonts poppler-fonts.cpp)
qt5_add_simpletest(poppler_attachments poppler-attachments.cpp)
qt5_add_simpletest(stress-poppler-qt5 stress-poppler-qt5.cpp)
qt5_add_simpletest(stress-poppler-dir stress-poppler-dir.cpp)
+qt5_add_simpletest(stress-threads-qt5 stress-threads-qt5.cpp)
qt5_add_simpletest(poppler-texts poppler-texts.cpp)
qt5_add_qtest(check_attachments check_attachments.cpp)
diff --git a/qt5/tests/Makefile.am b/qt5/tests/Makefile.am
index d787a6b..be9fa44 100644
--- a/qt5/tests/Makefile.am
+++ b/qt5/tests/Makefile.am
@@ -19,7 +19,8 @@ SUFFIXES: .moc
noinst_PROGRAMS = test-poppler-qt5 stress-poppler-qt5 \
poppler-fonts test-password-qt5 stress-poppler-dir \
- poppler-attachments poppler-texts
+ poppler-attachments poppler-texts poppler-forms \
+ stress-threads-qt5
test_poppler_qt5_SOURCES = \
@@ -49,6 +50,11 @@ poppler_texts_SOURCES = \
poppler_texts_LDADD = $(LDADDS)
+poppler_forms_SOURCES = \
+ poppler-forms.cpp
+
+poppler_forms_LDADD = $(LDADDS)
+
stress_poppler_qt5_SOURCES = \
stress-poppler-qt5.cpp
@@ -60,6 +66,11 @@ stress_poppler_dir_SOURCES = \
stress_poppler_dir_LDADD = $(LDADDS)
+stress_threads_qt5_SOURCES = \
+ stress-threads-qt5.cpp
+
+stress_threads_qt5_LDADD = $(LDADDS)
+
clean-generic:
rm -f *.moc
diff --git a/qt5/tests/stress-threads-qt5.cpp b/qt5/tests/stress-threads-qt5.cpp
new file mode 100644
index 0000000..2a24a35
--- /dev/null
+++ b/qt5/tests/stress-threads-qt5.cpp
@@ -0,0 +1,304 @@
+
+#include <unistd.h>
+#include <time.h>
+
+#include <poppler-qt5.h>
+#include <poppler-form.h>
+
+#include <QtCore/QDebug>
+#include <QtCore/QFile>
+#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(uint seed, Poppler::Document* document, QMutex* annotationMutex, QObject* parent = 0);
+
+ void run();
+
+private:
+ uint m_seed;
+ 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(uint seed, Poppler::Document* document, QMutex* annotationMutex, QObject* parent) : QThread(parent),
+ m_seed(seed),
+ m_document(document),
+ m_annotationMutex(annotationMutex)
+{
+}
+
+void CrazyThread::run()
+{
+ typedef QScopedPointer< Poppler::Page > PagePointer;
+
+ qsrand(m_seed);
+
+ 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 < 5)
+ {
+ 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]);
+
+ qsrand(time(0));
+
+ 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(qrand(), document, annotationMutex))->start();
+ }
+ }
+
+ sleep(duration);
+
+ return EXIT_SUCCESS;
+}
diff --git a/qt5/tests/test-poppler-qt5.cpp b/qt5/tests/test-poppler-qt5.cpp
index 985b920..d16728b 100644
--- a/qt5/tests/test-poppler-qt5.cpp
+++ b/qt5/tests/test-poppler-qt5.cpp
@@ -148,7 +148,7 @@ int main( int argc, char **argv )
argc > 3)
{
// use argument as file name
- qWarning() << "usage: test-poppler-qt filename [-extract|-arthur|-textRects]";
+ qWarning() << "usage: test-poppler-qt5 filename [-extract|-arthur|-textRects]";
exit(1);
}
More information about the poppler
mailing list