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 | |
18 | namespace BluezQt |
19 | { |
20 | extern void bluezqt_initFakeBluezTestRun(); |
21 | } |
22 | |
23 | using namespace BluezQt; |
24 | |
25 | void TestEndpoint::release() |
26 | { |
27 | m_releaseCalled = true; |
28 | } |
29 | |
30 | void 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 | |
57 | void MediaTest::cleanupTestCase() |
58 | { |
59 | FakeBluez::stop(); |
60 | } |
61 | |
62 | void 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 | |
80 | void 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 | |
110 | void 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 | |
123 | void 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 | |
134 | QTEST_MAIN(MediaTest) |
135 | |
136 | #include "moc_mediatest.cpp" |
137 | |