blob: fa47536505545c24d212cceaa08cf3ba047c4a89 [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 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000263 if (!frontendConf.isSoftwareFe) {
264 recordSingleFilterTest(filterConf, frontendConf, dvrConf, Dataflow_Context::LNBRECORD);
265 }
Hongguang600a6ae2021-07-08 18:51:51 -0700266 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000267 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700268}
269
270void TunerRecordAidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf,
271 FrontendConfig frontendConf,
272 DvrConfig dvrConf) {
273 int32_t demuxId;
274 std::shared_ptr<IDemux> demux;
275 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
276 mDvrTests.setDemux(demux);
277
278 DvrConfig dvrSourceConfig;
279 if (record.hasFrontendConnection) {
280 int32_t feId;
281 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
282 ASSERT_TRUE(feId != INVALID_ID);
283 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
284 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
285 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
286 } else {
287 dvrSourceConfig = dvrMap[record.dvrSourceId];
288 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
289 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
290 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
291 }
292
293 int64_t filterId;
294 std::shared_ptr<IFilter> filter;
295 mFilterTests.setDemux(demux);
296
297 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
298 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
299 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
300
301 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
302 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
303 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
304 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
305 filter = mFilterTests.getFilterById(filterId);
306 ASSERT_TRUE(filter != nullptr);
307 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
308 ASSERT_TRUE(mDvrTests.startDvrRecord());
309 ASSERT_TRUE(mFilterTests.startFilter(filterId));
310 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
311 ASSERT_TRUE(mDvrTests.stopDvrRecord());
312 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
313 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
314 mDvrTests.closeDvrRecord();
315 ASSERT_TRUE(mDemuxTests.closeDemux());
316
317 if (record.hasFrontendConnection) {
318 ASSERT_TRUE(mFrontendTests.closeFrontend());
319 }
320}
321
322void TunerRecordAidlTest::recordSingleFilterTest(FilterConfig filterConf,
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000323 FrontendConfig frontendConf, DvrConfig dvrConf,
324 Dataflow_Context context) {
Hongguang600a6ae2021-07-08 18:51:51 -0700325 int32_t demuxId;
326 std::shared_ptr<IDemux> demux;
327 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
328 mDvrTests.setDemux(demux);
329
330 DvrConfig dvrSourceConfig;
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000331 if (context == Dataflow_Context::RECORD) {
332 if (record.hasFrontendConnection) {
333 int32_t feId;
334 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
335 ASSERT_TRUE(feId != INVALID_ID);
336 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
337 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
338 if (frontendConf.isSoftwareFe) {
339 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]);
340 }
341 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
342 mFrontendTests.setDvrTests(&mDvrTests);
343 } else {
344 dvrSourceConfig = dvrMap[record.dvrSourceId];
345 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
346 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
347 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
348 }
349 } else if (context == Dataflow_Context::LNBRECORD) {
350 // If function arrives here, frontend should not be software, so no need to configure a dvr
351 // source or dvr fe connection that might be used for recording without an Lnb
Hongguang600a6ae2021-07-08 18:51:51 -0700352 int32_t feId;
353 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
354 ASSERT_TRUE(feId != INVALID_ID);
355 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
356 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000357 if (mLnbId != INVALID_LNB_ID) {
358 ASSERT_TRUE(mFrontendTests.setLnb(mLnbId));
359 } else {
360 FAIL();
Hongguang600a6ae2021-07-08 18:51:51 -0700361 }
362 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
363 mFrontendTests.setDvrTests(&mDvrTests);
Hongguang600a6ae2021-07-08 18:51:51 -0700364 }
365
366 int64_t filterId;
367 std::shared_ptr<IFilter> filter;
368 mFilterTests.setDemux(demux);
369 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
370 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
371 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
372 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
373 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
374 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
375 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
376 filter = mFilterTests.getFilterById(filterId);
377 ASSERT_TRUE(filter != nullptr);
378 mDvrTests.startRecordOutputThread(dvrConf.settings.get<DvrSettings::Tag::record>());
379 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
380 ASSERT_TRUE(mDvrTests.startDvrRecord());
381 ASSERT_TRUE(mFilterTests.startFilter(filterId));
382
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000383 if (context == Dataflow_Context::RECORD) {
384 if (record.hasFrontendConnection) {
385 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
386 } else {
387 // Start DVR Source
388 mDvrTests.startPlaybackInputThread(
389 dvrSourceConfig.playbackInputFile,
390 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
391 ASSERT_TRUE(mDvrTests.startDvrPlayback());
392 }
393 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700394 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -0700395 }
Hongguang600a6ae2021-07-08 18:51:51 -0700396 mDvrTests.testRecordOutput();
397 mDvrTests.stopRecordThread();
398
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000399 if (context == Dataflow_Context::RECORD) {
400 if (record.hasFrontendConnection) {
401 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
402 } else {
403 mDvrTests.stopPlaybackThread();
404 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
405 }
406 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700407 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -0700408 }
409
410 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
411 ASSERT_TRUE(mDvrTests.stopDvrRecord());
412 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
413 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
414 mDvrTests.closeDvrRecord();
415
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000416 if (context == Dataflow_Context::RECORD) {
417 if (record.hasFrontendConnection) {
418 ASSERT_TRUE(mFrontendTests.closeFrontend());
419 } else {
420 mDvrTests.closeDvrPlayback();
421 }
422 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700423 ASSERT_TRUE(mFrontendTests.closeFrontend());
Hongguang600a6ae2021-07-08 18:51:51 -0700424 }
425
426 ASSERT_TRUE(mDemuxTests.closeDemux());
427}
428
429void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,
430 FrontendConfig frontendConf,
431 DescramblerConfig descConfig) {
432 int32_t demuxId;
433 std::shared_ptr<IDemux> demux;
434 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
435
436 DvrConfig dvrSourceConfig;
437 if (descrambling.hasFrontendConnection) {
438 int32_t feId;
439 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
440 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
441 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
442 if (frontendConf.isSoftwareFe) {
443 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]);
444 }
445 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
446 mFrontendTests.setDemux(demux);
447 } else {
448 dvrSourceConfig = dvrMap[descrambling.dvrSourceId];
449 mDvrTests.setDemux(demux);
450 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
451 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
452 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
453 }
454
455 set<int64_t> filterIds;
456 int64_t filterId;
457 set<struct FilterConfig>::iterator config;
458 set<int64_t>::iterator id;
459 mFilterTests.setDemux(demux);
460 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
461 ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize));
462 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
463 ASSERT_TRUE(mFilterTests.configFilter((*config).settings, filterId));
464 filterIds.insert(filterId);
465 }
466 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
467 vector<uint8_t> token;
468 ASSERT_TRUE(mDescramblerTests.getKeyToken(descConfig.casSystemId, descConfig.provisionStr,
469 descConfig.hidlPvtData, token));
470 mDescramblerTests.setKeyToken(token);
471 vector<DemuxPid> pids;
472 DemuxPid pid;
473 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
474 ASSERT_TRUE(mDescramblerTests.getDemuxPidFromFilterSettings((*config).type,
475 (*config).settings, pid));
476 pids.push_back(pid);
477 ASSERT_TRUE(mDescramblerTests.addPid(pid, nullptr));
478 }
479 for (id = filterIds.begin(); id != filterIds.end(); id++) {
480 ASSERT_TRUE(mFilterTests.startFilter(*id));
481 }
482
483 if (descrambling.hasFrontendConnection) {
484 // tune test
485 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
486 } else {
487 // Start DVR Source
488 mDvrTests.startPlaybackInputThread(
489 dvrSourceConfig.playbackInputFile,
490 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
491 ASSERT_TRUE(mDvrTests.startDvrPlayback());
492 }
493
494 ASSERT_TRUE(filterDataOutputTest());
495
496 if (descrambling.hasFrontendConnection) {
497 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
498 } else {
499 mDvrTests.stopPlaybackThread();
500 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
501 }
502
503 for (id = filterIds.begin(); id != filterIds.end(); id++) {
504 ASSERT_TRUE(mFilterTests.stopFilter(*id));
505 }
506 for (auto pid : pids) {
507 ASSERT_TRUE(mDescramblerTests.removePid(pid, nullptr));
508 }
509 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
510 for (id = filterIds.begin(); id != filterIds.end(); id++) {
511 ASSERT_TRUE(mFilterTests.closeFilter(*id));
512 }
513
514 if (descrambling.hasFrontendConnection) {
515 ASSERT_TRUE(mFrontendTests.closeFrontend());
516 } else {
517 mDvrTests.closeDvrPlayback();
518 }
519
520 ASSERT_TRUE(mDemuxTests.closeDemux());
521}
522
523TEST_P(TunerLnbAidlTest, SendDiseqcMessageToLnb) {
524 description("Open and configure an Lnb with specific settings then send a diseqc msg to it.");
525 if (!lnbLive.support) {
526 return;
527 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000528 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
529 if (lnbLive_configs.empty()) {
530 ALOGD("No frontends that support satellites.");
531 return;
Hongguang600a6ae2021-07-08 18:51:51 -0700532 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000533 for (auto& combination : lnbLive_configs) {
534 lnbLive = combination;
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000535 if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) {
536 vector<int32_t> ids;
537 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
538 ASSERT_TRUE(ids.size() > 0);
539 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
540 } else {
541 int32_t id;
542 ASSERT_TRUE(mLnbTests.openLnbByName(lnbMap[lnbLive.lnbId].name, id));
543 }
544 ASSERT_TRUE(mLnbTests.setLnbCallback());
545 ASSERT_TRUE(mLnbTests.setVoltage(lnbMap[lnbLive.lnbId].voltage));
546 ASSERT_TRUE(mLnbTests.setTone(lnbMap[lnbLive.lnbId].tone));
547 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbMap[lnbLive.lnbId].position));
548 for (auto msgName : lnbLive.diseqcMsgs) {
549 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
550 }
551 ASSERT_TRUE(mLnbTests.closeLnb());
Hongguang600a6ae2021-07-08 18:51:51 -0700552 }
Hongguang600a6ae2021-07-08 18:51:51 -0700553}
554
555TEST_P(TunerDemuxAidlTest, openDemux) {
556 description("Open and close a Demux.");
557 if (!live.hasFrontendConnection) {
558 return;
559 }
560 int32_t feId;
561 int32_t demuxId;
562 std::shared_ptr<IDemux> demux;
563 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
564 ASSERT_TRUE(feId != INVALID_ID);
565 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
566 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
567 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
568 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
569 ASSERT_TRUE(mDemuxTests.closeDemux());
570 ASSERT_TRUE(mFrontendTests.closeFrontend());
571}
572
573TEST_P(TunerDemuxAidlTest, getAvSyncTime) {
574 description("Get the A/V sync time from a PCR filter.");
575 if (!live.hasFrontendConnection) {
576 return;
577 }
578 if (live.pcrFilterId.compare(emptyHardwareId) == 0) {
579 return;
580 }
581 int32_t feId;
582 int32_t demuxId;
583 std::shared_ptr<IDemux> demux;
584 int64_t mediaFilterId;
585 int64_t pcrFilterId;
586 int32_t avSyncHwId;
587 std::shared_ptr<IFilter> mediaFilter;
588
589 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
590 ASSERT_TRUE(feId != INVALID_ID);
591 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
592 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
593 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
594 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
595 mFilterTests.setDemux(demux);
596 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type,
597 filterMap[live.videoFilterId].bufferSize));
598 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(mediaFilterId));
599 ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
600 mediaFilter = mFilterTests.getFilterById(mediaFilterId);
601 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type,
602 filterMap[live.pcrFilterId].bufferSize));
603 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(pcrFilterId));
604 ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.pcrFilterId].settings, pcrFilterId));
605 ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId));
606 ASSERT_TRUE(pcrFilterId == avSyncHwId);
607 ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId));
608 ASSERT_TRUE(mFilterTests.closeFilter(pcrFilterId));
609 ASSERT_TRUE(mFilterTests.closeFilter(mediaFilterId));
610 ASSERT_TRUE(mDemuxTests.closeDemux());
611 ASSERT_TRUE(mFrontendTests.closeFrontend());
612}
613
614TEST_P(TunerFilterAidlTest, StartFilterInDemux) {
615 description("Open and start a filter in Demux.");
616 if (!live.hasFrontendConnection) {
617 return;
618 }
619 // TODO use parameterized tests
620 configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
621}
622
623TEST_P(TunerFilterAidlTest, ConfigIpFilterInDemuxWithCid) {
624 description("Open and configure an ip filter in Demux.");
625 // TODO use parameterized tests
626 if (!live.hasFrontendConnection) {
627 return;
628 }
629 if (live.ipFilterId.compare(emptyHardwareId) == 0) {
630 return;
631 }
632 configSingleFilterInDemuxTest(filterMap[live.ipFilterId], frontendMap[live.frontendId]);
633}
634
635TEST_P(TunerFilterAidlTest, ReconfigFilterToReceiveStartId) {
636 description("Recofigure and restart a filter to test start id.");
637 if (!live.hasFrontendConnection) {
638 return;
639 }
640 // TODO use parameterized tests
641 reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId], filterMap[live.videoFilterId],
642 frontendMap[live.frontendId]);
643}
644
645TEST_P(TunerFilterAidlTest, SetFilterLinkage) {
646 description("Pick up all the possible linkages from the demux caps and set them up.");
647 DemuxCapabilities caps;
648 int32_t demuxId;
649 std::shared_ptr<IDemux> demux;
650 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
651 ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
652 mFilterTests.setDemux(demux);
653 for (int i = 0; i < caps.linkCaps.size(); i++) {
654 uint32_t bitMask = 1;
655 for (int j = 0; j < FILTER_MAIN_TYPE_BIT_COUNT; j++) {
656 if (caps.linkCaps[i] & (bitMask << j)) {
657 int64_t sourceFilterId;
658 int64_t sinkFilterId;
659 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(i), FMQ_SIZE_16M));
660 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sourceFilterId));
661 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(j), FMQ_SIZE_16M));
662 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sinkFilterId));
663 ASSERT_TRUE(mFilterTests.setFilterDataSource(sourceFilterId, sinkFilterId));
664 ASSERT_TRUE(mFilterTests.setFilterDataSourceToDemux(sinkFilterId));
665 ASSERT_TRUE(mFilterTests.closeFilter(sinkFilterId));
666 ASSERT_TRUE(mFilterTests.closeFilter(sourceFilterId));
667 }
668 }
669 }
670 ASSERT_TRUE(mDemuxTests.closeDemux());
671}
672
673TEST_P(TunerFilterAidlTest, testTimeFilter) {
674 description("Open a timer filter in Demux and set time stamp.");
675 if (!timeFilter.support) {
676 return;
677 }
678 // TODO use parameterized tests
Frankie Lizcano0c069532022-07-14 20:20:46 +0000679 auto timeFilter_configs = generateTimeFilterConfigurations();
680 for (auto& configuration : timeFilter_configs) {
681 timeFilter = configuration;
682 testTimeFilter(timeFilterMap[timeFilter.timeFilterId]);
683 }
Hongguang600a6ae2021-07-08 18:51:51 -0700684}
685
Gareth Fenn9a808452022-03-31 08:40:00 +0100686static bool isEventProducingFilter(const FilterConfig& filterConfig) {
687 switch (filterConfig.type.mainType) {
688 case DemuxFilterMainType::TS: {
689 auto tsFilterType =
690 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
691 return (tsFilterType == DemuxTsFilterType::SECTION ||
692 tsFilterType == DemuxTsFilterType::PES ||
693 tsFilterType == DemuxTsFilterType::AUDIO ||
694 tsFilterType == DemuxTsFilterType::VIDEO ||
695 tsFilterType == DemuxTsFilterType::RECORD ||
696 tsFilterType == DemuxTsFilterType::TEMI);
697 }
698 case DemuxFilterMainType::MMTP: {
699 auto mmtpFilterType =
700 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
701 return (mmtpFilterType == DemuxMmtpFilterType::SECTION ||
702 mmtpFilterType == DemuxMmtpFilterType::PES ||
703 mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
704 mmtpFilterType == DemuxMmtpFilterType::VIDEO ||
705 mmtpFilterType == DemuxMmtpFilterType::RECORD ||
706 mmtpFilterType == DemuxMmtpFilterType::DOWNLOAD);
707 }
708 case DemuxFilterMainType::IP: {
709 auto ipFilterType =
710 filterConfig.type.subType.get<DemuxFilterSubType::Tag::ipFilterType>();
711 return (ipFilterType == DemuxIpFilterType::SECTION);
712 }
713 case DemuxFilterMainType::TLV: {
714 auto tlvFilterType =
715 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tlvFilterType>();
716 return (tlvFilterType == DemuxTlvFilterType::SECTION);
717 }
718 case DemuxFilterMainType::ALP: {
719 auto alpFilterType =
720 filterConfig.type.subType.get<DemuxFilterSubType::Tag::alpFilterType>();
721 return (alpFilterType == DemuxAlpFilterType::SECTION);
722 }
723 default:
724 return false;
725 }
726}
727
Patrick Rohr1586d212021-11-23 00:40:56 +0100728static bool isMediaFilter(const FilterConfig& filterConfig) {
729 switch (filterConfig.type.mainType) {
730 case DemuxFilterMainType::TS: {
731 // TS Audio and Video filters are media filters
732 auto tsFilterType =
733 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
734 return (tsFilterType == DemuxTsFilterType::AUDIO ||
735 tsFilterType == DemuxTsFilterType::VIDEO);
736 }
737 case DemuxFilterMainType::MMTP: {
738 // MMTP Audio and Video filters are media filters
739 auto mmtpFilterType =
740 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
741 return (mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
742 mmtpFilterType == DemuxMmtpFilterType::VIDEO);
743 }
744 default:
745 return false;
746 }
747}
Patrick Rohr149b0872021-11-20 00:39:37 +0100748
Patrick Rohr1586d212021-11-23 00:40:56 +0100749static int getDemuxFilterEventDataLength(const DemuxFilterEvent& event) {
750 switch (event.getTag()) {
751 case DemuxFilterEvent::Tag::section:
752 return event.get<DemuxFilterEvent::Tag::section>().dataLength;
753 case DemuxFilterEvent::Tag::media:
754 return event.get<DemuxFilterEvent::Tag::media>().dataLength;
755 case DemuxFilterEvent::Tag::pes:
756 return event.get<DemuxFilterEvent::Tag::pes>().dataLength;
757 case DemuxFilterEvent::Tag::download:
758 return event.get<DemuxFilterEvent::Tag::download>().dataLength;
759 case DemuxFilterEvent::Tag::ipPayload:
760 return event.get<DemuxFilterEvent::Tag::ipPayload>().dataLength;
761
762 case DemuxFilterEvent::Tag::tsRecord:
763 case DemuxFilterEvent::Tag::mmtpRecord:
764 case DemuxFilterEvent::Tag::temi:
765 case DemuxFilterEvent::Tag::monitorEvent:
766 case DemuxFilterEvent::Tag::startId:
767 return 0;
768 }
769}
770
771// TODO: move boilerplate into text fixture
772void TunerFilterAidlTest::testDelayHint(const FilterConfig& filterConf) {
Gareth Fenn9a808452022-03-31 08:40:00 +0100773 if (!filterConf.timeDelayInMs && !filterConf.dataDelayInBytes) {
774 return;
775 }
776 if (!isEventProducingFilter(filterConf)) {
777 return;
778 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100779 int32_t feId;
780 int32_t demuxId;
781 std::shared_ptr<IDemux> demux;
782 int64_t filterId;
783
784 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
785 ASSERT_TRUE(feId != INVALID_ID);
786 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
787 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
788 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
789 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
790 mFilterTests.setDemux(demux);
791
Patrick Rohr149b0872021-11-20 00:39:37 +0100792 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
793 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
Patrick Rohr149b0872021-11-20 00:39:37 +0100794
Patrick Rohr1586d212021-11-23 00:40:56 +0100795 bool mediaFilter = isMediaFilter(filterConf);
Patrick Rohr149b0872021-11-20 00:39:37 +0100796 auto filter = mFilterTests.getFilterById(filterId);
797
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100798 // startTime needs to be set before calling setDelayHint.
799 auto startTime = std::chrono::steady_clock::now();
800
Gareth Fenn9a808452022-03-31 08:40:00 +0100801 int timeDelayInMs = filterConf.timeDelayInMs;
802 if (timeDelayInMs > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100803 FilterDelayHint delayHint;
804 delayHint.hintType = FilterDelayHintType::TIME_DELAY_IN_MS;
Gareth Fenn9a808452022-03-31 08:40:00 +0100805 delayHint.hintValue = timeDelayInMs;
Patrick Rohr149b0872021-11-20 00:39:37 +0100806
Patrick Rohr1586d212021-11-23 00:40:56 +0100807 // setDelayHint should fail for media filters.
808 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
809 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100810
Patrick Rohr1586d212021-11-23 00:40:56 +0100811 int dataDelayInBytes = filterConf.dataDelayInBytes;
812 if (dataDelayInBytes > 0) {
813 FilterDelayHint delayHint;
814 delayHint.hintType = FilterDelayHintType::DATA_SIZE_DELAY_IN_BYTES;
815 delayHint.hintValue = dataDelayInBytes;
Patrick Rohr149b0872021-11-20 00:39:37 +0100816
Patrick Rohr1586d212021-11-23 00:40:56 +0100817 // setDelayHint should fail for media filters.
818 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
819 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100820
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100821 // start and stop filter (and wait for first callback) in order to
822 // circumvent callback scheduler race conditions after adjusting filter
823 // delays.
824 auto cb = mFilterTests.getFilterCallbacks().at(filterId);
825 auto future =
826 cb->verifyFilterCallback([](const std::vector<DemuxFilterEvent>&) { return true; });
Gareth Fenn9a808452022-03-31 08:40:00 +0100827
828 // The configure stage can also produce events, so we should set the delay
829 // hint beforehand.
830 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
Patrick Rohr1586d212021-11-23 00:40:56 +0100831 mFilterTests.startFilter(filterId);
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100832
833 auto timeout = std::chrono::seconds(30);
834 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
835
Patrick Rohr1586d212021-11-23 00:40:56 +0100836 mFilterTests.stopFilter(filterId);
Patrick Rohr149b0872021-11-20 00:39:37 +0100837
Patrick Rohr1586d212021-11-23 00:40:56 +0100838 if (!mediaFilter) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100839 int callbackSize = 0;
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100840 future = cb->verifyFilterCallback(
Patrick Rohr1586d212021-11-23 00:40:56 +0100841 [&callbackSize](const std::vector<DemuxFilterEvent>& events) {
842 for (const auto& event : events) {
843 callbackSize += getDemuxFilterEventDataLength(event);
844 }
845 return true;
846 });
847
Patrick Rohr1586d212021-11-23 00:40:56 +0100848 ASSERT_TRUE(mFilterTests.startFilter(filterId));
849
850 // block and wait for callback to be received.
Patrick Rohr1586d212021-11-23 00:40:56 +0100851 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
Patrick Rohr1586d212021-11-23 00:40:56 +0100852
Gareth Fenn9a808452022-03-31 08:40:00 +0100853 auto duration = std::chrono::steady_clock::now() - startTime;
854 bool delayHintTest = duration >= std::chrono::milliseconds(timeDelayInMs);
Patrick Rohr1586d212021-11-23 00:40:56 +0100855 bool dataSizeTest = callbackSize >= dataDelayInBytes;
856
Gareth Fenn9a808452022-03-31 08:40:00 +0100857 if (timeDelayInMs > 0 && dataDelayInBytes > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100858 ASSERT_TRUE(delayHintTest || dataSizeTest);
859 } else {
860 // if only one of time delay / data delay is configured, one of them
861 // holds true by default, so we want both assertions to be true.
862 ASSERT_TRUE(delayHintTest && dataSizeTest);
863 }
864
865 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
866 }
867
Patrick Rohr149b0872021-11-20 00:39:37 +0100868 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
869 ASSERT_TRUE(mDemuxTests.closeDemux());
870 ASSERT_TRUE(mFrontendTests.closeFrontend());
871}
872
Patrick Rohr1586d212021-11-23 00:40:56 +0100873TEST_P(TunerFilterAidlTest, FilterDelayHintTest) {
874 description("Test filter time delay hint.");
Gareth Fenn9a808452022-03-31 08:40:00 +0100875 if (!live.hasFrontendConnection) {
876 return;
877 }
Patrick Rohr1586d212021-11-23 00:40:56 +0100878 for (const auto& obj : filterMap) {
879 testDelayHint(obj.second);
880 }
881}
882
Hongguang600a6ae2021-07-08 18:51:51 -0700883TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
884 description("Feed ts data from playback and configure Ts section filter to get output");
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000885 if (!playback.support) {
Hongguang600a6ae2021-07-08 18:51:51 -0700886 return;
887 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000888 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
889 for (auto& configuration : playback_configs) {
890 if (configuration.sectionFilterId.compare(emptyHardwareId) != 0) {
891 playback = configuration;
892 playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]);
893 }
894 }
Hongguang600a6ae2021-07-08 18:51:51 -0700895}
896
897TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsAudioFilterTest) {
898 description("Feed ts data from playback and configure Ts audio filter to get output");
899 if (!playback.support) {
900 return;
901 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000902 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
903 for (auto& configuration : playback_configs) {
904 playback = configuration;
905 playbackSingleFilterTest(filterMap[playback.audioFilterId], dvrMap[playback.dvrId]);
906 }
Hongguang600a6ae2021-07-08 18:51:51 -0700907}
908
909TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsVideoFilterTest) {
910 description("Feed ts data from playback and configure Ts video filter to get output");
911 if (!playback.support) {
912 return;
913 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000914 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
915 for (auto& configuration : playback_configs) {
916 playback = configuration;
917 playbackSingleFilterTest(filterMap[playback.videoFilterId], dvrMap[playback.dvrId]);
918 }
Hongguang600a6ae2021-07-08 18:51:51 -0700919}
920
921TEST_P(TunerRecordAidlTest, RecordDataFlowWithTsRecordFilterTest) {
922 description("Feed ts data from frontend to recording and test with ts record filter");
923 if (!record.support) {
924 return;
925 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000926 auto record_configs = generateRecordConfigurations();
927 for (auto& configuration : record_configs) {
928 record = configuration;
929 recordSingleFilterTest(filterMap[record.recordFilterId], frontendMap[record.frontendId],
930 dvrMap[record.dvrRecordId], Dataflow_Context::RECORD);
931 }
Hongguang600a6ae2021-07-08 18:51:51 -0700932}
933
934TEST_P(TunerRecordAidlTest, AttachFiltersToRecordTest) {
935 description("Attach a single filter to the record dvr test.");
936 // TODO use parameterized tests
937 if (!record.support) {
938 return;
939 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000940 auto record_configs = generateRecordConfigurations();
941 for (auto& configuration : record_configs) {
942 record = configuration;
943 attachSingleFilterToRecordDvrTest(filterMap[record.recordFilterId],
944 frontendMap[record.frontendId],
945 dvrMap[record.dvrRecordId]);
946 }
Hongguang600a6ae2021-07-08 18:51:51 -0700947}
948
949TEST_P(TunerRecordAidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
950 description("Feed ts data from Fe with Lnb to recording and test with ts record filter");
951 if (!lnbRecord.support) {
952 return;
953 }
Frankie Lizcanoecba02a2022-07-12 17:56:54 +0000954 vector<LnbRecordHardwareConnections> lnbRecord_configs = generateLnbRecordConfigurations();
955 if (lnbRecord_configs.empty()) {
956 ALOGD("No frontends that support satellites.");
957 return;
958 }
959 for (auto& configuration : lnbRecord_configs) {
960 lnbRecord = configuration;
961 recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId],
962 frontendMap[lnbRecord.frontendId],
963 dvrMap[lnbRecord.dvrRecordId], lnbMap[lnbRecord.lnbId]);
964 }
Hongguang600a6ae2021-07-08 18:51:51 -0700965}
966
967TEST_P(TunerFrontendAidlTest, TuneFrontend) {
968 description("Tune one Frontend with specific setting and check Lock event");
969 if (!live.hasFrontendConnection) {
970 return;
971 }
972 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
973}
974
975TEST_P(TunerFrontendAidlTest, AutoScanFrontend) {
976 description("Run an auto frontend scan with specific setting and check lock scanMessage");
977 if (!scan.hasFrontendConnection) {
978 return;
979 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +0000980 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
981 for (auto& configuration : scan_configs) {
982 scan = configuration;
983 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_AUTO);
984 }
Hongguang600a6ae2021-07-08 18:51:51 -0700985}
986
987TEST_P(TunerFrontendAidlTest, BlindScanFrontend) {
988 description("Run an blind frontend scan with specific setting and check lock scanMessage");
989 if (!scan.hasFrontendConnection) {
990 return;
991 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +0000992 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
993 for (auto& configuration : scan_configs) {
994 scan = configuration;
995 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
996 }
Hongguang600a6ae2021-07-08 18:51:51 -0700997}
998
999TEST_P(TunerFrontendAidlTest, TuneFrontendWithFrontendSettings) {
1000 description("Tune one Frontend with setting and check Lock event");
1001 if (!live.hasFrontendConnection) {
1002 return;
1003 }
1004 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
1005}
1006
1007TEST_P(TunerFrontendAidlTest, BlindScanFrontendWithEndFrequency) {
1008 description("Run an blind frontend scan with setting and check lock scanMessage");
1009 if (!scan.hasFrontendConnection) {
1010 return;
1011 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001012 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
1013 for (auto& configuration : scan_configs) {
1014 scan = configuration;
1015 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
1016 }
Hongguang600a6ae2021-07-08 18:51:51 -07001017}
1018
1019TEST_P(TunerFrontendAidlTest, LinkToCiCam) {
1020 description("Test Frontend link to CiCam");
1021 if (!live.hasFrontendConnection) {
1022 return;
1023 }
1024 if (!frontendMap[live.frontendId].canConnectToCiCam) {
1025 return;
1026 }
1027 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
1028}
1029
Hongguangfcedda02021-12-13 17:08:02 -08001030TEST_P(TunerFrontendAidlTest, getHardwareInfo) {
1031 description("Test Frontend get hardware info");
1032 if (!live.hasFrontendConnection) {
1033 return;
1034 }
1035 mFrontendTests.debugInfoTest(frontendMap[live.frontendId]);
1036}
1037
Hongguang5766ddf2021-12-23 11:40:37 -08001038TEST_P(TunerFrontendAidlTest, maxNumberOfFrontends) {
1039 description("Test Max Frontend number");
1040 if (!live.hasFrontendConnection) {
1041 return;
1042 }
1043 mFrontendTests.maxNumberOfFrontendsTest();
1044}
1045
Hongguang881190f2022-01-14 13:23:37 -08001046TEST_P(TunerFrontendAidlTest, statusReadinessTest) {
1047 description("Test Max Frontend status readiness");
1048 if (!live.hasFrontendConnection) {
1049 return;
1050 }
1051 mFrontendTests.statusReadinessTest(frontendMap[live.frontendId]);
1052}
1053
Hongguang600a6ae2021-07-08 18:51:51 -07001054TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowVideoFilterTest) {
1055 description("Test Video Filter functionality in Broadcast use case.");
1056 if (!live.hasFrontendConnection) {
1057 return;
1058 }
1059 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1060}
1061
1062TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowAudioFilterTest) {
1063 description("Test Audio Filter functionality in Broadcast use case.");
1064 if (!live.hasFrontendConnection) {
1065 return;
1066 }
1067 broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]);
1068}
1069
1070TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowSectionFilterTest) {
1071 description("Test Section Filter functionality in Broadcast use case.");
1072 if (!live.hasFrontendConnection) {
1073 return;
1074 }
1075 if (live.sectionFilterId.compare(emptyHardwareId) == 0) {
1076 return;
1077 }
1078 broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]);
1079}
1080
1081TEST_P(TunerBroadcastAidlTest, IonBufferTest) {
1082 description("Test the av filter data bufferring.");
1083 if (!live.hasFrontendConnection) {
1084 return;
1085 }
1086 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1087}
1088
1089TEST_P(TunerBroadcastAidlTest, LnbBroadcastDataFlowVideoFilterTest) {
1090 description("Test Video Filter functionality in Broadcast with Lnb use case.");
1091 if (!lnbLive.support) {
1092 return;
1093 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +00001094 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
1095 if (lnbLive_configs.empty()) {
1096 ALOGD("No frontends that support satellites.");
1097 return;
1098 }
1099 for (auto& combination : lnbLive_configs) {
1100 lnbLive = combination;
1101 broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId],
1102 frontendMap[lnbLive.frontendId], lnbMap[lnbLive.lnbId]);
1103 }
Hongguang600a6ae2021-07-08 18:51:51 -07001104}
1105
1106TEST_P(TunerBroadcastAidlTest, MediaFilterWithSharedMemoryHandle) {
1107 description("Test the Media Filter with shared memory handle");
1108 if (!live.hasFrontendConnection) {
1109 return;
1110 }
1111 mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1112}
1113
1114TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
1115 description("Create Descrambler");
1116 if (!descrambling.support) {
1117 return;
1118 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001119 vector<DescramblingHardwareConnections> descrambling_configs =
1120 generateDescramblingConfigurations();
1121 if (descrambling_configs.empty()) {
1122 ALOGD("No valid descrambling combinations in the configuration file.");
1123 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001124 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001125 for (auto& combination : descrambling_configs) {
1126 descrambling = combination;
1127 int32_t demuxId;
1128 std::shared_ptr<IDemux> demux;
1129 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
Hongguang600a6ae2021-07-08 18:51:51 -07001130
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001131 if (descrambling.hasFrontendConnection) {
1132 int32_t feId;
1133 mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId);
1134 ASSERT_TRUE(feId != INVALID_ID);
1135 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
1136 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
1137 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
1138 }
Hongguang600a6ae2021-07-08 18:51:51 -07001139
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001140 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
1141 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
1142 ASSERT_TRUE(mDemuxTests.closeDemux());
1143
1144 if (descrambling.hasFrontendConnection) {
1145 ASSERT_TRUE(mFrontendTests.closeFrontend());
1146 }
Hongguang600a6ae2021-07-08 18:51:51 -07001147 }
1148}
1149
1150TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
1151 description("Test ts audio filter in scrambled broadcast use case");
1152 if (!descrambling.support) {
1153 return;
1154 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001155 vector<DescramblingHardwareConnections> descrambling_configs =
1156 generateDescramblingConfigurations();
1157 if (descrambling_configs.empty()) {
1158 ALOGD("No valid descrambling combinations in the configuration file.");
1159 return;
1160 }
1161 for (auto& combination : descrambling_configs) {
1162 descrambling = combination;
1163 set<FilterConfig> filterConfs;
1164 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
1165 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
1166 scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
1167 descramblerMap[descrambling.descramblerId]);
1168 }
Hongguang600a6ae2021-07-08 18:51:51 -07001169}
1170
1171INSTANTIATE_TEST_SUITE_P(PerInstance, TunerBroadcastAidlTest,
1172 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1173 android::PrintInstanceNameToString);
1174
1175INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFrontendAidlTest,
1176 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1177 android::PrintInstanceNameToString);
1178
1179INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFilterAidlTest,
1180 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1181 android::PrintInstanceNameToString);
1182
1183INSTANTIATE_TEST_SUITE_P(PerInstance, TunerRecordAidlTest,
1184 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1185 android::PrintInstanceNameToString);
1186
1187INSTANTIATE_TEST_SUITE_P(PerInstance, TunerLnbAidlTest,
1188 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1189 android::PrintInstanceNameToString);
1190
1191INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDemuxAidlTest,
1192 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1193 android::PrintInstanceNameToString);
1194
1195INSTANTIATE_TEST_SUITE_P(PerInstance, TunerPlaybackAidlTest,
1196 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1197 android::PrintInstanceNameToString);
1198
1199INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDescramblerAidlTest,
1200 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1201 android::PrintInstanceNameToString);
1202
1203} // namespace
1204
1205// Start thread pool to receive callbacks from AIDL service.
1206int main(int argc, char** argv) {
1207 ::testing::InitGoogleTest(&argc, argv);
1208 ABinderProcess_setThreadPoolMaxThreadCount(1);
1209 ABinderProcess_startThreadPool();
1210 return RUN_ALL_TESTS();
1211}