--- /dev/null
+/** ***** QxtFileLock test ***** */
+#include <QTest>
+#include <QFile>
+#include <QxtFileLock>
+#include <QxtJob>
+#include <QMutex>
+#include <QWaitCondition>
+
+class QxtFileLockTest: public QObject
+{
+ Q_OBJECT
+private:
+ QFile * file1;
+ QFile * file2;
+
+
+private slots:
+ void initTestCase()
+ {
+ file1=new QFile("lock.file");
+ file2=new QFile("lock.file");
+ QVERIFY(file1->open(QIODevice::ReadWrite));
+ QVERIFY(file2->open(QIODevice::ReadWrite));
+ }
+
+
+ ///read and write lock on the same handle
+ void rw_same()
+ {
+ QxtFileLock lock1(file1,0x10,20,QxtFileLock::ReadLock);
+ QVERIFY(lock1.lock());
+ QxtFileLock lock2(file1,0x10,20,QxtFileLock::WriteLock);
+ QVERIFY(lock2.lock());
+ }
+
+ ///Trying to readlock the same region with DIFFERENT handles
+ void rr_different()
+ {
+ QxtFileLock lock1(file1,0x10,20,QxtFileLock::ReadLock);
+ QxtFileLock lock2(file2,0x10,20,QxtFileLock::ReadLock);
+ QVERIFY(lock1.lock() && lock2.lock());
+ }
+
+ ///Trying to lock the same region with DIFFERENT handles and different locks
+ void rw_different()
+ {
+ QxtFileLock lock1(file1,0x10,20,QxtFileLock::ReadLock);
+ QxtFileLock lock2(file2,0x10,20,QxtFileLock::WriteLock);
+ QVERIFY(lock1.lock() && !lock2.lock());
+ }
+
+ ///Trying to writelock the same region with DIFFERENT handles
+ void ww_different()
+ {
+ QxtFileLock lock1(file1,0x10,20,QxtFileLock::WriteLock);
+ QxtFileLock lock2(file2,0x10,20,QxtFileLock::WriteLock);
+ QVERIFY(lock1.lock() && !lock2.lock());
+ }
+
+ ///Trying to writelock the different regions with DIFFERENT handles
+ void ww_different_region()
+ {
+ QxtFileLock lock1(file1,0x10 ,20,QxtFileLock::WriteLock);
+ QxtFileLock lock2(file2,0x10+21,20,QxtFileLock::WriteLock);
+ QVERIFY(lock1.lock() && lock2.lock());
+ }
+
+ ///different region, different handles, different locks
+ void rw_different_region()
+ {
+ QxtFileLock lock1(file1,0x10 ,20,QxtFileLock::ReadLock);
+ QxtFileLock lock2(file2,0x10+21,20,QxtFileLock::WriteLock);
+ QVERIFY(lock1.lock() && lock2.lock());
+ }
+ ///different region, same handles, different locks
+ void rw_same_region()
+ {
+ QxtFileLock lock1(file1,0x10 ,20,QxtFileLock::ReadLock);
+ QxtFileLock lock2(file1,0x10+21,20,QxtFileLock::WriteLock);
+ QVERIFY(lock1.lock() && lock2.lock());
+ }
+ void cleanupTestCase()
+ {
+ delete file1;
+ delete file2;
+ }
+
+};
+#include <QThread>
+#include <qxtsignalwaiter.h>
+
+class Q43Thread : public QThread
+{
+public:
+ void run()
+ {
+ exec();
+ }
+}
+; /// qt < 4.3 backwards compatibility
+
+///this is a job hack, not part of the testcase, ignore it if you don't what it is
+
+///here is the interesting part of the job. this executes one lock on a spefic thread and asserts the result
+class LockJob : public QxtJob
+{
+public:
+ LockJob(QxtFileLock*f,bool expectedresult):QxtJob()
+ {
+ lock =f;
+ expected=expectedresult;
+ }
+ QxtFileLock*lock ;
+ bool expected;
+ virtual void run()
+ {
+ qDebug("locking on %p",QThread::currentThread ());
+ QVERIFY(lock ->lock ()==expected);
+ }
+ void exec(QThread * o)
+ {
+ QxtJob::exec(o);
+ join();
+ }
+};
+
+
+class QxtFileLockThreadTest : public QObject
+{
+ Q_OBJECT
+private:
+ Q43Thread t1;
+ Q43Thread t2;
+
+private slots:
+ void initTestCase()
+ {
+ qDebug("main thread is %p",QThread::currentThread ());
+
+ QxtSignalWaiter w1(&t1,SIGNAL(started()));
+ t1.start();
+ QVERIFY(t1.isRunning());
+ t2.start();
+ QVERIFY(t2.isRunning());
+ }
+
+
+ ///Trying to writelock the same region twice
+ void ww_same()
+ {
+ QFile file1("lock.file");
+ QVERIFY(file1.open(QIODevice::ReadWrite));
+ QFile file2("lock.file");
+ QVERIFY(file2.open(QIODevice::ReadWrite));
+
+ QxtFileLock lock1(&file1,0x10,20,QxtFileLock::WriteLock);
+ file1.moveToThread(&t1);
+ LockJob l(&lock1,true);
+ l.exec(&t1);
+
+ QxtFileLock lock2(&file2,0x10,20,QxtFileLock::WriteLock);
+ file2.moveToThread(&t2);
+ LockJob l2(&lock2,false);
+ l2.exec(&t2);
+ l2.join();
+ }
+
+
+ ///Trying to readlock the same region
+ void rr_same()
+ {
+ QFile file1("lock.file");
+ QVERIFY(file1.open(QIODevice::ReadWrite));
+ QFile file2("lock.file");
+ QVERIFY(file2.open(QIODevice::ReadWrite));
+
+ QxtFileLock lock1(&file1,0x10,20,QxtFileLock::ReadLock);
+ file1.moveToThread(&t1);
+ LockJob l1(&lock1,true);
+ l1.exec(&t1);
+ l1.join();
+
+ QxtFileLock lock2(&file2,0x10,20,QxtFileLock::ReadLock);
+ file2.moveToThread(&t2);
+ LockJob l2(&lock2,true);
+ l2.exec(&t2);
+ l2.join();
+ }
+
+ ///Trying to lock the same region with different locks
+ void rw_same()
+ {
+
+ QFile file1("lock.file");
+ QVERIFY(file1.open(QIODevice::ReadWrite));
+ QFile file2("lock.file");
+ QVERIFY(file2.open(QIODevice::ReadWrite));
+
+ QxtFileLock lock1(&file1,0x10,20,QxtFileLock::WriteLock);
+ file1.moveToThread(&t1);
+ LockJob(&lock1,true).exec(&t1);
+
+ QxtFileLock lock2(&file2,0x10,20,QxtFileLock::ReadLock);
+ file2.moveToThread(&t2);
+ LockJob(&lock2,false).exec(&t2);
+ }
+
+ ///Trying to writelock different regions
+ void ww_different()
+ {
+ QFile file1("lock.file");
+ QVERIFY(file1.open(QIODevice::ReadWrite));
+ QFile file2("lock.file");
+ QVERIFY(file2.open(QIODevice::ReadWrite));
+
+ QxtFileLock lock1(&file1,0x10,20,QxtFileLock::WriteLock);
+ file1.moveToThread(&t1);
+ LockJob(&lock1,true).exec(&t1);
+
+ QxtFileLock lock2(&file2,0x10+21,20,QxtFileLock::WriteLock);
+ file2.moveToThread(&t2);
+ LockJob(&lock2,true).exec(&t2);
+ }
+ void cleanupTestCase()
+ {
+ t1.quit ();
+ t1.wait ();
+ t2.quit ();
+ t2.wait ();
+ }
+};
+
+
+int main(int argc, char ** argv)
+{
+ QCoreApplication app(argc,argv);
+ QxtFileLockTest test1;
+ QxtFileLockThreadTest test2;
+ return QTest::qExec(&test1,argc,argv)+QTest::qExec(&test2,argc,argv);
+}
+
+
+#include "main.moc"