1 /** ***** QxtFileLock test ***** */
7 #include <QWaitCondition>
9 class QxtFileLockTest: public QObject
20 file1=new QFile("lock.file");
21 file2=new QFile("lock.file");
22 QVERIFY(file1->open(QIODevice::ReadWrite));
23 QVERIFY(file2->open(QIODevice::ReadWrite));
27 ///read and write lock on the same handle
30 QxtFileLock lock1(file1,0x10,20,QxtFileLock::ReadLock);
31 QVERIFY(lock1.lock());
32 QxtFileLock lock2(file1,0x10,20,QxtFileLock::WriteLock);
33 QVERIFY(lock2.lock());
36 ///Trying to readlock the same region with DIFFERENT handles
39 QxtFileLock lock1(file1,0x10,20,QxtFileLock::ReadLock);
40 QxtFileLock lock2(file2,0x10,20,QxtFileLock::ReadLock);
41 QVERIFY(lock1.lock() && lock2.lock());
44 ///Trying to lock the same region with DIFFERENT handles and different locks
47 QxtFileLock lock1(file1,0x10,20,QxtFileLock::ReadLock);
48 QxtFileLock lock2(file2,0x10,20,QxtFileLock::WriteLock);
49 QVERIFY(lock1.lock() && !lock2.lock());
52 ///Trying to writelock the same region with DIFFERENT handles
55 QxtFileLock lock1(file1,0x10,20,QxtFileLock::WriteLock);
56 QxtFileLock lock2(file2,0x10,20,QxtFileLock::WriteLock);
57 QVERIFY(lock1.lock() && !lock2.lock());
60 ///Trying to writelock the different regions with DIFFERENT handles
61 void ww_different_region()
63 QxtFileLock lock1(file1,0x10 ,20,QxtFileLock::WriteLock);
64 QxtFileLock lock2(file2,0x10+21,20,QxtFileLock::WriteLock);
65 QVERIFY(lock1.lock() && lock2.lock());
68 ///different region, different handles, different locks
69 void rw_different_region()
71 QxtFileLock lock1(file1,0x10 ,20,QxtFileLock::ReadLock);
72 QxtFileLock lock2(file2,0x10+21,20,QxtFileLock::WriteLock);
73 QVERIFY(lock1.lock() && lock2.lock());
75 ///different region, same handles, different locks
78 QxtFileLock lock1(file1,0x10 ,20,QxtFileLock::ReadLock);
79 QxtFileLock lock2(file1,0x10+21,20,QxtFileLock::WriteLock);
80 QVERIFY(lock1.lock() && lock2.lock());
82 void cleanupTestCase()
90 #include <qxtsignalwaiter.h>
92 class Q43Thread : public QThread
100 ; /// qt < 4.3 backwards compatibility
102 ///this is a job hack, not part of the testcase, ignore it if you don't what it is
104 ///here is the interesting part of the job. this executes one lock on a spefic thread and asserts the result
105 class LockJob : public QxtJob
108 LockJob(QxtFileLock*f,bool expectedresult):QxtJob()
111 expected=expectedresult;
117 qDebug("locking on %p",QThread::currentThread ());
118 QVERIFY(lock ->lock ()==expected);
120 void exec(QThread * o)
128 class QxtFileLockThreadTest : public QObject
138 qDebug("main thread is %p",QThread::currentThread ());
140 QxtSignalWaiter w1(&t1,SIGNAL(started()));
142 QVERIFY(t1.isRunning());
144 QVERIFY(t2.isRunning());
148 ///Trying to writelock the same region twice
151 QFile file1("lock.file");
152 QVERIFY(file1.open(QIODevice::ReadWrite));
153 QFile file2("lock.file");
154 QVERIFY(file2.open(QIODevice::ReadWrite));
156 QxtFileLock lock1(&file1,0x10,20,QxtFileLock::WriteLock);
157 file1.moveToThread(&t1);
158 LockJob l(&lock1,true);
161 QxtFileLock lock2(&file2,0x10,20,QxtFileLock::WriteLock);
162 file2.moveToThread(&t2);
163 LockJob l2(&lock2,false);
169 ///Trying to readlock the same region
172 QFile file1("lock.file");
173 QVERIFY(file1.open(QIODevice::ReadWrite));
174 QFile file2("lock.file");
175 QVERIFY(file2.open(QIODevice::ReadWrite));
177 QxtFileLock lock1(&file1,0x10,20,QxtFileLock::ReadLock);
178 file1.moveToThread(&t1);
179 LockJob l1(&lock1,true);
183 QxtFileLock lock2(&file2,0x10,20,QxtFileLock::ReadLock);
184 file2.moveToThread(&t2);
185 LockJob l2(&lock2,true);
190 ///Trying to lock the same region with different locks
194 QFile file1("lock.file");
195 QVERIFY(file1.open(QIODevice::ReadWrite));
196 QFile file2("lock.file");
197 QVERIFY(file2.open(QIODevice::ReadWrite));
199 QxtFileLock lock1(&file1,0x10,20,QxtFileLock::WriteLock);
200 file1.moveToThread(&t1);
201 LockJob(&lock1,true).exec(&t1);
203 QxtFileLock lock2(&file2,0x10,20,QxtFileLock::ReadLock);
204 file2.moveToThread(&t2);
205 LockJob(&lock2,false).exec(&t2);
208 ///Trying to writelock different regions
211 QFile file1("lock.file");
212 QVERIFY(file1.open(QIODevice::ReadWrite));
213 QFile file2("lock.file");
214 QVERIFY(file2.open(QIODevice::ReadWrite));
216 QxtFileLock lock1(&file1,0x10,20,QxtFileLock::WriteLock);
217 file1.moveToThread(&t1);
218 LockJob(&lock1,true).exec(&t1);
220 QxtFileLock lock2(&file2,0x10+21,20,QxtFileLock::WriteLock);
221 file2.moveToThread(&t2);
222 LockJob(&lock2,true).exec(&t2);
224 void cleanupTestCase()
234 int main(int argc, char ** argv)
236 QCoreApplication app(argc,argv);
237 QxtFileLockTest test1;
238 QxtFileLockThreadTest test2;
239 return QTest::qExec(&test1,argc,argv)+QTest::qExec(&test2,argc,argv);