From ff3595f07fc388dcc2dcadab313451752bf7a122 Mon Sep 17 00:00:00 2001 From: Sami Rosendahl Date: Tue, 27 Mar 2012 11:09:10 +0300 Subject: Add deleteLater() test to tst_qmediaplayerbackend Task-number: QTBUG-24927 Change-Id: Ic58a33aad9038af0325d20bed16d3e70d7e15b5a Reviewed-by: Jason McDonald Reviewed-by: Michael Goddard --- .../tst_qmediaplayerbackend.cpp | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'tests') diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index d40dd2253..d12f5ad41 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -73,6 +73,7 @@ private slots: void unloadMedia(); void playPauseStop(); void processEOS(); + void deleteLaterAtEOS(); void volumeAndMuted(); void volumeAcrossFiles_data(); void volumeAcrossFiles(); @@ -379,6 +380,57 @@ void tst_QMediaPlayerBackend::processEOS() statusSpy.last()[0].value() == QMediaPlayer::LoadedMedia); } +// Helper class for tst_QMediaPlayerBackend::deleteLaterAtEOS() +class DeleteLaterAtEos : public QObject +{ + Q_OBJECT +public: + DeleteLaterAtEos(QMediaPlayer* p) : player(p) + { + } + +public slots: + void play() + { + QVERIFY(connect(player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), + this, SLOT(onMediaStatusChanged(QMediaPlayer::MediaStatus)))); + player->play(); + } + +private slots: + void onMediaStatusChanged(QMediaPlayer::MediaStatus status) + { + if (status == QMediaPlayer::EndOfMedia) { + player-> deleteLater(); + player = 0; + } + } + +private: + QMediaPlayer* player; +}; + +// Regression test for +// QTBUG-24927 - deleteLater() called to QMediaPlayer from its signal handler does not work as expected +void tst_QMediaPlayerBackend::deleteLaterAtEOS() +{ + QPointer player(new QMediaPlayer); + DeleteLaterAtEos deleter(player); + player->setMedia(localWavFile); + + // Create an event loop for verifying deleteLater behavior instead of using + // QTRY_VERIFY or QTest::qWait. QTest::qWait makes extra effort to process + // DeferredDelete events during the wait, which interferes with this test. + QEventLoop loop; + QTimer::singleShot(0, &deleter, SLOT(play())); + QTimer::singleShot(5000, &loop, SLOT(quit())); + connect(player.data(), SIGNAL(destroyed()), &loop, SLOT(quit())); + loop.exec(); + // Verify that the player was destroyed within the event loop. + // This check will fail without the fix for QTBUG-24927. + QVERIFY(player.isNull()); +} + void tst_QMediaPlayerBackend::volumeAndMuted() { //volume and muted properties should be independent -- cgit v1.2.3