blob: 4d176ab86dc8e146b5e4bdf3b209b7dc92d8c24a [file] [log] [blame]
Hongguang600a6ae2021-07-08 18:51:51 -07001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "VtsHalTvTunerTargetTest.h"
18
19#include <aidl/Gtest.h>
20#include <aidl/Vintf.h>
21#include <android/binder_manager.h>
22#include <android/binder_process.h>
23
24namespace {
25
26AssertionResult TunerBroadcastAidlTest::filterDataOutputTest() {
27 return filterDataOutputTestBase(mFilterTests);
28}
29
30AssertionResult TunerPlaybackAidlTest::filterDataOutputTest() {
31 return filterDataOutputTestBase(mFilterTests);
32}
33
34AssertionResult TunerDescramblerAidlTest::filterDataOutputTest() {
35 return filterDataOutputTestBase(mFilterTests);
36}
37
38void TunerFilterAidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf,
39 FrontendConfig frontendConf) {
40 int32_t feId;
41 int32_t demuxId;
42 std::shared_ptr<IDemux> demux;
43 int64_t filterId;
44
45 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
46 ASSERT_TRUE(feId != INVALID_ID);
47 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
48 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
49 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
50 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
51 mFilterTests.setDemux(demux);
52 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
53 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
54 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
55 if (filterConf.type.mainType == DemuxFilterMainType::IP) {
56 ASSERT_TRUE(mFilterTests.configIpFilterCid(filterConf.ipCid, filterId));
57 }
58 if (filterConf.monitorEventTypes > 0) {
59 ASSERT_TRUE(mFilterTests.configureMonitorEvent(filterId, filterConf.monitorEventTypes));
60 }
61 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
62 ASSERT_TRUE(mFilterTests.startFilter(filterId));
63 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
64 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
65 ASSERT_TRUE(mDemuxTests.closeDemux());
66 ASSERT_TRUE(mFrontendTests.closeFrontend());
67}
68
69void TunerFilterAidlTest::reconfigSingleFilterInDemuxTest(FilterConfig filterConf,
70 FilterConfig filterReconf,
71 FrontendConfig frontendConf) {
72 int32_t feId;
73 int32_t demuxId;
74 std::shared_ptr<IDemux> demux;
75 int64_t filterId;
76
77 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
78 ASSERT_TRUE(feId != INVALID_ID);
79 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
80 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
81 if (frontendConf.isSoftwareFe) {
82 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
83 }
84 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
85 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
86 mFrontendTests.setDemux(demux);
87 mFilterTests.setDemux(demux);
88 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
89 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
90 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
91 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
92 ASSERT_TRUE(mFilterTests.startFilter(filterId));
93 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
94 ASSERT_TRUE(mFilterTests.configFilter(filterReconf.settings, filterId));
95 ASSERT_TRUE(mFilterTests.startFilter(filterId));
96 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
97 ASSERT_TRUE(mFilterTests.startIdTest(filterId));
98 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
99 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
100 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
101 ASSERT_TRUE(mDemuxTests.closeDemux());
102 ASSERT_TRUE(mFrontendTests.closeFrontend());
103}
104
105void TunerFilterAidlTest::testTimeFilter(TimeFilterConfig filterConf) {
106 int32_t demuxId;
107 std::shared_ptr<IDemux> demux;
108 DemuxCapabilities caps;
109
110 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
111 ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
112 ASSERT_TRUE(caps.bTimeFilter);
113 mFilterTests.setDemux(demux);
114 ASSERT_TRUE(mFilterTests.openTimeFilterInDemux());
115 ASSERT_TRUE(mFilterTests.setTimeStamp(filterConf.timeStamp));
116 ASSERT_TRUE(mFilterTests.getTimeStamp());
117 ASSERT_TRUE(mFilterTests.clearTimeStamp());
118 ASSERT_TRUE(mFilterTests.closeTimeFilter());
119 ASSERT_TRUE(mDemuxTests.closeDemux());
120}
121
122void TunerBroadcastAidlTest::broadcastSingleFilterTest(FilterConfig filterConf,
123 FrontendConfig frontendConf) {
124 int32_t feId;
125 int32_t demuxId;
126 std::shared_ptr<IDemux> demux;
127 int64_t filterId;
128
129 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
130 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
131 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
Frankie Lizcano87421812022-07-28 17:13:01 +0000132 if (mLnbId != INVALID_LNB_ID) {
133 ASSERT_TRUE(mFrontendTests.setLnb(mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700134 }
135 if (frontendConf.isSoftwareFe) {
136 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
137 }
138 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
139 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
140 mFrontendTests.setDemux(demux);
141 mFilterTests.setDemux(demux);
142 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
143 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
144 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
145 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
146 ASSERT_TRUE(mFilterTests.startFilter(filterId));
147 // tune test
148 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
149 ASSERT_TRUE(filterDataOutputTest());
150 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
151 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
152 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
153 ASSERT_TRUE(mDemuxTests.closeDemux());
154 ASSERT_TRUE(mFrontendTests.closeFrontend());
155}
156
157void TunerBroadcastAidlTest::broadcastSingleFilterTestWithLnb(FilterConfig filterConf,
158 FrontendConfig frontendConf,
159 LnbConfig lnbConf) {
160 if (lnbConf.name.compare(emptyHardwareId) == 0) {
161 vector<int32_t> ids;
162 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
163 ASSERT_TRUE(ids.size() > 0);
164 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
Frankie Lizcano87421812022-07-28 17:13:01 +0000165 mLnbId = ids[0];
Hongguang600a6ae2021-07-08 18:51:51 -0700166 } else {
Frankie Lizcano87421812022-07-28 17:13:01 +0000167 ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700168 }
169 ASSERT_TRUE(mLnbTests.setLnbCallback());
170 ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
171 ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
172 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
Frankie Lizcanod1f520e2022-07-26 20:05:46 +0000173 if (!frontendConf.isSoftwareFe) {
174 broadcastSingleFilterTest(filterConf, frontendConf);
175 }
Hongguang600a6ae2021-07-08 18:51:51 -0700176 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000177 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700178}
179
180void TunerBroadcastAidlTest::mediaFilterUsingSharedMemoryTest(FilterConfig filterConf,
181 FrontendConfig frontendConf) {
182 int32_t feId;
183 int32_t demuxId;
184 std::shared_ptr<IDemux> demux;
185 int64_t filterId;
186
187 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
188 ASSERT_TRUE(feId != INVALID_ID);
189 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
190 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
191 if (frontendConf.isSoftwareFe) {
192 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[live.dvrSoftwareFeId]);
193 }
194 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
195 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
196 mFrontendTests.setDemux(demux);
197 mFilterTests.setDemux(demux);
198 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
199 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
200 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
201 ASSERT_TRUE(mFilterTests.getSharedAvMemoryHandle(filterId));
202 ASSERT_TRUE(mFilterTests.configAvFilterStreamType(filterConf.streamType, filterId));
203 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
204 ASSERT_TRUE(mFilterTests.startFilter(filterId));
205 // tune test
206 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
207 ASSERT_TRUE(filterDataOutputTest());
208 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
209 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
210 ASSERT_TRUE(mFilterTests.releaseShareAvHandle(filterId));
211 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
212 ASSERT_TRUE(mDemuxTests.closeDemux());
213 ASSERT_TRUE(mFrontendTests.closeFrontend());
214}
215
216void TunerPlaybackAidlTest::playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf) {
217 int32_t demuxId;
218 std::shared_ptr<IDemux> demux;
219 int64_t filterId;
220
221 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
222 mFilterTests.setDemux(demux);
223 mDvrTests.setDemux(demux);
224 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
225 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrConf.settings));
226 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
227 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
228 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
229 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
230 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
231 mDvrTests.startPlaybackInputThread(dvrConf.playbackInputFile,
232 dvrConf.settings.get<DvrSettings::Tag::playback>());
233 ASSERT_TRUE(mDvrTests.startDvrPlayback());
234 ASSERT_TRUE(mFilterTests.startFilter(filterId));
235 ASSERT_TRUE(filterDataOutputTest());
236 mDvrTests.stopPlaybackThread();
237 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
238 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
239 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
240 mDvrTests.closeDvrPlayback();
241 ASSERT_TRUE(mDemuxTests.closeDemux());
242}
243
244void TunerRecordAidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf,
245 FrontendConfig frontendConf,
246 DvrConfig dvrConf, LnbConfig lnbConf) {
247 if (lnbConf.name.compare(emptyHardwareId) == 0) {
248 vector<int32_t> ids;
249 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
250 ASSERT_TRUE(ids.size() > 0);
251 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
Frankie Lizcano87421812022-07-28 17:13:01 +0000252 mLnbId = ids[0];
Hongguang600a6ae2021-07-08 18:51:51 -0700253 } else {
Frankie Lizcano87421812022-07-28 17:13:01 +0000254 ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, mLnbId));
Hongguang600a6ae2021-07-08 18:51:51 -0700255 }
256 ASSERT_TRUE(mLnbTests.setLnbCallback());
257 ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
258 ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
259 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
260 for (auto msgName : lnbRecord.diseqcMsgs) {
261 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
262 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000263 if (!frontendConf.isSoftwareFe) {
264 recordSingleFilterTest(filterConf, frontendConf, dvrConf, Dataflow_Context::LNBRECORD);
265 }
Hongguang600a6ae2021-07-08 18:51:51 -0700266 ASSERT_TRUE(mLnbTests.closeLnb());
Frankie Lizcano87421812022-07-28 17:13:01 +0000267 mLnbId = INVALID_LNB_ID;
Hongguang600a6ae2021-07-08 18:51:51 -0700268}
269
270void TunerRecordAidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf,
271 FrontendConfig frontendConf,
272 DvrConfig dvrConf) {
273 int32_t demuxId;
274 std::shared_ptr<IDemux> demux;
275 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
276 mDvrTests.setDemux(demux);
277
278 DvrConfig dvrSourceConfig;
279 if (record.hasFrontendConnection) {
280 int32_t feId;
281 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
282 ASSERT_TRUE(feId != INVALID_ID);
283 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
284 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
285 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
286 } else {
287 dvrSourceConfig = dvrMap[record.dvrSourceId];
288 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
289 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
290 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
291 }
292
293 int64_t filterId;
294 std::shared_ptr<IFilter> filter;
295 mFilterTests.setDemux(demux);
296
297 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
298 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
299 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
300
301 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
302 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
303 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
304 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
305 filter = mFilterTests.getFilterById(filterId);
306 ASSERT_TRUE(filter != nullptr);
307 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
308 ASSERT_TRUE(mDvrTests.startDvrRecord());
309 ASSERT_TRUE(mFilterTests.startFilter(filterId));
310 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
311 ASSERT_TRUE(mDvrTests.stopDvrRecord());
312 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
313 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
314 mDvrTests.closeDvrRecord();
315 ASSERT_TRUE(mDemuxTests.closeDemux());
316
317 if (record.hasFrontendConnection) {
318 ASSERT_TRUE(mFrontendTests.closeFrontend());
319 }
320}
321
322void TunerRecordAidlTest::recordSingleFilterTest(FilterConfig filterConf,
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000323 FrontendConfig frontendConf, DvrConfig dvrConf,
324 Dataflow_Context context) {
Hongguang600a6ae2021-07-08 18:51:51 -0700325 int32_t demuxId;
326 std::shared_ptr<IDemux> demux;
327 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
328 mDvrTests.setDemux(demux);
329
330 DvrConfig dvrSourceConfig;
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000331 if (context == Dataflow_Context::RECORD) {
332 if (record.hasFrontendConnection) {
333 int32_t feId;
334 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
335 ASSERT_TRUE(feId != INVALID_ID);
336 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
337 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
338 if (frontendConf.isSoftwareFe) {
339 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[record.dvrSoftwareFeId]);
340 }
341 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
342 mFrontendTests.setDvrTests(&mDvrTests);
343 } else {
344 dvrSourceConfig = dvrMap[record.dvrSourceId];
345 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
346 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
347 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
348 }
349 } else if (context == Dataflow_Context::LNBRECORD) {
350 // If function arrives here, frontend should not be software, so no need to configure a dvr
351 // source or dvr fe connection that might be used for recording without an Lnb
Hongguang600a6ae2021-07-08 18:51:51 -0700352 int32_t feId;
353 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
354 ASSERT_TRUE(feId != INVALID_ID);
355 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
356 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000357 if (mLnbId != INVALID_LNB_ID) {
358 ASSERT_TRUE(mFrontendTests.setLnb(mLnbId));
359 } else {
360 FAIL();
Hongguang600a6ae2021-07-08 18:51:51 -0700361 }
362 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
363 mFrontendTests.setDvrTests(&mDvrTests);
Hongguang600a6ae2021-07-08 18:51:51 -0700364 }
365
366 int64_t filterId;
367 std::shared_ptr<IFilter> filter;
368 mFilterTests.setDemux(demux);
369 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize));
370 ASSERT_TRUE(mDvrTests.configDvrRecord(dvrConf.settings));
371 ASSERT_TRUE(mDvrTests.getDvrRecordMQDescriptor());
372 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
373 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
374 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
375 ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId, filterConf.getMqDesc));
376 filter = mFilterTests.getFilterById(filterId);
377 ASSERT_TRUE(filter != nullptr);
378 mDvrTests.startRecordOutputThread(dvrConf.settings.get<DvrSettings::Tag::record>());
379 ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter));
380 ASSERT_TRUE(mDvrTests.startDvrRecord());
381 ASSERT_TRUE(mFilterTests.startFilter(filterId));
382
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000383 if (context == Dataflow_Context::RECORD) {
384 if (record.hasFrontendConnection) {
385 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
386 } else {
387 // Start DVR Source
388 mDvrTests.startPlaybackInputThread(
389 dvrSourceConfig.playbackInputFile,
390 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
391 ASSERT_TRUE(mDvrTests.startDvrPlayback());
392 }
393 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700394 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -0700395 }
Hongguang600a6ae2021-07-08 18:51:51 -0700396 mDvrTests.testRecordOutput();
397 mDvrTests.stopRecordThread();
398
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000399 if (context == Dataflow_Context::RECORD) {
400 if (record.hasFrontendConnection) {
401 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
402 } else {
403 mDvrTests.stopPlaybackThread();
404 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
405 }
406 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700407 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
Hongguang600a6ae2021-07-08 18:51:51 -0700408 }
409
410 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
411 ASSERT_TRUE(mDvrTests.stopDvrRecord());
412 ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter));
413 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
414 mDvrTests.closeDvrRecord();
415
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000416 if (context == Dataflow_Context::RECORD) {
417 if (record.hasFrontendConnection) {
418 ASSERT_TRUE(mFrontendTests.closeFrontend());
419 } else {
420 mDvrTests.closeDvrPlayback();
421 }
422 } else if (context == Dataflow_Context::LNBRECORD) {
Hongguang600a6ae2021-07-08 18:51:51 -0700423 ASSERT_TRUE(mFrontendTests.closeFrontend());
Hongguang600a6ae2021-07-08 18:51:51 -0700424 }
425
426 ASSERT_TRUE(mDemuxTests.closeDemux());
427}
428
429void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,
430 FrontendConfig frontendConf,
431 DescramblerConfig descConfig) {
432 int32_t demuxId;
433 std::shared_ptr<IDemux> demux;
434 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
435
436 DvrConfig dvrSourceConfig;
437 if (descrambling.hasFrontendConnection) {
438 int32_t feId;
439 mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
440 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
441 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
442 if (frontendConf.isSoftwareFe) {
443 mFrontendTests.setSoftwareFrontendDvrConfig(dvrMap[descrambling.dvrSoftwareFeId]);
444 }
445 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
446 mFrontendTests.setDemux(demux);
447 } else {
448 dvrSourceConfig = dvrMap[descrambling.dvrSourceId];
449 mDvrTests.setDemux(demux);
450 ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrSourceConfig.type, dvrSourceConfig.bufferSize));
451 ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
452 ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
453 }
454
455 set<int64_t> filterIds;
456 int64_t filterId;
457 set<struct FilterConfig>::iterator config;
458 set<int64_t>::iterator id;
459 mFilterTests.setDemux(demux);
460 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
461 ASSERT_TRUE(mFilterTests.openFilterInDemux((*config).type, (*config).bufferSize));
462 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
463 ASSERT_TRUE(mFilterTests.configFilter((*config).settings, filterId));
464 filterIds.insert(filterId);
465 }
466 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
467 vector<uint8_t> token;
468 ASSERT_TRUE(mDescramblerTests.getKeyToken(descConfig.casSystemId, descConfig.provisionStr,
469 descConfig.hidlPvtData, token));
470 mDescramblerTests.setKeyToken(token);
471 vector<DemuxPid> pids;
472 DemuxPid pid;
473 for (config = mediaFilterConfs.begin(); config != mediaFilterConfs.end(); config++) {
474 ASSERT_TRUE(mDescramblerTests.getDemuxPidFromFilterSettings((*config).type,
475 (*config).settings, pid));
476 pids.push_back(pid);
477 ASSERT_TRUE(mDescramblerTests.addPid(pid, nullptr));
478 }
479 for (id = filterIds.begin(); id != filterIds.end(); id++) {
480 ASSERT_TRUE(mFilterTests.startFilter(*id));
481 }
482
483 if (descrambling.hasFrontendConnection) {
484 // tune test
485 ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
486 } else {
487 // Start DVR Source
488 mDvrTests.startPlaybackInputThread(
489 dvrSourceConfig.playbackInputFile,
490 dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
491 ASSERT_TRUE(mDvrTests.startDvrPlayback());
492 }
493
494 ASSERT_TRUE(filterDataOutputTest());
495
496 if (descrambling.hasFrontendConnection) {
497 ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
498 } else {
499 mDvrTests.stopPlaybackThread();
500 ASSERT_TRUE(mDvrTests.stopDvrPlayback());
501 }
502
503 for (id = filterIds.begin(); id != filterIds.end(); id++) {
504 ASSERT_TRUE(mFilterTests.stopFilter(*id));
505 }
506 for (auto pid : pids) {
507 ASSERT_TRUE(mDescramblerTests.removePid(pid, nullptr));
508 }
509 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
510 for (id = filterIds.begin(); id != filterIds.end(); id++) {
511 ASSERT_TRUE(mFilterTests.closeFilter(*id));
512 }
513
514 if (descrambling.hasFrontendConnection) {
515 ASSERT_TRUE(mFrontendTests.closeFrontend());
516 } else {
517 mDvrTests.closeDvrPlayback();
518 }
519
520 ASSERT_TRUE(mDemuxTests.closeDemux());
521}
522
523TEST_P(TunerLnbAidlTest, SendDiseqcMessageToLnb) {
524 description("Open and configure an Lnb with specific settings then send a diseqc msg to it.");
525 if (!lnbLive.support) {
526 return;
527 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000528 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
529 if (lnbLive_configs.empty()) {
530 ALOGD("No frontends that support satellites.");
531 return;
Hongguang600a6ae2021-07-08 18:51:51 -0700532 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000533 for (auto& combination : lnbLive_configs) {
534 lnbLive = combination;
Frankie Lizcano1e283b32022-07-08 21:07:42 +0000535 if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) {
536 vector<int32_t> ids;
537 ASSERT_TRUE(mLnbTests.getLnbIds(ids));
538 ASSERT_TRUE(ids.size() > 0);
539 ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
540 } else {
541 int32_t id;
542 ASSERT_TRUE(mLnbTests.openLnbByName(lnbMap[lnbLive.lnbId].name, id));
543 }
544 ASSERT_TRUE(mLnbTests.setLnbCallback());
545 ASSERT_TRUE(mLnbTests.setVoltage(lnbMap[lnbLive.lnbId].voltage));
546 ASSERT_TRUE(mLnbTests.setTone(lnbMap[lnbLive.lnbId].tone));
547 ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbMap[lnbLive.lnbId].position));
548 for (auto msgName : lnbLive.diseqcMsgs) {
549 ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
550 }
551 ASSERT_TRUE(mLnbTests.closeLnb());
Hongguang600a6ae2021-07-08 18:51:51 -0700552 }
Hongguang600a6ae2021-07-08 18:51:51 -0700553}
554
555TEST_P(TunerDemuxAidlTest, openDemux) {
556 description("Open and close a Demux.");
557 if (!live.hasFrontendConnection) {
558 return;
559 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000560 auto live_configs = generateLiveConfigurations();
561 for (auto& configuration : live_configs) {
562 live = configuration;
563 int32_t feId;
564 int32_t demuxId;
565 std::shared_ptr<IDemux> demux;
566 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
567 ASSERT_TRUE(feId != INVALID_ID);
568 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
569 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
570 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
571 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
572 ASSERT_TRUE(mDemuxTests.closeDemux());
573 ASSERT_TRUE(mFrontendTests.closeFrontend());
574 }
Hongguang600a6ae2021-07-08 18:51:51 -0700575}
576
577TEST_P(TunerDemuxAidlTest, getAvSyncTime) {
578 description("Get the A/V sync time from a PCR filter.");
579 if (!live.hasFrontendConnection) {
580 return;
581 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000582 auto live_configs = generateLiveConfigurations();
583 for (auto& configuration : live_configs) {
584 live = configuration;
585 if (live.pcrFilterId.compare(emptyHardwareId) == 0) {
586 continue;
587 }
588 int32_t feId;
589 int32_t demuxId;
590 std::shared_ptr<IDemux> demux;
591 int64_t mediaFilterId;
592 int64_t pcrFilterId;
593 int32_t avSyncHwId;
594 std::shared_ptr<IFilter> mediaFilter;
Hongguang600a6ae2021-07-08 18:51:51 -0700595
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000596 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
597 ASSERT_TRUE(feId != INVALID_ID);
598 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
599 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
600 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
601 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
602 mFilterTests.setDemux(demux);
603 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type,
604 filterMap[live.videoFilterId].bufferSize));
605 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(mediaFilterId));
606 ASSERT_TRUE(
607 mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
608 mediaFilter = mFilterTests.getFilterById(mediaFilterId);
609 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type,
610 filterMap[live.pcrFilterId].bufferSize));
611 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(pcrFilterId));
612 ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.pcrFilterId].settings, pcrFilterId));
613 ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId));
614 ASSERT_TRUE(pcrFilterId == avSyncHwId);
615 ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId));
616 ASSERT_TRUE(mFilterTests.closeFilter(pcrFilterId));
617 ASSERT_TRUE(mFilterTests.closeFilter(mediaFilterId));
618 ASSERT_TRUE(mDemuxTests.closeDemux());
619 ASSERT_TRUE(mFrontendTests.closeFrontend());
620 }
Hongguang600a6ae2021-07-08 18:51:51 -0700621}
622
623TEST_P(TunerFilterAidlTest, StartFilterInDemux) {
624 description("Open and start a filter in Demux.");
625 if (!live.hasFrontendConnection) {
626 return;
627 }
628 // TODO use parameterized tests
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000629 auto live_configs = generateLiveConfigurations();
630 for (auto& configuration : live_configs) {
631 live = configuration;
632 configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
633 }
Hongguang600a6ae2021-07-08 18:51:51 -0700634}
635
636TEST_P(TunerFilterAidlTest, ConfigIpFilterInDemuxWithCid) {
637 description("Open and configure an ip filter in Demux.");
638 // TODO use parameterized tests
639 if (!live.hasFrontendConnection) {
640 return;
641 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000642 auto live_configs = generateLiveConfigurations();
643 for (auto& configuration : live_configs) {
644 live = configuration;
645 if (live.ipFilterId.compare(emptyHardwareId) == 0) {
646 continue;
647 }
648 configSingleFilterInDemuxTest(filterMap[live.ipFilterId], frontendMap[live.frontendId]);
Hongguang600a6ae2021-07-08 18:51:51 -0700649 }
Hongguang600a6ae2021-07-08 18:51:51 -0700650}
651
652TEST_P(TunerFilterAidlTest, ReconfigFilterToReceiveStartId) {
653 description("Recofigure and restart a filter to test start id.");
654 if (!live.hasFrontendConnection) {
655 return;
656 }
657 // TODO use parameterized tests
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000658 auto live_configs = generateLiveConfigurations();
659 for (auto& configuration : live_configs) {
660 live = configuration;
661 reconfigSingleFilterInDemuxTest(filterMap[live.videoFilterId],
662 filterMap[live.videoFilterId],
663 frontendMap[live.frontendId]);
664 }
Hongguang600a6ae2021-07-08 18:51:51 -0700665}
666
667TEST_P(TunerFilterAidlTest, SetFilterLinkage) {
668 description("Pick up all the possible linkages from the demux caps and set them up.");
669 DemuxCapabilities caps;
670 int32_t demuxId;
671 std::shared_ptr<IDemux> demux;
672 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
673 ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
674 mFilterTests.setDemux(demux);
675 for (int i = 0; i < caps.linkCaps.size(); i++) {
676 uint32_t bitMask = 1;
677 for (int j = 0; j < FILTER_MAIN_TYPE_BIT_COUNT; j++) {
678 if (caps.linkCaps[i] & (bitMask << j)) {
679 int64_t sourceFilterId;
680 int64_t sinkFilterId;
681 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(i), FMQ_SIZE_16M));
682 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sourceFilterId));
683 ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(j), FMQ_SIZE_16M));
684 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(sinkFilterId));
685 ASSERT_TRUE(mFilterTests.setFilterDataSource(sourceFilterId, sinkFilterId));
686 ASSERT_TRUE(mFilterTests.setFilterDataSourceToDemux(sinkFilterId));
687 ASSERT_TRUE(mFilterTests.closeFilter(sinkFilterId));
688 ASSERT_TRUE(mFilterTests.closeFilter(sourceFilterId));
689 }
690 }
691 }
692 ASSERT_TRUE(mDemuxTests.closeDemux());
693}
694
695TEST_P(TunerFilterAidlTest, testTimeFilter) {
696 description("Open a timer filter in Demux and set time stamp.");
697 if (!timeFilter.support) {
698 return;
699 }
700 // TODO use parameterized tests
Frankie Lizcano0c069532022-07-14 20:20:46 +0000701 auto timeFilter_configs = generateTimeFilterConfigurations();
702 for (auto& configuration : timeFilter_configs) {
703 timeFilter = configuration;
704 testTimeFilter(timeFilterMap[timeFilter.timeFilterId]);
705 }
Hongguang600a6ae2021-07-08 18:51:51 -0700706}
707
Gareth Fenn9a808452022-03-31 08:40:00 +0100708static bool isEventProducingFilter(const FilterConfig& filterConfig) {
709 switch (filterConfig.type.mainType) {
710 case DemuxFilterMainType::TS: {
711 auto tsFilterType =
712 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
713 return (tsFilterType == DemuxTsFilterType::SECTION ||
714 tsFilterType == DemuxTsFilterType::PES ||
715 tsFilterType == DemuxTsFilterType::AUDIO ||
716 tsFilterType == DemuxTsFilterType::VIDEO ||
717 tsFilterType == DemuxTsFilterType::RECORD ||
718 tsFilterType == DemuxTsFilterType::TEMI);
719 }
720 case DemuxFilterMainType::MMTP: {
721 auto mmtpFilterType =
722 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
723 return (mmtpFilterType == DemuxMmtpFilterType::SECTION ||
724 mmtpFilterType == DemuxMmtpFilterType::PES ||
725 mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
726 mmtpFilterType == DemuxMmtpFilterType::VIDEO ||
727 mmtpFilterType == DemuxMmtpFilterType::RECORD ||
728 mmtpFilterType == DemuxMmtpFilterType::DOWNLOAD);
729 }
730 case DemuxFilterMainType::IP: {
731 auto ipFilterType =
732 filterConfig.type.subType.get<DemuxFilterSubType::Tag::ipFilterType>();
733 return (ipFilterType == DemuxIpFilterType::SECTION);
734 }
735 case DemuxFilterMainType::TLV: {
736 auto tlvFilterType =
737 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tlvFilterType>();
738 return (tlvFilterType == DemuxTlvFilterType::SECTION);
739 }
740 case DemuxFilterMainType::ALP: {
741 auto alpFilterType =
742 filterConfig.type.subType.get<DemuxFilterSubType::Tag::alpFilterType>();
743 return (alpFilterType == DemuxAlpFilterType::SECTION);
744 }
745 default:
746 return false;
747 }
748}
749
Patrick Rohr1586d212021-11-23 00:40:56 +0100750static bool isMediaFilter(const FilterConfig& filterConfig) {
751 switch (filterConfig.type.mainType) {
752 case DemuxFilterMainType::TS: {
753 // TS Audio and Video filters are media filters
754 auto tsFilterType =
755 filterConfig.type.subType.get<DemuxFilterSubType::Tag::tsFilterType>();
756 return (tsFilterType == DemuxTsFilterType::AUDIO ||
757 tsFilterType == DemuxTsFilterType::VIDEO);
758 }
759 case DemuxFilterMainType::MMTP: {
760 // MMTP Audio and Video filters are media filters
761 auto mmtpFilterType =
762 filterConfig.type.subType.get<DemuxFilterSubType::Tag::mmtpFilterType>();
763 return (mmtpFilterType == DemuxMmtpFilterType::AUDIO ||
764 mmtpFilterType == DemuxMmtpFilterType::VIDEO);
765 }
766 default:
767 return false;
768 }
769}
Patrick Rohr149b0872021-11-20 00:39:37 +0100770
Patrick Rohr1586d212021-11-23 00:40:56 +0100771static int getDemuxFilterEventDataLength(const DemuxFilterEvent& event) {
772 switch (event.getTag()) {
773 case DemuxFilterEvent::Tag::section:
774 return event.get<DemuxFilterEvent::Tag::section>().dataLength;
775 case DemuxFilterEvent::Tag::media:
776 return event.get<DemuxFilterEvent::Tag::media>().dataLength;
777 case DemuxFilterEvent::Tag::pes:
778 return event.get<DemuxFilterEvent::Tag::pes>().dataLength;
779 case DemuxFilterEvent::Tag::download:
780 return event.get<DemuxFilterEvent::Tag::download>().dataLength;
781 case DemuxFilterEvent::Tag::ipPayload:
782 return event.get<DemuxFilterEvent::Tag::ipPayload>().dataLength;
783
784 case DemuxFilterEvent::Tag::tsRecord:
785 case DemuxFilterEvent::Tag::mmtpRecord:
786 case DemuxFilterEvent::Tag::temi:
787 case DemuxFilterEvent::Tag::monitorEvent:
788 case DemuxFilterEvent::Tag::startId:
789 return 0;
790 }
791}
792
793// TODO: move boilerplate into text fixture
794void TunerFilterAidlTest::testDelayHint(const FilterConfig& filterConf) {
Gareth Fenn9a808452022-03-31 08:40:00 +0100795 if (!filterConf.timeDelayInMs && !filterConf.dataDelayInBytes) {
796 return;
797 }
798 if (!isEventProducingFilter(filterConf)) {
799 return;
800 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100801 int32_t feId;
802 int32_t demuxId;
803 std::shared_ptr<IDemux> demux;
804 int64_t filterId;
805
806 mFrontendTests.getFrontendIdByType(frontendMap[live.frontendId].type, feId);
807 ASSERT_TRUE(feId != INVALID_ID);
808 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
809 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
810 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
811 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
812 mFilterTests.setDemux(demux);
813
Patrick Rohr149b0872021-11-20 00:39:37 +0100814 ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize));
815 ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId));
Patrick Rohr149b0872021-11-20 00:39:37 +0100816
Patrick Rohr1586d212021-11-23 00:40:56 +0100817 bool mediaFilter = isMediaFilter(filterConf);
Patrick Rohr149b0872021-11-20 00:39:37 +0100818 auto filter = mFilterTests.getFilterById(filterId);
819
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100820 // startTime needs to be set before calling setDelayHint.
821 auto startTime = std::chrono::steady_clock::now();
822
Gareth Fenn9a808452022-03-31 08:40:00 +0100823 int timeDelayInMs = filterConf.timeDelayInMs;
824 if (timeDelayInMs > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100825 FilterDelayHint delayHint;
826 delayHint.hintType = FilterDelayHintType::TIME_DELAY_IN_MS;
Gareth Fenn9a808452022-03-31 08:40:00 +0100827 delayHint.hintValue = timeDelayInMs;
Patrick Rohr149b0872021-11-20 00:39:37 +0100828
Patrick Rohr1586d212021-11-23 00:40:56 +0100829 // setDelayHint should fail for media filters.
830 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
831 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100832
Patrick Rohr1586d212021-11-23 00:40:56 +0100833 int dataDelayInBytes = filterConf.dataDelayInBytes;
834 if (dataDelayInBytes > 0) {
835 FilterDelayHint delayHint;
836 delayHint.hintType = FilterDelayHintType::DATA_SIZE_DELAY_IN_BYTES;
837 delayHint.hintValue = dataDelayInBytes;
Patrick Rohr149b0872021-11-20 00:39:37 +0100838
Patrick Rohr1586d212021-11-23 00:40:56 +0100839 // setDelayHint should fail for media filters.
840 ASSERT_EQ(filter->setDelayHint(delayHint).isOk(), !mediaFilter);
841 }
Patrick Rohr149b0872021-11-20 00:39:37 +0100842
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100843 // start and stop filter (and wait for first callback) in order to
844 // circumvent callback scheduler race conditions after adjusting filter
845 // delays.
846 auto cb = mFilterTests.getFilterCallbacks().at(filterId);
847 auto future =
848 cb->verifyFilterCallback([](const std::vector<DemuxFilterEvent>&) { return true; });
Gareth Fenn9a808452022-03-31 08:40:00 +0100849
850 // The configure stage can also produce events, so we should set the delay
851 // hint beforehand.
852 ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId));
Patrick Rohr1586d212021-11-23 00:40:56 +0100853 mFilterTests.startFilter(filterId);
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100854
855 auto timeout = std::chrono::seconds(30);
856 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
857
Patrick Rohr1586d212021-11-23 00:40:56 +0100858 mFilterTests.stopFilter(filterId);
Patrick Rohr149b0872021-11-20 00:39:37 +0100859
Patrick Rohr1586d212021-11-23 00:40:56 +0100860 if (!mediaFilter) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100861 int callbackSize = 0;
Patrick Rohr2b0e9ee2021-12-27 13:55:16 +0100862 future = cb->verifyFilterCallback(
Patrick Rohr1586d212021-11-23 00:40:56 +0100863 [&callbackSize](const std::vector<DemuxFilterEvent>& events) {
864 for (const auto& event : events) {
865 callbackSize += getDemuxFilterEventDataLength(event);
866 }
867 return true;
868 });
869
Patrick Rohr1586d212021-11-23 00:40:56 +0100870 ASSERT_TRUE(mFilterTests.startFilter(filterId));
871
872 // block and wait for callback to be received.
Patrick Rohr1586d212021-11-23 00:40:56 +0100873 ASSERT_EQ(future.wait_for(timeout), std::future_status::ready);
Patrick Rohr1586d212021-11-23 00:40:56 +0100874
Gareth Fenn9a808452022-03-31 08:40:00 +0100875 auto duration = std::chrono::steady_clock::now() - startTime;
876 bool delayHintTest = duration >= std::chrono::milliseconds(timeDelayInMs);
Patrick Rohr1586d212021-11-23 00:40:56 +0100877 bool dataSizeTest = callbackSize >= dataDelayInBytes;
878
Gareth Fenn9a808452022-03-31 08:40:00 +0100879 if (timeDelayInMs > 0 && dataDelayInBytes > 0) {
Patrick Rohr1586d212021-11-23 00:40:56 +0100880 ASSERT_TRUE(delayHintTest || dataSizeTest);
881 } else {
882 // if only one of time delay / data delay is configured, one of them
883 // holds true by default, so we want both assertions to be true.
884 ASSERT_TRUE(delayHintTest && dataSizeTest);
885 }
886
887 ASSERT_TRUE(mFilterTests.stopFilter(filterId));
888 }
889
Patrick Rohr149b0872021-11-20 00:39:37 +0100890 ASSERT_TRUE(mFilterTests.closeFilter(filterId));
891 ASSERT_TRUE(mDemuxTests.closeDemux());
892 ASSERT_TRUE(mFrontendTests.closeFrontend());
893}
894
Patrick Rohr1586d212021-11-23 00:40:56 +0100895TEST_P(TunerFilterAidlTest, FilterDelayHintTest) {
896 description("Test filter time delay hint.");
Gareth Fenn9a808452022-03-31 08:40:00 +0100897 if (!live.hasFrontendConnection) {
898 return;
899 }
Patrick Rohr1586d212021-11-23 00:40:56 +0100900 for (const auto& obj : filterMap) {
901 testDelayHint(obj.second);
902 }
903}
904
Hongguang600a6ae2021-07-08 18:51:51 -0700905TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
906 description("Feed ts data from playback and configure Ts section filter to get output");
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000907 if (!playback.support) {
Hongguang600a6ae2021-07-08 18:51:51 -0700908 return;
909 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000910 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
911 for (auto& configuration : playback_configs) {
912 if (configuration.sectionFilterId.compare(emptyHardwareId) != 0) {
913 playback = configuration;
914 playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]);
915 }
916 }
Hongguang600a6ae2021-07-08 18:51:51 -0700917}
918
919TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsAudioFilterTest) {
920 description("Feed ts data from playback and configure Ts audio filter to get output");
921 if (!playback.support) {
922 return;
923 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000924 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
925 for (auto& configuration : playback_configs) {
926 playback = configuration;
927 playbackSingleFilterTest(filterMap[playback.audioFilterId], dvrMap[playback.dvrId]);
928 }
Hongguang600a6ae2021-07-08 18:51:51 -0700929}
930
931TEST_P(TunerPlaybackAidlTest, PlaybackDataFlowWithTsVideoFilterTest) {
932 description("Feed ts data from playback and configure Ts video filter to get output");
933 if (!playback.support) {
934 return;
935 }
Frankie Lizcanoa53f5542022-07-07 17:32:06 +0000936 vector<DvrPlaybackHardwareConnections> playback_configs = generatePlaybackConfigs();
937 for (auto& configuration : playback_configs) {
938 playback = configuration;
939 playbackSingleFilterTest(filterMap[playback.videoFilterId], dvrMap[playback.dvrId]);
940 }
Hongguang600a6ae2021-07-08 18:51:51 -0700941}
942
943TEST_P(TunerRecordAidlTest, RecordDataFlowWithTsRecordFilterTest) {
944 description("Feed ts data from frontend to recording and test with ts record filter");
945 if (!record.support) {
946 return;
947 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000948 auto record_configs = generateRecordConfigurations();
949 for (auto& configuration : record_configs) {
950 record = configuration;
951 recordSingleFilterTest(filterMap[record.recordFilterId], frontendMap[record.frontendId],
952 dvrMap[record.dvrRecordId], Dataflow_Context::RECORD);
953 }
Hongguang600a6ae2021-07-08 18:51:51 -0700954}
955
956TEST_P(TunerRecordAidlTest, AttachFiltersToRecordTest) {
957 description("Attach a single filter to the record dvr test.");
958 // TODO use parameterized tests
959 if (!record.support) {
960 return;
961 }
Frankie Lizcano9c464f72022-07-18 17:56:52 +0000962 auto record_configs = generateRecordConfigurations();
963 for (auto& configuration : record_configs) {
964 record = configuration;
965 attachSingleFilterToRecordDvrTest(filterMap[record.recordFilterId],
966 frontendMap[record.frontendId],
967 dvrMap[record.dvrRecordId]);
968 }
Hongguang600a6ae2021-07-08 18:51:51 -0700969}
970
971TEST_P(TunerRecordAidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
972 description("Feed ts data from Fe with Lnb to recording and test with ts record filter");
973 if (!lnbRecord.support) {
974 return;
975 }
Frankie Lizcanoecba02a2022-07-12 17:56:54 +0000976 vector<LnbRecordHardwareConnections> lnbRecord_configs = generateLnbRecordConfigurations();
977 if (lnbRecord_configs.empty()) {
978 ALOGD("No frontends that support satellites.");
979 return;
980 }
981 for (auto& configuration : lnbRecord_configs) {
982 lnbRecord = configuration;
983 recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId],
984 frontendMap[lnbRecord.frontendId],
985 dvrMap[lnbRecord.dvrRecordId], lnbMap[lnbRecord.lnbId]);
986 }
Hongguang600a6ae2021-07-08 18:51:51 -0700987}
988
989TEST_P(TunerFrontendAidlTest, TuneFrontend) {
990 description("Tune one Frontend with specific setting and check Lock event");
991 if (!live.hasFrontendConnection) {
992 return;
993 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +0000994 auto live_configs = generateLiveConfigurations();
995 for (auto& configuration : live_configs) {
996 live = configuration;
997 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
998 }
Hongguang600a6ae2021-07-08 18:51:51 -0700999}
1000
1001TEST_P(TunerFrontendAidlTest, AutoScanFrontend) {
1002 description("Run an auto frontend scan with specific setting and check lock scanMessage");
1003 if (!scan.hasFrontendConnection) {
1004 return;
1005 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001006 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
1007 for (auto& configuration : scan_configs) {
1008 scan = configuration;
1009 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_AUTO);
1010 }
Hongguang600a6ae2021-07-08 18:51:51 -07001011}
1012
1013TEST_P(TunerFrontendAidlTest, BlindScanFrontend) {
1014 description("Run an blind frontend scan with specific setting and check lock scanMessage");
1015 if (!scan.hasFrontendConnection) {
1016 return;
1017 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001018 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
1019 for (auto& configuration : scan_configs) {
1020 scan = configuration;
1021 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
1022 }
Hongguang600a6ae2021-07-08 18:51:51 -07001023}
1024
1025TEST_P(TunerFrontendAidlTest, TuneFrontendWithFrontendSettings) {
1026 description("Tune one Frontend with setting and check Lock event");
1027 if (!live.hasFrontendConnection) {
1028 return;
1029 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001030 auto live_configs = generateLiveConfigurations();
1031 for (auto& configuration : live_configs) {
1032 live = configuration;
1033 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
1034 }
Hongguang600a6ae2021-07-08 18:51:51 -07001035}
1036
1037TEST_P(TunerFrontendAidlTest, BlindScanFrontendWithEndFrequency) {
1038 description("Run an blind frontend scan with setting and check lock scanMessage");
1039 if (!scan.hasFrontendConnection) {
1040 return;
1041 }
Frankie Lizcano3138d6b2022-07-11 22:06:45 +00001042 vector<ScanHardwareConnections> scan_configs = generateScanConfigurations();
1043 for (auto& configuration : scan_configs) {
1044 scan = configuration;
1045 mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
1046 }
Hongguang600a6ae2021-07-08 18:51:51 -07001047}
1048
1049TEST_P(TunerFrontendAidlTest, LinkToCiCam) {
1050 description("Test Frontend link to CiCam");
1051 if (!live.hasFrontendConnection) {
1052 return;
1053 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001054 auto live_configs = generateLiveConfigurations();
1055 for (auto& configuration : live_configs) {
1056 live = configuration;
1057 if (!frontendMap[live.frontendId].canConnectToCiCam) {
1058 continue;
1059 }
1060 mFrontendTests.tuneTest(frontendMap[live.frontendId]);
Hongguang600a6ae2021-07-08 18:51:51 -07001061 }
Hongguang600a6ae2021-07-08 18:51:51 -07001062}
1063
Hongguangfcedda02021-12-13 17:08:02 -08001064TEST_P(TunerFrontendAidlTest, getHardwareInfo) {
1065 description("Test Frontend get hardware info");
1066 if (!live.hasFrontendConnection) {
1067 return;
1068 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001069 auto live_configs = generateLiveConfigurations();
1070 for (auto& configuration : live_configs) {
1071 live = configuration;
1072 mFrontendTests.debugInfoTest(frontendMap[live.frontendId]);
1073 }
Hongguangfcedda02021-12-13 17:08:02 -08001074}
1075
Hongguang5766ddf2021-12-23 11:40:37 -08001076TEST_P(TunerFrontendAidlTest, maxNumberOfFrontends) {
1077 description("Test Max Frontend number");
1078 if (!live.hasFrontendConnection) {
1079 return;
1080 }
1081 mFrontendTests.maxNumberOfFrontendsTest();
1082}
1083
Hongguang881190f2022-01-14 13:23:37 -08001084TEST_P(TunerFrontendAidlTest, statusReadinessTest) {
1085 description("Test Max Frontend status readiness");
1086 if (!live.hasFrontendConnection) {
1087 return;
1088 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001089 auto live_configs = generateLiveConfigurations();
1090 for (auto& configuration : live_configs) {
1091 live = configuration;
1092 mFrontendTests.statusReadinessTest(frontendMap[live.frontendId]);
1093 }
Hongguang881190f2022-01-14 13:23:37 -08001094}
1095
Hongguang600a6ae2021-07-08 18:51:51 -07001096TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowVideoFilterTest) {
1097 description("Test Video Filter functionality in Broadcast use case.");
1098 if (!live.hasFrontendConnection) {
1099 return;
1100 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001101 auto live_configs = generateLiveConfigurations();
1102 for (auto& configuration : live_configs) {
1103 live = configuration;
1104 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1105 }
Hongguang600a6ae2021-07-08 18:51:51 -07001106}
1107
1108TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowAudioFilterTest) {
1109 description("Test Audio Filter functionality in Broadcast use case.");
1110 if (!live.hasFrontendConnection) {
1111 return;
1112 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001113 auto live_configs = generateLiveConfigurations();
1114 for (auto& configuration : live_configs) {
1115 live = configuration;
1116 broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]);
1117 }
Hongguang600a6ae2021-07-08 18:51:51 -07001118}
1119
1120TEST_P(TunerBroadcastAidlTest, BroadcastDataFlowSectionFilterTest) {
1121 description("Test Section Filter functionality in Broadcast use case.");
1122 if (!live.hasFrontendConnection) {
1123 return;
1124 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001125 auto live_configs = generateLiveConfigurations();
1126 for (auto& configuration : live_configs) {
1127 live = configuration;
1128 if (live.sectionFilterId.compare(emptyHardwareId) == 0) {
1129 continue;
1130 }
1131 broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]);
Hongguang600a6ae2021-07-08 18:51:51 -07001132 }
Hongguang600a6ae2021-07-08 18:51:51 -07001133}
1134
1135TEST_P(TunerBroadcastAidlTest, IonBufferTest) {
1136 description("Test the av filter data bufferring.");
1137 if (!live.hasFrontendConnection) {
1138 return;
1139 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001140 auto live_configs = generateLiveConfigurations();
1141 for (auto& configuration : live_configs) {
1142 live = configuration;
1143 broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
1144 }
Hongguang600a6ae2021-07-08 18:51:51 -07001145}
1146
1147TEST_P(TunerBroadcastAidlTest, LnbBroadcastDataFlowVideoFilterTest) {
1148 description("Test Video Filter functionality in Broadcast with Lnb use case.");
1149 if (!lnbLive.support) {
1150 return;
1151 }
Frankie Lizcano1e283b32022-07-08 21:07:42 +00001152 vector<LnbLiveHardwareConnections> lnbLive_configs = generateLnbLiveConfigurations();
1153 if (lnbLive_configs.empty()) {
1154 ALOGD("No frontends that support satellites.");
1155 return;
1156 }
1157 for (auto& combination : lnbLive_configs) {
1158 lnbLive = combination;
1159 broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId],
1160 frontendMap[lnbLive.frontendId], lnbMap[lnbLive.lnbId]);
1161 }
Hongguang600a6ae2021-07-08 18:51:51 -07001162}
1163
1164TEST_P(TunerBroadcastAidlTest, MediaFilterWithSharedMemoryHandle) {
1165 description("Test the Media Filter with shared memory handle");
1166 if (!live.hasFrontendConnection) {
1167 return;
1168 }
Frankie Lizcano8b87f252022-07-19 21:51:54 +00001169 auto live_configs = generateLiveConfigurations();
1170 for (auto& configuration : live_configs) {
1171 live = configuration;
1172 mediaFilterUsingSharedMemoryTest(filterMap[live.videoFilterId],
1173 frontendMap[live.frontendId]);
1174 }
Hongguang600a6ae2021-07-08 18:51:51 -07001175}
1176
1177TEST_P(TunerDescramblerAidlTest, CreateDescrambler) {
1178 description("Create Descrambler");
1179 if (!descrambling.support) {
1180 return;
1181 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001182 vector<DescramblingHardwareConnections> descrambling_configs =
1183 generateDescramblingConfigurations();
1184 if (descrambling_configs.empty()) {
1185 ALOGD("No valid descrambling combinations in the configuration file.");
1186 return;
Hongguang600a6ae2021-07-08 18:51:51 -07001187 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001188 for (auto& combination : descrambling_configs) {
1189 descrambling = combination;
1190 int32_t demuxId;
1191 std::shared_ptr<IDemux> demux;
1192 ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
Hongguang600a6ae2021-07-08 18:51:51 -07001193
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001194 if (descrambling.hasFrontendConnection) {
1195 int32_t feId;
1196 mFrontendTests.getFrontendIdByType(frontendMap[descrambling.frontendId].type, feId);
1197 ASSERT_TRUE(feId != INVALID_ID);
1198 ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
1199 ASSERT_TRUE(mFrontendTests.setFrontendCallback());
1200 ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
1201 }
Hongguang600a6ae2021-07-08 18:51:51 -07001202
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001203 ASSERT_TRUE(mDescramblerTests.openDescrambler(demuxId));
1204 ASSERT_TRUE(mDescramblerTests.closeDescrambler());
1205 ASSERT_TRUE(mDemuxTests.closeDemux());
1206
1207 if (descrambling.hasFrontendConnection) {
1208 ASSERT_TRUE(mFrontendTests.closeFrontend());
1209 }
Hongguang600a6ae2021-07-08 18:51:51 -07001210 }
1211}
1212
1213TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
1214 description("Test ts audio filter in scrambled broadcast use case");
1215 if (!descrambling.support) {
1216 return;
1217 }
Frankie Lizcanof4e07962022-07-13 20:54:34 +00001218 vector<DescramblingHardwareConnections> descrambling_configs =
1219 generateDescramblingConfigurations();
1220 if (descrambling_configs.empty()) {
1221 ALOGD("No valid descrambling combinations in the configuration file.");
1222 return;
1223 }
1224 for (auto& combination : descrambling_configs) {
1225 descrambling = combination;
1226 set<FilterConfig> filterConfs;
1227 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
1228 filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
1229 scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
1230 descramblerMap[descrambling.descramblerId]);
1231 }
Hongguang600a6ae2021-07-08 18:51:51 -07001232}
1233
1234INSTANTIATE_TEST_SUITE_P(PerInstance, TunerBroadcastAidlTest,
1235 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1236 android::PrintInstanceNameToString);
1237
1238INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFrontendAidlTest,
1239 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1240 android::PrintInstanceNameToString);
1241
1242INSTANTIATE_TEST_SUITE_P(PerInstance, TunerFilterAidlTest,
1243 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1244 android::PrintInstanceNameToString);
1245
1246INSTANTIATE_TEST_SUITE_P(PerInstance, TunerRecordAidlTest,
1247 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1248 android::PrintInstanceNameToString);
1249
1250INSTANTIATE_TEST_SUITE_P(PerInstance, TunerLnbAidlTest,
1251 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1252 android::PrintInstanceNameToString);
1253
1254INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDemuxAidlTest,
1255 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1256 android::PrintInstanceNameToString);
1257
1258INSTANTIATE_TEST_SUITE_P(PerInstance, TunerPlaybackAidlTest,
1259 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1260 android::PrintInstanceNameToString);
1261
1262INSTANTIATE_TEST_SUITE_P(PerInstance, TunerDescramblerAidlTest,
1263 testing::ValuesIn(android::getAidlHalInstanceNames(ITuner::descriptor)),
1264 android::PrintInstanceNameToString);
1265
1266} // namespace
1267
1268// Start thread pool to receive callbacks from AIDL service.
1269int main(int argc, char** argv) {
1270 ::testing::InitGoogleTest(&argc, argv);
1271 ABinderProcess_setThreadPoolMaxThreadCount(1);
1272 ABinderProcess_startThreadPool();
1273 return RUN_ALL_TESTS();
1274}