summaryrefslogtreecommitdiffstats
path: root/tests/auto/unit/multimedia/qmediarecorder
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/unit/multimedia/qmediarecorder')
-rw-r--r--tests/auto/unit/multimedia/qmediarecorder/CMakeLists.txt20
-rw-r--r--tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp492
2 files changed, 512 insertions, 0 deletions
diff --git a/tests/auto/unit/multimedia/qmediarecorder/CMakeLists.txt b/tests/auto/unit/multimedia/qmediarecorder/CMakeLists.txt
new file mode 100644
index 000000000..83e40012a
--- /dev/null
+++ b/tests/auto/unit/multimedia/qmediarecorder/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Generated from QMediaRecorder.pro.
+
+#####################################################################
+## tst_QMediaRecorder Test:
+#####################################################################
+
+qt_internal_add_test(tst_qmediarecorder
+ SOURCES
+ tst_qmediarecorder.cpp
+ INCLUDE_DIRECTORIES
+ ../../mockbackend
+ LIBRARIES
+ # Remove: L${CMAKE_CURRENT_SOURCE_DIR}
+ Qt::Gui
+ Qt::MultimediaPrivate
+ MockMultimediaPlugin
+)
diff --git a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
new file mode 100644
index 000000000..a11f39207
--- /dev/null
+++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp
@@ -0,0 +1,492 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QtTest/QtTest>
+#include <QDebug>
+#include <QtMultimedia/qmediametadata.h>
+#include <private/qplatformmediarecorder_p.h>
+#include "private/qguiapplication_p.h"
+#include <qmediarecorder.h>
+#include <qaudioformat.h>
+#include <qmockintegration.h>
+#include <qmediacapturesession.h>
+#include <qscreencapture.h>
+#include <qwindowcapture.h>
+
+#include "qguiapplication_platform.h"
+#include "qmockmediacapturesession.h"
+#include "qmockmediaencoder.h"
+
+QT_USE_NAMESPACE
+
+Q_ENABLE_MOCK_MULTIMEDIA_PLUGIN
+
+class tst_QMediaRecorder : public QObject
+{
+ Q_OBJECT
+
+public slots:
+ void initTestCase();
+ void cleanupTestCase();
+
+private slots:
+ void testBasicSession();
+ void testNullControls();
+ void testDeleteMediaCapture();
+ void testError();
+ void testSink();
+ void testRecord();
+ void testEncodingSettings();
+ void testAudioSettings();
+ void testVideoSettings();
+ void testSettingsApplied();
+
+ void metaData();
+
+ void testIsAvailable();
+ void testEnum();
+
+ void testVideoSettingsQuality();
+ void testVideoSettingsEncodingMode();
+
+ void testApplicationInative();
+
+private:
+ QMediaCaptureSession *captureSession;
+ QCamera *object = nullptr;
+ QMockMediaCaptureSession *service = nullptr;
+ QMockMediaEncoder *mock;
+ QMediaRecorder *encoder;
+};
+
+void tst_QMediaRecorder::initTestCase()
+{
+ captureSession = new QMediaCaptureSession;
+ object = new QCamera;
+ encoder = new QMediaRecorder;
+ captureSession->setCamera(object);
+ captureSession->setRecorder(encoder);
+ service = QMockIntegration::instance()->lastCaptureService();
+ mock = service->mockControl;
+}
+
+void tst_QMediaRecorder::cleanupTestCase()
+{
+ delete encoder;
+ delete object;
+ delete captureSession;
+}
+
+void tst_QMediaRecorder::testBasicSession()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ QMediaRecorder recorder;
+ session.setCamera(&camera);
+ session.setRecorder(&recorder);
+
+ QCOMPARE(recorder.outputLocation(), QUrl());
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(recorder.duration(), qint64(0));
+}
+
+void tst_QMediaRecorder::testNullControls()
+{
+ // With the new changes, hasControls does not make much sense anymore
+ // since the session does not own the controls
+ // The equivalent of this test would be to not set the control to the session
+ // ???
+ QMediaCaptureSession session;
+ // mockIntegration->lastCaptureService()->hasControls = false;
+ QCamera camera;
+ QMediaRecorder recorder;
+ session.setCamera(&camera);
+ // session.setRecorder(&recorder);
+
+ QCOMPARE(recorder.outputLocation(), QUrl());
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(recorder.duration(), qint64(0));
+
+ recorder.setOutputLocation(QUrl("file://test/save/file.mp4"));
+ QCOMPARE(recorder.outputLocation(), QUrl("file://test/save/file.mp4"));
+ QCOMPARE(recorder.actualLocation(), QUrl());
+
+ QMediaFormat format;
+ format.setFileFormat(QMediaFormat::MPEG4);
+ format.setAudioCodec(QMediaFormat::AudioCodec::AAC);
+ format.setVideoCodec(QMediaFormat::VideoCodec::VP9);
+ recorder.setMediaFormat(format);
+ recorder.setQuality(QMediaRecorder::LowQuality);
+ recorder.setVideoResolution(640, 480);
+
+ QCOMPARE(recorder.mediaFormat().audioCodec(), QMediaFormat::AudioCodec::AAC);
+ QCOMPARE(recorder.mediaFormat().videoCodec(), QMediaFormat::VideoCodec::VP9);
+ QCOMPARE(recorder.mediaFormat().fileFormat(), QMediaFormat::MPEG4);
+
+ QSignalSpy spy(&recorder, &QMediaRecorder::recorderStateChanged);
+
+ recorder.record();
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(spy.size(), 0);
+
+ recorder.pause();
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(spy.size(), 0);
+
+ recorder.stop();
+ QCOMPARE(recorder.recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(recorder.error(), QMediaRecorder::NoError);
+ QCOMPARE(spy.size(), 0);
+}
+
+void tst_QMediaRecorder::testDeleteMediaCapture()
+{
+ QMediaCaptureSession session;
+ QMediaRecorder recorder;
+
+ session.setRecorder(&recorder);
+
+ auto checkSourceDeleting = [&](auto setter, auto getter, auto signal) {
+ using Type = std::remove_pointer_t<decltype((session.*getter)())>;
+
+ auto errorPrinter = qScopeGuard(
+ []() { qDebug() << QMetaType::fromType<Type>().name() << "deleting failed"; });
+
+ auto capture = std::make_unique<Type>();
+
+ (session.*setter)(capture.get());
+
+ QVERIFY((session.*getter)() == capture.get());
+
+ QSignalSpy spy(&session, signal);
+ capture.reset();
+
+ QCOMPARE(spy.size(), 1);
+ QCOMPARE((session.*getter)(), nullptr);
+
+ QVERIFY(recorder.isAvailable());
+
+ errorPrinter.dismiss();
+ };
+
+ checkSourceDeleting(&QMediaCaptureSession::setImageCapture,
+ &QMediaCaptureSession::imageCapture,
+ &QMediaCaptureSession::imageCaptureChanged);
+ checkSourceDeleting(&QMediaCaptureSession::setCamera, &QMediaCaptureSession::camera,
+ &QMediaCaptureSession::cameraChanged);
+ checkSourceDeleting(&QMediaCaptureSession::setScreenCapture,
+ &QMediaCaptureSession::screenCapture,
+ &QMediaCaptureSession::screenCaptureChanged);
+ checkSourceDeleting(&QMediaCaptureSession::setWindowCapture,
+ &QMediaCaptureSession::windowCapture,
+ &QMediaCaptureSession::windowCaptureChanged);
+}
+
+void tst_QMediaRecorder::testError()
+{
+ const QString errorString(QLatin1String("format error"));
+
+ QSignalSpy spy(encoder, &QMediaRecorder::errorOccurred);
+
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
+ QCOMPARE(encoder->errorString(), QString());
+
+ mock->updateError(QMediaRecorder::FormatError, errorString);
+ QCOMPARE(encoder->error(), QMediaRecorder::FormatError);
+ QCOMPARE(encoder->errorString(), errorString);
+ QCOMPARE(spy.size(), 1);
+
+ QCOMPARE(spy.last()[0].value<QMediaRecorder::Error>(), QMediaRecorder::FormatError);
+}
+
+void tst_QMediaRecorder::testSink()
+{
+ encoder->setOutputLocation(QUrl("test.tmp"));
+ QUrl s = encoder->outputLocation();
+ QCOMPARE(s.toString(), QStringLiteral("test.tmp"));
+ QCOMPARE(encoder->actualLocation(), QUrl());
+
+ //the actual location is available after record
+ encoder->record();
+ QCOMPARE(encoder->actualLocation().toString(), QStringLiteral("test.tmp"));
+ encoder->stop();
+ QCOMPARE(encoder->actualLocation().toString(), QStringLiteral("test.tmp"));
+
+ //setOutputLocation resets the actual location
+ encoder->setOutputLocation(QUrl());
+ QCOMPARE(encoder->actualLocation(), QUrl());
+
+ encoder->record();
+ QCOMPARE(encoder->actualLocation(), QUrl::fromLocalFile("default_name.mp4"));
+ encoder->stop();
+ QCOMPARE(encoder->actualLocation(), QUrl::fromLocalFile("default_name.mp4"));
+
+ mock->reset();
+}
+
+void tst_QMediaRecorder::testRecord()
+{
+ QSignalSpy stateSignal(encoder, &QMediaRecorder::recorderStateChanged);
+ QSignalSpy progressSignal(encoder, &QMediaRecorder::durationChanged);
+ encoder->record();
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::RecordingState);
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
+ QCOMPARE(encoder->errorString(), QString());
+
+ QCOMPARE(stateSignal.size(), 1);
+ QCOMPARE(stateSignal.last()[0].value<QMediaRecorder::RecorderState>(), QMediaRecorder::RecordingState);
+
+ QTestEventLoop::instance().enterLoop(1);
+
+ QVERIFY(progressSignal.size() > 0);
+
+ encoder->pause();
+
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::PausedState);
+
+ QCOMPARE(stateSignal.size(), 2);
+
+ QTestEventLoop::instance().enterLoop(1);
+
+ encoder->stop();
+
+ QCOMPARE(encoder->recorderState(), QMediaRecorder::StoppedState);
+ QCOMPARE(stateSignal.size(), 3);
+
+ QTestEventLoop::instance().enterLoop(1);
+
+ mock->stop();
+ QCOMPARE(stateSignal.size(), 3);
+
+ mock->reset();
+}
+
+void tst_QMediaRecorder::testEncodingSettings()
+{
+ QMediaFormat format = encoder->mediaFormat();
+ QCOMPARE(format.fileFormat(), QMediaFormat::UnspecifiedFormat);
+ QCOMPARE(format.audioCodec(), QMediaFormat::AudioCodec::Unspecified);
+ QCOMPARE(format.videoCodec(), QMediaFormat::VideoCodec::Unspecified);
+ QCOMPARE(encoder->quality(), QMediaRecorder::NormalQuality);
+ QCOMPARE(encoder->encodingMode(), QMediaRecorder::ConstantQualityEncoding);
+
+ format.setAudioCodec(QMediaFormat::AudioCodec::MP3);
+ encoder->setAudioSampleRate(44100);
+ encoder->setAudioBitRate(256*1024);
+ encoder->setQuality(QMediaRecorder::HighQuality);
+ encoder->setEncodingMode(QMediaRecorder::AverageBitRateEncoding);
+
+ format.setVideoCodec(QMediaFormat::VideoCodec::H264);
+ encoder->setVideoBitRate(800);
+ encoder->setVideoFrameRate(24*1024);
+ encoder->setVideoResolution(QSize(800,600));
+ encoder->setMediaFormat(format);
+
+ QCOMPARE(encoder->mediaFormat().audioCodec(), QMediaFormat::AudioCodec::MP3);
+ QCOMPARE(encoder->audioSampleRate(), 44100);
+ QCOMPARE(encoder->audioBitRate(), 256*1024);
+ QCOMPARE(encoder->quality(), QMediaRecorder::HighQuality);
+ QCOMPARE(encoder->encodingMode(), QMediaRecorder::AverageBitRateEncoding);
+
+ QCOMPARE(encoder->mediaFormat().videoCodec(), QMediaFormat::VideoCodec::H264);
+ QCOMPARE(encoder->videoBitRate(), 800);
+ QCOMPARE(encoder->videoFrameRate(), 24*1024);
+ QCOMPARE(encoder->videoResolution(), QSize(800,600));
+}
+
+void tst_QMediaRecorder::testAudioSettings()
+{
+ QMediaRecorder recorder;
+
+ QCOMPARE(recorder.mediaFormat(), QMediaFormat());
+ QCOMPARE(recorder.mediaFormat().fileFormat(), QMediaFormat::UnspecifiedFormat);
+ QCOMPARE(recorder.audioBitRate(), -1);
+ QCOMPARE(recorder.quality(), QMediaRecorder::NormalQuality);
+ QCOMPARE(recorder.audioSampleRate(), -1);
+
+ QMediaFormat format;
+ format.setFileFormat(QMediaFormat::FLAC);
+ recorder.setMediaFormat(format);
+ QCOMPARE(recorder.mediaFormat(), format);
+
+ recorder.setAudioBitRate(128000);
+ QCOMPARE(recorder.audioBitRate(), 128000);
+
+ recorder.setQuality(QMediaRecorder::HighQuality);
+ QCOMPARE(recorder.quality(), QMediaRecorder::HighQuality);
+
+ recorder.setAudioSampleRate(44100);
+ QCOMPARE(recorder.audioSampleRate(), 44100);
+
+ QCOMPARE(recorder.audioChannelCount(), -1);
+ recorder.setAudioChannelCount(2);
+ QCOMPARE(recorder.audioChannelCount(), 2);
+}
+
+void tst_QMediaRecorder::testVideoSettings()
+{
+ QMediaRecorder recorder;
+
+ QCOMPARE(recorder.mediaFormat(), QMediaFormat());
+ QCOMPARE(recorder.mediaFormat().videoCodec(), QMediaFormat::VideoCodec::Unspecified);
+ QMediaFormat format;
+ format.setVideoCodec(QMediaFormat::VideoCodec::H265);
+ recorder.setMediaFormat(format);
+ QCOMPARE(recorder.mediaFormat(), format);
+ QCOMPARE(recorder.mediaFormat().videoCodec(), QMediaFormat::VideoCodec::H265);
+
+ QCOMPARE(recorder.videoBitRate(), -1);
+ recorder.setVideoBitRate(128000);
+ QCOMPARE(recorder.videoBitRate(), 128000);
+
+ QCOMPARE(recorder.quality(), QMediaRecorder::NormalQuality);
+ recorder.setQuality(QMediaRecorder::HighQuality);
+ QCOMPARE(recorder.quality(), QMediaRecorder::HighQuality);
+
+ QCOMPARE(recorder.videoFrameRate(), -1);
+ recorder.setVideoFrameRate(60);
+ QVERIFY(qFuzzyCompare(recorder.videoFrameRate(), qreal(60)));
+ recorder.setVideoFrameRate(24.0);
+ QVERIFY(qFuzzyCompare(recorder.videoFrameRate(), qreal(24.0)));
+
+ QCOMPARE(recorder.videoResolution(), QSize());
+ recorder.setVideoResolution(QSize(320,240));
+ QCOMPARE(recorder.videoResolution(), QSize(320,240));
+ recorder.setVideoResolution(800,600);
+ QCOMPARE(recorder.videoResolution(), QSize(800,600));
+}
+
+void tst_QMediaRecorder::testSettingsApplied()
+{
+ QMediaCaptureSession session;
+ QMediaRecorder encoder;
+ session.setRecorder(&encoder);
+
+ encoder.setVideoResolution(640,480);
+
+ //encoder settings are applied before recording if changed
+ encoder.setQuality(QMediaRecorder::VeryHighQuality);
+ encoder.record();
+
+ encoder.stop();
+}
+
+void tst_QMediaRecorder::metaData()
+{
+ QMediaCaptureSession session;
+ QCamera camera;
+ QMediaRecorder recorder;
+ session.setCamera(&camera);
+ session.setRecorder(&recorder);
+
+ QVERIFY(recorder.metaData().isEmpty());
+
+ QMediaMetaData data;
+ data.insert(QMediaMetaData::Author, QStringLiteral("John Doe"));
+ recorder.setMetaData(data);
+
+ QCOMPARE(recorder.metaData().value(QMediaMetaData::Author).toString(), QStringLiteral("John Doe"));
+}
+
+void tst_QMediaRecorder::testIsAvailable()
+{
+ {
+ QMediaCaptureSession session;
+ QCamera camera;
+ QMediaRecorder recorder;
+ session.setCamera(&camera);
+ session.setRecorder(&recorder);
+ QCOMPARE(recorder.isAvailable(), true);
+ }
+ {
+ QMediaRecorder recorder;
+ QCOMPARE(recorder.isAvailable(), false);
+ }
+}
+
+/* enum QMediaRecorder::ResourceError property test. */
+void tst_QMediaRecorder::testEnum()
+{
+ const QString errorString(QLatin1String("resource error"));
+
+ QSignalSpy spy(encoder, &QMediaRecorder::errorOccurred);
+
+ QCOMPARE(encoder->error(), QMediaRecorder::NoError);
+ QCOMPARE(encoder->errorString(), QString());
+
+ mock->updateError(QMediaRecorder::ResourceError, errorString);
+ QCOMPARE(encoder->error(), QMediaRecorder::ResourceError);
+ QCOMPARE(encoder->errorString(), errorString);
+ QCOMPARE(spy.size(), 1);
+
+ QCOMPARE(spy.last()[0].value<QMediaRecorder::Error>(), QMediaRecorder::ResourceError);
+}
+
+void tst_QMediaRecorder::testVideoSettingsQuality()
+{
+ QMediaRecorder recorder;
+ /* Verify the default value is intialised correctly*/
+ QCOMPARE(recorder.quality(), QMediaRecorder::NormalQuality);
+
+ /* Set all types of Quality parameter and Verify if it is set correctly*/
+ recorder.setQuality(QMediaRecorder::HighQuality);
+ QCOMPARE(recorder.quality(), QMediaRecorder::HighQuality);
+
+ recorder.setQuality(QMediaRecorder::VeryLowQuality);
+ QCOMPARE(recorder.quality(), QMediaRecorder::VeryLowQuality);
+
+ recorder.setQuality(QMediaRecorder::LowQuality);
+ QCOMPARE(recorder.quality(), QMediaRecorder::LowQuality);
+
+ recorder.setQuality(QMediaRecorder::VeryHighQuality);
+ QCOMPARE(recorder.quality(), QMediaRecorder::VeryHighQuality);
+}
+
+void tst_QMediaRecorder::testVideoSettingsEncodingMode()
+{
+ QMediaRecorder recorder;
+
+ /* Verify the default values are initialised correctly*/
+ QCOMPARE(recorder.encodingMode(), QMediaRecorder::ConstantQualityEncoding);
+
+ /* Set each type of encoding mode and Verify if it is set correctly*/
+ recorder.setEncodingMode(QMediaRecorder::ConstantBitRateEncoding);
+ QCOMPARE(recorder.encodingMode(),QMediaRecorder::ConstantBitRateEncoding);
+
+ recorder.setEncodingMode(QMediaRecorder::AverageBitRateEncoding);
+ QCOMPARE(recorder.encodingMode(), QMediaRecorder::AverageBitRateEncoding);
+}
+
+void tst_QMediaRecorder::testApplicationInative()
+{
+ QMediaCaptureSession session;
+ QMediaRecorder encoder;
+ session.setRecorder(&encoder);
+
+ encoder.setVideoResolution(640, 480);
+ encoder.setQuality(QMediaRecorder::VeryHighQuality);
+
+ encoder.setOutputLocation(QUrl("test.tmp"));
+ QCOMPARE(encoder.outputLocation().toString(), QStringLiteral("test.tmp"));
+ QCOMPARE(encoder.actualLocation(), QUrl());
+
+ encoder.record();
+
+ QGuiApplicationPrivate::setApplicationState(Qt::ApplicationInactive);
+ QCoreApplication::processEvents();
+
+ QGuiApplicationPrivate::setApplicationState(Qt::ApplicationActive);
+ QCoreApplication::processEvents();
+
+ encoder.stop();
+
+ // the actual location is available after record
+ QCOMPARE(encoder.actualLocation().toString(), QStringLiteral("test.tmp"));
+}
+
+QTEST_GUILESS_MAIN(tst_QMediaRecorder)
+#include "tst_qmediarecorder.moc"