1 /*
2  * Copyright 2020 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 "VtsHalTvTunerV1_0TargetTest.h"
18 
19 namespace {
20 
filterDataOutputTest()21 AssertionResult TunerBroadcastHidlTest::filterDataOutputTest() {
22     return filterDataOutputTestBase(mFilterTests);
23 }
24 
filterDataOutputTest()25 AssertionResult TunerPlaybackHidlTest::filterDataOutputTest() {
26     return filterDataOutputTestBase(mFilterTests);
27 }
28 
filterDataOutputTest()29 AssertionResult TunerDescramblerHidlTest::filterDataOutputTest() {
30     return filterDataOutputTestBase(mFilterTests);
31 }
32 
configSingleFilterInDemuxTest(FilterConfig filterConf,FrontendConfig frontendConf)33 void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf,
34                                                         FrontendConfig frontendConf) {
35     uint32_t feId;
36     uint32_t demuxId;
37     sp<IDemux> demux;
38     uint32_t filterId;
39 
40     mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
41     ASSERT_TRUE(feId != INVALID_ID);
42     ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
43     ASSERT_TRUE(mFrontendTests.setFrontendCallback());
44     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
45     ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
46     mFilterTests.setDemux(demux);
47     ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
48     ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId));
49     ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
50     ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
51     ASSERT_TRUE(mFilterTests.startFilter(filterId));
52     ASSERT_TRUE(mFilterTests.stopFilter(filterId));
53     ASSERT_TRUE(mFilterTests.closeFilter(filterId));
54     ASSERT_TRUE(mDemuxTests.closeDemux());
55     ASSERT_TRUE(mFrontendTests.closeFrontend());
56 }
57 
testTimeFilter(TimeFilterConfig filterConf)58 void TunerFilterHidlTest::testTimeFilter(TimeFilterConfig filterConf) {
59     uint32_t demuxId;
60     sp<IDemux> demux;
61     DemuxCapabilities caps;
62 
63     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
64     ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
65     ASSERT_TRUE(caps.bTimeFilter);
66     mFilterTests.setDemux(demux);
67     ASSERT_TRUE(mFilterTests.openTimeFilterInDemux());
68     ASSERT_TRUE(mFilterTests.setTimeStamp(filterConf.timeStamp));
69     ASSERT_TRUE(mFilterTests.getTimeStamp());
70     ASSERT_TRUE(mFilterTests.clearTimeStamp());
71     ASSERT_TRUE(mFilterTests.closeTimeFilter());
72     ASSERT_TRUE(mDemuxTests.closeDemux());
73 }
74 
broadcastSingleFilterTest(FilterConfig filterConf,FrontendConfig frontendConf)75 void TunerBroadcastHidlTest::broadcastSingleFilterTest(FilterConfig filterConf,
76                                                        FrontendConfig frontendConf) {
77     uint32_t feId;
78     uint32_t demuxId;
79     sp<IDemux> demux;
80     uint32_t filterId;
81 
82     mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
83     ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
84     ASSERT_TRUE(mFrontendTests.setFrontendCallback());
85     if (mLnbId) {
86         ASSERT_TRUE(mFrontendTests.setLnb(*mLnbId));
87     }
88     if (frontendConf.isSoftwareFe) {
89         mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
90     }
91     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
92     ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
93     mFrontendTests.setDemux(demux);
94     mFilterTests.setDemux(demux);
95     ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
96     ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId));
97     ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
98     ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
99     ASSERT_TRUE(mFilterTests.startFilter(filterId));
100     // tune test
101     ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
102     ASSERT_TRUE(filterDataOutputTest());
103     ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
104     ASSERT_TRUE(mFilterTests.stopFilter(filterId));
105     ASSERT_TRUE(mFilterTests.closeFilter(filterId));
106     ASSERT_TRUE(mDemuxTests.closeDemux());
107     ASSERT_TRUE(mFrontendTests.closeFrontend());
108 }
109 
broadcastSingleFilterTestWithLnb(FilterConfig filterConf,FrontendConfig frontendConf,LnbConfig lnbConf)110 void TunerBroadcastHidlTest::broadcastSingleFilterTestWithLnb(FilterConfig filterConf,
111                                                               FrontendConfig frontendConf,
112                                                               LnbConfig lnbConf) {
113     if (lnbConf.name.compare(emptyHardwareId) == 0) {
114         vector<uint32_t> ids;
115         ASSERT_TRUE(mLnbTests.getLnbIds(ids));
116         ASSERT_TRUE(ids.size() > 0);
117         ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
118         mLnbId = &ids[0];
119     } else {
120         mLnbId = (uint32_t*)malloc(sizeof(uint32_t));
121         ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, *mLnbId));
122     }
123     ASSERT_TRUE(mLnbTests.setLnbCallback());
124     ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
125     ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
126     ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
127     broadcastSingleFilterTest(filterConf, frontendConf);
128     ASSERT_TRUE(mLnbTests.closeLnb());
129     mLnbId = nullptr;
130 }
131 
playbackSingleFilterTest(FilterConfig filterConf,DvrConfig dvrConf)132 void TunerPlaybackHidlTest::playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf) {
133     uint32_t demuxId;
134     sp<IDemux> demux;
135     uint32_t filterId;
136 
137     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
138     mFilterTests.setDemux(demux);
139     mDvrTests.setDemux(demux);
140     ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
141     ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrConf.settings));
142     ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
143     ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
144     ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId));
145     ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
146     ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
147     mDvrTests.startPlaybackInputThread(dvrConf.playbackInputFile, dvrConf.settings.playback());
148     ASSERT_TRUE(mDvrTests.startDvrPlayback());
149     ASSERT_TRUE(mFilterTests.startFilter(filterId));
150     ASSERT_TRUE(filterDataOutputTest());
151     mDvrTests.stopPlaybackThread();
152     ASSERT_TRUE(mFilterTests.stopFilter(filterId));
153     ASSERT_TRUE(mDvrTests.stopDvrPlayback());
154     ASSERT_TRUE(mFilterTests.closeFilter(filterId));
155     mDvrTests.closeDvrPlayback();
156     ASSERT_TRUE(mDemuxTests.closeDemux());
157 }
158 
recordSingleFilterTest(FilterConfig filterConf,FrontendConfig frontendConf,DvrConfig dvrConf)159 void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf,
160                                                  FrontendConfig frontendConf, DvrConfig dvrConf) {
161     uint32_t demuxId;
162     sp<IDemux> demux;
163     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
164     mDvrTests.setDemux(demux);
165 
166     DvrConfig dvrSourceConfig;
167     if (mLnbId || record.hasFrontendConnection) {
168         uint32_t feId;
169         mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
170         ASSERT_TRUE(feId != INVALID_ID);
171         ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
172         ASSERT_TRUE(mFrontendTests.setFrontendCallback());
173         if (mLnbId) {
174             ASSERT_TRUE(mFrontendTests.setLnb(*mLnbId));
175         }
176         if (frontendConf.isSoftwareFe) {
177             mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]);
178         }
179         ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
180         mFrontendTests.setDvrTests(mDvrTests);
181     } else {
182         dvrSourceConfig = dvrMap[record.dvrSourceId];
183         ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
184         ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
185         ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
186     }
187 
188     uint32_t filterId;
189     sp<IFilter> filter;
190     mFilterTests.setDemux(demux);
191     ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
192     ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
193     ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
194     ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
195     ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId));
196     ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
197     ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
198     filter = mFilterTests.getFilterById(filterId);
199     ASSERT_TRUE(filter != nullptr);
200     mDvrTests.startRecordOutputThread(dvrConf.settings.record());
201     ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
202     ASSERT_TRUE(mDvrTests.startDvrRecord());
203     ASSERT_TRUE(mFilterTests.startFilter(filterId));
204 
205     if (mLnbId || record.hasFrontendConnection) {
206         ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
207     } else {
208         // Start DVR Source
209         mDvrTests.startPlaybackInputThread(dvrSourceConfig.playbackInputFile,
210                                            dvrSourceConfig.settings.playback());
211         ASSERT_TRUE(mDvrTests.startDvrPlayback());
212     }
213 
214     mDvrTests.testRecordOutput();
215     mDvrTests.stopRecordThread();
216 
217     if (mLnbId || record.hasFrontendConnection) {
218         ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
219     } else {
220         mDvrTests.stopPlaybackThread();
221         ASSERT_TRUE(mDvrTests.stopDvrPlayback());
222     }
223 
224     ASSERT_TRUE(mFilterTests.stopFilter(filterId));
225     ASSERT_TRUE(mDvrTests.stopDvrRecord());
226     ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
227     ASSERT_TRUE(mFilterTests.closeFilter(filterId));
228     mDvrTests.closeDvrRecord();
229 
230     if (mLnbId || record.hasFrontendConnection) {
231         ASSERT_TRUE(mFrontendTests.closeFrontend());
232     } else {
233         mDvrTests.closeDvrPlayback();
234     }
235 
236     ASSERT_TRUE(mDemuxTests.closeDemux());
237 }
238 
recordSingleFilterTestWithLnb(FilterConfig filterConf,FrontendConfig frontendConf,DvrConfig dvrConf,LnbConfig lnbConf)239 void TunerRecordHidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf,
240                                                         FrontendConfig frontendConf,
241                                                         DvrConfig dvrConf, LnbConfig lnbConf) {
242     if (lnbConf.name.compare(emptyHardwareId) == 0) {
243         vector<uint32_t> ids;
244         ASSERT_TRUE(mLnbTests.getLnbIds(ids));
245         ASSERT_TRUE(ids.size() > 0);
246         ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
247         mLnbId = &ids[0];
248     } else {
249         mLnbId = (uint32_t*)malloc(sizeof(uint32_t));
250         ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, *mLnbId));
251     }
252     ASSERT_TRUE(mLnbTests.setLnbCallback());
253     ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
254     ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
255     ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
256     for (auto msgName : lnbRecord.diseqcMsgs) {
257         ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
258     }
259     recordSingleFilterTest(filterConf, frontendConf, dvrConf);
260     ASSERT_TRUE(mLnbTests.closeLnb());
261     mLnbId = nullptr;
262 }
263 
attachSingleFilterToRecordDvrTest(FilterConfig filterConf,FrontendConfig frontendConf,DvrConfig dvrConf)264 void TunerRecordHidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf,
265                                                             FrontendConfig frontendConf,
266                                                             DvrConfig dvrConf) {
267     uint32_t demuxId;
268     sp<IDemux> demux;
269     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
270     mDvrTests.setDemux(demux);
271 
272     DvrConfig dvrSourceConfig;
273     if (record.hasFrontendConnection) {
274         uint32_t feId;
275         mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
276         ASSERT_TRUE(feId != INVALID_ID);
277         ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
278         ASSERT_TRUE(mFrontendTests.setFrontendCallback());
279         ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
280     } else {
281         dvrSourceConfig = dvrMap[record.dvrSourceId];
282         ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
283         ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
284         ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
285     }
286 
287     uint32_t filterId;
288     sp<IFilter> filter;
289     mFilterTests.setDemux(demux);
290 
291     ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
292     ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
293     ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
294 
295     ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
296     ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId));
297     ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
298     ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
299     filter = mFilterTests.getFilterById(filterId);
300     ASSERT_TRUE(filter != nullptr);
301     ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
302     ASSERT_TRUE(mDvrTests.startDvrRecord());
303     ASSERT_TRUE(mFilterTests.startFilter(filterId));
304     ASSERT_TRUE(mFilterTests.stopFilter(filterId));
305     ASSERT_TRUE(mDvrTests.stopDvrRecord());
306     ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
307     ASSERT_TRUE(mFilterTests.closeFilter(filterId));
308     mDvrTests.closeDvrRecord();
309     ASSERT_TRUE(mDemuxTests.closeDemux());
310 
311     if (record.hasFrontendConnection) {
312         ASSERT_TRUE(mFrontendTests.closeFrontend());
313     }
314 }
315 
scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,FrontendConfig frontendConf,DescramblerConfig descConfig)316 void TunerDescramblerHidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,
317                                                       FrontendConfig frontendConf,
318                                                       DescramblerConfig descConfig) {
319     uint32_t demuxId;
320     sp<IDemux> demux;
321     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
322 
323     DvrConfig dvrSourceConfig;
324     if (descrambling.hasFrontendConnection) {
325         uint32_t feId;
326         mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
327         ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
328         ASSERT_TRUE(mFrontendTests.setFrontendCallback());
329         if (frontendConf.isSoftwareFe) {
330             mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]);
331         }
332         ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
333         mFrontendTests.setDemux(demux);
334     } else {
335         dvrSourceConfig = dvrMap[descrambling.dvrSourceId];
336         mDvrTests.setDemux(demux);
337         ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
338         ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
339         ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
340     }
341 
342     set<uint32_t> filterIds;
343     uint32_t filterId;
344     set<struct FilterConfig>::iterator config;
345     set<uint32_t>::iterator id;
346     mFilterTests.setDemux(demux);
347     for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
348         ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize));
349         ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId));
350         ASSERT_TRUE(mFilterTests.configFilter((*config).settings, filterId));
351         filterIds.insert(filterId);
352     }
353     ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
354     TunerKeyToken token;
355     ASSERT_TRUE(mDescramblerTests.getKeyToken(descConfig.casSystemId, descConfig.provisionStr,
356                                               descConfig.hidlPvtData, token));
357     mDescramblerTests.setKeyToken(token);
358     vector<DemuxPid> pids;
359     DemuxPid pid;
360     for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
361         ASSERT_TRUE(mDescramblerTests.getDemuxPidFromFilterSettings((*config).type,
362                                                                     (*config).settings, pid));
363         pids.push_back(pid);
364         ASSERT_TRUE(mDescramblerTests.addPid(pid, nullptr));
365     }
366     for (id = filterIds.begin(); id != filterIds.end(); id++) {
367         ASSERT_TRUE(mFilterTests.startFilter(*id));
368     }
369 
370     if (descrambling.hasFrontendConnection) {
371         // tune test
372         ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
373     } else {
374         // Start DVR Source
375         mDvrTests.startPlaybackInputThread(dvrSourceConfig.playbackInputFile,
376                                            dvrSourceConfig.settings.playback());
377         ASSERT_TRUE(mDvrTests.startDvrPlayback());
378     }
379 
380     ASSERT_TRUE(filterDataOutputTest());
381 
382     if (descrambling.hasFrontendConnection) {
383         ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
384     } else {
385         mDvrTests.stopPlaybackThread();
386         ASSERT_TRUE(mDvrTests.stopDvrPlayback());
387     }
388 
389     for (id = filterIds.begin(); id != filterIds.end(); id++) {
390         ASSERT_TRUE(mFilterTests.stopFilter(*id));
391     }
392     for (auto pid : pids) {
393         ASSERT_TRUE(mDescramblerTests.removePid(pid, nullptr));
394     }
395     ASSERT_TRUE(mDescramblerTests.closeDescrambler());
396     for (id = filterIds.begin(); id != filterIds.end(); id++) {
397         ASSERT_TRUE(mFilterTests.closeFilter(*id));
398     }
399 
400     if (descrambling.hasFrontendConnection) {
401         ASSERT_TRUE(mFrontendTests.closeFrontend());
402     } else {
403         mDvrTests.closeDvrPlayback();
404     }
405 
406     ASSERT_TRUE(mDemuxTests.closeDemux());
407 }
408 
TEST_P(TunerFrontendHidlTest,TuneFrontend)409 TEST_P(TunerFrontendHidlTest, TuneFrontend) {
410     description("Tune one Frontend with specific setting and check Lock event");
411     if (!live.hasFrontendConnection) {
412         return;
413     }
414     mFrontendTests.tuneTest(frontendMap[live.frontendId]);
415 }
416 
TEST_P(TunerFrontendHidlTest,AutoScanFrontend)417 TEST_P(TunerFrontendHidlTest, AutoScanFrontend) {
418     description("Run an auto frontend scan with specific setting and check lock scanMessage");
419     if (!scan.hasFrontendConnection) {
420         return;
421     }
422     mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_AUTO);
423 }
424 
TEST_P(TunerFrontendHidlTest,BlindScanFrontend)425 TEST_P(TunerFrontendHidlTest, BlindScanFrontend) {
426     description("Run an blind frontend scan with specific setting and check lock scanMessage");
427     if (!scan.hasFrontendConnection) {
428         return;
429     }
430     mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
431 }
432 
TEST_P(TunerLnbHidlTest,SendDiseqcMessageToLnb)433 TEST_P(TunerLnbHidlTest, SendDiseqcMessageToLnb) {
434     description("Open and configure an Lnb with specific settings then send a diseqc msg to it.");
435     if (!lnbLive.support) {
436         return;
437     }
438     if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) {
439         vector<uint32_t> ids;
440         ASSERT_TRUE(mLnbTests.getLnbIds(ids));
441         ASSERT_TRUE(ids.size() > 0);
442         ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
443     } else {
444         uint32_t id;
445         ASSERT_TRUE(mLnbTests.openLnbByName(lnbMap[lnbLive.lnbId].name, id));
446     }
447     ASSERT_TRUE(mLnbTests.setLnbCallback());
448     ASSERT_TRUE(mLnbTests.setVoltage(lnbMap[lnbLive.lnbId].voltage));
449     ASSERT_TRUE(mLnbTests.setTone(lnbMap[lnbLive.lnbId].tone));
450     ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbMap[lnbLive.lnbId].position));
451     for (auto msgName : lnbLive.diseqcMsgs) {
452         ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
453     }
454     ASSERT_TRUE(mLnbTests.closeLnb());
455 }
456 
TEST_P(TunerDemuxHidlTest,openDemux)457 TEST_P(TunerDemuxHidlTest, openDemux) {
458     description("Open and close a Demux.");
459     if (!live.hasFrontendConnection) {
460         return;
461     }
462     uint32_t feId;
463     uint32_t demuxId;
464     sp<IDemux> demux;
465     mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
466     ASSERT_TRUE(feId != INVALID_ID);
467     ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
468     ASSERT_TRUE(mFrontendTests.setFrontendCallback());
469     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
470     ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
471     ASSERT_TRUE(mDemuxTests.closeDemux());
472     ASSERT_TRUE(mFrontendTests.closeFrontend());
473 }
474 
TEST_P(TunerDemuxHidlTest,getAvSyncTime)475 TEST_P(TunerDemuxHidlTest, getAvSyncTime) {
476     description("Get the A/V sync time from a PCR filter.");
477     if (!live.hasFrontendConnection) {
478         return;
479     }
480     if (live.pcrFilterId.compare(emptyHardwareId) == 0) {
481         return;
482     }
483     uint32_t feId;
484     uint32_t demuxId;
485     sp<IDemux> demux;
486     uint32_t mediaFilterId;
487     uint32_t pcrFilterId;
488     uint32_t avSyncHwId;
489     sp<IFilter> mediaFilter;
490 
491     mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
492     ASSERT_TRUE(feId != INVALID_ID);
493     ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
494     ASSERT_TRUE(mFrontendTests.setFrontendCallback());
495     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
496     ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
497     mFilterTests.setDemux(demux);
498     ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type,
499                                                filterMap[live.videoFilterId].bufferSize));
500     ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(mediaFilterId));
501     ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
502     mediaFilter = mFilterTests.getFilterById(mediaFilterId);
503     ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type,
504                                                filterMap[live.pcrFilterId].bufferSize));
505     ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(pcrFilterId));
506     ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.pcrFilterId].settings, pcrFilterId));
507     ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId));
508     ASSERT_TRUE(pcrFilterId == avSyncHwId);
509     ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId));
510     ASSERT_TRUE(mFilterTests.closeFilter(pcrFilterId));
511     ASSERT_TRUE(mFilterTests.closeFilter(mediaFilterId));
512     ASSERT_TRUE(mDemuxTests.closeDemux());
513     ASSERT_TRUE(mFrontendTests.closeFrontend());
514 }
515 
TEST_P(TunerFilterHidlTest,StartFilterInDemux)516 TEST_P(TunerFilterHidlTest, StartFilterInDemux) {
517     description("Open and start a filter in Demux.");
518     if (!live.hasFrontendConnection) {
519         return;
520     }
521     // TODO use paramterized tests
522     configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
523 }
524 
TEST_P(TunerFilterHidlTest,SetFilterLinkage)525 TEST_P(TunerFilterHidlTest, SetFilterLinkage) {
526     description("Pick up all the possible linkages from the demux caps and set them up.");
527     DemuxCapabilities caps;
528     uint32_t demuxId;
529     sp<IDemux> demux;
530     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
531     ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
532     mFilterTests.setDemux(demux);
533     for (int i = 0; i < caps.linkCaps.size(); i++) {
534         uint32_t bitMask = 1;
535         for (int j = 0; j < FILTER_MAIN_TYPE_BIT_COUNT; j++) {
536             if (caps.linkCaps[i] & (bitMask << j)) {
537                 uint32_t sourceFilterId;
538                 uint32_t sinkFilterId;
539                 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(i), FMQ_SIZE_16M));
540                 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(sourceFilterId));
541                 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(j), FMQ_SIZE_16M));
542                 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(sinkFilterId));
543                 ASSERT_TRUE(mFilterTests.setFilterDataSource(sourceFilterId, sinkFilterId));
544                 ASSERT_TRUE(mFilterTests.setFilterDataSourceToDemux(sinkFilterId));
545                 ASSERT_TRUE(mFilterTests.closeFilter(sinkFilterId));
546                 ASSERT_TRUE(mFilterTests.closeFilter(sourceFilterId));
547             }
548         }
549     }
550     ASSERT_TRUE(mDemuxTests.closeDemux());
551 }
552 
TEST_P(TunerFilterHidlTest,testTimeFilter)553 TEST_P(TunerFilterHidlTest, testTimeFilter) {
554     description("Open a timer filter in Demux and set time stamp.");
555     if (!timeFilter.support) {
556         return;
557     }
558     // TODO use paramterized tests
559     testTimeFilter(timeFilterMap[timeFilter.timeFilterId]);
560 }
561 
TEST_P(TunerBroadcastHidlTest,BroadcastDataFlowVideoFilterTest)562 TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowVideoFilterTest) {
563     description("Test Video Filter functionality in Broadcast use case.");
564     if (!live.hasFrontendConnection) {
565         return;
566     }
567     broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
568 }
569 
TEST_P(TunerBroadcastHidlTest,BroadcastDataFlowAudioFilterTest)570 TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowAudioFilterTest) {
571     description("Test Audio Filter functionality in Broadcast use case.");
572     if (!live.hasFrontendConnection) {
573         return;
574     }
575     broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]);
576 }
577 
TEST_P(TunerBroadcastHidlTest,BroadcastDataFlowSectionFilterTest)578 TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowSectionFilterTest) {
579     description("Test Section Filter functionality in Broadcast use case.");
580     if (!live.hasFrontendConnection) {
581         return;
582     }
583     if (live.sectionFilterId.compare(emptyHardwareId) == 0) {
584         return;
585     }
586     broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]);
587 }
588 
TEST_P(TunerBroadcastHidlTest,IonBufferTest)589 TEST_P(TunerBroadcastHidlTest, IonBufferTest) {
590     description("Test the av filter data bufferring.");
591     if (!live.hasFrontendConnection) {
592         return;
593     }
594     broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
595 }
596 
TEST_P(TunerBroadcastHidlTest,LnbBroadcastDataFlowVideoFilterTest)597 TEST_P(TunerBroadcastHidlTest, LnbBroadcastDataFlowVideoFilterTest) {
598     description("Test Video Filter functionality in Broadcast with Lnb use case.");
599     if (!lnbLive.support) {
600         return;
601     }
602     broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId],
603                                      frontendMap[lnbLive.frontendId], lnbMap[lnbLive.lnbId]);
604 }
605 
TEST_P(TunerPlaybackHidlTest,PlaybackDataFlowWithTsSectionFilterTest)606 TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
607     description("Feed ts data from playback and configure Ts section filter to get output");
608     if (!playback.support || playback.sectionFilterId.compare(emptyHardwareId) == 0) {
609         return;
610     }
611     playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]);
612 }
613 
TEST_P(TunerPlaybackHidlTest,PlaybackDataFlowWithTsAudioFilterTest)614 TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsAudioFilterTest) {
615     description("Feed ts data from playback and configure Ts audio filter to get output");
616     if (!playback.support) {
617         return;
618     }
619     playbackSingleFilterTest(filterMap[playback.audioFilterId], dvrMap[playback.dvrId]);
620 }
621 
TEST_P(TunerPlaybackHidlTest,PlaybackDataFlowWithTsVideoFilterTest)622 TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsVideoFilterTest) {
623     description("Feed ts data from playback and configure Ts video filter to get output");
624     if (!playback.support) {
625         return;
626     }
627     playbackSingleFilterTest(filterMap[playback.videoFilterId], dvrMap[playback.dvrId]);
628 }
629 
TEST_P(TunerRecordHidlTest,AttachFiltersToRecordTest)630 TEST_P(TunerRecordHidlTest, AttachFiltersToRecordTest) {
631     description("Attach a single filter to the record dvr test.");
632     // TODO use paramterized tests
633     if (!record.support) {
634         return;
635     }
636     attachSingleFilterToRecordDvrTest(filterMap[record.recordFilterId],
637                                       frontendMap[record.frontendId], dvrMap[record.dvrRecordId]);
638 }
639 
TEST_P(TunerRecordHidlTest,RecordDataFlowWithTsRecordFilterTest)640 TEST_P(TunerRecordHidlTest, RecordDataFlowWithTsRecordFilterTest) {
641     description("Feed ts data from frontend to recording and test with ts record filter");
642     if (!record.support) {
643         return;
644     }
645     recordSingleFilterTest(filterMap[record.recordFilterId], frontendMap[record.frontendId],
646                            dvrMap[record.dvrRecordId]);
647 }
648 
TEST_P(TunerRecordHidlTest,LnbRecordDataFlowWithTsRecordFilterTest)649 TEST_P(TunerRecordHidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
650     description("Feed ts data from Fe with Lnb to recording and test with ts record filter");
651     if (!lnbRecord.support) {
652         return;
653     }
654     recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId],
655                                   frontendMap[lnbRecord.frontendId], dvrMap[lnbRecord.dvrRecordId],
656                                   lnbMap[lnbRecord.lnbId]);
657 }
658 
TEST_P(TunerDescramblerHidlTest,CreateDescrambler)659 TEST_P(TunerDescramblerHidlTest, CreateDescrambler) {
660     description("Create Descrambler");
661     if (!descrambling.support) {
662         return;
663     }
664     uint32_t demuxId;
665     sp<IDemux> demux;
666     ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
667 
668     if (descrambling.hasFrontendConnection) {
669         uint32_t feId;
670         mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId);
671         ASSERT_TRUE(feId != INVALID_ID);
672         ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
673         ASSERT_TRUE(mFrontendTests.setFrontendCallback());
674         ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
675     }
676 
677     ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
678     ASSERT_TRUE(mDescramblerTests.closeDescrambler());
679     ASSERT_TRUE(mDemuxTests.closeDemux());
680 
681     if (descrambling.hasFrontendConnection) {
682         ASSERT_TRUE(mFrontendTests.closeFrontend());
683     }
684 }
685 
TEST_P(TunerDescramblerHidlTest,ScrambledBroadcastDataFlowMediaFiltersTest)686 TEST_P(TunerDescramblerHidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
687     description("Test ts audio filter in scrambled broadcast use case");
688     if (!descrambling.support) {
689         return;
690     }
691     set<FilterConfig> filterConfs;
692     filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
693     filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
694     scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
695                            descramblerMap[descrambling.descramblerId]);
696 }
697 
698 INSTANTIATE_TEST_SUITE_P(
699         PerInstance, TunerFrontendHidlTest,
700         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)),
701         android::hardware::PrintInstanceNameToString);
702 
703 INSTANTIATE_TEST_SUITE_P(
704         PerInstance, TunerLnbHidlTest,
705         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)),
706         android::hardware::PrintInstanceNameToString);
707 
708 INSTANTIATE_TEST_SUITE_P(
709         PerInstance, TunerDemuxHidlTest,
710         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)),
711         android::hardware::PrintInstanceNameToString);
712 
713 INSTANTIATE_TEST_SUITE_P(
714         PerInstance, TunerFilterHidlTest,
715         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)),
716         android::hardware::PrintInstanceNameToString);
717 
718 INSTANTIATE_TEST_SUITE_P(
719         PerInstance, TunerBroadcastHidlTest,
720         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)),
721         android::hardware::PrintInstanceNameToString);
722 
723 INSTANTIATE_TEST_SUITE_P(
724         PerInstance, TunerPlaybackHidlTest,
725         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)),
726         android::hardware::PrintInstanceNameToString);
727 
728 INSTANTIATE_TEST_SUITE_P(
729         PerInstance, TunerRecordHidlTest,
730         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)),
731         android::hardware::PrintInstanceNameToString);
732 
733 INSTANTIATE_TEST_SUITE_P(
734         PerInstance, TunerDescramblerHidlTest,
735         testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)),
736         android::hardware::PrintInstanceNameToString);
737 }  // namespace
738