From 5dfb698016e28f08eff79c7e797724ab92b07dcd Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 3 Jan 2012 13:29:28 +0100 Subject: QAudioIn/Output-tests: Remove SRCDIR-macro/stabilize. - Introduce QTemporaryDir to create a temporary directory to write the files, preventing file open failures caused by left-overs of failed tests. - Use smart pointers for files and QTemporaryDir to ensure that files and the directory are always cleaned up at destruction time. Change-Id: Icfbb331dbdd586012b5787f91c36e164033c4120 Reviewed-by: Michael Goddard --- tests/auto/integration/qaudioinput/qaudioinput.pro | 2 - .../integration/qaudioinput/tst_qaudioinput.cpp | 71 +++++----- .../auto/integration/qaudiooutput/qaudiooutput.pro | 2 - .../integration/qaudiooutput/tst_qaudiooutput.cpp | 145 ++++++++++----------- 4 files changed, 105 insertions(+), 115 deletions(-) (limited to 'tests/auto') diff --git a/tests/auto/integration/qaudioinput/qaudioinput.pro b/tests/auto/integration/qaudioinput/qaudioinput.pro index b70c6ee48..32839714c 100644 --- a/tests/auto/integration/qaudioinput/qaudioinput.pro +++ b/tests/auto/integration/qaudioinput/qaudioinput.pro @@ -6,7 +6,5 @@ CONFIG += no_private_qt_headers_warning # This is more of a system test # CONFIG += testcase -DEFINES += SRCDIR=\\\"$$PWD/\\\" - HEADERS += wavheader.h SOURCES += wavheader.cpp tst_qaudioinput.cpp diff --git a/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp b/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp index a70af910d..afff5b962 100755 --- a/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp +++ b/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp @@ -41,6 +41,9 @@ #include #include +#include +#include +#include #include #include @@ -98,15 +101,15 @@ private slots: void reset(); - void cleanupTestCase(); - private: + typedef QSharedPointer FilePtr; + QString formatToFileName(const QAudioFormat &format); - QString workingDir(); QAudioDeviceInfo audioDevice; QList testFormats; - QList audioFiles; + QList audioFiles; + QScopedPointer m_temporaryDir; QScopedPointer m_byteArray; QScopedPointer m_buffer; @@ -128,17 +131,6 @@ QString tst_QAudioInput::formatToFileName(const QAudioFormat &format) .arg(format.channels()); } - -QString tst_QAudioInput::workingDir() -{ - QDir working(QString(SRCDIR)); - - if (working.exists()) - return QString(SRCDIR); - - return QDir::currentPath(); -} - void tst_QAudioInput::initTestCase() { qRegisterMetaType(); @@ -197,9 +189,19 @@ void tst_QAudioInput::initTestCase() QVERIFY(testFormats.size()); + const QChar slash = QLatin1Char('/'); + QString temporaryPattern = QDir::tempPath(); + if (!temporaryPattern.endsWith(slash)) + temporaryPattern += slash; + temporaryPattern += "tst_qaudioinputXXXXXX"; + m_temporaryDir.reset(new QTemporaryDir(temporaryPattern)); + m_temporaryDir->setAutoRemove(true); + QVERIFY(m_temporaryDir->isValid()); + + const QString temporaryAudioPath = m_temporaryDir->path() + slash; foreach (const QAudioFormat &format, testFormats) { - QFile* file = new QFile(workingDir() + formatToFileName(format) + QString(".wav")); - audioFiles.append(file); + const QString fileName = temporaryAudioPath + formatToFileName(format) + QStringLiteral(".wav"); + audioFiles.append(FilePtr(new QFile(fileName))); } } @@ -343,13 +345,14 @@ void tst_QAudioInput::disableNotifyInterval() QAudioInput audioInputCheck(testFormats.at(0), this); audioInputCheck.setNotifyInterval(0); QSignalSpy notifySignal(&audioInputCheck, SIGNAL(notify())); - audioFiles.at(0)->open(QIODevice::WriteOnly); - audioInputCheck.start(audioFiles.at(0)); + QFile *audioFile = audioFiles.at(0).data(); + audioFile->open(QIODevice::WriteOnly); + audioInputCheck.start(audioFile); QTest::qWait(3000); // 3 seconds should be plenty audioInputCheck.stop(); QVERIFY2((notifySignal.count() == 0), QString("didn't disable notify interval: shouldn't have got any but got %1").arg(notifySignal.count()).toLocal8Bit().constData()); - audioFiles.at(0)->close(); + audioFile->close(); } } @@ -417,6 +420,7 @@ void tst_QAudioInput::pull() { for(int i=0; iclose(); - audioFiles.at(i)->open(QIODevice::WriteOnly); + audioFile->close(); + audioFile->open(QIODevice::WriteOnly); WavHeader wavHeader(testFormats.at(i)); - QVERIFY(wavHeader.write(*audioFiles.at(i))); + QVERIFY(wavHeader.write(*audioFile)); - audioInput.start(audioFiles.at(i)); + audioInput.start(audioFile); // Check that QAudioInput immediately transitions to ActiveState or IdleState QTRY_VERIFY2((stateSignal.count() > 0),"didn't emit signals on start()"); @@ -467,8 +471,8 @@ void tst_QAudioInput::pull() QVERIFY2((notifySignal.count() > 20 && notifySignal.count() < 40), QString("notify() signals emitted (%1) should be 30").arg(notifySignal.count()).toLocal8Bit().constData()); - WavHeader::writeDataLength(*audioFiles.at(i),audioFiles.at(i)->pos()-WavHeader::headerLength()); - audioFiles.at(i)->close(); + WavHeader::writeDataLength(*audioFile, audioFile->pos() - WavHeader::headerLength()); + audioFile->close(); } } @@ -476,6 +480,7 @@ void tst_QAudioInput::pullSuspendResume() { for(int i=0; i 0),"didn't emit signals on start()"); @@ -561,7 +566,7 @@ void tst_QAudioInput::pullSuspendResume() QString("notify() signals emitted (%1) should be 30").arg(notifySignal.count()).toLocal8Bit().constData()); WavHeader::writeDataLength(*audioFiles.at(i),audioFiles.at(i)->pos()-WavHeader::headerLength()); - audioFiles.at(i)->close(); + audioFile->close(); } } @@ -835,16 +840,6 @@ void tst_QAudioInput::reset() } } -void tst_QAudioInput::cleanupTestCase() -{ - QFile* file; - - foreach (file, audioFiles) { - file->remove(); - delete file; - } -} - QTEST_MAIN(tst_QAudioInput) #include "tst_qaudioinput.moc" diff --git a/tests/auto/integration/qaudiooutput/qaudiooutput.pro b/tests/auto/integration/qaudiooutput/qaudiooutput.pro index e3b50509e..d6a618ebf 100644 --- a/tests/auto/integration/qaudiooutput/qaudiooutput.pro +++ b/tests/auto/integration/qaudiooutput/qaudiooutput.pro @@ -6,7 +6,5 @@ CONFIG += no_private_qt_headers_warning # This is more of a system test # CONFIG += testcase -DEFINES += SRCDIR=\\\"$$PWD/\\\" - HEADERS += wavheader.h SOURCES += wavheader.cpp tst_qaudiooutput.cpp diff --git a/tests/auto/integration/qaudiooutput/tst_qaudiooutput.cpp b/tests/auto/integration/qaudiooutput/tst_qaudiooutput.cpp index aa32a2d50..a86ecdeb4 100755 --- a/tests/auto/integration/qaudiooutput/tst_qaudiooutput.cpp +++ b/tests/auto/integration/qaudiooutput/tst_qaudiooutput.cpp @@ -43,6 +43,9 @@ #include #include +#include +#include +#include #include #include @@ -97,16 +100,16 @@ private slots: void pushSuspendResume(); void pushUnderrun(); - void cleanupTestCase(); - private: + typedef QSharedPointer FilePtr; + QString formatToFileName(const QAudioFormat &format); - QString workingDir(); void createSineWaveData(const QAudioFormat &format, qint64 length, int frequency = 440); QAudioDeviceInfo audioDevice; QList testFormats; - QList audioFiles; + QList audioFiles; + QScopedPointer m_temporaryDir; QScopedPointer m_byteArray; QScopedPointer m_buffer; @@ -128,17 +131,6 @@ QString tst_QAudioOutput::formatToFileName(const QAudioFormat &format) .arg(format.channels()); } - -QString tst_QAudioOutput::workingDir() -{ - QDir working(QString(SRCDIR)); - - if (working.exists()) - return QString(SRCDIR); - - return QDir::currentPath(); -} - void tst_QAudioOutput::createSineWaveData(const QAudioFormat &format, qint64 length, int frequency) { const int channelBytes = format.sampleSize() / 8; @@ -242,18 +234,29 @@ void tst_QAudioOutput::initTestCase() QVERIFY(testFormats.size()); + const QChar slash = QLatin1Char('/'); + QString temporaryPattern = QDir::tempPath(); + if (!temporaryPattern.endsWith(slash)) + temporaryPattern += slash; + temporaryPattern += "tst_qaudiooutputXXXXXX"; + m_temporaryDir.reset(new QTemporaryDir(temporaryPattern)); + m_temporaryDir->setAutoRemove(true); + QVERIFY(m_temporaryDir->isValid()); + + const QString temporaryAudioPath = m_temporaryDir->path() + slash; foreach (const QAudioFormat &format, testFormats) { qint64 len = (format.frequency()*format.channels()*(format.sampleSize()/8)*2); // 2 seconds createSineWaveData(format, len); // Write generate sine wave data to file - QFile* file = new QFile(workingDir() + QString("generated") + formatToFileName(format) + QString(".wav")); - if (file->open(QIODevice::WriteOnly)) { - WavHeader wavHeader(format, len); - wavHeader.write(*file); - file->write(m_byteArray->data(), len); - file->close(); - audioFiles.append(file); - } + const QString fileName = temporaryAudioPath + QStringLiteral("generated") + + formatToFileName(format) + QStringLiteral(".wav"); + FilePtr file(new QFile(fileName)); + QVERIFY2(file->open(QIODevice::WriteOnly), qPrintable(file->errorString())); + WavHeader wavHeader(format, len); + wavHeader.write(*file.data()); + file->write(m_byteArray->data(), len); + file->close(); + audioFiles.append(file); } } @@ -396,13 +399,14 @@ void tst_QAudioOutput::disableNotifyInterval() QAudioOutput audioOutputCheck(testFormats.at(0), this); audioOutputCheck.setNotifyInterval(0); QSignalSpy notifySignal(&audioOutputCheck, SIGNAL(notify())); - audioFiles.at(0)->open(QIODevice::ReadOnly); - audioOutputCheck.start(audioFiles.at(0)); + QFile *audioFile = audioFiles.at(0).data(); + audioFile->open(QIODevice::ReadOnly); + audioOutputCheck.start(audioFile); QTest::qWait(3000); // 3 seconds should be plenty audioOutputCheck.stop(); QVERIFY2((notifySignal.count() == 0), QString("didn't disable notify interval: shouldn't have got any but got %1").arg(notifySignal.count()).toLocal8Bit().constData()); - audioFiles.at(0)->close(); + audioFile->close(); } } @@ -481,11 +485,12 @@ void tst_QAudioOutput::pull() QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()"); QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation"); - audioFiles.at(i)->close(); - audioFiles.at(i)->open(QIODevice::ReadOnly); - audioFiles.at(i)->seek(WavHeader::headerLength()); + QFile *audioFile = audioFiles.at(i).data(); + audioFile->close(); + audioFile->open(QIODevice::ReadOnly); + audioFile->seek(WavHeader::headerLength()); - audioOutput.start(audioFiles.at(i)); + audioOutput.start(audioFile); // Check that QAudioOutput immediately transitions to ActiveState QTRY_VERIFY2((stateSignal.count() == 1), @@ -502,7 +507,7 @@ void tst_QAudioOutput::pull() // Wait until playback finishes QTest::qWait(3000); // 3 seconds should be plenty - QVERIFY2(audioFiles.at(i)->atEnd(), "didn't play to EOF"); + QVERIFY2(audioFile->atEnd(), "didn't play to EOF"); QVERIFY2((stateSignal.count() == 1), QString("didn't emit IdleState signal when at EOF, got %1 signals instead").arg(stateSignal.count()).toLocal8Bit().constData()); QVERIFY2((audioOutput.state() == QAudio::IdleState), "didn't transitions to IdleState when at EOF"); @@ -523,7 +528,7 @@ void tst_QAudioOutput::pull() QVERIFY2((notifySignal.count() > 15 && notifySignal.count() < 25), QString("too many notify() signals emitted (%1)").arg(notifySignal.count()).toLocal8Bit().constData()); - audioFiles.at(i)->close(); + audioFile->close(); } } @@ -542,11 +547,12 @@ void tst_QAudioOutput::pullSuspendResume() QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()"); QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation"); - audioFiles.at(i)->close(); - audioFiles.at(i)->open(QIODevice::ReadOnly); - audioFiles.at(i)->seek(WavHeader::headerLength()); + QFile *audioFile = audioFiles.at(i).data(); + audioFile->close(); + audioFile->open(QIODevice::ReadOnly); + audioFile->seek(WavHeader::headerLength()); - audioOutput.start(audioFiles.at(i)); + audioOutput.start(audioFile); // Check that QAudioOutput immediately transitions to ActiveState QTRY_VERIFY2((stateSignal.count() == 1), QString("didn't emit signal on start(), got %1 signals instead").arg(stateSignal.count()).toLocal8Bit().constData()); @@ -592,7 +598,7 @@ void tst_QAudioOutput::pullSuspendResume() // Wait until playback finishes QTest::qWait(3000); // 3 seconds should be plenty - QVERIFY2(audioFiles.at(i)->atEnd(), "didn't play to EOF"); + QVERIFY2(audioFile->atEnd(), "didn't play to EOF"); QVERIFY2((stateSignal.count() == 1), QString("didn't emit IdleState signal when at EOF, got %1 signals instead").arg(stateSignal.count()).toLocal8Bit().constData()); QVERIFY2((audioOutput.state() == QAudio::IdleState), "didn't transitions to IdleState when at EOF"); @@ -611,7 +617,7 @@ void tst_QAudioOutput::pullSuspendResume() QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after stop()"); QVERIFY2((audioOutput.elapsedUSecs() == (qint64)0), "elapsedUSecs() not equal to zero in StoppedState"); - audioFiles.at(i)->close(); + audioFile->close(); } } @@ -630,9 +636,10 @@ void tst_QAudioOutput::push() QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()"); QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation"); - audioFiles.at(i)->close(); - audioFiles.at(i)->open(QIODevice::ReadOnly); - audioFiles.at(i)->seek(WavHeader::headerLength()); + QFile *audioFile = audioFiles.at(i).data(); + audioFile->close(); + audioFile->open(QIODevice::ReadOnly); + audioFile->seek(WavHeader::headerLength()); QIODevice* feed = audioOutput.start(); @@ -653,10 +660,10 @@ void tst_QAudioOutput::push() bool firstBuffer = true; QByteArray buffer(AUDIO_BUFFER, 0); - while (written < audioFiles.at(i)->size()-WavHeader::headerLength()) { + while (written < audioFile->size()-WavHeader::headerLength()) { if (audioOutput.bytesFree() >= audioOutput.periodSize()) { - qint64 len = audioFiles.at(i)->read(buffer.data(),audioOutput.periodSize()); + qint64 len = audioFile->read(buffer.data(),audioOutput.periodSize()); written += feed->write(buffer.constData(), len); if (firstBuffer) { @@ -676,7 +683,7 @@ void tst_QAudioOutput::push() // Wait until playback finishes QTest::qWait(3000); // 3 seconds should be plenty - QVERIFY2(audioFiles.at(i)->atEnd(), "didn't play to EOF"); + QVERIFY2(audioFile->atEnd(), "didn't play to EOF"); QVERIFY2((stateSignal.count() == 1), QString("didn't emit IdleState signal when at EOF, got %1 signals instead").arg(stateSignal.count()).toLocal8Bit().constData()); QVERIFY2((audioOutput.state() == QAudio::IdleState), "didn't transitions to IdleState when at EOF"); @@ -697,7 +704,7 @@ void tst_QAudioOutput::push() QVERIFY2((notifySignal.count() > 15 && notifySignal.count() < 25), QString("too many notify() signals emitted (%1)").arg(notifySignal.count()).toLocal8Bit().constData()); - audioFiles.at(i)->close(); + audioFile->close(); } } @@ -716,9 +723,10 @@ void tst_QAudioOutput::pushSuspendResume() QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()"); QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation"); - audioFiles.at(i)->close(); - audioFiles.at(i)->open(QIODevice::ReadOnly); - audioFiles.at(i)->seek(WavHeader::headerLength()); + QFile *audioFile = audioFiles.at(i).data(); + audioFile->close(); + audioFile->open(QIODevice::ReadOnly); + audioFile->seek(WavHeader::headerLength()); QIODevice* feed = audioOutput.start(); @@ -740,10 +748,10 @@ void tst_QAudioOutput::pushSuspendResume() QByteArray buffer(AUDIO_BUFFER, 0); // Play half of the clip - while (written < (audioFiles.at(i)->size()-WavHeader::headerLength())/2) { + while (written < (audioFile->size()-WavHeader::headerLength())/2) { if (audioOutput.bytesFree() >= audioOutput.periodSize()) { - qint64 len = audioFiles.at(i)->read(buffer.data(),audioOutput.periodSize()); + qint64 len = audioFile->read(buffer.data(),audioOutput.periodSize()); written += feed->write(buffer.constData(), len); if (firstBuffer) { @@ -792,9 +800,9 @@ void tst_QAudioOutput::pushSuspendResume() stateSignal.clear(); // Play rest of the clip - while (!audioFiles.at(i)->atEnd()) { + while (!audioFile->atEnd()) { if (audioOutput.bytesFree() >= audioOutput.periodSize()) { - qint64 len = audioFiles.at(i)->read(buffer.data(),audioOutput.periodSize()); + qint64 len = audioFile->read(buffer.data(),audioOutput.periodSize()); written += feed->write(buffer.constData(), len); } else QTest::qWait(20); @@ -804,7 +812,7 @@ void tst_QAudioOutput::pushSuspendResume() // Wait until playback finishes QTest::qWait(1000); // 1 seconds should be plenty - QVERIFY2(audioFiles.at(i)->atEnd(), "didn't play to EOF"); + QVERIFY2(audioFile->atEnd(), "didn't play to EOF"); QVERIFY2((stateSignal.count() == 1), QString("didn't emit IdleState signal when at EOF, got %1 signals instead").arg(stateSignal.count()).toLocal8Bit().constData()); QVERIFY2((audioOutput.state() == QAudio::IdleState), "didn't transitions to IdleState when at EOF"); @@ -823,7 +831,7 @@ void tst_QAudioOutput::pushSuspendResume() QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after stop()"); QVERIFY2((audioOutput.elapsedUSecs() == (qint64)0), "elapsedUSecs() not equal to zero in StoppedState"); - audioFiles.at(i)->close(); + audioFile->close(); } } @@ -842,9 +850,10 @@ void tst_QAudioOutput::pushUnderrun() QVERIFY2((audioOutput.error() == QAudio::NoError), "error() was not set to QAudio::NoError before start()"); QVERIFY2((audioOutput.elapsedUSecs() == qint64(0)),"elapsedUSecs() not zero on creation"); - audioFiles.at(i)->close(); - audioFiles.at(i)->open(QIODevice::ReadOnly); - audioFiles.at(i)->seek(WavHeader::headerLength()); + QFile *audioFile = audioFiles.at(i).data(); + audioFile->close(); + audioFile->open(QIODevice::ReadOnly); + audioFile->seek(WavHeader::headerLength()); QIODevice* feed = audioOutput.start(); @@ -866,10 +875,10 @@ void tst_QAudioOutput::pushUnderrun() QByteArray buffer(AUDIO_BUFFER, 0); // Play half of the clip - while (written < (audioFiles.at(i)->size()-WavHeader::headerLength())/2) { + while (written < (audioFile->size()-WavHeader::headerLength())/2) { if (audioOutput.bytesFree() >= audioOutput.periodSize()) { - qint64 len = audioFiles.at(i)->read(buffer.data(),audioOutput.periodSize()); + qint64 len = audioFile->read(buffer.data(),audioOutput.periodSize()); written += feed->write(buffer.constData(), len); if (firstBuffer) { @@ -898,9 +907,9 @@ void tst_QAudioOutput::pushUnderrun() firstBuffer = true; // Play rest of the clip - while (!audioFiles.at(i)->atEnd()) { + while (!audioFile->atEnd()) { if (audioOutput.bytesFree() >= audioOutput.periodSize()) { - qint64 len = audioFiles.at(i)->read(buffer.data(),audioOutput.periodSize()); + qint64 len = audioFile->read(buffer.data(),audioOutput.periodSize()); written += feed->write(buffer.constData(), len); if (firstBuffer) { // Check for transition to ActiveState when data is provided @@ -919,7 +928,7 @@ void tst_QAudioOutput::pushUnderrun() // Wait until playback finishes QTest::qWait(1000); // 1 seconds should be plenty - QVERIFY2(audioFiles.at(i)->atEnd(), "didn't play to EOF"); + QVERIFY2(audioFile->atEnd(), "didn't play to EOF"); QVERIFY2((stateSignal.count() == 1), QString("didn't emit IdleState signal when at EOF, got %1 signals instead").arg(stateSignal.count()).toLocal8Bit().constData()); QVERIFY2((audioOutput.state() == QAudio::IdleState), "didn't transitions to IdleState when at EOF"); @@ -938,17 +947,7 @@ void tst_QAudioOutput::pushUnderrun() QVERIFY2((audioOutput.error() == QAudio::NoError), "error() is not QAudio::NoError after stop()"); QVERIFY2((audioOutput.elapsedUSecs() == (qint64)0), "elapsedUSecs() not equal to zero in StoppedState"); - audioFiles.at(i)->close(); - } -} - -void tst_QAudioOutput::cleanupTestCase() -{ - QFile* file; - - foreach (file, audioFiles) { - file->remove(); - delete file; + audioFile->close(); } } -- cgit v1.2.3