File indexing completed on 2024-04-21 14:52:44

0001 /*
0002  * SPDX-FileCopyrightText: 2018 Manuel Weichselbaumer <mincequi@web.de>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005  */
0006 
0007 #include "mediatest.h"
0008 #include "a2dp-codecs.h"
0009 #include "autotests.h"
0010 #include "initmanagerjob.h"
0011 #include "manager.h"
0012 #include "media.h"
0013 #include "pendingcall.h"
0014 
0015 #include <QDBusObjectPath>
0016 #include <QSignalSpy>
0017 
0018 namespace BluezQt
0019 {
0020 extern void bluezqt_initFakeBluezTestRun();
0021 }
0022 
0023 using namespace BluezQt;
0024 
0025 void TestEndpoint::release()
0026 {
0027     m_releaseCalled = true;
0028 }
0029 
0030 void MediaTest::initTestCase()
0031 {
0032     bluezqt_initFakeBluezTestRun();
0033     FakeBluez::start();
0034     FakeBluez::runTest(QStringLiteral("bluez-standard"));
0035 
0036     // Create adapter
0037     QString adapter = QStringLiteral("/org/bluez/hci0");
0038     QVariantMap adapterProps;
0039     adapterProps[QStringLiteral("Path")] = QVariant::fromValue(QDBusObjectPath(adapter));
0040     adapterProps[QStringLiteral("Address")] = QStringLiteral("1C:E5:C3:BC:94:7E");
0041     adapterProps[QStringLiteral("Name")] = QStringLiteral("TestAdapter");
0042     FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("create-adapter"), adapterProps);
0043 
0044     Manager *manager = new Manager(this);
0045     InitManagerJob *initJob = manager->init();
0046     initJob->exec();
0047     QVERIFY(!initJob->error());
0048     QCOMPARE(manager->adapters().count(), 1);
0049 
0050     m_adapter = manager->adapters().at(0);
0051     QVERIFY(m_adapter->media());
0052 
0053     m_endpoint = new TestEndpoint({MediaEndpoint::Role::AudioSink, MediaEndpoint::Codec::Sbc}, this);
0054     m_adapter->media()->registerEndpoint(m_endpoint)->waitForFinished();
0055 }
0056 
0057 void MediaTest::cleanupTestCase()
0058 {
0059     FakeBluez::stop();
0060 }
0061 
0062 void MediaTest::setConfigurationTest()
0063 {
0064     QSignalSpy endpointSpy(m_endpoint, SIGNAL(configurationSet(QString, QVariantMap)));
0065 
0066     QVariantMap props;
0067     props.insert(QStringLiteral("Key"), QVariant::fromValue(int(123)));
0068 
0069     QVariantMap params;
0070     params.insert(QStringLiteral("AdapterPath"), QVariant::fromValue(QDBusObjectPath(m_adapter->ubi())));
0071     params.insert(QStringLiteral("Transport"), QVariant::fromValue(m_endpoint->objectPath()));
0072     params.insert(QStringLiteral("Properties"), props);
0073     FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:set-configuration"), params);
0074     endpointSpy.wait();
0075     auto args = endpointSpy.takeFirst();
0076     QCOMPARE(args.at(0).toString(), m_endpoint->objectPath().path());
0077     QCOMPARE(args.at(1).value<QVariantMap>(), props);
0078 }
0079 
0080 void MediaTest::selectConfigurationTest()
0081 {
0082     QSignalSpy endpointSpy(m_endpoint, SIGNAL(configurationSelected(QByteArray, QByteArray)));
0083 
0084     a2dp_sbc_t sbcConfiguration;
0085     sbcConfiguration.frequency = SBC_SAMPLING_FREQ_44100;
0086     sbcConfiguration.channel_mode = SBC_CHANNEL_MODE_STEREO;
0087     sbcConfiguration.block_length = SBC_BLOCK_LENGTH_16;
0088     sbcConfiguration.subbands = SBC_SUBBANDS_8;
0089     sbcConfiguration.allocation_method = SBC_ALLOCATION_LOUDNESS;
0090     sbcConfiguration.min_bitpool = 2;
0091     sbcConfiguration.max_bitpool = 53;
0092 
0093     QVariantMap params;
0094     params.insert(QStringLiteral("AdapterPath"), QVariant::fromValue(QDBusObjectPath(m_adapter->ubi())));
0095     params.insert(QStringLiteral("Capabilities"), QByteArray(reinterpret_cast<const char *>(&sbcCapabilities), sizeof(sbcCapabilities)));
0096     FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:select-configuration"), params);
0097     endpointSpy.wait();
0098     auto args = endpointSpy.takeFirst();
0099     QCOMPARE(args.at(0).toByteArray(), QByteArray(reinterpret_cast<const char *>(&sbcCapabilities), sizeof(sbcCapabilities)));
0100     QCOMPARE(args.at(1).toByteArray(), QByteArray(reinterpret_cast<const char *>(&sbcConfiguration), sizeof(sbcConfiguration)));
0101 
0102     params.insert(QStringLiteral("Capabilities"), QByteArray());
0103     FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:select-configuration"), params);
0104     endpointSpy.wait();
0105     args = endpointSpy.takeFirst();
0106     QCOMPARE(args.at(0).toByteArray(), QByteArray());
0107     QCOMPARE(args.at(1).toByteArray(), QByteArray());
0108 }
0109 
0110 void MediaTest::clearConfigurationTest()
0111 {
0112     QSignalSpy endpointSpy(m_endpoint, SIGNAL(configurationCleared(QString)));
0113 
0114     QVariantMap params;
0115     params.insert(QStringLiteral("AdapterPath"), QVariant::fromValue(QDBusObjectPath(m_adapter->ubi())));
0116     params.insert(QStringLiteral("Transport"), QVariant::fromValue(m_endpoint->objectPath()));
0117     FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:clear-configuration"), params);
0118     endpointSpy.wait();
0119     auto args = endpointSpy.takeFirst();
0120     QCOMPARE(args.at(0).toString(), m_endpoint->objectPath().path());
0121 }
0122 
0123 void MediaTest::releaseTest()
0124 {
0125     QCOMPARE(m_endpoint->m_releaseCalled, false);
0126 
0127     QVariantMap params;
0128     params.insert(QStringLiteral("AdapterPath"), QVariant::fromValue(QDBusObjectPath(m_adapter->ubi())));
0129     FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:release"), params);
0130 
0131     QTRY_COMPARE(m_endpoint->m_releaseCalled, true);
0132 }
0133 
0134 QTEST_MAIN(MediaTest)
0135 
0136 #include "moc_mediatest.cpp"