diff options
Diffstat (limited to 'tests/auto/unit/multimedia/qwavedecoder')
25 files changed, 334 insertions, 0 deletions
diff --git a/tests/auto/unit/multimedia/qwavedecoder/CMakeLists.txt b/tests/auto/unit/multimedia/qwavedecoder/CMakeLists.txt new file mode 100644 index 000000000..4567e95ac --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qwavedecoder.pro. + +##################################################################### +## tst_qwavedecoder Test: +##################################################################### + +# Collect test data +file(GLOB_RECURSE test_data_glob + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + data/*) +list(APPEND test_data ${test_data_glob}) + +qt_internal_add_test(tst_qwavedecoder + SOURCES + tst_qwavedecoder.cpp + LIBRARIES + Qt::Gui + Qt::MultimediaPrivate + Qt::Network + TESTDATA ${test_data} +) diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_datadesc_1_16_8000.le.wav b/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_datadesc_1_16_8000.le.wav Binary files differnew file mode 100644 index 000000000..b6eac4d70 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_datadesc_1_16_8000.le.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_fmtdesc_1_16_8000.le.wav b/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_fmtdesc_1_16_8000.le.wav Binary files differnew file mode 100644 index 000000000..2f0da1370 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_fmtdesc_1_16_8000.le.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_fmtstring_1_16_8000.le.wav b/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_fmtstring_1_16_8000.le.wav Binary files differnew file mode 100644 index 000000000..b14a53c9e --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/corrupt_fmtstring_1_16_8000.le.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/empty.wav b/tests/auto/unit/multimedia/qwavedecoder/data/empty.wav new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/empty.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/gendata.sh b/tests/auto/unit/multimedia/qwavedecoder/data/gendata.sh new file mode 100755 index 000000000..99a04129b --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/gendata.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Copyright (C) 2016 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +# Generate some simple test data. Uses "sox". + +endian="" +endian_extn="" + +for channel in 1 2; do + if [ $channel -eq 1 ]; then + endian="little" + endian_extn="le" + fi + + if [ $channel -eq 2 ]; then + endian="big" + endian_extn="be" + fi + for samplebits in 8 16 32; do + for samplerate in 44100 8000; do + if [ $samplebits -ne 8 ]; then + sox -n --endian "${endian}" -c ${channel} -b ${samplebits} -r ${samplerate} isawav_${channel}_${samplebits}_${samplerate}_${endian_extn}.wav synth 0.25 sine 300-3300 + else + sox -n -c ${channel} -b ${samplebits} -r ${samplerate} isawav_${channel}_${samplebits}_${samplerate}.wav synth 0.25 sine 300-3300 + fi + done + done +done + diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_44100_le.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_44100_le.wav Binary files differnew file mode 100644 index 000000000..88b1a8379 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_44100_le.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_44100_le_2.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_44100_le_2.wav Binary files differnew file mode 100644 index 000000000..087e68e82 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_44100_le_2.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_8000_le.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_8000_le.wav Binary files differnew file mode 100644 index 000000000..83a405907 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_16_8000_le.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_32_44100_le.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_32_44100_le.wav Binary files differnew file mode 100644 index 000000000..9c437b155 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_32_44100_le.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_32_8000_le.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_32_8000_le.wav Binary files differnew file mode 100644 index 000000000..f90a8bc35 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_32_8000_le.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_44100.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_44100.wav Binary files differnew file mode 100644 index 000000000..7d10829ea --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_44100.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000.wav Binary files differnew file mode 100644 index 000000000..76c08e89e --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000_even_bext.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000_even_bext.wav Binary files differnew file mode 100644 index 000000000..531b0ee58 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000_even_bext.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000_odd_bext.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000_odd_bext.wav Binary files differnew file mode 100644 index 000000000..467be6312 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_1_8_8000_odd_bext.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_16_44100_be.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_16_44100_be.wav Binary files differnew file mode 100644 index 000000000..ca0cd425a --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_16_44100_be.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_16_8000_be.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_16_8000_be.wav Binary files differnew file mode 100644 index 000000000..3a684590b --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_16_8000_be.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_32_44100_be.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_32_44100_be.wav Binary files differnew file mode 100644 index 000000000..f1aaf2906 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_32_44100_be.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_32_8000_be.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_32_8000_be.wav Binary files differnew file mode 100644 index 000000000..c10c20872 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_32_8000_be.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_8_44100.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_8_44100.wav Binary files differnew file mode 100644 index 000000000..befd02baf --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_8_44100.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_8_8000.wav b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_8_8000.wav Binary files differnew file mode 100644 index 000000000..ce8b0d06a --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/isawav_2_8_8000.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/nosampledata.wav b/tests/auto/unit/multimedia/qwavedecoder/data/nosampledata.wav Binary files differnew file mode 100644 index 000000000..8dbde9545 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/nosampledata.wav diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/notawav.wav b/tests/auto/unit/multimedia/qwavedecoder/data/notawav.wav new file mode 100644 index 000000000..36a20ea05 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/notawav.wav @@ -0,0 +1 @@ +Ceci n'est pas une wav file diff --git a/tests/auto/unit/multimedia/qwavedecoder/data/onebyte.wav b/tests/auto/unit/multimedia/qwavedecoder/data/onebyte.wav new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/data/onebyte.wav @@ -0,0 +1 @@ +1 diff --git a/tests/auto/unit/multimedia/qwavedecoder/tst_qwavedecoder.cpp b/tests/auto/unit/multimedia/qwavedecoder/tst_qwavedecoder.cpp new file mode 100644 index 000000000..079f98075 --- /dev/null +++ b/tests/auto/unit/multimedia/qwavedecoder/tst_qwavedecoder.cpp @@ -0,0 +1,278 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QtTest/QtTest> +#include <qwavedecoder.h> + +#include <QNetworkAccessManager> +#include <QNetworkRequest> +#include <QNetworkReply> + +class tst_QWaveDecoder : public QObject +{ + Q_OBJECT +public: + enum Corruption { + None = 1, + NotAWav = 2, + NoSampleData = 4, + FormatDescriptor = 8, + FormatString = 16, + DataDescriptor = 32 + }; + +public slots: + + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + +private slots: + + void file_data(); + void file(); + + void http_data() {file_data();} + void http(); + + void readAllAtOnce(); + void readPerByte(); +}; + +void tst_QWaveDecoder::init() +{ +} + +void tst_QWaveDecoder::cleanup() +{ +} + +void tst_QWaveDecoder::initTestCase() +{ +} + +void tst_QWaveDecoder::cleanupTestCase() +{ +} + +static QString testFilePath(const char *filename) +{ + QString path = QStringLiteral("data/%1").arg(filename); + return QFINDTESTDATA(path); +} + +void tst_QWaveDecoder::file_data() +{ + QTest::addColumn<QString>("file"); + QTest::addColumn<tst_QWaveDecoder::Corruption>("corruption"); + QTest::addColumn<int>("channels"); + QTest::addColumn<int>("samplesize"); + QTest::addColumn<int>("samplerate"); + + QTest::newRow("File is empty") << testFilePath("empty.wav") << tst_QWaveDecoder::NotAWav << -1 << -1 << -1; + QTest::newRow("File is one byte") << testFilePath("onebyte.wav") << tst_QWaveDecoder::NotAWav << -1 << -1 << -1; + QTest::newRow("File is not a wav(text)") << testFilePath("notawav.wav") << tst_QWaveDecoder::NotAWav << -1 << -1 << -1; + QTest::newRow("Wav file has no sample data") << testFilePath("nosampledata.wav") << tst_QWaveDecoder::NoSampleData << -1 << -1 << -1; + QTest::newRow("corrupt fmt chunk descriptor") << testFilePath("corrupt_fmtdesc_1_16_8000.le.wav") << tst_QWaveDecoder::FormatDescriptor << -1 << -1 << -1; + QTest::newRow("corrupt fmt string") << testFilePath("corrupt_fmtstring_1_16_8000.le.wav") << tst_QWaveDecoder::FormatString << -1 << -1 << -1; + QTest::newRow("corrupt data chunk descriptor") << testFilePath("corrupt_datadesc_1_16_8000.le.wav") << tst_QWaveDecoder::DataDescriptor << -1 << -1 << -1; + + QTest::newRow("File isawav_1_8_8000.wav") << testFilePath("isawav_1_8_8000.wav") << tst_QWaveDecoder::None << 1 << 8 << 8000; + QTest::newRow("File isawav_1_8_44100.wav") << testFilePath("isawav_1_8_44100.wav") << tst_QWaveDecoder::None << 1 << 8 << 44100; + QTest::newRow("File isawav_2_8_8000.wav") << testFilePath("isawav_2_8_8000.wav") << tst_QWaveDecoder::None << 2 << 8 << 8000; + QTest::newRow("File isawav_2_8_44100.wav") << testFilePath("isawav_2_8_44100.wav") << tst_QWaveDecoder::None << 2 << 8 << 44100; + + QTest::newRow("File isawav_1_16_8000_le.wav") << testFilePath("isawav_1_16_8000_le.wav") << tst_QWaveDecoder::None << 1 << 16 << 8000; + QTest::newRow("File isawav_1_16_44100_le.wav") << testFilePath("isawav_1_16_44100_le.wav") << tst_QWaveDecoder::None << 1 << 16 << 44100; + QTest::newRow("File isawav_2_16_8000_be.wav") << testFilePath("isawav_2_16_8000_be.wav") << tst_QWaveDecoder::None << 2 << 16 << 8000; + QTest::newRow("File isawav_2_16_44100_be.wav") << testFilePath("isawav_2_16_44100_be.wav") << tst_QWaveDecoder::None << 2 << 16 << 44100; + // The next file has extra data in the wave header. + QTest::newRow("File isawav_1_16_44100_le_2.wav") << testFilePath("isawav_1_16_44100_le_2.wav") << tst_QWaveDecoder::None << 1 << 16 << 44100; + // The next file has embedded bext chunk with odd payload (QTBUG-122193) + QTest::newRow("File isawav_1_8_8000_odd_bext.wav") << testFilePath("isawav_1_8_8000_odd_bext.wav") << tst_QWaveDecoder::None << 1 << 8 << 8000; + // The next file has embedded bext chunk with even payload + QTest::newRow("File isawav_1_8_8000_even_bext.wav") << testFilePath("isawav_1_8_8000_even_bext.wav") << tst_QWaveDecoder::None << 1 << 8 << 8000; + // 32 bit waves are not supported + QTest::newRow("File isawav_1_32_8000_le.wav") << testFilePath("isawav_1_32_8000_le.wav") << tst_QWaveDecoder::FormatDescriptor << 1 << 32 << 8000; + QTest::newRow("File isawav_1_32_44100_le.wav") << testFilePath("isawav_1_32_44100_le.wav") << tst_QWaveDecoder::FormatDescriptor << 1 << 32 << 44100; + QTest::newRow("File isawav_2_32_8000_be.wav") << testFilePath("isawav_2_32_8000_be.wav") << tst_QWaveDecoder::FormatDescriptor << 2 << 32 << 8000; + QTest::newRow("File isawav_2_32_44100_be.wav") << testFilePath("isawav_2_32_44100_be.wav") << tst_QWaveDecoder::FormatDescriptor << 2 << 32 << 44100; +} + +void tst_QWaveDecoder::file() +{ + QFETCH(QString, file); + QFETCH(tst_QWaveDecoder::Corruption, corruption); + QFETCH(int, channels); + QFETCH(int, samplesize); + QFETCH(int, samplerate); + + QFile stream; + stream.setFileName(file); + stream.open(QIODevice::ReadOnly); + + QVERIFY(stream.isOpen()); + + QWaveDecoder waveDecoder(&stream); + QSignalSpy validFormatSpy(&waveDecoder, &QWaveDecoder::formatKnown); + QSignalSpy parsingErrorSpy(&waveDecoder, &QWaveDecoder::parsingError); + + QVERIFY(waveDecoder.open(QIODeviceBase::ReadOnly)); + + if (corruption == NotAWav) { + QSKIP("Not all failures detected correctly yet"); + QTRY_COMPARE(parsingErrorSpy.count(), 1); + QCOMPARE(validFormatSpy.count(), 0); + } else if (corruption == NoSampleData) { + QTRY_COMPARE(validFormatSpy.count(), 1); + QCOMPARE(parsingErrorSpy.count(), 0); + QVERIFY(waveDecoder.audioFormat().isValid()); + QVERIFY(waveDecoder.size() == 0); + QVERIFY(waveDecoder.duration() == 0); + } else if (corruption == FormatDescriptor) { + QTRY_COMPARE(parsingErrorSpy.count(), 1); + QCOMPARE(validFormatSpy.count(), 0); + } else if (corruption == FormatString) { + QTRY_COMPARE(parsingErrorSpy.count(), 1); + QCOMPARE(validFormatSpy.count(), 0); + QVERIFY(!waveDecoder.audioFormat().isValid()); + } else if (corruption == DataDescriptor) { + QTRY_COMPARE(parsingErrorSpy.count(), 1); + QCOMPARE(validFormatSpy.count(), 0); + QVERIFY(waveDecoder.size() == 0); + } else if (corruption == None) { + QTRY_COMPARE(validFormatSpy.count(), 1); + QCOMPARE(parsingErrorSpy.count(), 0); + QVERIFY(waveDecoder.audioFormat().isValid()); + QVERIFY(waveDecoder.size() > 0); + QVERIFY(waveDecoder.duration() == 250); + QAudioFormat format = waveDecoder.audioFormat(); + QVERIFY(format.isValid()); + QVERIFY(format.channelCount() == channels); + QCOMPARE(format.bytesPerSample() * 8, samplesize); + QVERIFY(format.sampleRate() == samplerate); + } + + stream.close(); +} + +void tst_QWaveDecoder::http() +{ + QFETCH(QString, file); + QFETCH(tst_QWaveDecoder::Corruption, corruption); + QFETCH(int, channels); + QFETCH(int, samplesize); + QFETCH(int, samplerate); + + QFile stream; + stream.setFileName(file); + stream.open(QIODevice::ReadOnly); + + QVERIFY(stream.isOpen()); + + QNetworkAccessManager nam; + + QNetworkReply *reply = nam.get(QNetworkRequest(QUrl::fromLocalFile(file))); + + QWaveDecoder waveDecoder(reply); + QSignalSpy validFormatSpy(&waveDecoder, &QWaveDecoder::formatKnown); + QSignalSpy parsingErrorSpy(&waveDecoder, &QWaveDecoder::parsingError); + + QVERIFY(waveDecoder.open(QIODeviceBase::ReadOnly)); + + if (corruption == NotAWav) { + QSKIP("Not all failures detected correctly yet"); + QTRY_COMPARE(parsingErrorSpy.count(), 1); + QCOMPARE(validFormatSpy.count(), 0); + } else if (corruption == NoSampleData) { + QTRY_COMPARE(validFormatSpy.count(), 1); + QCOMPARE(parsingErrorSpy.count(), 0); + QVERIFY(waveDecoder.audioFormat().isValid()); + QVERIFY(waveDecoder.size() == 0); + QVERIFY(waveDecoder.duration() == 0); + } else if (corruption == FormatDescriptor) { + QTRY_COMPARE(parsingErrorSpy.count(), 1); + QCOMPARE(validFormatSpy.count(), 0); + } else if (corruption == FormatString) { + QTRY_COMPARE(parsingErrorSpy.count(), 1); + QCOMPARE(validFormatSpy.count(), 0); + QVERIFY(!waveDecoder.audioFormat().isValid()); + } else if (corruption == DataDescriptor) { + QTRY_COMPARE(parsingErrorSpy.count(), 1); + QCOMPARE(validFormatSpy.count(), 0); + QVERIFY(waveDecoder.size() == 0); + } else if (corruption == None) { + QTRY_COMPARE(validFormatSpy.count(), 1); + QCOMPARE(parsingErrorSpy.count(), 0); + QVERIFY(waveDecoder.audioFormat().isValid()); + QVERIFY(waveDecoder.size() > 0); + QVERIFY(waveDecoder.duration() == 250); + QAudioFormat format = waveDecoder.audioFormat(); + QVERIFY(format.isValid()); + QVERIFY(format.channelCount() == channels); + QCOMPARE(format.bytesPerSample() * 8, samplesize); + QVERIFY(format.sampleRate() == samplerate); + } + + delete reply; +} + +void tst_QWaveDecoder::readAllAtOnce() +{ + QFile stream; + stream.setFileName(testFilePath("isawav_2_8_44100.wav")); + stream.open(QIODevice::ReadOnly); + + QVERIFY(stream.isOpen()); + + QWaveDecoder waveDecoder(&stream); + QSignalSpy validFormatSpy(&waveDecoder, &QWaveDecoder::formatKnown); + + QVERIFY(waveDecoder.open(QIODeviceBase::ReadOnly)); + + QTRY_COMPARE(validFormatSpy.count(), 1); + QVERIFY(waveDecoder.size() > 0); + + QByteArray buffer; + buffer.resize(waveDecoder.size()); + + qint64 readSize = waveDecoder.read(buffer.data(), waveDecoder.size()); + QVERIFY(readSize == waveDecoder.size()); + + readSize = waveDecoder.read(buffer.data(), 1); + QVERIFY(readSize == 0); + + stream.close(); +} + +void tst_QWaveDecoder::readPerByte() +{ + QFile stream; + stream.setFileName(testFilePath("isawav_2_8_44100.wav")); + stream.open(QIODevice::ReadOnly); + + QVERIFY(stream.isOpen()); + + QWaveDecoder waveDecoder(&stream); + QSignalSpy validFormatSpy(&waveDecoder, &QWaveDecoder::formatKnown); + + QVERIFY(waveDecoder.open(QIODeviceBase::ReadOnly)); + + QTRY_COMPARE(validFormatSpy.count(), 1); + QVERIFY(waveDecoder.size() > 0); + + qint64 readSize = 0; + char buf; + for (int ii = 0; ii < waveDecoder.size(); ++ii) + readSize += waveDecoder.read(&buf, 1); + QVERIFY(readSize == waveDecoder.size()); + QVERIFY(waveDecoder.read(&buf,1) == 0); + + stream.close(); +} + +QTEST_MAIN(tst_QWaveDecoder) + +#include "tst_qwavedecoder.moc" + |