Add option (enabled by default) to omit the sender from a slot's arguments. In most...
[qtgstreamer:qtgstreamer.git] / tests / bustest.cpp
1 /*
2     Copyright (C) 2010  George Kiagiadakis <kiagiadakis.george@gmail.com>
3
4     This library is free software; you can redistribute it and/or modify
5     it under the terms of the GNU Lesser General Public License as published
6     by the Free Software Foundation; either version 2.1 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU Lesser General Public License
15     along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17 #include "qgsttest.h"
18 #include <QGlib/Signal>
19 #include <QGst/Bus>
20 #include <QGst/Structure>
21 #include <QGst/Message>
22
23 class BusTest : public QGstTest
24 {
25     Q_OBJECT
26 private:
27     void messageClosure(const QGst::MessagePtr &);
28
29 private Q_SLOTS:
30     void watchTest();
31
32 private:
33     QEventLoop m_eventLoop;
34     int m_messagesReceived;
35 };
36
37 class MessagePushThread : public QThread
38 {
39 public:
40     QGst::BusPtr bus;
41
42 private:
43     virtual void run();
44 };
45
46 void MessagePushThread::run()
47 {
48     for (int i=0; i<10; ++i) {
49         QGst::Structure s("test");
50         s.setValue("sequence", i);
51         QGst::MessagePtr msg = QGst::ApplicationMessage::create(bus, s);
52         QVERIFY(!msg.isNull());
53         bus->post(msg);
54
55         if (i > 5) {
56             msleep(10); //add some delay for some messages
57         }
58     }
59 }
60
61 void BusTest::messageClosure(const QGst::MessagePtr & msg)
62 {
63     //we should receive this signal from the main thread
64     QCOMPARE(QThread::currentThread(), QCoreApplication::instance()->thread());
65
66     //check if the message is the same we sent from the other thread
67     QVERIFY(!msg.isNull());
68     QCOMPARE(msg->type(), QGst::MessageApplication);
69     const QGst::SharedStructure s = msg->structure();
70     QCOMPARE(s.name(), QString("test"));
71     QCOMPARE(s.value("sequence").get<int>(), m_messagesReceived);
72
73     if (++m_messagesReceived == 10) {
74         m_eventLoop.exit(1);
75     }
76 }
77
78 void BusTest::watchTest()
79 {
80     MessagePushThread thread;
81     thread.bus = QGst::Bus::create();
82
83     m_messagesReceived = 0;
84     thread.bus->addSignalWatch();
85     QGlib::Signal::connect(thread.bus, "message", this, &BusTest::messageClosure);
86
87     thread.start();
88
89     //kill the event loop after 5 seconds
90     QTimer::singleShot(5000, &m_eventLoop, SLOT(quit()));
91     int code = m_eventLoop.exec();
92     QCOMPARE(code, 1); //we get 1 if we quit from messageClosure and 0 if we quit from the timer
93     QCOMPARE(m_messagesReceived, 10);
94
95     thread.wait(); //allow the thread to cleanup properly
96 }
97
98 QTEST_MAIN(BusTest)
99
100 #include "moc_qgsttest.cpp"
101 #include "bustest.moc"