1
/****************************************************************************
2
**
3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4
** All rights reserved.
5
** Contact: Nokia Corporation (qt-info@nokia.com)
6
**
7
** This file is part of the test suite of the Qt Toolkit.
8
**
9
** $QT_BEGIN_LICENSE:LGPL$
10
** GNU Lesser General Public License Usage
11
** This file may be used under the terms of the GNU Lesser General Public
12
** License version 2.1 as published by the Free Software Foundation and
13
** appearing in the file LICENSE.LGPL included in the packaging of this
14
** file. Please review the following information to ensure the GNU Lesser
15
** General Public License version 2.1 requirements will be met:
16
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17
**
18
** In addition, as a special exception, Nokia gives you certain additional
19
** rights. These rights are described in the Nokia Qt LGPL Exception
20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21
**
22
** GNU General Public License Usage
23
** Alternatively, this file may be used under the terms of the GNU General
24
** Public License version 3.0 as published by the Free Software Foundation
25
** and appearing in the file LICENSE.GPL included in the packaging of this
26
** file. Please review the following information to ensure the GNU General
27
** Public License version 3.0 requirements will be met:
28
** http://www.gnu.org/copyleft/gpl.html.
29
**
30
** Other Usage
31
** Alternatively, this file may be used in accordance with the terms and
32
** conditions contained in a signed written agreement between you and Nokia.
33
**
34
**
35
**
36
**
37
**
38
** $QT_END_LICENSE$
39
**
40
****************************************************************************/
41
42
43
#include <QtTest/QtTest>
44
#include <qthread.h>
45
#include <q3semaphore.h>
46
#include "q3semaphore.h"
47
48
//TESTED_CLASS=
49
//TESTED_FILES=
50
51
class tst_Q3Semaphore : public QObject
52
{
53
    Q_OBJECT
54
55
public:
56
    tst_Q3Semaphore();
57
    virtual ~tst_Q3Semaphore();
58
59
public slots:
60
    void init();
61
    void cleanup();
62
private slots:
63
    void incrementOne();
64
    void incrementN();
65
};
66
67
Q3Semaphore *semaphore = 0;
68
69
tst_Q3Semaphore::tst_Q3Semaphore()
70
{
71
72
}
73
74
tst_Q3Semaphore::~tst_Q3Semaphore()
75
{
76
77
}
78
79
// init() will be executed immediately before each testfunction is run.
80
void tst_Q3Semaphore::init()
81
{
82
}
83
84
// cleanup() will be executed immediately after each testfunction is run.
85
void tst_Q3Semaphore::cleanup()
86
{
87
}
88
89
class ThreadOne : public QThread
90
{
91
public:
92
    ThreadOne() {}
93
94
protected:
95
    void run()
96
    {
97
	int i = 0;
98
	while ( i < 100 ) {
99
	    (*semaphore)++;
100
	    i++;
101
	    (*semaphore)--;
102
	}
103
    }
104
};
105
106
void tst_Q3Semaphore::incrementOne()
107
{
108
    QVERIFY(!semaphore);
109
    semaphore = new Q3Semaphore(1);
110
111
    ThreadOne t1;
112
    ThreadOne t2;
113
114
    t1.start();
115
    t2.start();
116
117
    QVERIFY(t1.wait(4000));
118
    QVERIFY(t2.wait(4000));
119
120
    delete semaphore;
121
    semaphore = 0;
122
}
123
124
class ThreadN : public QThread
125
{
126
    int N;
127
128
 public:
129
    ThreadN(int n) :N(n) { }
130
131
protected:
132
    void run()
133
    {
134
	int i = 0;
135
	while ( i < 100 ) {
136
	    (*semaphore)+=N;
137
	    i++;
138
	    (*semaphore)-=N;
139
	}
140
    }
141
};
142
143
void tst_Q3Semaphore::incrementN()
144
{
145
    QVERIFY(!semaphore);
146
    semaphore = new Q3Semaphore(4);
147
148
    ThreadN t1(2);
149
    ThreadN t2(3);
150
151
    t1.start();
152
    t2.start();
153
154
    QVERIFY(t1.wait(4000));
155
    QVERIFY(t2.wait(4000));
156
157
    delete semaphore;
158
    semaphore = 0;
159
}
160
161
QTEST_MAIN(tst_Q3Semaphore)
162
#include "tst_q3semaphore.moc"