1/*
2 * SPDX-FileCopyrightText: 2018 Manuel Weichselbaumer <mincequi@web.de>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5 */
6
7#include "mediatest.h"
8#include "a2dp-codecs.h"
9#include "autotests.h"
10#include "initmanagerjob.h"
11#include "manager.h"
12#include "media.h"
13#include "pendingcall.h"
14
15#include <QDBusObjectPath>
16#include <QSignalSpy>
17
18namespace BluezQt
19{
20extern void bluezqt_initFakeBluezTestRun();
21}
22
23using namespace BluezQt;
24
25void TestEndpoint::release()
26{
27 m_releaseCalled = true;
28}
29
30void MediaTest::initTestCase()
31{
32 bluezqt_initFakeBluezTestRun();
33 FakeBluez::start();
34 FakeBluez::runTest(QStringLiteral("bluez-standard"));
35
36 // Create adapter
37 QString adapter = QStringLiteral("/org/bluez/hci0");
38 QVariantMap adapterProps;
39 adapterProps[QStringLiteral("Path")] = QVariant::fromValue(QDBusObjectPath(adapter));
40 adapterProps[QStringLiteral("Address")] = QStringLiteral("1C:E5:C3:BC:94:7E");
41 adapterProps[QStringLiteral("Name")] = QStringLiteral("TestAdapter");
42 FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("create-adapter"), adapterProps);
43
44 Manager *manager = new Manager(this);
45 InitManagerJob *initJob = manager->init();
46 initJob->exec();
47 QVERIFY(!initJob->error());
48 QCOMPARE(manager->adapters().count(), 1);
49
50 m_adapter = manager->adapters().at(0);
51 QVERIFY(m_adapter->media());
52
53 m_endpoint = new TestEndpoint({MediaEndpoint::Role::AudioSink, MediaEndpoint::Codec::Sbc}, this);
54 m_adapter->media()->registerEndpoint(m_endpoint)->waitForFinished();
55}
56
57void MediaTest::cleanupTestCase()
58{
59 FakeBluez::stop();
60}
61
62void MediaTest::setConfigurationTest()
63{
64 QSignalSpy endpointSpy(m_endpoint, SIGNAL(configurationSet(QString, QVariantMap)));
65
66 QVariantMap props;
67 props.insert(QStringLiteral("Key"), QVariant::fromValue(int(123)));
68
69 QVariantMap params;
70 params.insert(QStringLiteral("AdapterPath"), QVariant::fromValue(QDBusObjectPath(m_adapter->ubi())));
71 params.insert(QStringLiteral("Transport"), QVariant::fromValue(m_endpoint->objectPath()));
72 params.insert(QStringLiteral("Properties"), props);
73 FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:set-configuration"), params);
74 endpointSpy.wait();
75 auto args = endpointSpy.takeFirst();
76 QCOMPARE(args.at(0).toString(), m_endpoint->objectPath().path());
77 QCOMPARE(args.at(1).value<QVariantMap>(), props);
78}
79
80void MediaTest::selectConfigurationTest()
81{
82 QSignalSpy endpointSpy(m_endpoint, SIGNAL(configurationSelected(QByteArray, QByteArray)));
83
84 a2dp_sbc_t sbcConfiguration;
85 sbcConfiguration.frequency = SBC_SAMPLING_FREQ_44100;
86 sbcConfiguration.channel_mode = SBC_CHANNEL_MODE_STEREO;
87 sbcConfiguration.block_length = SBC_BLOCK_LENGTH_16;
88 sbcConfiguration.subbands = SBC_SUBBANDS_8;
89 sbcConfiguration.allocation_method = SBC_ALLOCATION_LOUDNESS;
90 sbcConfiguration.min_bitpool = 2;
91 sbcConfiguration.max_bitpool = 53;
92
93 QVariantMap params;
94 params.insert(QStringLiteral("AdapterPath"), QVariant::fromValue(QDBusObjectPath(m_adapter->ubi())));
95 params.insert(QStringLiteral("Capabilities"), QByteArray(reinterpret_cast<const char *>(&sbcCapabilities), sizeof(sbcCapabilities)));
96 FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:select-configuration"), params);
97 endpointSpy.wait();
98 auto args = endpointSpy.takeFirst();
99 QCOMPARE(args.at(0).toByteArray(), QByteArray(reinterpret_cast<const char *>(&sbcCapabilities), sizeof(sbcCapabilities)));
100 QCOMPARE(args.at(1).toByteArray(), QByteArray(reinterpret_cast<const char *>(&sbcConfiguration), sizeof(sbcConfiguration)));
101
102 params.insert(QStringLiteral("Capabilities"), QByteArray());
103 FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:select-configuration"), params);
104 endpointSpy.wait();
105 args = endpointSpy.takeFirst();
106 QCOMPARE(args.at(0).toByteArray(), QByteArray());
107 QCOMPARE(args.at(1).toByteArray(), QByteArray());
108}
109
110void MediaTest::clearConfigurationTest()
111{
112 QSignalSpy endpointSpy(m_endpoint, SIGNAL(configurationCleared(QString)));
113
114 QVariantMap params;
115 params.insert(QStringLiteral("AdapterPath"), QVariant::fromValue(QDBusObjectPath(m_adapter->ubi())));
116 params.insert(QStringLiteral("Transport"), QVariant::fromValue(m_endpoint->objectPath()));
117 FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:clear-configuration"), params);
118 endpointSpy.wait();
119 auto args = endpointSpy.takeFirst();
120 QCOMPARE(args.at(0).toString(), m_endpoint->objectPath().path());
121}
122
123void MediaTest::releaseTest()
124{
125 QCOMPARE(m_endpoint->m_releaseCalled, false);
126
127 QVariantMap params;
128 params.insert(QStringLiteral("AdapterPath"), QVariant::fromValue(QDBusObjectPath(m_adapter->ubi())));
129 FakeBluez::runAction(QStringLiteral("devicemanager"), QStringLiteral("adapter-media:release"), params);
130
131 QTRY_COMPARE(m_endpoint->m_releaseCalled, true);
132}
133
134QTEST_MAIN(MediaTest)
135
136#include "moc_mediatest.cpp"
137

source code of bluez-qt/autotests/mediatest.cpp