blob: 90f9987ae354883f3c995400ddc3479b6a9f04a3 [file] [log] [blame]
Hongguang600a6ae2021-07-08 18:51:51 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "VtsHalTvTunerTargetTest.h"
18
19#include <aidl/Gtest.h>
20#include <aidl/Vintf.h>
21#include <android/binder_manager.h>
22#include <android/binder_process.h>
23
24namespace {
25
26AssertionResult TunerBroadcastAidlTest::filterDataOutputTest() {
27 return filterDataOutputTestBase(mFilterTests);
28}
29
30AssertionResult TunerPlaybackAidlTest::filterDataOutputTest() {
31 return filterDataOutputTestBase(mFilterTests);
32}
33
34AssertionResult TunerDescramblerAidlTest::filterDataOutputTest() {
35 return filterDataOutputTestBase(mFilterTests);
36}
37
38void TunerFilterAidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf,
39 FrontendConfig frontendConf) {
40 int32_t feId;
41 int32_t demuxId;
42 std::shared_ptr<IDemux> demux;
43 int64_t filterId;
44
45 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
46 ASSERT_TRUE(feId != INVALID_ID);
47 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
48 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
49 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
50 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
51 mFilterTests.setDemux(demux);
52 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
53 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
54 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
55 if (filterConf.type.mainType == DemuxFilterMainType::IP) {
56 ASSERT_TRUE(mFilterTests.configIpFilterCid(filterConf.ipCid, filterId));
57 }
58 if (filterConf.monitorEventTypes > 0) {
59 ASSERT_TRUE(mFilterTests.configureMonitorEvent(filterId, filterConf.monitorEventTypes));
60 }
61 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
62 ASSERT_TRUE(mFilterTests.startFilter(filterId));
63 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
64 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
65 ASSERT_TRUE(mDemuxTests.closeDemux());
66 ASSERT_TRUE(mFrontendTests.closeFrontend());
67}
68
69void TunerFilterAidlTest::reconfigSingleFilterInDemuxTest(FilterConfig filterConf,
70 FilterConfig filterReconf,
71 FrontendConfig frontendConf) {
72 int32_t feId;
73 int32_t demuxId;
74 std::shared_ptr<IDemux> demux;
75 int64_t filterId;
76
77 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
78 ASSERT_TRUE(feId != INVALID_ID);
79 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
80 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
81 if (frontendConf.isSoftwareFe) {
82 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
83 }
84 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
85 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
86 mFrontendTests.setDemux(demux);
87 mFilterTests.setDemux(demux);
88 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
89 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
90 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
91 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
92 ASSERT_TRUE(mFilterTests.startFilter(filterId));
93 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
94 ASSERT_TRUE(mFilterTests.configFilter(filterReconf.settings, filterId));
95 ASSERT_TRUE(mFilterTests.startFilter(filterId));
96 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
97 ASSERT_TRUE(mFilterTests.startIdTest(filterId));
98 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
99 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
100 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
101 ASSERT_TRUE(mDemuxTests.closeDemux());
102 ASSERT_TRUE(mFrontendTests.closeFrontend());
103}
104
105void TunerFilterAidlTest::testTimeFilter(TimeFilterConfig filterConf) {
106 int32_t demuxId;
107 std::shared_ptr<IDemux> demux;
108 DemuxCapabilities caps;
109
110 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
111 ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
112 ASSERT_TRUE(caps.bTimeFilter);
113 mFilterTests.setDemux(demux);
114 ASSERT_TRUE(mFilterTests.openTimeFilterInDemux());
115 ASSERT_TRUE(mFilterTests.setTimeStamp(filterConf.timeStamp));
116 ASSERT_TRUE(mFilterTests.getTimeStamp());
117 ASSERT_TRUE(mFilterTests.clearTimeStamp());
118 ASSERT_TRUE(mFilterTests.closeTimeFilter());
119 ASSERT_TRUE(mDemuxTests.closeDemux());
120}
121
122void TunerBroadcastAidlTest::broadcastSingleFilterTest(FilterConfig filterConf,
123 FrontendConfig frontendConf) {
124 int32_t feId;
125 int32_t demuxId;
126 std::shared_ptr<IDemux> demux;
127 int64_t filterId;
128
129 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
130 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
131 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
Frankie Lizcano87421812022-07-28 17:13:01 +0000132 if (mLnbId != INVALID_LNB_ID) {
133 ASSERT_TRUE(mFrontendTests.setLnb(mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700134 }
135 if (frontendConf.isSoftwareFe) {
136 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
137 }
138 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
139 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
140 mFrontendTests.setDemux(demux);
141 mFilterTests.setDemux(demux);
142 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
143 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
144 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
145 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
146 ASSERT_TRUE(mFilterTests.startFilter(filterId));
147 // tune test
148 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
149 ASSERT_TRUE(filterDataOutputTest());
150 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
151 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
152 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
153 ASSERT_TRUE(mDemuxTests.closeDemux());
154 ASSERT_TRUE(mFrontendTests.closeFrontend());
155}
156
157void TunerBroadcastAidlTest::broadcastSingleFilterTestWithLnb(FilterConfig filterConf,
158 FrontendConfig frontendConf,
159 LnbConfig lnbConf) {
160 if (lnbConf.name.compare(emptyHardwareId) == 0) {
161 vector<int32_t> ids;
162 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
163 ASSERT_TRUE(ids.size() > 0);
164 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
Frankie Lizcano87421812022-07-28 17:13:01 +0000165 mLnbId = ids[0];
Hongguang600a6ae2021-07-08 18:51:51 -0700166 } else {
Frankie Lizcano87421812022-07-28 17:13:01 +0000167 ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700168 }
169 ASSERT_TRUE(mLnbTests.setLnbCallback());
170 ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
171 ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
172 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
Frankie Lizcanod1f520e2022-07-26 20:05:46 +0000173 if (!frontendConf.isSoftwareFe) {
174 broadcastSingleFilterTest(filterConf, frontendConf);
175 }
Hongguang600a6ae2021-07-08 18:51:51 -0700176 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000177 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700178}
179
180void TunerBroadcastAidlTest::mediaFilterUsingSharedMemoryTest(FilterConfig filterConf,
181 FrontendConfig frontendConf) {
182 int32_t feId;
183 int32_t demuxId;
184 std::shared_ptr<IDemux> demux;
185 int64_t filterId;
186
187 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
188 ASSERT_TRUE(feId != INVALID_ID);
189 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
190 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
191 if (frontendConf.isSoftwareFe) {
192 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
193 }
194 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
195 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
196 mFrontendTests.setDemux(demux);
197 mFilterTests.setDemux(demux);
198 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
199 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
200 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
201 ASSERT_TRUE(mFilterTests.getSharedAvMemoryHandle(filterId));
202 ASSERT_TRUE(mFilterTests.configAvFilterStreamType(filterConf.streamType, filterId));
203 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
204 ASSERT_TRUE(mFilterTests.startFilter(filterId));
205 // tune test
206 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
207 ASSERT_TRUE(filterDataOutputTest());
208 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
209 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
210 ASSERT_TRUE(mFilterTests.releaseShareAvHandle(filterId));
211 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
212 ASSERT_TRUE(mDemuxTests.closeDemux());
213 ASSERT_TRUE(mFrontendTests.closeFrontend());
214}
215
216void TunerPlaybackAidlTest::playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf) {
217 int32_t demuxId;
218 std::shared_ptr<IDemux> demux;
219 int64_t filterId;
220
221 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
222 mFilterTests.setDemux(demux);
223 mDvrTests.setDemux(demux);
224 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
225 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrConf.settings));
226 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
227 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
228 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
229 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
230 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
231 mDvrTests.startPlaybackInputThread(dvrConf.playbackInputFile,
232 dvrConf.settings.get<DvrSettings::Tag::playback>());
233 ASSERT_TRUE(mDvrTests.startDvrPlayback());
234 ASSERT_TRUE(mFilterTests.startFilter(filterId));
235 ASSERT_TRUE(filterDataOutputTest());
236 mDvrTests.stopPlaybackThread();
237 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
238 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
239 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
240 mDvrTests.closeDvrPlayback();
241 ASSERT_TRUE(mDemuxTests.closeDemux());
242}
243
244void TunerRecordAidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf,
245 FrontendConfig frontendConf,
246 DvrConfig dvrConf, LnbConfig lnbConf) {
247 if (lnbConf.name.compare(emptyHardwareId) == 0) {
248 vector<int32_t> ids;
249 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
250 ASSERT_TRUE(ids.size() > 0);
251 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
Frankie Lizcano87421812022-07-28 17:13:01 +0000252 mLnbId = ids[0];
Hongguang600a6ae2021-07-08 18:51:51 -0700253 } else {
Frankie Lizcano87421812022-07-28 17:13:01 +0000254 ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700255 }
256 ASSERT_TRUE(mLnbTests.setLnbCallback());
257 ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
258 ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
259 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
260 for (auto msgName : lnbRecord.diseqcMsgs) {
261 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
262 }
263 recordSingleFilterTest(filterConf, frontendConf, dvrConf);
264 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000265 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700266}
267
268void TunerRecordAidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf,
269 FrontendConfig frontendConf,
270 DvrConfig dvrConf) {
271 int32_t demuxId;
272 std::shared_ptr<IDemux> demux;
273 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
274 mDvrTests.setDemux(demux);
275
276 DvrConfig dvrSourceConfig;
277 if (record.hasFrontendConnection) {
278 int32_t feId;
279 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
280 ASSERT_TRUE(feId != INVALID_ID);
281 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
282 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
283 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
284 } else {
285 dvrSourceConfig = dvrMap[record.dvrSourceId];
286 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
287 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
288 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
289 }
290
291 int64_t filterId;
292 std::shared_ptr<IFilter> filter;
293 mFilterTests.setDemux(demux);
294
295 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
296 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
297 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
298
299 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
300 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
301 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
302 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
303 filter = mFilterTests.getFilterById(filterId);
304 ASSERT_TRUE(filter != nullptr);
305 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
306 ASSERT_TRUE(mDvrTests.startDvrRecord());
307 ASSERT_TRUE(mFilterTests.startFilter(filterId));
308 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
309 ASSERT_TRUE(mDvrTests.stopDvrRecord());
310 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
311 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
312 mDvrTests.closeDvrRecord();
313 ASSERT_TRUE(mDemuxTests.closeDemux());
314
315 if (record.hasFrontendConnection) {
316 ASSERT_TRUE(mFrontendTests.closeFrontend());
317 }
318}
319
320void TunerRecordAidlTest::recordSingleFilterTest(FilterConfig filterConf,
321 FrontendConfig frontendConf, DvrConfig dvrConf) {
322 int32_t demuxId;
323 std::shared_ptr<IDemux> demux;
324 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
325 mDvrTests.setDemux(demux);
326
327 DvrConfig dvrSourceConfig;
328 if (record.hasFrontendConnection) {
329 int32_t feId;
330 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
331 ASSERT_TRUE(feId != INVALID_ID);
332 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
333 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
334 if (frontendConf.isSoftwareFe) {
335 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]);
336 }
337 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
338 mFrontendTests.setDvrTests(&mDvrTests);
339 } else {
340 dvrSourceConfig = dvrMap[record.dvrSourceId];
341 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
342 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
343 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
344 }
345
346 int64_t filterId;
347 std::shared_ptr<IFilter> filter;
348 mFilterTests.setDemux(demux);
349 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
350 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
351 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
352 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
353 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
354 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
355 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
356 filter = mFilterTests.getFilterById(filterId);
357 ASSERT_TRUE(filter != nullptr);
358 mDvrTests.startRecordOutputThread(dvrConf.settings.get<DvrSettings::Tag::record>());
359 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
360 ASSERT_TRUE(mDvrTests.startDvrRecord());
361 ASSERT_TRUE(mFilterTests.startFilter(filterId));
362
363 if (record.hasFrontendConnection) {
364 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
365 } else {
366 // Start DVR Source
367 mDvrTests.startPlaybackInputThread(
368 dvrSourceConfig.playbackInputFile,
369 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
370 ASSERT_TRUE(mDvrTests.startDvrPlayback());
371 }
372
373 mDvrTests.testRecordOutput();
374 mDvrTests.stopRecordThread();
375
376 if (record.hasFrontendConnection) {
377 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
378 } else {
379 mDvrTests.stopPlaybackThread();
380 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
381 }
382
383 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
384 ASSERT_TRUE(mDvrTests.stopDvrRecord());
385 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
386 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
387 mDvrTests.closeDvrRecord();
388
389 if (record.hasFrontendConnection) {
390 ASSERT_TRUE(mFrontendTests.closeFrontend());
391 } else {
392 mDvrTests.closeDvrPlayback();
393 }
394
395 ASSERT_TRUE(mDemuxTests.closeDemux());
396}
397
398void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,
399 FrontendConfig frontendConf,
400 DescramblerConfig descConfig) {
401 int32_t demuxId;
402 std::shared_ptr<IDemux> demux;
403 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
404
405 DvrConfig dvrSourceConfig;
406 if (descrambling.hasFrontendConnection) {
407 int32_t feId;
408 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
409 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
410 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
411 if (frontendConf.isSoftwareFe) {
412 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]);
413 }
414 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
415 mFrontendTests.setDemux(demux);
416 } else {
417 dvrSourceConfig = dvrMap[descrambling.dvrSourceId];
418 mDvrTests.setDemux(demux);
419 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
420 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
421 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
422 }
423
424 set<int64_t> filterIds;
425 int64_t filterId;
426 set<struct FilterConfig>::iterator config;
427 set<int64_t>::iterator id;
428 mFilterTests.setDemux(demux);
429 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
430 ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize));
431 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
432 ASSERT_TRUE(mFilterTests.configFilter((*config).settings, filterId));
433 filterIds.insert(filterId);
434 }
435 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
436 vector<uint8_t> token;
437 ASSERT_TRUE(mDescramblerTests.getKeyToken(descConfig.casSystemId, descConfig.provisionStr,
438 descConfig.hidlPvtData, token));
439 mDescramblerTests.setKeyToken(token);
440 vector<DemuxPid> pids;
441 DemuxPid pid;
442 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
443 ASSERT_TRUE(mDescramblerTests.getDemuxPidFromFilterSettings((*config).type,
444 (*config).settings, pid));
445 pids.push_back(pid);
446 ASSERT_TRUE(mDescramblerTests.addPid(pid, nullptr));
447 }
448 for (id = filterIds.begin(); id != filterIds.end(); id++) {
449 ASSERT_TRUE(mFilterTests.startFilter(*id));
450 }
451
452 if (descrambling.hasFrontendConnection) {
453 // tune test
454 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
455 } else {
456 // Start DVR Source
457 mDvrTests.startPlaybackInputThread(
458 dvrSourceConfig.playbackInputFile,
459 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
460 ASSERT_TRUE(mDvrTests.startDvrPlayback());
461 }
462
463 ASSERT_TRUE(filterDataOutputTest());
464
465 if (descrambling.hasFrontendConnection) {
466 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
467 } else {
468 mDvrTests.stopPlaybackThread();
469 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
470 }
471
472 for (id = filterIds.begin(); id != filterIds.end(); id++) {
473 ASSERT_TRUE(mFilterTests.stopFilter(*id));
474 }
475 for (auto pid : pids) {
476 ASSERT_TRUE(mDescramblerTests.removePid(pid, nullptr));
477 }
478 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
479 for (id = filterIds.begin(); id != filterIds.end(); id++) {
480 ASSERT_TRUE(mFilterTests.closeFilter(*id));
481 }
482
483 if (descrambling.hasFrontendConnection) {
484 ASSERT_TRUE(mFrontendTests.closeFrontend());
485 } else {
486 mDvrTests.closeDvrPlayback();
487 }
488
489 ASSERT_TRUE(mDemuxTests.closeDemux());
490}
491
492TEST_P(TunerLnbAidlTest, SendDiseqcMessageToLnb) {
493 description("Open and configure an Lnb with specific settings then send a diseqc msg to it.");
494 if (!lnbLive.support) {
495 return;
496 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000497 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
498 if (lnbLive_configs.empty()) {
499 ALOGD("No frontends that support satellites.");
500 return;
Hongguang600a6ae2021-07-08 18:51:51 -0700501 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000502 for (auto& combination : lnbLive_configs) {
503 lnbLive = combination;
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000504 if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) {
505 vector<int32_t> ids;
506 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
507 ASSERT_TRUE(ids.size() > 0);
508 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
509 } else {
510 int32_t id;
511 ASSERT_TRUE(mLnbTests.openLnbByName(lnbMap[lnbLive.lnbId].name, id));
512 }
513 ASSERT_TRUE(mLnbTests.setLnbCallback());
514 ASSERT_TRUE(mLnbTests.setVoltage(lnbMap[lnbLive.lnbId].voltage));
515 ASSERT_TRUE(mLnbTests.setTone(lnbMap[lnbLive.lnbId].tone));
516 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbMap[lnbLive.lnbId].position));
517 for (auto msgName : lnbLive.diseqcMsgs) {
518 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
519 }
520 ASSERT_TRUE(mLnbTests.closeLnb());
Hongguang600a6ae2021-07-08 18:51:51 -0700521 }
Hongguang600a6ae2021-07-08 18:51:51 -0700522}
523
524TEST_P(TunerDemuxAidlTest, openDemux) {
525 description("Open and close a Demux.");
526 if (!live.hasFrontendConnection) {
527 return;
528 }
529 int32_t feId;
530 int32_t demuxId;
531 std::shared_ptr<IDemux> demux;
532 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
533 ASSERT_TRUE(feId != INVALID_ID);
534 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
535 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
536 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
537 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
538 ASSERT_TRUE(mDemuxTests.closeDemux());
539 ASSERT_TRUE(mFrontendTests.closeFrontend());
540}
541
542TEST_P(TunerDemuxAidlTest, getAvSyncTime) {
543 description("Get the A/V sync time from a PCR filter.");
544 if (!live.hasFrontendConnection) {
545 return;
546 }
547 if (live.pcrFilterId.compare(emptyHardwareId) == 0) {
548 return;
549 }
550 int32_t feId;
551 int32_t demuxId;
552 std::shared_ptr<IDemux> demux;
553 int64_t mediaFilterId;
554 int64_t pcrFilterId;
555 int32_t avSyncHwId;
556 std::shared_ptr<IFilter> mediaFilter;
557
558 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
559 ASSERT_TRUE(feId != INVALID_ID);
560 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
561 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
562 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
563 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
564 mFilterTests.setDemux(demux);
565 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type,
566 filterMap[live.videoFilterId].bufferSize));
567 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(mediaFilterId));
568 ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
569 mediaFilter = mFilterTests.getFilterById(mediaFilterId);
570 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type,
571 filterMap[live.pcrFilterId].bufferSize));
572 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(pcrFilterId));
573 ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.pcrFilterId].settings, pcrFilterId));
574 ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId));
575 ASSERT_TRUE(pcrFilterId == avSyncHwId);
576 ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId));
577 ASSERT_TRUE(mFilterTests.closeFilter(pcrFilterId));
578 ASSERT_TRUE(mFilterTests.closeFilter(mediaFilterId));
579 ASSERT_TRUE(mDemuxTests.closeDemux());
580 ASSERT_TRUE(mFrontendTests.closeFrontend());
581}
582
583TEST_P(TunerFilterAidlTest, StartFilterInDemux) {
584 description("Open and start a filter in Demux.");
585 if (!live.hasFrontendConnection) {
586 return;
587 }
588 // TODO use parameterized tests
589 configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
590}
591
592TEST_P(TunerFilterAidlTest, ConfigIpFilterInDemuxWithCid) {
593 description("Open and configure an ip filter in Demux.");
594 // TODO use parameterized tests
595 if (!live.hasFrontendConnection) {
596 return;
597 }
598 if (live.ipFilterId.compare(emptyHardwareId) == 0) {
599 return;
600 }
601 configSingleFilterInDemuxTest(filterMap[live.ipFilterId], frontendMap[live.frontendId]);
602}
603
604TEST_P(TunerFilterAidlTest, ReconfigFilterToReceiveStartId) {
605 description("Recofigure and restart a filter to test start id.");
606 if (!live.hasFrontendConnection) {
607 return;
608 }
609 // TODO use parameterized tests
610 reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId], filterMap[live.videoFilterId],
611 frontendMap[live.frontendId]);
612}
613
614TEST_P(TunerFilterAidlTest, SetFilterLinkage) {
615 description("Pick up all the possible linkages from the demux caps and set them up.");
616 DemuxCapabilities caps;
617 int32_t demuxId;
618 std::shared_ptr<IDemux> demux;
619 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
620 ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
621 mFilterTests.setDemux(demux);
622 for (int i = 0; i < caps.linkCaps.size(); i++) {
623 uint32_t bitMask = 1;
624 for (int j = 0; j < FILTER_MAIN_TYPE_BIT_COUNT; j++) {
625 if (caps.linkCaps[i] & (bitMask << j)) {
626 int64_t sourceFilterId;
627 int64_t sinkFilterId;
628 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(i), FMQ_SIZE_16M));
629 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sourceFilterId));
630 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(j), FMQ_SIZE_16M));
631 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sinkFilterId));
632 ASSERT_TRUE(mFilterTests.setFilterDataSource(sourceFilterId, sinkFilterId));
633 ASSERT_TRUE(mFilterTests.setFilterDataSourceToDemux(sinkFilterId));
634 ASSERT_TRUE(mFilterTests.closeFilter(sinkFilterId));
635 ASSERT_TRUE(mFilterTests.closeFilter(sourceFilterId));
636 }
637 }
638 }
639 ASSERT_TRUE(mDemuxTests.closeDemux());
640}
641
642TEST_P(TunerFilterAidlTest, testTimeFilter) {
643 description("Open a timer filter in Demux and set time stamp.");
644 if (!timeFilter.support) {
645 return;
646 }
647 // TODO use parameterized tests
Frankie Lizcano0c069532022-07-14 20:20:46 +0000648 auto timeFilter_configs = generateTimeFilterConfigurations();
649 for (auto& configuration : timeFilter_configs) {
650 timeFilter = configuration;
651 testTimeFilter(timeFilterMap[timeFilter.timeFilterId]);
652 }
Hongguang600a6ae2021-07-08 18:51:51 -0700653}
654
Gareth Fenn9a808452022-03-31 08:40:00 +0100655static bool isEventProducingFilter(const FilterConfig& filterConfig) {
656 switch (filterConfig.type.mainType) {
657 case DemuxFilterMainType::TS: {
658 auto tsFilterType =
659 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
660 return (tsFilterType == DemuxTsFilterType::SECTION ||
661 tsFilterType == DemuxTsFilterType::PES ||
662 tsFilterType == DemuxTsFilterType::AUDIO ||
663 tsFilterType == DemuxTsFilterType::VIDEO ||
664 tsFilterType == DemuxTsFilterType::RECORD ||
665 tsFilterType == DemuxTsFilterType::TEMI);
666 }
667 case DemuxFilterMainType::MMTP: {
668 auto mmtpFilterType =
669 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
670 return (mmtpFilterType == DemuxMmtpFilterType::SECTION ||
671 mmtpFilterType == DemuxMmtpFilterType::PES ||
672 mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
673 mmtpFilterType == DemuxMmtpFilterType::VIDEO ||
674 mmtpFilterType == DemuxMmtpFilterType::RECORD ||
675 mmtpFilterType == DemuxMmtpFilterType::DOWNLOAD);
676 }
677 case DemuxFilterMainType::IP: {
678 auto ipFilterType =
679 filterConfig.type.subType.get<DemuxFilterSubType::Tag::ipFilterType>();
680 return (ipFilterType == DemuxIpFilterType::SECTION);
681 }
682 case DemuxFilterMainType::TLV: {
683 auto tlvFilterType =
684 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tlvFilterType>();
685 return (tlvFilterType == DemuxTlvFilterType::SECTION);
686 }
687 case DemuxFilterMainType::ALP: {
688 auto alpFilterType =
689 filterConfig.type.subType.get<DemuxFilterSubType::Tag::alpFilterType>();
690 return (alpFilterType == DemuxAlpFilterType::SECTION);
691 }
692 default:
693 return false;
694 }
695}
696
Patrick Rohr1586d212021-11-23 00:40:56 +0100697static bool isMediaFilter(const FilterConfig& filterConfig) {
698 switch (filterConfig.type.mainType) {
699 case DemuxFilterMainType::TS: {
700 // TS Audio and Video filters are media filters
701 auto tsFilterType =
702 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
703 return (tsFilterType == DemuxTsFilterType::AUDIO ||
704 tsFilterType == DemuxTsFilterType::VIDEO);
705 }
706 case DemuxFilterMainType::MMTP: {
707 // MMTP Audio and Video filters are media filters
708 auto mmtpFilterType =
709 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
710 return (mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
711 mmtpFilterType == DemuxMmtpFilterType::VIDEO);
712 }
713 default:
714 return false;
715 }
716}
Patrick Rohr149b0872021-11-20 00:39:37 +0100717
Patrick Rohr1586d212021-11-23 00:40:56 +0100718static int getDemuxFilterEventDataLength(const DemuxFilterEvent& event) {
719 switch (event.getTag()) {
720 case DemuxFilterEvent::Tag::section:
721 return event.get<DemuxFilterEvent::Tag::section>().dataLength;
722 case DemuxFilterEvent::Tag::media:
723 return event.get<DemuxFilterEvent::Tag::media>().dataLength;
724 case DemuxFilterEvent::Tag::pes:
725 return event.get<DemuxFilterEvent::Tag::pes>().dataLength;
726 case DemuxFilterEvent::Tag::download:
727 return event.get<DemuxFilterEvent::Tag::download>().dataLength;
728 case DemuxFilterEvent::Tag::ipPayload:
729 return event.get<DemuxFilterEvent::Tag::ipPayload>().dataLength;
730
731 case DemuxFilterEvent::Tag::tsRecord:
732 case DemuxFilterEvent::Tag::mmtpRecord:
733 case DemuxFilterEvent::Tag::temi:
734 case DemuxFilterEvent::Tag::monitorEvent:
735 case DemuxFilterEvent::Tag::startId:
736 return 0;
737 }
738}
739
740// TODO: move boilerplate into text fixture
741void TunerFilterAidlTest::testDelayHint(const FilterConfig& filterConf) {
Gareth Fenn9a808452022-03-31 08:40:00 +0100742 if (!filterConf.timeDelayInMs && !filterConf.dataDelayInBytes) {
743 return;
744 }
745 if (!isEventProducingFilter(filterConf)) {
746 return;
747 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100748 int32_t feId;
749 int32_t demuxId;
750 std::shared_ptr<IDemux> demux;
751 int64_t filterId;
752
753 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
754 ASSERT_TRUE(feId != INVALID_ID);
755 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
756 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
757 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
758 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
759 mFilterTests.setDemux(demux);
760
Patrick Rohr149b0872021-11-20 00:39:37 +0100761 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
762 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
Patrick Rohr149b0872021-11-20 00:39:37 +0100763
Patrick Rohr1586d212021-11-23 00:40:56 +0100764 bool mediaFilter = isMediaFilter(filterConf);
Patrick Rohr149b0872021-11-20 00:39:37 +0100765 auto filter = mFilterTests.getFilterById(filterId);
766
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100767 // startTime needs to be set before calling setDelayHint.
768 auto startTime = std::chrono::steady_clock::now();
769
Gareth Fenn9a808452022-03-31 08:40:00 +0100770 int timeDelayInMs = filterConf.timeDelayInMs;
771 if (timeDelayInMs > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100772 FilterDelayHint delayHint;
773 delayHint.hintType = FilterDelayHintType::TIME_DELAY_IN_MS;
Gareth Fenn9a808452022-03-31 08:40:00 +0100774 delayHint.hintValue = timeDelayInMs;
Patrick Rohr149b0872021-11-20 00:39:37 +0100775
Patrick Rohr1586d212021-11-23 00:40:56 +0100776 // setDelayHint should fail for media filters.
777 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
778 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100779
Patrick Rohr1586d212021-11-23 00:40:56 +0100780 int dataDelayInBytes = filterConf.dataDelayInBytes;
781 if (dataDelayInBytes > 0) {
782 FilterDelayHint delayHint;
783 delayHint.hintType = FilterDelayHintType::DATA_SIZE_DELAY_IN_BYTES;
784 delayHint.hintValue = dataDelayInBytes;
Patrick Rohr149b0872021-11-20 00:39:37 +0100785
Patrick Rohr1586d212021-11-23 00:40:56 +0100786 // setDelayHint should fail for media filters.
787 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
788 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100789
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100790 // start and stop filter (and wait for first callback) in order to
791 // circumvent callback scheduler race conditions after adjusting filter
792 // delays.
793 auto cb = mFilterTests.getFilterCallbacks().at(filterId);
794 auto future =
795 cb->verifyFilterCallback([](const std::vector<DemuxFilterEvent>&) { return true; });
Gareth Fenn9a808452022-03-31 08:40:00 +0100796
797 // The configure stage can also produce events, so we should set the delay
798 // hint beforehand.
799 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
Patrick Rohr1586d212021-11-23 00:40:56 +0100800 mFilterTests.startFilter(filterId);
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100801
802 auto timeout = std::chrono::seconds(30);
803 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
804
Patrick Rohr1586d212021-11-23 00:40:56 +0100805 mFilterTests.stopFilter(filterId);
Patrick Rohr149b0872021-11-20 00:39:37 +0100806
Patrick Rohr1586d212021-11-23 00:40:56 +0100807 if (!mediaFilter) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100808 int callbackSize = 0;
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100809 future = cb->verifyFilterCallback(
Patrick Rohr1586d212021-11-23 00:40:56 +0100810 [&callbackSize](const std::vector<DemuxFilterEvent>& events) {
811 for (const auto& event : events) {
812 callbackSize += getDemuxFilterEventDataLength(event);
813 }
814 return true;
815 });
816
Patrick Rohr1586d212021-11-23 00:40:56 +0100817 ASSERT_TRUE(mFilterTests.startFilter(filterId));
818
819 // block and wait for callback to be received.
Patrick Rohr1586d212021-11-23 00:40:56 +0100820 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
Patrick Rohr1586d212021-11-23 00:40:56 +0100821
Gareth Fenn9a808452022-03-31 08:40:00 +0100822 auto duration = std::chrono::steady_clock::now() - startTime;
823 bool delayHintTest = duration >= std::chrono::milliseconds(timeDelayInMs);
Patrick Rohr1586d212021-11-23 00:40:56 +0100824 bool dataSizeTest = callbackSize >= dataDelayInBytes;
825
Gareth Fenn9a808452022-03-31 08:40:00 +0100826 if (timeDelayInMs > 0 && dataDelayInBytes > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100827 ASSERT_TRUE(delayHintTest || dataSizeTest);
828 } else {
829 // if only one of time delay / data delay is configured, one of them
830 // holds true by default, so we want both assertions to be true.
831 ASSERT_TRUE(delayHintTest && dataSizeTest);
832 }
833
834 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
835 }
836
Patrick Rohr149b0872021-11-20 00:39:37 +0100837 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
838 ASSERT_TRUE(mDemuxTests.closeDemux());
839 ASSERT_TRUE(mFrontendTests.closeFrontend());
840}
841
Patrick Rohr1586d212021-11-23 00:40:56 +0100842TEST_P(TunerFilterAidlTest, FilterDelayHintTest) {
843 description("Test filter time delay hint.");
Gareth Fenn9a808452022-03-31 08:40:00 +0100844 if (!live.hasFrontendConnection) {
845 return;
846 }
Patrick Rohr1586d212021-11-23 00:40:56 +0100847 for (const auto& obj : filterMap) {
848 testDelayHint(obj.second);
849 }
850}
851
Hongguang600a6ae2021-07-08 18:51:51 -0700852TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
853 description("Feed ts data from playback and configure Ts section filter to get output");
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000854 if (!playback.support) {
Hongguang600a6ae2021-07-08 18:51:51 -0700855 return;
856 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000857 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
858 for (auto& configuration : playback_configs) {
859 if (configuration.sectionFilterId.compare(emptyHardwareId) != 0) {
860 playback = configuration;
861 playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]);
862 }
863 }
Hongguang600a6ae2021-07-08 18:51:51 -0700864}
865
866TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsAudioFilterTest) {
867 description("Feed ts data from playback and configure Ts audio filter to get output");
868 if (!playback.support) {
869 return;
870 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000871 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
872 for (auto& configuration : playback_configs) {
873 playback = configuration;
874 playbackSingleFilterTest(filterMap[playback.audioFilterId], dvrMap[playback.dvrId]);
875 }
Hongguang600a6ae2021-07-08 18:51:51 -0700876}
877
878TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsVideoFilterTest) {
879 description("Feed ts data from playback and configure Ts video filter to get output");
880 if (!playback.support) {
881 return;
882 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000883 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
884 for (auto& configuration : playback_configs) {
885 playback = configuration;
886 playbackSingleFilterTest(filterMap[playback.videoFilterId], dvrMap[playback.dvrId]);
887 }
Hongguang600a6ae2021-07-08 18:51:51 -0700888}
889
890TEST_P(TunerRecordAidlTest, RecordDataFlowWithTsRecordFilterTest) {
891 description("Feed ts data from frontend to recording and test with ts record filter");
892 if (!record.support) {
893 return;
894 }
895 recordSingleFilterTest(filterMap[record.recordFilterId], frontendMap[record.frontendId],
896 dvrMap[record.dvrRecordId]);
897}
898
899TEST_P(TunerRecordAidlTest, AttachFiltersToRecordTest) {
900 description("Attach a single filter to the record dvr test.");
901 // TODO use parameterized tests
902 if (!record.support) {
903 return;
904 }
905 attachSingleFilterToRecordDvrTest(filterMap[record.recordFilterId],
906 frontendMap[record.frontendId], dvrMap[record.dvrRecordId]);
907}
908
909TEST_P(TunerRecordAidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
910 description("Feed ts data from Fe with Lnb to recording and test with ts record filter");
911 if (!lnbRecord.support) {
912 return;
913 }
Frankie Lizcanoecba02a2022-07-12 17:56:54 +0000914 vector<LnbRecordHardwareConnections> lnbRecord_configs = generateLnbRecordConfigurations();
915 if (lnbRecord_configs.empty()) {
916 ALOGD("No frontends that support satellites.");
917 return;
918 }
919 for (auto& configuration : lnbRecord_configs) {
920 lnbRecord = configuration;
921 recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId],
922 frontendMap[lnbRecord.frontendId],
923 dvrMap[lnbRecord.dvrRecordId], lnbMap[lnbRecord.lnbId]);
924 }
Hongguang600a6ae2021-07-08 18:51:51 -0700925}
926
927TEST_P(TunerFrontendAidlTest, TuneFrontend) {
928 description("Tune one Frontend with specific setting and check Lock event");
929 if (!live.hasFrontendConnection) {
930 return;
931 }
932 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
933}
934
935TEST_P(TunerFrontendAidlTest, AutoScanFrontend) {
936 description("Run an auto frontend scan with specific setting and check lock scanMessage");
937 if (!scan.hasFrontendConnection) {
938 return;
939 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +0000940 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
941 for (auto& configuration : scan_configs) {
942 scan = configuration;
943 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_AUTO);
944 }
Hongguang600a6ae2021-07-08 18:51:51 -0700945}
946
947TEST_P(TunerFrontendAidlTest, BlindScanFrontend) {
948 description("Run an blind frontend scan with specific setting and check lock scanMessage");
949 if (!scan.hasFrontendConnection) {
950 return;
951 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +0000952 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
953 for (auto& configuration : scan_configs) {
954 scan = configuration;
955 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
956 }
Hongguang600a6ae2021-07-08 18:51:51 -0700957}
958
959TEST_P(TunerFrontendAidlTest, TuneFrontendWithFrontendSettings) {
960 description("Tune one Frontend with setting and check Lock event");
961 if (!live.hasFrontendConnection) {
962 return;
963 }
964 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
965}
966
967TEST_P(TunerFrontendAidlTest, BlindScanFrontendWithEndFrequency) {
968 description("Run an blind frontend scan with setting and check lock scanMessage");
969 if (!scan.hasFrontendConnection) {
970 return;
971 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +0000972 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
973 for (auto& configuration : scan_configs) {
974 scan = configuration;
975 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
976 }
Hongguang600a6ae2021-07-08 18:51:51 -0700977}
978
979TEST_P(TunerFrontendAidlTest, LinkToCiCam) {
980 description("Test Frontend link to CiCam");
981 if (!live.hasFrontendConnection) {
982 return;
983 }
984 if (!frontendMap[live.frontendId].canConnectToCiCam) {
985 return;
986 }
987 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
988}
989
Hongguangfcedda02021-12-13 17:08:02 -0800990TEST_P(TunerFrontendAidlTest, getHardwareInfo) {
991 description("Test Frontend get hardware info");
992 if (!live.hasFrontendConnection) {
993 return;
994 }
995 mFrontendTests.debugInfoTest(frontendMap[live.frontendId]);
996}
997
Hongguang5766ddf2021-12-23 11:40:37 -0800998TEST_P(TunerFrontendAidlTest, maxNumberOfFrontends) {
999 description("Test Max Frontend number");
1000 if (!live.hasFrontendConnection) {
1001 return;
1002 }
1003 mFrontendTests.maxNumberOfFrontendsTest();
1004}
1005
Hongguang881190f2022-01-14 13:23:37 -08001006TEST_P(TunerFrontendAidlTest, statusReadinessTest) {
1007 description("Test Max Frontend status readiness");
1008 if (!live.hasFrontendConnection) {
1009 return;
1010 }
1011 mFrontendTests.statusReadinessTest(frontendMap[live.frontendId]);
1012}
1013
Hongguang600a6ae2021-07-08 18:51:51 -07001014TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowVideoFilterTest) {
1015 description("Test Video Filter functionality in Broadcast use case.");
1016 if (!live.hasFrontendConnection) {
1017 return;
1018 }
1019 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1020}
1021
1022TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowAudioFilterTest) {
1023 description("Test Audio Filter functionality in Broadcast use case.");
1024 if (!live.hasFrontendConnection) {
1025 return;
1026 }
1027 broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]);
1028}
1029
1030TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowSectionFilterTest) {
1031 description("Test Section Filter functionality in Broadcast use case.");
1032 if (!live.hasFrontendConnection) {
1033 return;
1034 }
1035 if (live.sectionFilterId.compare(emptyHardwareId) == 0) {
1036 return;
1037 }
1038 broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]);
1039}
1040
1041TEST_P(TunerBroadcastAidlTest, IonBufferTest) {
1042 description("Test the av filter data bufferring.");
1043 if (!live.hasFrontendConnection) {
1044 return;
1045 }
1046 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1047}
1048
1049TEST_P(TunerBroadcastAidlTest, LnbBroadcastDataFlowVideoFilterTest) {
1050 description("Test Video Filter functionality in Broadcast with Lnb use case.");
1051 if (!lnbLive.support) {
1052 return;
1053 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +00001054 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
1055 if (lnbLive_configs.empty()) {
1056 ALOGD("No frontends that support satellites.");
1057 return;
1058 }
1059 for (auto& combination : lnbLive_configs) {
1060 lnbLive = combination;
1061 broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId],
1062 frontendMap[lnbLive.frontendId], lnbMap[lnbLive.lnbId]);
1063 }
Hongguang600a6ae2021-07-08 18:51:51 -07001064}
1065
1066TEST_P(TunerBroadcastAidlTest, MediaFilterWithSharedMemoryHandle) {
1067 description("Test the Media Filter with shared memory handle");
1068 if (!live.hasFrontendConnection) {
1069 return;
1070 }
1071 mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1072}
1073
1074TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
1075 description("Create Descrambler");
1076 if (!descrambling.support) {
1077 return;
1078 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001079 vector<DescramblingHardwareConnections> descrambling_configs =
1080 generateDescramblingConfigurations();
1081 if (descrambling_configs.empty()) {
1082 ALOGD("No valid descrambling combinations in the configuration file.");
1083 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001084 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001085 for (auto& combination : descrambling_configs) {
1086 descrambling = combination;
1087 int32_t demuxId;
1088 std::shared_ptr<IDemux> demux;
1089 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
Hongguang600a6ae2021-07-08 18:51:51 -07001090
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001091 if (descrambling.hasFrontendConnection) {
1092 int32_t feId;
1093 mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId);
1094 ASSERT_TRUE(feId != INVALID_ID);
1095 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
1096 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
1097 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
1098 }
Hongguang600a6ae2021-07-08 18:51:51 -07001099
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001100 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
1101 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
1102 ASSERT_TRUE(mDemuxTests.closeDemux());
1103
1104 if (descrambling.hasFrontendConnection) {
1105 ASSERT_TRUE(mFrontendTests.closeFrontend());
1106 }
Hongguang600a6ae2021-07-08 18:51:51 -07001107 }
1108}
1109
1110TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
1111 description("Test ts audio filter in scrambled broadcast use case");
1112 if (!descrambling.support) {
1113 return;
1114 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001115 vector<DescramblingHardwareConnections> descrambling_configs =
1116 generateDescramblingConfigurations();
1117 if (descrambling_configs.empty()) {
1118 ALOGD("No valid descrambling combinations in the configuration file.");
1119 return;
1120 }
1121 for (auto& combination : descrambling_configs) {
1122 descrambling = combination;
1123 set<FilterConfig> filterConfs;
1124 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
1125 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
1126 scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
1127 descramblerMap[descrambling.descramblerId]);
1128 }
Hongguang600a6ae2021-07-08 18:51:51 -07001129}
1130
1131INSTANTIATE_TEST_SUITE_P(PerInstance, TunerBroadcastAidlTest,
1132 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1133 android::PrintInstanceNameToString);
1134
1135INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFrontendAidlTest,
1136 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1137 android::PrintInstanceNameToString);
1138
1139INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFilterAidlTest,
1140 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1141 android::PrintInstanceNameToString);
1142
1143INSTANTIATE_TEST_SUITE_P(PerInstance, TunerRecordAidlTest,
1144 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1145 android::PrintInstanceNameToString);
1146
1147INSTANTIATE_TEST_SUITE_P(PerInstance, TunerLnbAidlTest,
1148 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1149 android::PrintInstanceNameToString);
1150
1151INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDemuxAidlTest,
1152 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1153 android::PrintInstanceNameToString);
1154
1155INSTANTIATE_TEST_SUITE_P(PerInstance, TunerPlaybackAidlTest,
1156 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1157 android::PrintInstanceNameToString);
1158
1159INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDescramblerAidlTest,
1160 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1161 android::PrintInstanceNameToString);
1162
1163} // namespace
1164
1165// Start thread pool to receive callbacks from AIDL service.
1166int main(int argc, char** argv) {
1167 ::testing::InitGoogleTest(&argc, argv);
1168 ABinderProcess_setThreadPoolMaxThreadCount(1);
1169 ABinderProcess_startThreadPool();
1170 return RUN_ALL_TESTS();
1171}