blob: b8e291252785ae83907df23522231930e0618fd4 [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));
173 broadcastSingleFilterTest(filterConf, frontendConf);
174 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000175 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700176}
177
178void TunerBroadcastAidlTest::mediaFilterUsingSharedMemoryTest(FilterConfig filterConf,
179 FrontendConfig frontendConf) {
180 int32_t feId;
181 int32_t demuxId;
182 std::shared_ptr<IDemux> demux;
183 int64_t filterId;
184
185 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
186 ASSERT_TRUE(feId != INVALID_ID);
187 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
188 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
189 if (frontendConf.isSoftwareFe) {
190 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
191 }
192 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
193 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
194 mFrontendTests.setDemux(demux);
195 mFilterTests.setDemux(demux);
196 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
197 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
198 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
199 ASSERT_TRUE(mFilterTests.getSharedAvMemoryHandle(filterId));
200 ASSERT_TRUE(mFilterTests.configAvFilterStreamType(filterConf.streamType, filterId));
201 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
202 ASSERT_TRUE(mFilterTests.startFilter(filterId));
203 // tune test
204 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
205 ASSERT_TRUE(filterDataOutputTest());
206 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
207 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
208 ASSERT_TRUE(mFilterTests.releaseShareAvHandle(filterId));
209 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
210 ASSERT_TRUE(mDemuxTests.closeDemux());
211 ASSERT_TRUE(mFrontendTests.closeFrontend());
212}
213
214void TunerPlaybackAidlTest::playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf) {
215 int32_t demuxId;
216 std::shared_ptr<IDemux> demux;
217 int64_t filterId;
218
219 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
220 mFilterTests.setDemux(demux);
221 mDvrTests.setDemux(demux);
222 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
223 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrConf.settings));
224 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
225 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
226 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
227 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
228 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
229 mDvrTests.startPlaybackInputThread(dvrConf.playbackInputFile,
230 dvrConf.settings.get<DvrSettings::Tag::playback>());
231 ASSERT_TRUE(mDvrTests.startDvrPlayback());
232 ASSERT_TRUE(mFilterTests.startFilter(filterId));
233 ASSERT_TRUE(filterDataOutputTest());
234 mDvrTests.stopPlaybackThread();
235 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
236 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
237 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
238 mDvrTests.closeDvrPlayback();
239 ASSERT_TRUE(mDemuxTests.closeDemux());
240}
241
242void TunerRecordAidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf,
243 FrontendConfig frontendConf,
244 DvrConfig dvrConf, LnbConfig lnbConf) {
245 if (lnbConf.name.compare(emptyHardwareId) == 0) {
246 vector<int32_t> ids;
247 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
248 ASSERT_TRUE(ids.size() > 0);
249 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
Frankie Lizcano87421812022-07-28 17:13:01 +0000250 mLnbId = ids[0];
Hongguang600a6ae2021-07-08 18:51:51 -0700251 } else {
Frankie Lizcano87421812022-07-28 17:13:01 +0000252 ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700253 }
254 ASSERT_TRUE(mLnbTests.setLnbCallback());
255 ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
256 ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
257 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
258 for (auto msgName : lnbRecord.diseqcMsgs) {
259 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
260 }
261 recordSingleFilterTest(filterConf, frontendConf, dvrConf);
262 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000263 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700264}
265
266void TunerRecordAidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf,
267 FrontendConfig frontendConf,
268 DvrConfig dvrConf) {
269 int32_t demuxId;
270 std::shared_ptr<IDemux> demux;
271 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
272 mDvrTests.setDemux(demux);
273
274 DvrConfig dvrSourceConfig;
275 if (record.hasFrontendConnection) {
276 int32_t feId;
277 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
278 ASSERT_TRUE(feId != INVALID_ID);
279 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
280 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
281 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
282 } else {
283 dvrSourceConfig = dvrMap[record.dvrSourceId];
284 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
285 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
286 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
287 }
288
289 int64_t filterId;
290 std::shared_ptr<IFilter> filter;
291 mFilterTests.setDemux(demux);
292
293 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
294 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
295 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
296
297 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
298 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
299 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
300 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
301 filter = mFilterTests.getFilterById(filterId);
302 ASSERT_TRUE(filter != nullptr);
303 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
304 ASSERT_TRUE(mDvrTests.startDvrRecord());
305 ASSERT_TRUE(mFilterTests.startFilter(filterId));
306 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
307 ASSERT_TRUE(mDvrTests.stopDvrRecord());
308 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
309 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
310 mDvrTests.closeDvrRecord();
311 ASSERT_TRUE(mDemuxTests.closeDemux());
312
313 if (record.hasFrontendConnection) {
314 ASSERT_TRUE(mFrontendTests.closeFrontend());
315 }
316}
317
318void TunerRecordAidlTest::recordSingleFilterTest(FilterConfig filterConf,
319 FrontendConfig frontendConf, DvrConfig dvrConf) {
320 int32_t demuxId;
321 std::shared_ptr<IDemux> demux;
322 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
323 mDvrTests.setDemux(demux);
324
325 DvrConfig dvrSourceConfig;
326 if (record.hasFrontendConnection) {
327 int32_t feId;
328 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
329 ASSERT_TRUE(feId != INVALID_ID);
330 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
331 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
332 if (frontendConf.isSoftwareFe) {
333 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]);
334 }
335 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
336 mFrontendTests.setDvrTests(&mDvrTests);
337 } else {
338 dvrSourceConfig = dvrMap[record.dvrSourceId];
339 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
340 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
341 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
342 }
343
344 int64_t filterId;
345 std::shared_ptr<IFilter> filter;
346 mFilterTests.setDemux(demux);
347 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
348 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
349 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
350 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
351 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
352 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
353 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
354 filter = mFilterTests.getFilterById(filterId);
355 ASSERT_TRUE(filter != nullptr);
356 mDvrTests.startRecordOutputThread(dvrConf.settings.get<DvrSettings::Tag::record>());
357 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
358 ASSERT_TRUE(mDvrTests.startDvrRecord());
359 ASSERT_TRUE(mFilterTests.startFilter(filterId));
360
361 if (record.hasFrontendConnection) {
362 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
363 } else {
364 // Start DVR Source
365 mDvrTests.startPlaybackInputThread(
366 dvrSourceConfig.playbackInputFile,
367 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
368 ASSERT_TRUE(mDvrTests.startDvrPlayback());
369 }
370
371 mDvrTests.testRecordOutput();
372 mDvrTests.stopRecordThread();
373
374 if (record.hasFrontendConnection) {
375 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
376 } else {
377 mDvrTests.stopPlaybackThread();
378 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
379 }
380
381 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
382 ASSERT_TRUE(mDvrTests.stopDvrRecord());
383 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
384 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
385 mDvrTests.closeDvrRecord();
386
387 if (record.hasFrontendConnection) {
388 ASSERT_TRUE(mFrontendTests.closeFrontend());
389 } else {
390 mDvrTests.closeDvrPlayback();
391 }
392
393 ASSERT_TRUE(mDemuxTests.closeDemux());
394}
395
396void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,
397 FrontendConfig frontendConf,
398 DescramblerConfig descConfig) {
399 int32_t demuxId;
400 std::shared_ptr<IDemux> demux;
401 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
402
403 DvrConfig dvrSourceConfig;
404 if (descrambling.hasFrontendConnection) {
405 int32_t feId;
406 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
407 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
408 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
409 if (frontendConf.isSoftwareFe) {
410 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]);
411 }
412 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
413 mFrontendTests.setDemux(demux);
414 } else {
415 dvrSourceConfig = dvrMap[descrambling.dvrSourceId];
416 mDvrTests.setDemux(demux);
417 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
418 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
419 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
420 }
421
422 set<int64_t> filterIds;
423 int64_t filterId;
424 set<struct FilterConfig>::iterator config;
425 set<int64_t>::iterator id;
426 mFilterTests.setDemux(demux);
427 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
428 ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize));
429 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
430 ASSERT_TRUE(mFilterTests.configFilter((*config).settings, filterId));
431 filterIds.insert(filterId);
432 }
433 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
434 vector<uint8_t> token;
435 ASSERT_TRUE(mDescramblerTests.getKeyToken(descConfig.casSystemId, descConfig.provisionStr,
436 descConfig.hidlPvtData, token));
437 mDescramblerTests.setKeyToken(token);
438 vector<DemuxPid> pids;
439 DemuxPid pid;
440 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
441 ASSERT_TRUE(mDescramblerTests.getDemuxPidFromFilterSettings((*config).type,
442 (*config).settings, pid));
443 pids.push_back(pid);
444 ASSERT_TRUE(mDescramblerTests.addPid(pid, nullptr));
445 }
446 for (id = filterIds.begin(); id != filterIds.end(); id++) {
447 ASSERT_TRUE(mFilterTests.startFilter(*id));
448 }
449
450 if (descrambling.hasFrontendConnection) {
451 // tune test
452 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
453 } else {
454 // Start DVR Source
455 mDvrTests.startPlaybackInputThread(
456 dvrSourceConfig.playbackInputFile,
457 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
458 ASSERT_TRUE(mDvrTests.startDvrPlayback());
459 }
460
461 ASSERT_TRUE(filterDataOutputTest());
462
463 if (descrambling.hasFrontendConnection) {
464 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
465 } else {
466 mDvrTests.stopPlaybackThread();
467 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
468 }
469
470 for (id = filterIds.begin(); id != filterIds.end(); id++) {
471 ASSERT_TRUE(mFilterTests.stopFilter(*id));
472 }
473 for (auto pid : pids) {
474 ASSERT_TRUE(mDescramblerTests.removePid(pid, nullptr));
475 }
476 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
477 for (id = filterIds.begin(); id != filterIds.end(); id++) {
478 ASSERT_TRUE(mFilterTests.closeFilter(*id));
479 }
480
481 if (descrambling.hasFrontendConnection) {
482 ASSERT_TRUE(mFrontendTests.closeFrontend());
483 } else {
484 mDvrTests.closeDvrPlayback();
485 }
486
487 ASSERT_TRUE(mDemuxTests.closeDemux());
488}
489
490TEST_P(TunerLnbAidlTest, SendDiseqcMessageToLnb) {
491 description("Open and configure an Lnb with specific settings then send a diseqc msg to it.");
492 if (!lnbLive.support) {
493 return;
494 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000495 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
496 if (lnbLive_configs.empty()) {
497 ALOGD("No frontends that support satellites.");
498 return;
Hongguang600a6ae2021-07-08 18:51:51 -0700499 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000500 for (auto& combination : lnbLive_configs) {
501 lnbLive = combination;
502
503 if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) {
504 vector<int32_t> ids;
505 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
506 ASSERT_TRUE(ids.size() > 0);
507 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
508 } else {
509 int32_t id;
510 ASSERT_TRUE(mLnbTests.openLnbByName(lnbMap[lnbLive.lnbId].name, id));
511 }
512 ASSERT_TRUE(mLnbTests.setLnbCallback());
513 ASSERT_TRUE(mLnbTests.setVoltage(lnbMap[lnbLive.lnbId].voltage));
514 ASSERT_TRUE(mLnbTests.setTone(lnbMap[lnbLive.lnbId].tone));
515 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbMap[lnbLive.lnbId].position));
516 for (auto msgName : lnbLive.diseqcMsgs) {
517 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
518 }
519 ASSERT_TRUE(mLnbTests.closeLnb());
Hongguang600a6ae2021-07-08 18:51:51 -0700520 }
Hongguang600a6ae2021-07-08 18:51:51 -0700521}
522
523TEST_P(TunerDemuxAidlTest, openDemux) {
524 description("Open and close a Demux.");
525 if (!live.hasFrontendConnection) {
526 return;
527 }
528 int32_t feId;
529 int32_t demuxId;
530 std::shared_ptr<IDemux> demux;
531 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
532 ASSERT_TRUE(feId != INVALID_ID);
533 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
534 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
535 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
536 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
537 ASSERT_TRUE(mDemuxTests.closeDemux());
538 ASSERT_TRUE(mFrontendTests.closeFrontend());
539}
540
541TEST_P(TunerDemuxAidlTest, getAvSyncTime) {
542 description("Get the A/V sync time from a PCR filter.");
543 if (!live.hasFrontendConnection) {
544 return;
545 }
546 if (live.pcrFilterId.compare(emptyHardwareId) == 0) {
547 return;
548 }
549 int32_t feId;
550 int32_t demuxId;
551 std::shared_ptr<IDemux> demux;
552 int64_t mediaFilterId;
553 int64_t pcrFilterId;
554 int32_t avSyncHwId;
555 std::shared_ptr<IFilter> mediaFilter;
556
557 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
558 ASSERT_TRUE(feId != INVALID_ID);
559 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
560 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
561 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
562 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
563 mFilterTests.setDemux(demux);
564 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type,
565 filterMap[live.videoFilterId].bufferSize));
566 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(mediaFilterId));
567 ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
568 mediaFilter = mFilterTests.getFilterById(mediaFilterId);
569 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type,
570 filterMap[live.pcrFilterId].bufferSize));
571 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(pcrFilterId));
572 ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.pcrFilterId].settings, pcrFilterId));
573 ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId));
574 ASSERT_TRUE(pcrFilterId == avSyncHwId);
575 ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId));
576 ASSERT_TRUE(mFilterTests.closeFilter(pcrFilterId));
577 ASSERT_TRUE(mFilterTests.closeFilter(mediaFilterId));
578 ASSERT_TRUE(mDemuxTests.closeDemux());
579 ASSERT_TRUE(mFrontendTests.closeFrontend());
580}
581
582TEST_P(TunerFilterAidlTest, StartFilterInDemux) {
583 description("Open and start a filter in Demux.");
584 if (!live.hasFrontendConnection) {
585 return;
586 }
587 // TODO use parameterized tests
588 configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
589}
590
591TEST_P(TunerFilterAidlTest, ConfigIpFilterInDemuxWithCid) {
592 description("Open and configure an ip filter in Demux.");
593 // TODO use parameterized tests
594 if (!live.hasFrontendConnection) {
595 return;
596 }
597 if (live.ipFilterId.compare(emptyHardwareId) == 0) {
598 return;
599 }
600 configSingleFilterInDemuxTest(filterMap[live.ipFilterId], frontendMap[live.frontendId]);
601}
602
603TEST_P(TunerFilterAidlTest, ReconfigFilterToReceiveStartId) {
604 description("Recofigure and restart a filter to test start id.");
605 if (!live.hasFrontendConnection) {
606 return;
607 }
608 // TODO use parameterized tests
609 reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId], filterMap[live.videoFilterId],
610 frontendMap[live.frontendId]);
611}
612
613TEST_P(TunerFilterAidlTest, SetFilterLinkage) {
614 description("Pick up all the possible linkages from the demux caps and set them up.");
615 DemuxCapabilities caps;
616 int32_t demuxId;
617 std::shared_ptr<IDemux> demux;
618 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
619 ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
620 mFilterTests.setDemux(demux);
621 for (int i = 0; i < caps.linkCaps.size(); i++) {
622 uint32_t bitMask = 1;
623 for (int j = 0; j < FILTER_MAIN_TYPE_BIT_COUNT; j++) {
624 if (caps.linkCaps[i] & (bitMask << j)) {
625 int64_t sourceFilterId;
626 int64_t sinkFilterId;
627 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(i), FMQ_SIZE_16M));
628 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sourceFilterId));
629 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(j), FMQ_SIZE_16M));
630 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sinkFilterId));
631 ASSERT_TRUE(mFilterTests.setFilterDataSource(sourceFilterId, sinkFilterId));
632 ASSERT_TRUE(mFilterTests.setFilterDataSourceToDemux(sinkFilterId));
633 ASSERT_TRUE(mFilterTests.closeFilter(sinkFilterId));
634 ASSERT_TRUE(mFilterTests.closeFilter(sourceFilterId));
635 }
636 }
637 }
638 ASSERT_TRUE(mDemuxTests.closeDemux());
639}
640
641TEST_P(TunerFilterAidlTest, testTimeFilter) {
642 description("Open a timer filter in Demux and set time stamp.");
643 if (!timeFilter.support) {
644 return;
645 }
646 // TODO use parameterized tests
647 testTimeFilter(timeFilterMap[timeFilter.timeFilterId]);
648}
649
Gareth Fenn9a808452022-03-31 08:40:00 +0100650static bool isEventProducingFilter(const FilterConfig& filterConfig) {
651 switch (filterConfig.type.mainType) {
652 case DemuxFilterMainType::TS: {
653 auto tsFilterType =
654 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
655 return (tsFilterType == DemuxTsFilterType::SECTION ||
656 tsFilterType == DemuxTsFilterType::PES ||
657 tsFilterType == DemuxTsFilterType::AUDIO ||
658 tsFilterType == DemuxTsFilterType::VIDEO ||
659 tsFilterType == DemuxTsFilterType::RECORD ||
660 tsFilterType == DemuxTsFilterType::TEMI);
661 }
662 case DemuxFilterMainType::MMTP: {
663 auto mmtpFilterType =
664 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
665 return (mmtpFilterType == DemuxMmtpFilterType::SECTION ||
666 mmtpFilterType == DemuxMmtpFilterType::PES ||
667 mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
668 mmtpFilterType == DemuxMmtpFilterType::VIDEO ||
669 mmtpFilterType == DemuxMmtpFilterType::RECORD ||
670 mmtpFilterType == DemuxMmtpFilterType::DOWNLOAD);
671 }
672 case DemuxFilterMainType::IP: {
673 auto ipFilterType =
674 filterConfig.type.subType.get<DemuxFilterSubType::Tag::ipFilterType>();
675 return (ipFilterType == DemuxIpFilterType::SECTION);
676 }
677 case DemuxFilterMainType::TLV: {
678 auto tlvFilterType =
679 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tlvFilterType>();
680 return (tlvFilterType == DemuxTlvFilterType::SECTION);
681 }
682 case DemuxFilterMainType::ALP: {
683 auto alpFilterType =
684 filterConfig.type.subType.get<DemuxFilterSubType::Tag::alpFilterType>();
685 return (alpFilterType == DemuxAlpFilterType::SECTION);
686 }
687 default:
688 return false;
689 }
690}
691
Patrick Rohr1586d212021-11-23 00:40:56 +0100692static bool isMediaFilter(const FilterConfig& filterConfig) {
693 switch (filterConfig.type.mainType) {
694 case DemuxFilterMainType::TS: {
695 // TS Audio and Video filters are media filters
696 auto tsFilterType =
697 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
698 return (tsFilterType == DemuxTsFilterType::AUDIO ||
699 tsFilterType == DemuxTsFilterType::VIDEO);
700 }
701 case DemuxFilterMainType::MMTP: {
702 // MMTP Audio and Video filters are media filters
703 auto mmtpFilterType =
704 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
705 return (mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
706 mmtpFilterType == DemuxMmtpFilterType::VIDEO);
707 }
708 default:
709 return false;
710 }
711}
Patrick Rohr149b0872021-11-20 00:39:37 +0100712
Patrick Rohr1586d212021-11-23 00:40:56 +0100713static int getDemuxFilterEventDataLength(const DemuxFilterEvent& event) {
714 switch (event.getTag()) {
715 case DemuxFilterEvent::Tag::section:
716 return event.get<DemuxFilterEvent::Tag::section>().dataLength;
717 case DemuxFilterEvent::Tag::media:
718 return event.get<DemuxFilterEvent::Tag::media>().dataLength;
719 case DemuxFilterEvent::Tag::pes:
720 return event.get<DemuxFilterEvent::Tag::pes>().dataLength;
721 case DemuxFilterEvent::Tag::download:
722 return event.get<DemuxFilterEvent::Tag::download>().dataLength;
723 case DemuxFilterEvent::Tag::ipPayload:
724 return event.get<DemuxFilterEvent::Tag::ipPayload>().dataLength;
725
726 case DemuxFilterEvent::Tag::tsRecord:
727 case DemuxFilterEvent::Tag::mmtpRecord:
728 case DemuxFilterEvent::Tag::temi:
729 case DemuxFilterEvent::Tag::monitorEvent:
730 case DemuxFilterEvent::Tag::startId:
731 return 0;
732 }
733}
734
735// TODO: move boilerplate into text fixture
736void TunerFilterAidlTest::testDelayHint(const FilterConfig& filterConf) {
Gareth Fenn9a808452022-03-31 08:40:00 +0100737 if (!filterConf.timeDelayInMs && !filterConf.dataDelayInBytes) {
738 return;
739 }
740 if (!isEventProducingFilter(filterConf)) {
741 return;
742 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100743 int32_t feId;
744 int32_t demuxId;
745 std::shared_ptr<IDemux> demux;
746 int64_t filterId;
747
748 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
749 ASSERT_TRUE(feId != INVALID_ID);
750 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
751 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
752 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
753 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
754 mFilterTests.setDemux(demux);
755
Patrick Rohr149b0872021-11-20 00:39:37 +0100756 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
757 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
Patrick Rohr149b0872021-11-20 00:39:37 +0100758
Patrick Rohr1586d212021-11-23 00:40:56 +0100759 bool mediaFilter = isMediaFilter(filterConf);
Patrick Rohr149b0872021-11-20 00:39:37 +0100760 auto filter = mFilterTests.getFilterById(filterId);
761
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100762 // startTime needs to be set before calling setDelayHint.
763 auto startTime = std::chrono::steady_clock::now();
764
Gareth Fenn9a808452022-03-31 08:40:00 +0100765 int timeDelayInMs = filterConf.timeDelayInMs;
766 if (timeDelayInMs > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100767 FilterDelayHint delayHint;
768 delayHint.hintType = FilterDelayHintType::TIME_DELAY_IN_MS;
Gareth Fenn9a808452022-03-31 08:40:00 +0100769 delayHint.hintValue = timeDelayInMs;
Patrick Rohr149b0872021-11-20 00:39:37 +0100770
Patrick Rohr1586d212021-11-23 00:40:56 +0100771 // setDelayHint should fail for media filters.
772 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
773 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100774
Patrick Rohr1586d212021-11-23 00:40:56 +0100775 int dataDelayInBytes = filterConf.dataDelayInBytes;
776 if (dataDelayInBytes > 0) {
777 FilterDelayHint delayHint;
778 delayHint.hintType = FilterDelayHintType::DATA_SIZE_DELAY_IN_BYTES;
779 delayHint.hintValue = dataDelayInBytes;
Patrick Rohr149b0872021-11-20 00:39:37 +0100780
Patrick Rohr1586d212021-11-23 00:40:56 +0100781 // setDelayHint should fail for media filters.
782 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
783 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100784
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100785 // start and stop filter (and wait for first callback) in order to
786 // circumvent callback scheduler race conditions after adjusting filter
787 // delays.
788 auto cb = mFilterTests.getFilterCallbacks().at(filterId);
789 auto future =
790 cb->verifyFilterCallback([](const std::vector<DemuxFilterEvent>&) { return true; });
Gareth Fenn9a808452022-03-31 08:40:00 +0100791
792 // The configure stage can also produce events, so we should set the delay
793 // hint beforehand.
794 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
Patrick Rohr1586d212021-11-23 00:40:56 +0100795 mFilterTests.startFilter(filterId);
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100796
797 auto timeout = std::chrono::seconds(30);
798 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
799
Patrick Rohr1586d212021-11-23 00:40:56 +0100800 mFilterTests.stopFilter(filterId);
Patrick Rohr149b0872021-11-20 00:39:37 +0100801
Patrick Rohr1586d212021-11-23 00:40:56 +0100802 if (!mediaFilter) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100803 int callbackSize = 0;
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100804 future = cb->verifyFilterCallback(
Patrick Rohr1586d212021-11-23 00:40:56 +0100805 [&callbackSize](const std::vector<DemuxFilterEvent>& events) {
806 for (const auto& event : events) {
807 callbackSize += getDemuxFilterEventDataLength(event);
808 }
809 return true;
810 });
811
Patrick Rohr1586d212021-11-23 00:40:56 +0100812 ASSERT_TRUE(mFilterTests.startFilter(filterId));
813
814 // block and wait for callback to be received.
Patrick Rohr1586d212021-11-23 00:40:56 +0100815 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
Patrick Rohr1586d212021-11-23 00:40:56 +0100816
Gareth Fenn9a808452022-03-31 08:40:00 +0100817 auto duration = std::chrono::steady_clock::now() - startTime;
818 bool delayHintTest = duration >= std::chrono::milliseconds(timeDelayInMs);
Patrick Rohr1586d212021-11-23 00:40:56 +0100819 bool dataSizeTest = callbackSize >= dataDelayInBytes;
820
Gareth Fenn9a808452022-03-31 08:40:00 +0100821 if (timeDelayInMs > 0 && dataDelayInBytes > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100822 ASSERT_TRUE(delayHintTest || dataSizeTest);
823 } else {
824 // if only one of time delay / data delay is configured, one of them
825 // holds true by default, so we want both assertions to be true.
826 ASSERT_TRUE(delayHintTest && dataSizeTest);
827 }
828
829 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
830 }
831
Patrick Rohr149b0872021-11-20 00:39:37 +0100832 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
833 ASSERT_TRUE(mDemuxTests.closeDemux());
834 ASSERT_TRUE(mFrontendTests.closeFrontend());
835}
836
Patrick Rohr1586d212021-11-23 00:40:56 +0100837TEST_P(TunerFilterAidlTest, FilterDelayHintTest) {
838 description("Test filter time delay hint.");
Gareth Fenn9a808452022-03-31 08:40:00 +0100839 if (!live.hasFrontendConnection) {
840 return;
841 }
Patrick Rohr1586d212021-11-23 00:40:56 +0100842 for (const auto& obj : filterMap) {
843 testDelayHint(obj.second);
844 }
845}
846
Hongguang600a6ae2021-07-08 18:51:51 -0700847TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
848 description("Feed ts data from playback and configure Ts section filter to get output");
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000849 if (!playback.support) {
Hongguang600a6ae2021-07-08 18:51:51 -0700850 return;
851 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000852 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
853 for (auto& configuration : playback_configs) {
854 if (configuration.sectionFilterId.compare(emptyHardwareId) != 0) {
855 playback = configuration;
856 playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]);
857 }
858 }
Hongguang600a6ae2021-07-08 18:51:51 -0700859}
860
861TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsAudioFilterTest) {
862 description("Feed ts data from playback and configure Ts audio filter to get output");
863 if (!playback.support) {
864 return;
865 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000866 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
867 for (auto& configuration : playback_configs) {
868 playback = configuration;
869 playbackSingleFilterTest(filterMap[playback.audioFilterId], dvrMap[playback.dvrId]);
870 }
Hongguang600a6ae2021-07-08 18:51:51 -0700871}
872
873TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsVideoFilterTest) {
874 description("Feed ts data from playback and configure Ts video filter to get output");
875 if (!playback.support) {
876 return;
877 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000878 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
879 for (auto& configuration : playback_configs) {
880 playback = configuration;
881 playbackSingleFilterTest(filterMap[playback.videoFilterId], dvrMap[playback.dvrId]);
882 }
Hongguang600a6ae2021-07-08 18:51:51 -0700883}
884
885TEST_P(TunerRecordAidlTest, RecordDataFlowWithTsRecordFilterTest) {
886 description("Feed ts data from frontend to recording and test with ts record filter");
887 if (!record.support) {
888 return;
889 }
890 recordSingleFilterTest(filterMap[record.recordFilterId], frontendMap[record.frontendId],
891 dvrMap[record.dvrRecordId]);
892}
893
894TEST_P(TunerRecordAidlTest, AttachFiltersToRecordTest) {
895 description("Attach a single filter to the record dvr test.");
896 // TODO use parameterized tests
897 if (!record.support) {
898 return;
899 }
900 attachSingleFilterToRecordDvrTest(filterMap[record.recordFilterId],
901 frontendMap[record.frontendId], dvrMap[record.dvrRecordId]);
902}
903
904TEST_P(TunerRecordAidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
905 description("Feed ts data from Fe with Lnb to recording and test with ts record filter");
906 if (!lnbRecord.support) {
907 return;
908 }
Frankie Lizcanoecba02a2022-07-12 17:56:54 +0000909 vector<LnbRecordHardwareConnections> lnbRecord_configs = generateLnbRecordConfigurations();
910 if (lnbRecord_configs.empty()) {
911 ALOGD("No frontends that support satellites.");
912 return;
913 }
914 for (auto& configuration : lnbRecord_configs) {
915 lnbRecord = configuration;
916 recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId],
917 frontendMap[lnbRecord.frontendId],
918 dvrMap[lnbRecord.dvrRecordId], lnbMap[lnbRecord.lnbId]);
919 }
Hongguang600a6ae2021-07-08 18:51:51 -0700920}
921
922TEST_P(TunerFrontendAidlTest, TuneFrontend) {
923 description("Tune one Frontend with specific setting and check Lock event");
924 if (!live.hasFrontendConnection) {
925 return;
926 }
927 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
928}
929
930TEST_P(TunerFrontendAidlTest, AutoScanFrontend) {
931 description("Run an auto frontend scan with specific setting and check lock scanMessage");
932 if (!scan.hasFrontendConnection) {
933 return;
934 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +0000935 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
936 for (auto& configuration : scan_configs) {
937 scan = configuration;
938 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_AUTO);
939 }
Hongguang600a6ae2021-07-08 18:51:51 -0700940}
941
942TEST_P(TunerFrontendAidlTest, BlindScanFrontend) {
943 description("Run an blind frontend scan with specific setting and check lock scanMessage");
944 if (!scan.hasFrontendConnection) {
945 return;
946 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +0000947 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
948 for (auto& configuration : scan_configs) {
949 scan = configuration;
950 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
951 }
Hongguang600a6ae2021-07-08 18:51:51 -0700952}
953
954TEST_P(TunerFrontendAidlTest, TuneFrontendWithFrontendSettings) {
955 description("Tune one Frontend with setting and check Lock event");
956 if (!live.hasFrontendConnection) {
957 return;
958 }
959 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
960}
961
962TEST_P(TunerFrontendAidlTest, BlindScanFrontendWithEndFrequency) {
963 description("Run an blind frontend scan with setting and check lock scanMessage");
964 if (!scan.hasFrontendConnection) {
965 return;
966 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +0000967 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
968 for (auto& configuration : scan_configs) {
969 scan = configuration;
970 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
971 }
Hongguang600a6ae2021-07-08 18:51:51 -0700972}
973
974TEST_P(TunerFrontendAidlTest, LinkToCiCam) {
975 description("Test Frontend link to CiCam");
976 if (!live.hasFrontendConnection) {
977 return;
978 }
979 if (!frontendMap[live.frontendId].canConnectToCiCam) {
980 return;
981 }
982 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
983}
984
Hongguangfcedda02021-12-13 17:08:02 -0800985TEST_P(TunerFrontendAidlTest, getHardwareInfo) {
986 description("Test Frontend get hardware info");
987 if (!live.hasFrontendConnection) {
988 return;
989 }
990 mFrontendTests.debugInfoTest(frontendMap[live.frontendId]);
991}
992
Hongguang5766ddf2021-12-23 11:40:37 -0800993TEST_P(TunerFrontendAidlTest, maxNumberOfFrontends) {
994 description("Test Max Frontend number");
995 if (!live.hasFrontendConnection) {
996 return;
997 }
998 mFrontendTests.maxNumberOfFrontendsTest();
999}
1000
Hongguang881190f2022-01-14 13:23:37 -08001001TEST_P(TunerFrontendAidlTest, statusReadinessTest) {
1002 description("Test Max Frontend status readiness");
1003 if (!live.hasFrontendConnection) {
1004 return;
1005 }
1006 mFrontendTests.statusReadinessTest(frontendMap[live.frontendId]);
1007}
1008
Hongguang600a6ae2021-07-08 18:51:51 -07001009TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowVideoFilterTest) {
1010 description("Test Video Filter functionality in Broadcast use case.");
1011 if (!live.hasFrontendConnection) {
1012 return;
1013 }
1014 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1015}
1016
1017TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowAudioFilterTest) {
1018 description("Test Audio Filter functionality in Broadcast use case.");
1019 if (!live.hasFrontendConnection) {
1020 return;
1021 }
1022 broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]);
1023}
1024
1025TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowSectionFilterTest) {
1026 description("Test Section Filter functionality in Broadcast use case.");
1027 if (!live.hasFrontendConnection) {
1028 return;
1029 }
1030 if (live.sectionFilterId.compare(emptyHardwareId) == 0) {
1031 return;
1032 }
1033 broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]);
1034}
1035
1036TEST_P(TunerBroadcastAidlTest, IonBufferTest) {
1037 description("Test the av filter data bufferring.");
1038 if (!live.hasFrontendConnection) {
1039 return;
1040 }
1041 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1042}
1043
1044TEST_P(TunerBroadcastAidlTest, LnbBroadcastDataFlowVideoFilterTest) {
1045 description("Test Video Filter functionality in Broadcast with Lnb use case.");
1046 if (!lnbLive.support) {
1047 return;
1048 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +00001049 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
1050 if (lnbLive_configs.empty()) {
1051 ALOGD("No frontends that support satellites.");
1052 return;
1053 }
1054 for (auto& combination : lnbLive_configs) {
1055 lnbLive = combination;
1056 broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId],
1057 frontendMap[lnbLive.frontendId], lnbMap[lnbLive.lnbId]);
1058 }
Hongguang600a6ae2021-07-08 18:51:51 -07001059}
1060
1061TEST_P(TunerBroadcastAidlTest, MediaFilterWithSharedMemoryHandle) {
1062 description("Test the Media Filter with shared memory handle");
1063 if (!live.hasFrontendConnection) {
1064 return;
1065 }
1066 mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1067}
1068
1069TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
1070 description("Create Descrambler");
1071 if (!descrambling.support) {
1072 return;
1073 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001074 vector<DescramblingHardwareConnections> descrambling_configs =
1075 generateDescramblingConfigurations();
1076 if (descrambling_configs.empty()) {
1077 ALOGD("No valid descrambling combinations in the configuration file.");
1078 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001079 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001080 for (auto& combination : descrambling_configs) {
1081 descrambling = combination;
1082 int32_t demuxId;
1083 std::shared_ptr<IDemux> demux;
1084 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
Hongguang600a6ae2021-07-08 18:51:51 -07001085
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001086 if (descrambling.hasFrontendConnection) {
1087 int32_t feId;
1088 mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId);
1089 ASSERT_TRUE(feId != INVALID_ID);
1090 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
1091 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
1092 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
1093 }
Hongguang600a6ae2021-07-08 18:51:51 -07001094
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001095 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
1096 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
1097 ASSERT_TRUE(mDemuxTests.closeDemux());
1098
1099 if (descrambling.hasFrontendConnection) {
1100 ASSERT_TRUE(mFrontendTests.closeFrontend());
1101 }
Hongguang600a6ae2021-07-08 18:51:51 -07001102 }
1103}
1104
1105TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
1106 description("Test ts audio filter in scrambled broadcast use case");
1107 if (!descrambling.support) {
1108 return;
1109 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001110 vector<DescramblingHardwareConnections> descrambling_configs =
1111 generateDescramblingConfigurations();
1112 if (descrambling_configs.empty()) {
1113 ALOGD("No valid descrambling combinations in the configuration file.");
1114 return;
1115 }
1116 for (auto& combination : descrambling_configs) {
1117 descrambling = combination;
1118 set<FilterConfig> filterConfs;
1119 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
1120 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
1121 scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
1122 descramblerMap[descrambling.descramblerId]);
1123 }
Hongguang600a6ae2021-07-08 18:51:51 -07001124}
1125
1126INSTANTIATE_TEST_SUITE_P(PerInstance, TunerBroadcastAidlTest,
1127 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1128 android::PrintInstanceNameToString);
1129
1130INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFrontendAidlTest,
1131 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1132 android::PrintInstanceNameToString);
1133
1134INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFilterAidlTest,
1135 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1136 android::PrintInstanceNameToString);
1137
1138INSTANTIATE_TEST_SUITE_P(PerInstance, TunerRecordAidlTest,
1139 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1140 android::PrintInstanceNameToString);
1141
1142INSTANTIATE_TEST_SUITE_P(PerInstance, TunerLnbAidlTest,
1143 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1144 android::PrintInstanceNameToString);
1145
1146INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDemuxAidlTest,
1147 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1148 android::PrintInstanceNameToString);
1149
1150INSTANTIATE_TEST_SUITE_P(PerInstance, TunerPlaybackAidlTest,
1151 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1152 android::PrintInstanceNameToString);
1153
1154INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDescramblerAidlTest,
1155 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1156 android::PrintInstanceNameToString);
1157
1158} // namespace
1159
1160// Start thread pool to receive callbacks from AIDL service.
1161int main(int argc, char** argv) {
1162 ::testing::InitGoogleTest(&argc, argv);
1163 ABinderProcess_setThreadPoolMaxThreadCount(1);
1164 ABinderProcess_startThreadPool();
1165 return RUN_ALL_TESTS();
1166}