blob: b4f62498bdedb5e09bcd00b1ef27f43cabdc0b02 [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));
sadiqsada630a9742023-12-20 22:14:31 +000051 mFrontendTests.setDemux(demux);
Hongguang600a6ae2021-07-08 18:51:51 -070052 mFilterTests.setDemux(demux);
53 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
54 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
55 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
56 if (filterConf.type.mainType == DemuxFilterMainType::IP) {
57 ASSERT_TRUE(mFilterTests.configIpFilterCid(filterConf.ipCid, filterId));
58 }
59 if (filterConf.monitorEventTypes > 0) {
60 ASSERT_TRUE(mFilterTests.configureMonitorEvent(filterId, filterConf.monitorEventTypes));
61 }
62 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
63 ASSERT_TRUE(mFilterTests.startFilter(filterId));
Eddy-SH Chen566240a2023-09-13 15:25:24 +080064 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
65 if (filterConf.monitorEventTypes > 0) {
66 ASSERT_TRUE(mFilterTests.testMonitorEvent(filterId, filterConf.monitorEventTypes));
67 }
68 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -070069 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
70 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
71 ASSERT_TRUE(mDemuxTests.closeDemux());
72 ASSERT_TRUE(mFrontendTests.closeFrontend());
73}
74
75void TunerFilterAidlTest::reconfigSingleFilterInDemuxTest(FilterConfig filterConf,
76 FilterConfig filterReconf,
77 FrontendConfig frontendConf) {
78 int32_t feId;
79 int32_t demuxId;
80 std::shared_ptr<IDemux> demux;
81 int64_t filterId;
82
83 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
84 ASSERT_TRUE(feId != INVALID_ID);
85 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
86 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
87 if (frontendConf.isSoftwareFe) {
88 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
89 }
90 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
91 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
92 mFrontendTests.setDemux(demux);
93 mFilterTests.setDemux(demux);
94 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
95 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
96 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
97 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
98 ASSERT_TRUE(mFilterTests.startFilter(filterId));
99 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
100 ASSERT_TRUE(mFilterTests.configFilter(filterReconf.settings, filterId));
101 ASSERT_TRUE(mFilterTests.startFilter(filterId));
102 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
Ray Chin17a3bf02024-11-19 20:55:25 +0800103 if (!isPassthroughFilter(filterReconf)) {
104 ASSERT_TRUE(mFilterTests.startIdTest(filterId));
105 }
Hongguang600a6ae2021-07-08 18:51:51 -0700106 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
107 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
108 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
109 ASSERT_TRUE(mDemuxTests.closeDemux());
110 ASSERT_TRUE(mFrontendTests.closeFrontend());
111}
112
113void TunerFilterAidlTest::testTimeFilter(TimeFilterConfig filterConf) {
114 int32_t demuxId;
115 std::shared_ptr<IDemux> demux;
116 DemuxCapabilities caps;
117
118 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
119 ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
120 ASSERT_TRUE(caps.bTimeFilter);
121 mFilterTests.setDemux(demux);
122 ASSERT_TRUE(mFilterTests.openTimeFilterInDemux());
123 ASSERT_TRUE(mFilterTests.setTimeStamp(filterConf.timeStamp));
124 ASSERT_TRUE(mFilterTests.getTimeStamp());
125 ASSERT_TRUE(mFilterTests.clearTimeStamp());
126 ASSERT_TRUE(mFilterTests.closeTimeFilter());
127 ASSERT_TRUE(mDemuxTests.closeDemux());
128}
129
130void TunerBroadcastAidlTest::broadcastSingleFilterTest(FilterConfig filterConf,
131 FrontendConfig frontendConf) {
132 int32_t feId;
133 int32_t demuxId;
134 std::shared_ptr<IDemux> demux;
135 int64_t filterId;
136
137 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
138 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
139 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
Frankie Lizcano87421812022-07-28 17:13:01 +0000140 if (mLnbId != INVALID_LNB_ID) {
141 ASSERT_TRUE(mFrontendTests.setLnb(mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700142 }
143 if (frontendConf.isSoftwareFe) {
144 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
145 }
146 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
147 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
148 mFrontendTests.setDemux(demux);
149 mFilterTests.setDemux(demux);
150 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
151 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
152 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
153 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
154 ASSERT_TRUE(mFilterTests.startFilter(filterId));
155 // tune test
156 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
Ray Chin17a3bf02024-11-19 20:55:25 +0800157 if (!isPassthroughFilter(filterConf)) {
158 ASSERT_TRUE(filterDataOutputTest());
159 }
Hongguang600a6ae2021-07-08 18:51:51 -0700160 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
161 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
162 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
163 ASSERT_TRUE(mDemuxTests.closeDemux());
164 ASSERT_TRUE(mFrontendTests.closeFrontend());
165}
166
167void TunerBroadcastAidlTest::broadcastSingleFilterTestWithLnb(FilterConfig filterConf,
168 FrontendConfig frontendConf,
169 LnbConfig lnbConf) {
170 if (lnbConf.name.compare(emptyHardwareId) == 0) {
171 vector<int32_t> ids;
172 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
173 ASSERT_TRUE(ids.size() > 0);
174 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
Frankie Lizcano87421812022-07-28 17:13:01 +0000175 mLnbId = ids[0];
Hongguang600a6ae2021-07-08 18:51:51 -0700176 } else {
Frankie Lizcano87421812022-07-28 17:13:01 +0000177 ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700178 }
179 ASSERT_TRUE(mLnbTests.setLnbCallback());
180 ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
181 ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
182 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
Frankie Lizcanod1f520e2022-07-26 20:05:46 +0000183 if (!frontendConf.isSoftwareFe) {
184 broadcastSingleFilterTest(filterConf, frontendConf);
185 }
Hongguang600a6ae2021-07-08 18:51:51 -0700186 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000187 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700188}
189
190void TunerBroadcastAidlTest::mediaFilterUsingSharedMemoryTest(FilterConfig filterConf,
191 FrontendConfig frontendConf) {
192 int32_t feId;
193 int32_t demuxId;
194 std::shared_ptr<IDemux> demux;
195 int64_t filterId;
196
197 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
198 ASSERT_TRUE(feId != INVALID_ID);
199 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
200 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
201 if (frontendConf.isSoftwareFe) {
202 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
203 }
204 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
205 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
206 mFrontendTests.setDemux(demux);
207 mFilterTests.setDemux(demux);
208 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
209 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
210 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
211 ASSERT_TRUE(mFilterTests.getSharedAvMemoryHandle(filterId));
212 ASSERT_TRUE(mFilterTests.configAvFilterStreamType(filterConf.streamType, filterId));
213 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
214 ASSERT_TRUE(mFilterTests.startFilter(filterId));
215 // tune test
216 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
Ray Chin17a3bf02024-11-19 20:55:25 +0800217 if (!isPassthroughFilter(filterConf)) {
218 ASSERT_TRUE(filterDataOutputTest());
219 }
Hongguang600a6ae2021-07-08 18:51:51 -0700220 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
221 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
222 ASSERT_TRUE(mFilterTests.releaseShareAvHandle(filterId));
223 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
224 ASSERT_TRUE(mDemuxTests.closeDemux());
225 ASSERT_TRUE(mFrontendTests.closeFrontend());
226}
227
228void TunerPlaybackAidlTest::playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf) {
229 int32_t demuxId;
230 std::shared_ptr<IDemux> demux;
231 int64_t filterId;
232
233 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
234 mFilterTests.setDemux(demux);
235 mDvrTests.setDemux(demux);
236 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
237 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrConf.settings));
238 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
239 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
240 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
241 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
242 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
243 mDvrTests.startPlaybackInputThread(dvrConf.playbackInputFile,
244 dvrConf.settings.get<DvrSettings::Tag::playback>());
245 ASSERT_TRUE(mDvrTests.startDvrPlayback());
246 ASSERT_TRUE(mFilterTests.startFilter(filterId));
247 ASSERT_TRUE(filterDataOutputTest());
248 mDvrTests.stopPlaybackThread();
249 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
250 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
251 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
252 mDvrTests.closeDvrPlayback();
253 ASSERT_TRUE(mDemuxTests.closeDemux());
254}
255
Ray Chin62ab6c92022-09-15 15:07:33 +0800256void TunerPlaybackAidlTest::setStatusCheckIntervalHintTest(int64_t statusCheckIntervalHint,
257 DvrConfig dvrConf) {
258 int32_t demuxId;
259 std::shared_ptr<IDemux> demux;
260
261 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
262 mDvrTests.setDemux(demux);
263 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
264 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrConf.settings));
265 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
266
267 ASSERT_TRUE(mDvrTests.setPlaybackStatusCheckIntervalHint(statusCheckIntervalHint));
268
269 mDvrTests.startPlaybackInputThread(dvrConf.playbackInputFile,
270 dvrConf.settings.get<DvrSettings::Tag::playback>());
271 ASSERT_TRUE(mDvrTests.startDvrPlayback());
272 mDvrTests.stopPlaybackThread();
273 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
274 mDvrTests.closeDvrPlayback();
275 ASSERT_TRUE(mDemuxTests.closeDemux());
276}
277
Hongguang600a6ae2021-07-08 18:51:51 -0700278void TunerRecordAidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf,
279 FrontendConfig frontendConf,
280 DvrConfig dvrConf, LnbConfig lnbConf) {
281 if (lnbConf.name.compare(emptyHardwareId) == 0) {
282 vector<int32_t> ids;
283 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
284 ASSERT_TRUE(ids.size() > 0);
285 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
Frankie Lizcano87421812022-07-28 17:13:01 +0000286 mLnbId = ids[0];
Hongguang600a6ae2021-07-08 18:51:51 -0700287 } else {
Frankie Lizcano87421812022-07-28 17:13:01 +0000288 ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700289 }
290 ASSERT_TRUE(mLnbTests.setLnbCallback());
291 ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
292 ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
293 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
294 for (auto msgName : lnbRecord.diseqcMsgs) {
295 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
296 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000297 if (!frontendConf.isSoftwareFe) {
298 recordSingleFilterTest(filterConf, frontendConf, dvrConf, Dataflow_Context::LNBRECORD);
299 }
Hongguang600a6ae2021-07-08 18:51:51 -0700300 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000301 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700302}
303
304void TunerRecordAidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf,
305 FrontendConfig frontendConf,
306 DvrConfig dvrConf) {
307 int32_t demuxId;
308 std::shared_ptr<IDemux> demux;
309 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
310 mDvrTests.setDemux(demux);
311
312 DvrConfig dvrSourceConfig;
313 if (record.hasFrontendConnection) {
314 int32_t feId;
315 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
316 ASSERT_TRUE(feId != INVALID_ID);
317 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
318 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
319 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
320 } else {
321 dvrSourceConfig = dvrMap[record.dvrSourceId];
322 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
323 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
324 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
325 }
326
327 int64_t filterId;
328 std::shared_ptr<IFilter> filter;
329 mFilterTests.setDemux(demux);
330
331 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
332 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
333 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
334
335 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
336 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
337 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
338 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
339 filter = mFilterTests.getFilterById(filterId);
340 ASSERT_TRUE(filter != nullptr);
341 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
342 ASSERT_TRUE(mDvrTests.startDvrRecord());
343 ASSERT_TRUE(mFilterTests.startFilter(filterId));
344 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
345 ASSERT_TRUE(mDvrTests.stopDvrRecord());
346 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
347 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
348 mDvrTests.closeDvrRecord();
349 ASSERT_TRUE(mDemuxTests.closeDemux());
350
351 if (record.hasFrontendConnection) {
352 ASSERT_TRUE(mFrontendTests.closeFrontend());
353 }
354}
355
356void TunerRecordAidlTest::recordSingleFilterTest(FilterConfig filterConf,
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000357 FrontendConfig frontendConf, DvrConfig dvrConf,
358 Dataflow_Context context) {
Hongguang600a6ae2021-07-08 18:51:51 -0700359 int32_t demuxId;
360 std::shared_ptr<IDemux> demux;
361 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
362 mDvrTests.setDemux(demux);
363
364 DvrConfig dvrSourceConfig;
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000365 if (context == Dataflow_Context::RECORD) {
366 if (record.hasFrontendConnection) {
367 int32_t feId;
368 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
369 ASSERT_TRUE(feId != INVALID_ID);
370 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
371 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
372 if (frontendConf.isSoftwareFe) {
373 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]);
374 }
375 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
376 mFrontendTests.setDvrTests(&mDvrTests);
377 } else {
378 dvrSourceConfig = dvrMap[record.dvrSourceId];
379 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
380 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
381 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
382 }
383 } else if (context == Dataflow_Context::LNBRECORD) {
384 // If function arrives here, frontend should not be software, so no need to configure a dvr
385 // source or dvr fe connection that might be used for recording without an Lnb
Hongguang600a6ae2021-07-08 18:51:51 -0700386 int32_t feId;
387 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
388 ASSERT_TRUE(feId != INVALID_ID);
389 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
390 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000391 if (mLnbId != INVALID_LNB_ID) {
392 ASSERT_TRUE(mFrontendTests.setLnb(mLnbId));
393 } else {
394 FAIL();
Hongguang600a6ae2021-07-08 18:51:51 -0700395 }
396 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
397 mFrontendTests.setDvrTests(&mDvrTests);
Hongguang600a6ae2021-07-08 18:51:51 -0700398 }
399
400 int64_t filterId;
401 std::shared_ptr<IFilter> filter;
402 mFilterTests.setDemux(demux);
403 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
404 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
405 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
406 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
407 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
408 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
409 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
410 filter = mFilterTests.getFilterById(filterId);
411 ASSERT_TRUE(filter != nullptr);
412 mDvrTests.startRecordOutputThread(dvrConf.settings.get<DvrSettings::Tag::record>());
413 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
414 ASSERT_TRUE(mDvrTests.startDvrRecord());
415 ASSERT_TRUE(mFilterTests.startFilter(filterId));
416
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000417 if (context == Dataflow_Context::RECORD) {
418 if (record.hasFrontendConnection) {
419 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
420 } else {
421 // Start DVR Source
422 mDvrTests.startPlaybackInputThread(
423 dvrSourceConfig.playbackInputFile,
424 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
425 ASSERT_TRUE(mDvrTests.startDvrPlayback());
426 }
427 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700428 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -0700429 }
Hongguang600a6ae2021-07-08 18:51:51 -0700430 mDvrTests.testRecordOutput();
431 mDvrTests.stopRecordThread();
432
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000433 if (context == Dataflow_Context::RECORD) {
434 if (record.hasFrontendConnection) {
435 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
436 } else {
437 mDvrTests.stopPlaybackThread();
438 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
439 }
440 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700441 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -0700442 }
443
444 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
445 ASSERT_TRUE(mDvrTests.stopDvrRecord());
446 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
447 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
448 mDvrTests.closeDvrRecord();
449
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000450 if (context == Dataflow_Context::RECORD) {
451 if (record.hasFrontendConnection) {
452 ASSERT_TRUE(mFrontendTests.closeFrontend());
453 } else {
454 mDvrTests.closeDvrPlayback();
455 }
456 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700457 ASSERT_TRUE(mFrontendTests.closeFrontend());
Hongguang600a6ae2021-07-08 18:51:51 -0700458 }
459
460 ASSERT_TRUE(mDemuxTests.closeDemux());
461}
462
Ray Chin62ab6c92022-09-15 15:07:33 +0800463void TunerRecordAidlTest::setStatusCheckIntervalHintTest(int64_t statusCheckIntervalHint,
464 FrontendConfig frontendConf,
465 DvrConfig dvrConf) {
466 int32_t demuxId;
467 std::shared_ptr<IDemux> demux;
468 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
469 mDvrTests.setDemux(demux);
470
471 DvrConfig dvrSourceConfig;
472 if (record.hasFrontendConnection) {
473 int32_t feId;
474 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
475 ASSERT_TRUE(feId != INVALID_ID);
476 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
477 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
478 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
479 } else {
480 dvrSourceConfig = dvrMap[record.dvrSourceId];
481 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
482 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
483 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
484 }
485
486 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
487 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
488 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
489
490 ASSERT_TRUE(mDvrTests.setRecordStatusCheckIntervalHint(statusCheckIntervalHint));
491
492 ASSERT_TRUE(mDvrTests.startDvrRecord());
493 ASSERT_TRUE(mDvrTests.stopDvrRecord());
494 mDvrTests.closeDvrRecord();
495 ASSERT_TRUE(mDemuxTests.closeDemux());
496
497 if (record.hasFrontendConnection) {
498 ASSERT_TRUE(mFrontendTests.closeFrontend());
499 }
500}
501
Hongguang600a6ae2021-07-08 18:51:51 -0700502void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,
503 FrontendConfig frontendConf,
Frankie Lizcano82101d22022-07-28 00:12:35 +0000504 DescramblerConfig descConfig,
505 Dataflow_Context context) {
Hongguang600a6ae2021-07-08 18:51:51 -0700506 int32_t demuxId;
507 std::shared_ptr<IDemux> demux;
508 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
509
510 DvrConfig dvrSourceConfig;
Frankie Lizcano82101d22022-07-28 00:12:35 +0000511 if (context == Dataflow_Context::DESCRAMBLING) {
512 if (descrambling.hasFrontendConnection) {
513 int32_t feId;
514 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
515 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
516 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
517 if (frontendConf.isSoftwareFe) {
518 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]);
519 }
520 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
521 mFrontendTests.setDemux(demux);
522 } else {
523 dvrSourceConfig = dvrMap[descrambling.dvrSourceId];
524 mDvrTests.setDemux(demux);
525 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
526 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
527 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
528 }
529 } else if (context == Dataflow_Context::LNBDESCRAMBLING) {
Hongguang600a6ae2021-07-08 18:51:51 -0700530 int32_t feId;
531 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
532 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
533 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
Frankie Lizcano82101d22022-07-28 00:12:35 +0000534 if (mLnbId != INVALID_LNB_ID) {
535 ASSERT_TRUE(mFrontendTests.setLnb(mLnbId));
536 } else {
537 // If, for some reason, the test got here without failing. We fail it here.
538 ALOGD("mLnbId is null. Something went wrong. Exiting ScrambledBroadcastWithLnbId.");
539 FAIL();
Hongguang600a6ae2021-07-08 18:51:51 -0700540 }
541 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
542 mFrontendTests.setDemux(demux);
Hongguang600a6ae2021-07-08 18:51:51 -0700543 }
544
545 set<int64_t> filterIds;
546 int64_t filterId;
547 set<struct FilterConfig>::iterator config;
548 set<int64_t>::iterator id;
549 mFilterTests.setDemux(demux);
550 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
551 ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize));
552 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
553 ASSERT_TRUE(mFilterTests.configFilter((*config).settings, filterId));
554 filterIds.insert(filterId);
555 }
556 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
557 vector<uint8_t> token;
558 ASSERT_TRUE(mDescramblerTests.getKeyToken(descConfig.casSystemId, descConfig.provisionStr,
559 descConfig.hidlPvtData, token));
560 mDescramblerTests.setKeyToken(token);
561 vector<DemuxPid> pids;
562 DemuxPid pid;
563 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
564 ASSERT_TRUE(mDescramblerTests.getDemuxPidFromFilterSettings((*config).type,
565 (*config).settings, pid));
566 pids.push_back(pid);
567 ASSERT_TRUE(mDescramblerTests.addPid(pid, nullptr));
568 }
569 for (id = filterIds.begin(); id != filterIds.end(); id++) {
570 ASSERT_TRUE(mFilterTests.startFilter(*id));
571 }
572
Frankie Lizcano82101d22022-07-28 00:12:35 +0000573 if (context == Dataflow_Context::DESCRAMBLING) {
574 if (descrambling.hasFrontendConnection) {
575 // tune test
576 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
577 } else {
578 // Start DVR Source
579 mDvrTests.startPlaybackInputThread(
580 dvrSourceConfig.playbackInputFile,
581 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
582 ASSERT_TRUE(mDvrTests.startDvrPlayback());
583 }
584 } else if (context == Dataflow_Context::LNBDESCRAMBLING) {
Hongguang600a6ae2021-07-08 18:51:51 -0700585 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -0700586 }
587
588 ASSERT_TRUE(filterDataOutputTest());
589
Frankie Lizcano82101d22022-07-28 00:12:35 +0000590 if (context == Dataflow_Context::DESCRAMBLING) {
591 if (descrambling.hasFrontendConnection) {
592 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
593 } else {
594 mDvrTests.stopPlaybackThread();
595 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
596 }
597 } else if (context == Dataflow_Context::LNBDESCRAMBLING) {
Hongguang600a6ae2021-07-08 18:51:51 -0700598 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -0700599 }
600
601 for (id = filterIds.begin(); id != filterIds.end(); id++) {
602 ASSERT_TRUE(mFilterTests.stopFilter(*id));
603 }
604 for (auto pid : pids) {
605 ASSERT_TRUE(mDescramblerTests.removePid(pid, nullptr));
606 }
607 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
608 for (id = filterIds.begin(); id != filterIds.end(); id++) {
609 ASSERT_TRUE(mFilterTests.closeFilter(*id));
610 }
611
Frankie Lizcano82101d22022-07-28 00:12:35 +0000612 if (context == Dataflow_Context::DESCRAMBLING) {
613 if (descrambling.hasFrontendConnection) {
614 ASSERT_TRUE(mFrontendTests.closeFrontend());
615 } else {
616 mDvrTests.closeDvrPlayback();
617 }
618 } else if (context == Dataflow_Context::LNBDESCRAMBLING) {
Hongguang600a6ae2021-07-08 18:51:51 -0700619 ASSERT_TRUE(mFrontendTests.closeFrontend());
Hongguang600a6ae2021-07-08 18:51:51 -0700620 }
621
622 ASSERT_TRUE(mDemuxTests.closeDemux());
623}
624
Frankie Lizcano82101d22022-07-28 00:12:35 +0000625void TunerDescramblerAidlTest::scrambledBroadcastTestWithLnb(
626 set<struct FilterConfig>& mediaFilterConfs, FrontendConfig& frontendConf,
627 DescramblerConfig& descConfig, LnbConfig& lnbConfig) {
628 // We can test the Lnb individually and make sure it functions properly. If the frontend is
629 // software, we cannot test the whole dataflow. If the frontend is hardware, we can
630 if (lnbConfig.name.compare(emptyHardwareId) == 0) {
631 vector<int32_t> ids;
632 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
633 ASSERT_TRUE(ids.size() > 0);
634 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
635 mLnbId = ids[0];
636 } else {
637 ASSERT_TRUE(mLnbTests.openLnbByName(lnbConfig.name, mLnbId));
638 }
639 // Once Lnb is opened, test some of its basic functionality
640 ASSERT_TRUE(mLnbTests.setLnbCallback());
641 ASSERT_TRUE(mLnbTests.setVoltage(lnbConfig.voltage));
642 ASSERT_TRUE(mLnbTests.setTone(lnbConfig.tone));
643 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConfig.position));
644 if (!frontendConf.isSoftwareFe) {
645 ALOGD("Frontend is not software, testing entire dataflow.");
646 scrambledBroadcastTest(mediaFilterConfs, frontendConf, descConfig,
647 Dataflow_Context::LNBDESCRAMBLING);
648 } else {
649 ALOGD("Frontend is software, did not test the entire dataflow, but tested the Lnb "
650 "individually.");
651 }
652 ASSERT_TRUE(mLnbTests.closeLnb());
653 mLnbId = INVALID_LNB_ID;
654}
655
Hongguang600a6ae2021-07-08 18:51:51 -0700656TEST_P(TunerLnbAidlTest, SendDiseqcMessageToLnb) {
657 description("Open and configure an Lnb with specific settings then send a diseqc msg to it.");
658 if (!lnbLive.support) {
659 return;
660 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000661 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
662 if (lnbLive_configs.empty()) {
663 ALOGD("No frontends that support satellites.");
664 return;
Hongguang600a6ae2021-07-08 18:51:51 -0700665 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000666 for (auto& combination : lnbLive_configs) {
667 lnbLive = combination;
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000668 if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) {
669 vector<int32_t> ids;
670 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
671 ASSERT_TRUE(ids.size() > 0);
672 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
673 } else {
674 int32_t id;
675 ASSERT_TRUE(mLnbTests.openLnbByName(lnbMap[lnbLive.lnbId].name, id));
676 }
677 ASSERT_TRUE(mLnbTests.setLnbCallback());
678 ASSERT_TRUE(mLnbTests.setVoltage(lnbMap[lnbLive.lnbId].voltage));
679 ASSERT_TRUE(mLnbTests.setTone(lnbMap[lnbLive.lnbId].tone));
680 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbMap[lnbLive.lnbId].position));
681 for (auto msgName : lnbLive.diseqcMsgs) {
682 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
683 }
684 ASSERT_TRUE(mLnbTests.closeLnb());
Hongguang600a6ae2021-07-08 18:51:51 -0700685 }
Hongguang600a6ae2021-07-08 18:51:51 -0700686}
687
688TEST_P(TunerDemuxAidlTest, openDemux) {
689 description("Open and close a Demux.");
690 if (!live.hasFrontendConnection) {
691 return;
692 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000693 auto live_configs = generateLiveConfigurations();
694 for (auto& configuration : live_configs) {
695 live = configuration;
696 int32_t feId;
697 int32_t demuxId;
698 std::shared_ptr<IDemux> demux;
699 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
700 ASSERT_TRUE(feId != INVALID_ID);
701 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
702 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
703 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
704 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
705 ASSERT_TRUE(mDemuxTests.closeDemux());
706 ASSERT_TRUE(mFrontendTests.closeFrontend());
707 }
Hongguang600a6ae2021-07-08 18:51:51 -0700708}
709
Kensuke Miyagi73b18ac2022-11-07 10:49:09 -0800710TEST_P(TunerDemuxAidlTest, openDemuxById) {
711 description("Open (with id) and close a Demux.");
712 std::vector<int32_t> demuxIds;
713 ASSERT_TRUE(mDemuxTests.getDemuxIds(demuxIds));
714 for (int i = 0; i < demuxIds.size(); i++) {
715 std::shared_ptr<IDemux> demux;
716 ASSERT_TRUE(mDemuxTests.openDemuxById(demuxIds[i], demux));
717 ASSERT_TRUE(mDemuxTests.closeDemux());
718 }
719}
720
721TEST_P(TunerDemuxAidlTest, getDemuxInfo) {
722 description("Check getDemuxInfo against demux caps");
723 std::vector<int32_t> demuxIds;
724 ASSERT_TRUE(mDemuxTests.getDemuxIds(demuxIds));
725 int32_t combinedFilterTypes = 0;
726 for (int i = 0; i < demuxIds.size(); i++) {
727 DemuxInfo demuxInfo;
728 ASSERT_TRUE(mDemuxTests.getDemuxInfo(demuxIds[i], demuxInfo));
729 combinedFilterTypes |= demuxInfo.filterTypes;
730 }
731 if (demuxIds.size() > 0) {
732 DemuxCapabilities demuxCaps;
733 ASSERT_TRUE(mDemuxTests.getDemuxCaps(demuxCaps));
734 ASSERT_TRUE(demuxCaps.filterCaps == combinedFilterTypes);
735 }
736}
737
Hongguang600a6ae2021-07-08 18:51:51 -0700738TEST_P(TunerDemuxAidlTest, getAvSyncTime) {
739 description("Get the A/V sync time from a PCR filter.");
740 if (!live.hasFrontendConnection) {
741 return;
742 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000743 auto live_configs = generateLiveConfigurations();
744 for (auto& configuration : live_configs) {
745 live = configuration;
746 if (live.pcrFilterId.compare(emptyHardwareId) == 0) {
747 continue;
748 }
749 int32_t feId;
750 int32_t demuxId;
751 std::shared_ptr<IDemux> demux;
752 int64_t mediaFilterId;
753 int64_t pcrFilterId;
754 int32_t avSyncHwId;
755 std::shared_ptr<IFilter> mediaFilter;
Hongguang600a6ae2021-07-08 18:51:51 -0700756
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000757 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
758 ASSERT_TRUE(feId != INVALID_ID);
759 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
760 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
761 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
762 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
763 mFilterTests.setDemux(demux);
764 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type,
765 filterMap[live.videoFilterId].bufferSize));
766 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(mediaFilterId));
767 ASSERT_TRUE(
768 mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
769 mediaFilter = mFilterTests.getFilterById(mediaFilterId);
770 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type,
771 filterMap[live.pcrFilterId].bufferSize));
772 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(pcrFilterId));
773 ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.pcrFilterId].settings, pcrFilterId));
774 ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId));
775 ASSERT_TRUE(pcrFilterId == avSyncHwId);
776 ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId));
777 ASSERT_TRUE(mFilterTests.closeFilter(pcrFilterId));
778 ASSERT_TRUE(mFilterTests.closeFilter(mediaFilterId));
779 ASSERT_TRUE(mDemuxTests.closeDemux());
780 ASSERT_TRUE(mFrontendTests.closeFrontend());
781 }
Hongguang600a6ae2021-07-08 18:51:51 -0700782}
783
784TEST_P(TunerFilterAidlTest, StartFilterInDemux) {
785 description("Open and start a filter in Demux.");
786 if (!live.hasFrontendConnection) {
787 return;
788 }
789 // TODO use parameterized tests
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000790 auto live_configs = generateLiveConfigurations();
791 for (auto& configuration : live_configs) {
792 live = configuration;
793 configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
794 }
Hongguang600a6ae2021-07-08 18:51:51 -0700795}
796
797TEST_P(TunerFilterAidlTest, ConfigIpFilterInDemuxWithCid) {
798 description("Open and configure an ip filter in Demux.");
799 // TODO use parameterized tests
800 if (!live.hasFrontendConnection) {
801 return;
802 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000803 auto live_configs = generateLiveConfigurations();
804 for (auto& configuration : live_configs) {
805 live = configuration;
806 if (live.ipFilterId.compare(emptyHardwareId) == 0) {
807 continue;
808 }
809 configSingleFilterInDemuxTest(filterMap[live.ipFilterId], frontendMap[live.frontendId]);
Hongguang600a6ae2021-07-08 18:51:51 -0700810 }
Hongguang600a6ae2021-07-08 18:51:51 -0700811}
812
813TEST_P(TunerFilterAidlTest, ReconfigFilterToReceiveStartId) {
814 description("Recofigure and restart a filter to test start id.");
815 if (!live.hasFrontendConnection) {
816 return;
817 }
818 // TODO use parameterized tests
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000819 auto live_configs = generateLiveConfigurations();
820 for (auto& configuration : live_configs) {
821 live = configuration;
822 reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId],
823 filterMap[live.videoFilterId],
824 frontendMap[live.frontendId]);
825 }
Hongguang600a6ae2021-07-08 18:51:51 -0700826}
827
828TEST_P(TunerFilterAidlTest, SetFilterLinkage) {
829 description("Pick up all the possible linkages from the demux caps and set them up.");
830 DemuxCapabilities caps;
831 int32_t demuxId;
832 std::shared_ptr<IDemux> demux;
833 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
834 ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
835 mFilterTests.setDemux(demux);
836 for (int i = 0; i < caps.linkCaps.size(); i++) {
837 uint32_t bitMask = 1;
838 for (int j = 0; j < FILTER_MAIN_TYPE_BIT_COUNT; j++) {
839 if (caps.linkCaps[i] & (bitMask << j)) {
840 int64_t sourceFilterId;
841 int64_t sinkFilterId;
842 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(i), FMQ_SIZE_16M));
843 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sourceFilterId));
844 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(j), FMQ_SIZE_16M));
845 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sinkFilterId));
846 ASSERT_TRUE(mFilterTests.setFilterDataSource(sourceFilterId, sinkFilterId));
847 ASSERT_TRUE(mFilterTests.setFilterDataSourceToDemux(sinkFilterId));
848 ASSERT_TRUE(mFilterTests.closeFilter(sinkFilterId));
849 ASSERT_TRUE(mFilterTests.closeFilter(sourceFilterId));
850 }
851 }
852 }
853 ASSERT_TRUE(mDemuxTests.closeDemux());
854}
855
856TEST_P(TunerFilterAidlTest, testTimeFilter) {
857 description("Open a timer filter in Demux and set time stamp.");
858 if (!timeFilter.support) {
859 return;
860 }
861 // TODO use parameterized tests
Frankie Lizcano0c069532022-07-14 20:20:46 +0000862 auto timeFilter_configs = generateTimeFilterConfigurations();
863 for (auto& configuration : timeFilter_configs) {
864 timeFilter = configuration;
865 testTimeFilter(timeFilterMap[timeFilter.timeFilterId]);
866 }
Hongguang600a6ae2021-07-08 18:51:51 -0700867}
868
Gareth Fenn9a808452022-03-31 08:40:00 +0100869static bool isEventProducingFilter(const FilterConfig& filterConfig) {
870 switch (filterConfig.type.mainType) {
871 case DemuxFilterMainType::TS: {
872 auto tsFilterType =
873 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
874 return (tsFilterType == DemuxTsFilterType::SECTION ||
875 tsFilterType == DemuxTsFilterType::PES ||
876 tsFilterType == DemuxTsFilterType::AUDIO ||
877 tsFilterType == DemuxTsFilterType::VIDEO ||
878 tsFilterType == DemuxTsFilterType::RECORD ||
879 tsFilterType == DemuxTsFilterType::TEMI);
880 }
881 case DemuxFilterMainType::MMTP: {
882 auto mmtpFilterType =
883 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
884 return (mmtpFilterType == DemuxMmtpFilterType::SECTION ||
885 mmtpFilterType == DemuxMmtpFilterType::PES ||
886 mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
887 mmtpFilterType == DemuxMmtpFilterType::VIDEO ||
888 mmtpFilterType == DemuxMmtpFilterType::RECORD ||
889 mmtpFilterType == DemuxMmtpFilterType::DOWNLOAD);
890 }
891 case DemuxFilterMainType::IP: {
892 auto ipFilterType =
893 filterConfig.type.subType.get<DemuxFilterSubType::Tag::ipFilterType>();
894 return (ipFilterType == DemuxIpFilterType::SECTION);
895 }
896 case DemuxFilterMainType::TLV: {
897 auto tlvFilterType =
898 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tlvFilterType>();
899 return (tlvFilterType == DemuxTlvFilterType::SECTION);
900 }
901 case DemuxFilterMainType::ALP: {
902 auto alpFilterType =
903 filterConfig.type.subType.get<DemuxFilterSubType::Tag::alpFilterType>();
904 return (alpFilterType == DemuxAlpFilterType::SECTION);
905 }
906 default:
907 return false;
908 }
909}
910
Patrick Rohr1586d212021-11-23 00:40:56 +0100911static bool isMediaFilter(const FilterConfig& filterConfig) {
912 switch (filterConfig.type.mainType) {
913 case DemuxFilterMainType::TS: {
914 // TS Audio and Video filters are media filters
915 auto tsFilterType =
916 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
917 return (tsFilterType == DemuxTsFilterType::AUDIO ||
918 tsFilterType == DemuxTsFilterType::VIDEO);
919 }
920 case DemuxFilterMainType::MMTP: {
921 // MMTP Audio and Video filters are media filters
922 auto mmtpFilterType =
923 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
924 return (mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
925 mmtpFilterType == DemuxMmtpFilterType::VIDEO);
926 }
927 default:
928 return false;
929 }
930}
Patrick Rohr149b0872021-11-20 00:39:37 +0100931
Patrick Rohr1586d212021-11-23 00:40:56 +0100932static int getDemuxFilterEventDataLength(const DemuxFilterEvent& event) {
933 switch (event.getTag()) {
934 case DemuxFilterEvent::Tag::section:
935 return event.get<DemuxFilterEvent::Tag::section>().dataLength;
936 case DemuxFilterEvent::Tag::media:
937 return event.get<DemuxFilterEvent::Tag::media>().dataLength;
938 case DemuxFilterEvent::Tag::pes:
939 return event.get<DemuxFilterEvent::Tag::pes>().dataLength;
940 case DemuxFilterEvent::Tag::download:
941 return event.get<DemuxFilterEvent::Tag::download>().dataLength;
942 case DemuxFilterEvent::Tag::ipPayload:
943 return event.get<DemuxFilterEvent::Tag::ipPayload>().dataLength;
944
945 case DemuxFilterEvent::Tag::tsRecord:
946 case DemuxFilterEvent::Tag::mmtpRecord:
947 case DemuxFilterEvent::Tag::temi:
948 case DemuxFilterEvent::Tag::monitorEvent:
949 case DemuxFilterEvent::Tag::startId:
950 return 0;
951 }
952}
953
954// TODO: move boilerplate into text fixture
955void TunerFilterAidlTest::testDelayHint(const FilterConfig& filterConf) {
Gareth Fenn9a808452022-03-31 08:40:00 +0100956 if (!filterConf.timeDelayInMs && !filterConf.dataDelayInBytes) {
957 return;
958 }
959 if (!isEventProducingFilter(filterConf)) {
960 return;
961 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100962 int32_t feId;
963 int32_t demuxId;
964 std::shared_ptr<IDemux> demux;
965 int64_t filterId;
966
967 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
968 ASSERT_TRUE(feId != INVALID_ID);
969 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
970 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
971 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
972 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
973 mFilterTests.setDemux(demux);
974
Patrick Rohr149b0872021-11-20 00:39:37 +0100975 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
976 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
Patrick Rohr149b0872021-11-20 00:39:37 +0100977
Patrick Rohr1586d212021-11-23 00:40:56 +0100978 bool mediaFilter = isMediaFilter(filterConf);
Patrick Rohr149b0872021-11-20 00:39:37 +0100979 auto filter = mFilterTests.getFilterById(filterId);
980
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100981 // startTime needs to be set before calling setDelayHint.
982 auto startTime = std::chrono::steady_clock::now();
983
Gareth Fenn9a808452022-03-31 08:40:00 +0100984 int timeDelayInMs = filterConf.timeDelayInMs;
985 if (timeDelayInMs > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100986 FilterDelayHint delayHint;
987 delayHint.hintType = FilterDelayHintType::TIME_DELAY_IN_MS;
Gareth Fenn9a808452022-03-31 08:40:00 +0100988 delayHint.hintValue = timeDelayInMs;
Patrick Rohr149b0872021-11-20 00:39:37 +0100989
Patrick Rohr1586d212021-11-23 00:40:56 +0100990 // setDelayHint should fail for media filters.
991 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
992 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100993
Patrick Rohr1586d212021-11-23 00:40:56 +0100994 int dataDelayInBytes = filterConf.dataDelayInBytes;
995 if (dataDelayInBytes > 0) {
996 FilterDelayHint delayHint;
997 delayHint.hintType = FilterDelayHintType::DATA_SIZE_DELAY_IN_BYTES;
998 delayHint.hintValue = dataDelayInBytes;
Patrick Rohr149b0872021-11-20 00:39:37 +0100999
Patrick Rohr1586d212021-11-23 00:40:56 +01001000 // setDelayHint should fail for media filters.
1001 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
1002 }
Patrick Rohr149b0872021-11-20 00:39:37 +01001003
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +01001004 // start and stop filter (and wait for first callback) in order to
1005 // circumvent callback scheduler race conditions after adjusting filter
1006 // delays.
1007 auto cb = mFilterTests.getFilterCallbacks().at(filterId);
1008 auto future =
1009 cb->verifyFilterCallback([](const std::vector<DemuxFilterEvent>&) { return true; });
Gareth Fenn9a808452022-03-31 08:40:00 +01001010
1011 // The configure stage can also produce events, so we should set the delay
1012 // hint beforehand.
1013 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
Patrick Rohr1586d212021-11-23 00:40:56 +01001014 mFilterTests.startFilter(filterId);
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +01001015
1016 auto timeout = std::chrono::seconds(30);
1017 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
1018
Patrick Rohr1586d212021-11-23 00:40:56 +01001019 mFilterTests.stopFilter(filterId);
Patrick Rohr149b0872021-11-20 00:39:37 +01001020
Patrick Rohr1586d212021-11-23 00:40:56 +01001021 if (!mediaFilter) {
Patrick Rohr1586d212021-11-23 00:40:56 +01001022 int callbackSize = 0;
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +01001023 future = cb->verifyFilterCallback(
Patrick Rohr1586d212021-11-23 00:40:56 +01001024 [&callbackSize](const std::vector<DemuxFilterEvent>& events) {
1025 for (const auto& event : events) {
1026 callbackSize += getDemuxFilterEventDataLength(event);
1027 }
1028 return true;
1029 });
1030
Patrick Rohr1586d212021-11-23 00:40:56 +01001031 ASSERT_TRUE(mFilterTests.startFilter(filterId));
1032
1033 // block and wait for callback to be received.
Patrick Rohr1586d212021-11-23 00:40:56 +01001034 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
Patrick Rohr1586d212021-11-23 00:40:56 +01001035
Gareth Fenn9a808452022-03-31 08:40:00 +01001036 auto duration = std::chrono::steady_clock::now() - startTime;
1037 bool delayHintTest = duration >= std::chrono::milliseconds(timeDelayInMs);
Patrick Rohr1586d212021-11-23 00:40:56 +01001038 bool dataSizeTest = callbackSize >= dataDelayInBytes;
1039
Gareth Fenn9a808452022-03-31 08:40:00 +01001040 if (timeDelayInMs > 0 && dataDelayInBytes > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +01001041 ASSERT_TRUE(delayHintTest || dataSizeTest);
1042 } else {
1043 // if only one of time delay / data delay is configured, one of them
1044 // holds true by default, so we want both assertions to be true.
1045 ASSERT_TRUE(delayHintTest && dataSizeTest);
1046 }
1047
1048 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
1049 }
1050
Patrick Rohr149b0872021-11-20 00:39:37 +01001051 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
1052 ASSERT_TRUE(mDemuxTests.closeDemux());
1053 ASSERT_TRUE(mFrontendTests.closeFrontend());
1054}
1055
Patrick Rohr1586d212021-11-23 00:40:56 +01001056TEST_P(TunerFilterAidlTest, FilterDelayHintTest) {
1057 description("Test filter time delay hint.");
Gareth Fenn9a808452022-03-31 08:40:00 +01001058 if (!live.hasFrontendConnection) {
1059 return;
1060 }
Patrick Rohr1586d212021-11-23 00:40:56 +01001061 for (const auto& obj : filterMap) {
1062 testDelayHint(obj.second);
1063 }
1064}
1065
Hongguang600a6ae2021-07-08 18:51:51 -07001066TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
1067 description("Feed ts data from playback and configure Ts section filter to get output");
Frankie Lizcanoa53f5542022-07-07 17:32:06 +00001068 if (!playback.support) {
Hongguang600a6ae2021-07-08 18:51:51 -07001069 return;
1070 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +00001071 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
1072 for (auto& configuration : playback_configs) {
1073 if (configuration.sectionFilterId.compare(emptyHardwareId) != 0) {
1074 playback = configuration;
1075 playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]);
1076 }
1077 }
Hongguang600a6ae2021-07-08 18:51:51 -07001078}
1079
1080TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsAudioFilterTest) {
1081 description("Feed ts data from playback and configure Ts audio filter to get output");
1082 if (!playback.support) {
1083 return;
1084 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +00001085 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
1086 for (auto& configuration : playback_configs) {
1087 playback = configuration;
1088 playbackSingleFilterTest(filterMap[playback.audioFilterId], dvrMap[playback.dvrId]);
1089 }
Hongguang600a6ae2021-07-08 18:51:51 -07001090}
1091
1092TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsVideoFilterTest) {
1093 description("Feed ts data from playback and configure Ts video filter to get output");
1094 if (!playback.support) {
1095 return;
1096 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +00001097 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
1098 for (auto& configuration : playback_configs) {
1099 playback = configuration;
1100 playbackSingleFilterTest(filterMap[playback.videoFilterId], dvrMap[playback.dvrId]);
1101 }
Hongguang600a6ae2021-07-08 18:51:51 -07001102}
1103
Ray Chin62ab6c92022-09-15 15:07:33 +08001104TEST_P(TunerPlaybackAidlTest, SetStatusCheckIntervalHintToPlaybackTest) {
1105 description("Set status check interval hint to playback test.");
1106 if (!playback.support) {
1107 return;
1108 }
1109 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
1110 for (auto& configuration : playback_configs) {
1111 playback = configuration;
1112 setStatusCheckIntervalHintTest(STATUS_CHECK_INTERVAL_MS, dvrMap[playback.dvrId]);
1113 }
1114}
1115
Hongguang600a6ae2021-07-08 18:51:51 -07001116TEST_P(TunerRecordAidlTest, RecordDataFlowWithTsRecordFilterTest) {
1117 description("Feed ts data from frontend to recording and test with ts record filter");
1118 if (!record.support) {
1119 return;
1120 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +00001121 auto record_configs = generateRecordConfigurations();
1122 for (auto& configuration : record_configs) {
1123 record = configuration;
1124 recordSingleFilterTest(filterMap[record.recordFilterId], frontendMap[record.frontendId],
1125 dvrMap[record.dvrRecordId], Dataflow_Context::RECORD);
1126 }
Hongguang600a6ae2021-07-08 18:51:51 -07001127}
1128
1129TEST_P(TunerRecordAidlTest, AttachFiltersToRecordTest) {
1130 description("Attach a single filter to the record dvr test.");
1131 // TODO use parameterized tests
1132 if (!record.support) {
1133 return;
1134 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +00001135 auto record_configs = generateRecordConfigurations();
1136 for (auto& configuration : record_configs) {
1137 record = configuration;
1138 attachSingleFilterToRecordDvrTest(filterMap[record.recordFilterId],
1139 frontendMap[record.frontendId],
1140 dvrMap[record.dvrRecordId]);
1141 }
Hongguang600a6ae2021-07-08 18:51:51 -07001142}
1143
1144TEST_P(TunerRecordAidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
1145 description("Feed ts data from Fe with Lnb to recording and test with ts record filter");
1146 if (!lnbRecord.support) {
1147 return;
1148 }
Frankie Lizcanoecba02a2022-07-12 17:56:54 +00001149 vector<LnbRecordHardwareConnections> lnbRecord_configs = generateLnbRecordConfigurations();
1150 if (lnbRecord_configs.empty()) {
1151 ALOGD("No frontends that support satellites.");
1152 return;
1153 }
1154 for (auto& configuration : lnbRecord_configs) {
1155 lnbRecord = configuration;
1156 recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId],
1157 frontendMap[lnbRecord.frontendId],
1158 dvrMap[lnbRecord.dvrRecordId], lnbMap[lnbRecord.lnbId]);
1159 }
Hongguang600a6ae2021-07-08 18:51:51 -07001160}
1161
Ray Chin62ab6c92022-09-15 15:07:33 +08001162TEST_P(TunerRecordAidlTest, SetStatusCheckIntervalHintToRecordTest) {
1163 description("Set status check interval hint to record test.");
1164 if (!record.support) {
1165 return;
1166 }
1167 auto record_configs = generateRecordConfigurations();
1168 for (auto& configuration : record_configs) {
1169 record = configuration;
1170 setStatusCheckIntervalHintTest(STATUS_CHECK_INTERVAL_MS, frontendMap[record.frontendId],
1171 dvrMap[record.dvrRecordId]);
1172 }
1173}
1174
Hongguang600a6ae2021-07-08 18:51:51 -07001175TEST_P(TunerFrontendAidlTest, TuneFrontend) {
1176 description("Tune one Frontend with specific setting and check Lock event");
1177 if (!live.hasFrontendConnection) {
1178 return;
1179 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001180 auto live_configs = generateLiveConfigurations();
1181 for (auto& configuration : live_configs) {
1182 live = configuration;
1183 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
1184 }
Hongguang600a6ae2021-07-08 18:51:51 -07001185}
1186
1187TEST_P(TunerFrontendAidlTest, AutoScanFrontend) {
1188 description("Run an auto frontend scan with specific setting and check lock scanMessage");
1189 if (!scan.hasFrontendConnection) {
1190 return;
1191 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001192 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
1193 for (auto& configuration : scan_configs) {
1194 scan = configuration;
1195 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_AUTO);
1196 }
Hongguang600a6ae2021-07-08 18:51:51 -07001197}
1198
1199TEST_P(TunerFrontendAidlTest, BlindScanFrontend) {
1200 description("Run an blind frontend scan with specific setting and check lock scanMessage");
1201 if (!scan.hasFrontendConnection) {
1202 return;
1203 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001204 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
1205 for (auto& configuration : scan_configs) {
1206 scan = configuration;
Ray Chin58be11e2023-12-22 19:10:46 +08001207 // Skip test if the frontend implementation doesn't support blind scan
1208 if (!frontendMap[scan.frontendId].supportBlindScan) {
1209 continue;
1210 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001211 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
1212 }
Hongguang600a6ae2021-07-08 18:51:51 -07001213}
1214
1215TEST_P(TunerFrontendAidlTest, TuneFrontendWithFrontendSettings) {
1216 description("Tune one Frontend with setting and check Lock event");
1217 if (!live.hasFrontendConnection) {
1218 return;
1219 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001220 auto live_configs = generateLiveConfigurations();
1221 for (auto& configuration : live_configs) {
1222 live = configuration;
1223 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
1224 }
Hongguang600a6ae2021-07-08 18:51:51 -07001225}
1226
1227TEST_P(TunerFrontendAidlTest, BlindScanFrontendWithEndFrequency) {
1228 description("Run an blind frontend scan with setting and check lock scanMessage");
1229 if (!scan.hasFrontendConnection) {
1230 return;
1231 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001232 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
1233 for (auto& configuration : scan_configs) {
1234 scan = configuration;
Ray Chin58be11e2023-12-22 19:10:46 +08001235 // Skip test if the frontend implementation doesn't support blind scan
1236 if (!frontendMap[scan.frontendId].supportBlindScan) {
1237 continue;
1238 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001239 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
1240 }
Hongguang600a6ae2021-07-08 18:51:51 -07001241}
1242
1243TEST_P(TunerFrontendAidlTest, LinkToCiCam) {
1244 description("Test Frontend link to CiCam");
1245 if (!live.hasFrontendConnection) {
1246 return;
1247 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001248 auto live_configs = generateLiveConfigurations();
1249 for (auto& configuration : live_configs) {
1250 live = configuration;
1251 if (!frontendMap[live.frontendId].canConnectToCiCam) {
1252 continue;
1253 }
1254 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
Hongguang600a6ae2021-07-08 18:51:51 -07001255 }
Hongguang600a6ae2021-07-08 18:51:51 -07001256}
1257
Hongguangfcedda02021-12-13 17:08:02 -08001258TEST_P(TunerFrontendAidlTest, getHardwareInfo) {
1259 description("Test Frontend get hardware info");
1260 if (!live.hasFrontendConnection) {
1261 return;
1262 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001263 auto live_configs = generateLiveConfigurations();
1264 for (auto& configuration : live_configs) {
1265 live = configuration;
1266 mFrontendTests.debugInfoTest(frontendMap[live.frontendId]);
1267 }
Hongguangfcedda02021-12-13 17:08:02 -08001268}
1269
Hongguang5766ddf2021-12-23 11:40:37 -08001270TEST_P(TunerFrontendAidlTest, maxNumberOfFrontends) {
1271 description("Test Max Frontend number");
1272 if (!live.hasFrontendConnection) {
1273 return;
1274 }
1275 mFrontendTests.maxNumberOfFrontendsTest();
1276}
1277
Hongguang881190f2022-01-14 13:23:37 -08001278TEST_P(TunerFrontendAidlTest, statusReadinessTest) {
1279 description("Test Max Frontend status readiness");
1280 if (!live.hasFrontendConnection) {
1281 return;
1282 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001283 auto live_configs = generateLiveConfigurations();
1284 for (auto& configuration : live_configs) {
1285 live = configuration;
1286 mFrontendTests.statusReadinessTest(frontendMap[live.frontendId]);
1287 }
Hongguang881190f2022-01-14 13:23:37 -08001288}
1289
Hongguang600a6ae2021-07-08 18:51:51 -07001290TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowVideoFilterTest) {
1291 description("Test Video Filter functionality in Broadcast use case.");
1292 if (!live.hasFrontendConnection) {
1293 return;
1294 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001295 auto live_configs = generateLiveConfigurations();
1296 for (auto& configuration : live_configs) {
1297 live = configuration;
1298 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1299 }
Hongguang600a6ae2021-07-08 18:51:51 -07001300}
1301
1302TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowAudioFilterTest) {
1303 description("Test Audio Filter functionality in Broadcast use case.");
1304 if (!live.hasFrontendConnection) {
1305 return;
1306 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001307 auto live_configs = generateLiveConfigurations();
1308 for (auto& configuration : live_configs) {
1309 live = configuration;
1310 broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]);
1311 }
Hongguang600a6ae2021-07-08 18:51:51 -07001312}
1313
1314TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowSectionFilterTest) {
1315 description("Test Section Filter functionality in Broadcast use case.");
1316 if (!live.hasFrontendConnection) {
1317 return;
1318 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001319 auto live_configs = generateLiveConfigurations();
1320 for (auto& configuration : live_configs) {
1321 live = configuration;
1322 if (live.sectionFilterId.compare(emptyHardwareId) == 0) {
1323 continue;
1324 }
1325 broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]);
Hongguang600a6ae2021-07-08 18:51:51 -07001326 }
Hongguang600a6ae2021-07-08 18:51:51 -07001327}
1328
1329TEST_P(TunerBroadcastAidlTest, IonBufferTest) {
1330 description("Test the av filter data bufferring.");
1331 if (!live.hasFrontendConnection) {
1332 return;
1333 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001334 auto live_configs = generateLiveConfigurations();
1335 for (auto& configuration : live_configs) {
1336 live = configuration;
1337 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1338 }
Hongguang600a6ae2021-07-08 18:51:51 -07001339}
1340
1341TEST_P(TunerBroadcastAidlTest, LnbBroadcastDataFlowVideoFilterTest) {
1342 description("Test Video Filter functionality in Broadcast with Lnb use case.");
1343 if (!lnbLive.support) {
1344 return;
1345 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +00001346 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
1347 if (lnbLive_configs.empty()) {
1348 ALOGD("No frontends that support satellites.");
1349 return;
1350 }
1351 for (auto& combination : lnbLive_configs) {
1352 lnbLive = combination;
1353 broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId],
1354 frontendMap[lnbLive.frontendId], lnbMap[lnbLive.lnbId]);
1355 }
Hongguang600a6ae2021-07-08 18:51:51 -07001356}
1357
1358TEST_P(TunerBroadcastAidlTest, MediaFilterWithSharedMemoryHandle) {
1359 description("Test the Media Filter with shared memory handle");
1360 if (!live.hasFrontendConnection) {
1361 return;
1362 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001363 auto live_configs = generateLiveConfigurations();
1364 for (auto& configuration : live_configs) {
1365 live = configuration;
1366 mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId],
1367 frontendMap[live.frontendId]);
1368 }
Hongguang600a6ae2021-07-08 18:51:51 -07001369}
1370
1371TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
1372 description("Create Descrambler");
1373 if (!descrambling.support) {
1374 return;
1375 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001376 vector<DescramblingHardwareConnections> descrambling_configs =
1377 generateDescramblingConfigurations();
1378 if (descrambling_configs.empty()) {
1379 ALOGD("No valid descrambling combinations in the configuration file.");
1380 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001381 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001382 for (auto& combination : descrambling_configs) {
1383 descrambling = combination;
1384 int32_t demuxId;
1385 std::shared_ptr<IDemux> demux;
1386 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
Hongguang600a6ae2021-07-08 18:51:51 -07001387
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001388 if (descrambling.hasFrontendConnection) {
1389 int32_t feId;
1390 mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId);
1391 ASSERT_TRUE(feId != INVALID_ID);
1392 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
1393 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
1394 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
1395 }
Hongguang600a6ae2021-07-08 18:51:51 -07001396
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001397 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
1398 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
1399 ASSERT_TRUE(mDemuxTests.closeDemux());
1400
1401 if (descrambling.hasFrontendConnection) {
1402 ASSERT_TRUE(mFrontendTests.closeFrontend());
1403 }
Hongguang600a6ae2021-07-08 18:51:51 -07001404 }
1405}
1406
1407TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
1408 description("Test ts audio filter in scrambled broadcast use case");
1409 if (!descrambling.support) {
1410 return;
1411 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001412 vector<DescramblingHardwareConnections> descrambling_configs =
1413 generateDescramblingConfigurations();
1414 if (descrambling_configs.empty()) {
1415 ALOGD("No valid descrambling combinations in the configuration file.");
1416 return;
1417 }
1418 for (auto& combination : descrambling_configs) {
1419 descrambling = combination;
1420 set<FilterConfig> filterConfs;
1421 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
1422 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
1423 scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
Frankie Lizcano82101d22022-07-28 00:12:35 +00001424 descramblerMap[descrambling.descramblerId],
1425 Dataflow_Context::DESCRAMBLING);
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001426 }
Hongguang600a6ae2021-07-08 18:51:51 -07001427}
1428
Frankie Lizcano82101d22022-07-28 00:12:35 +00001429TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTestWithLnb) {
1430 description("Test media filters in scrambled broadcast use case with Lnb");
1431 if (!lnbDescrambling.support) {
1432 return;
1433 }
Frankie Lizcanobcf4ebb2022-08-01 18:06:00 +00001434 auto lnbDescrambling_configs = generateLnbDescramblingConfigurations();
1435 if (lnbDescrambling_configs.empty()) {
1436 ALOGD("No frontends that support satellites.");
1437 return;
1438 }
1439 for (auto& configuration : lnbDescrambling_configs) {
1440 lnbDescrambling = configuration;
1441 set<FilterConfig> filterConfs;
1442 filterConfs.insert(static_cast<FilterConfig>(filterMap[lnbDescrambling.audioFilterId]));
1443 filterConfs.insert(static_cast<FilterConfig>(filterMap[lnbDescrambling.videoFilterId]));
1444 scrambledBroadcastTestWithLnb(filterConfs, frontendMap[lnbDescrambling.frontendId],
1445 descramblerMap[lnbDescrambling.descramblerId],
1446 lnbMap[lnbDescrambling.lnbId]);
1447 }
Frankie Lizcano82101d22022-07-28 00:12:35 +00001448}
1449
Hongguang600a6ae2021-07-08 18:51:51 -07001450INSTANTIATE_TEST_SUITE_P(PerInstance, TunerBroadcastAidlTest,
1451 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1452 android::PrintInstanceNameToString);
1453
1454INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFrontendAidlTest,
1455 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1456 android::PrintInstanceNameToString);
1457
1458INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFilterAidlTest,
1459 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1460 android::PrintInstanceNameToString);
1461
1462INSTANTIATE_TEST_SUITE_P(PerInstance, TunerRecordAidlTest,
1463 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1464 android::PrintInstanceNameToString);
1465
1466INSTANTIATE_TEST_SUITE_P(PerInstance, TunerLnbAidlTest,
1467 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1468 android::PrintInstanceNameToString);
1469
1470INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDemuxAidlTest,
1471 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1472 android::PrintInstanceNameToString);
1473
1474INSTANTIATE_TEST_SUITE_P(PerInstance, TunerPlaybackAidlTest,
1475 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1476 android::PrintInstanceNameToString);
1477
1478INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDescramblerAidlTest,
1479 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1480 android::PrintInstanceNameToString);
1481
1482} // namespace
1483
1484// Start thread pool to receive callbacks from AIDL service.
1485int main(int argc, char** argv) {
1486 ::testing::InitGoogleTest(&argc, argv);
1487 ABinderProcess_setThreadPoolMaxThreadCount(1);
1488 ABinderProcess_startThreadPool();
1489 return RUN_ALL_TESTS();
1490}