summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp')
-rw-r--r--audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp122
1 files changed, 96 insertions, 26 deletions
diff --git a/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp b/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp
index 9484ddd4..de0df400 100644
--- a/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp
+++ b/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp
@@ -55,6 +55,7 @@ using std::vector;
55using ::android::sp; 55using ::android::sp;
56using ::android::hardware::Return; 56using ::android::hardware::Return;
57using ::android::hardware::hidl_bitfield; 57using ::android::hardware::hidl_bitfield;
58using ::android::hardware::hidl_enum_iterator;
58using ::android::hardware::hidl_handle; 59using ::android::hardware::hidl_handle;
59using ::android::hardware::hidl_string; 60using ::android::hardware::hidl_string;
60using ::android::hardware::hidl_vec; 61using ::android::hardware::hidl_vec;
@@ -81,6 +82,7 @@ using ::android::hardware::audio::V4_0::SourceMetadata;
81using ::android::hardware::audio::V4_0::SinkMetadata; 82using ::android::hardware::audio::V4_0::SinkMetadata;
82using ::android::hardware::audio::common::V4_0::AudioChannelMask; 83using ::android::hardware::audio::common::V4_0::AudioChannelMask;
83using ::android::hardware::audio::common::V4_0::AudioConfig; 84using ::android::hardware::audio::common::V4_0::AudioConfig;
85using ::android::hardware::audio::common::V4_0::AudioContentType;
84using ::android::hardware::audio::common::V4_0::AudioDevice; 86using ::android::hardware::audio::common::V4_0::AudioDevice;
85using ::android::hardware::audio::common::V4_0::AudioFormat; 87using ::android::hardware::audio::common::V4_0::AudioFormat;
86using ::android::hardware::audio::common::V4_0::AudioHandleConsts; 88using ::android::hardware::audio::common::V4_0::AudioHandleConsts;
@@ -91,6 +93,7 @@ using ::android::hardware::audio::common::V4_0::AudioMode;
91using ::android::hardware::audio::common::V4_0::AudioOffloadInfo; 93using ::android::hardware::audio::common::V4_0::AudioOffloadInfo;
92using ::android::hardware::audio::common::V4_0::AudioOutputFlag; 94using ::android::hardware::audio::common::V4_0::AudioOutputFlag;
93using ::android::hardware::audio::common::V4_0::AudioSource; 95using ::android::hardware::audio::common::V4_0::AudioSource;
96using ::android::hardware::audio::common::V4_0::AudioUsage;
94using ::android::hardware::audio::common::V4_0::ThreadInfo; 97using ::android::hardware::audio::common::V4_0::ThreadInfo;
95using ::android::hardware::audio::common::utils::mkBitfield; 98using ::android::hardware::audio::common::utils::mkBitfield;
96 99
@@ -140,11 +143,11 @@ class AudioHidlTest : public HidlTest {
140sp<IDevicesFactory> AudioHidlTest::devicesFactory; 143sp<IDevicesFactory> AudioHidlTest::devicesFactory;
141 144
142TEST_F(AudioHidlTest, GetAudioDevicesFactoryService) { 145TEST_F(AudioHidlTest, GetAudioDevicesFactoryService) {
143 doc::test("test the getService (called in SetUp)"); 146 doc::test("Test the getService (called in SetUp)");
144} 147}
145 148
146TEST_F(AudioHidlTest, OpenDeviceInvalidParameter) { 149TEST_F(AudioHidlTest, OpenDeviceInvalidParameter) {
147 doc::test("test passing an invalid parameter to openDevice"); 150 doc::test("Test passing an invalid parameter to openDevice");
148 Result result; 151 Result result;
149 sp<IDevice> device; 152 sp<IDevice> device;
150 ASSERT_OK(devicesFactory->openDevice("Non existing device", returnIn(result, device))); 153 ASSERT_OK(devicesFactory->openDevice("Non existing device", returnIn(result, device)));
@@ -152,6 +155,19 @@ TEST_F(AudioHidlTest, OpenDeviceInvalidParameter) {
152 ASSERT_TRUE(device == nullptr); 155 ASSERT_TRUE(device == nullptr);
153} 156}
154 157
158TEST_F(AudioHidlTest, OpenPrimaryDeviceUsingGetDevice) {
159 doc::test("Calling openDevice(\"primary\") should return the primary device.");
160 Result result;
161 sp<IDevice> baseDevice;
162 ASSERT_OK(devicesFactory->openDevice("primary", returnIn(result, baseDevice)));
163 ASSERT_OK(result);
164 ASSERT_TRUE(baseDevice != nullptr);
165
166 Return<sp<IPrimaryDevice>> primaryDevice = IPrimaryDevice::castFrom(baseDevice);
167 ASSERT_TRUE(primaryDevice.isOk());
168 ASSERT_TRUE(sp<IPrimaryDevice>(primaryDevice) != nullptr);
169}
170
155////////////////////////////////////////////////////////////////////////////// 171//////////////////////////////////////////////////////////////////////////////
156/////////////////////////////// openDevice primary /////////////////////////// 172/////////////////////////////// openDevice primary ///////////////////////////
157////////////////////////////////////////////////////////////////////////////// 173//////////////////////////////////////////////////////////////////////////////
@@ -165,14 +181,11 @@ class AudioPrimaryHidlTest : public AudioHidlTest {
165 181
166 if (device == nullptr) { 182 if (device == nullptr) {
167 Result result; 183 Result result;
168 sp<IDevice> baseDevice; 184 ASSERT_OK(devicesFactory->openPrimaryDevice(returnIn(result, device)));
169 ASSERT_OK(devicesFactory->openDevice("primary", returnIn(result, baseDevice)));
170 ASSERT_OK(result); 185 ASSERT_OK(result);
171 ASSERT_TRUE(baseDevice != nullptr); 186 ASSERT_TRUE(device != nullptr);
172 187
173 environment->registerTearDown([] { device.clear(); }); 188 environment->registerTearDown([] { device.clear(); });
174 device = IPrimaryDevice::castFrom(baseDevice);
175 ASSERT_TRUE(device != nullptr);
176 } 189 }
177 } 190 }
178 191
@@ -600,13 +613,17 @@ class OutputStreamTest : public OpenStreamTest<IStreamOut> {
600 const AudioConfig& config = GetParam(); 613 const AudioConfig& config = GetParam();
601 // TODO: test all flag combination 614 // TODO: test all flag combination
602 auto flags = hidl_bitfield<AudioOutputFlag>(AudioOutputFlag::NONE); 615 auto flags = hidl_bitfield<AudioOutputFlag>(AudioOutputFlag::NONE);
603 SourceMetadata metadata = {{{}}}; // create on track metadata
604 testOpen( 616 testOpen(
605 [&](AudioIoHandle handle, AudioConfig config, auto cb) { 617 [&](AudioIoHandle handle, AudioConfig config, auto cb) {
606 return device->openOutputStream(handle, address, config, flags, metadata, cb); 618 return device->openOutputStream(handle, address, config, flags, initialMetadata,
619 cb);
607 }, 620 },
608 config); 621 config);
609 } 622 }
623
624 protected:
625 const SourceMetadata initialMetadata = {
626 {{AudioUsage::MEDIA, AudioContentType::MUSIC, 1 /* gain */}}};
610}; 627};
611TEST_P(OutputStreamTest, OpenOutputStreamTest) { 628TEST_P(OutputStreamTest, OpenOutputStreamTest) {
612 doc::test( 629 doc::test(
@@ -637,13 +654,15 @@ class InputStreamTest : public OpenStreamTest<IStreamIn> {
637 const AudioConfig& config = GetParam(); 654 const AudioConfig& config = GetParam();
638 // TODO: test all supported flags and source 655 // TODO: test all supported flags and source
639 auto flags = hidl_bitfield<AudioInputFlag>(AudioInputFlag::NONE); 656 auto flags = hidl_bitfield<AudioInputFlag>(AudioInputFlag::NONE);
640 SinkMetadata metadata = {{{AudioSource::DEFAULT, 1}}};
641 testOpen( 657 testOpen(
642 [&](AudioIoHandle handle, AudioConfig config, auto cb) { 658 [&](AudioIoHandle handle, AudioConfig config, auto cb) {
643 return device->openInputStream(handle, address, config, flags, metadata, cb); 659 return device->openInputStream(handle, address, config, flags, initialMetadata, cb);
644 }, 660 },
645 config); 661 config);
646 } 662 }
663
664 protected:
665 const SinkMetadata initialMetadata = {{{AudioSource::DEFAULT, 1 /* gain */}}};
647}; 666};
648 667
649TEST_P(InputStreamTest, OpenInputStreamTest) { 668TEST_P(InputStreamTest, OpenInputStreamTest) {
@@ -727,11 +746,12 @@ static void testCapabilityGetter(const string& name, IStream* stream,
727 ASSERT_OK(ret); 746 ASSERT_OK(ret);
728 747
729 if (currentMustBeSupported) { 748 if (currentMustBeSupported) {
749 ASSERT_NE(0U, capabilities.size()) << name << " must not return an empty list";
730 Property currentValue = extract((stream->*getter)()); 750 Property currentValue = extract((stream->*getter)());
731 EXPECT_NE(std::find(capabilities.begin(), capabilities.end(), currentValue), 751 EXPECT_TRUE(std::find(capabilities.begin(), capabilities.end(), currentValue) !=
732 capabilities.end()) 752 capabilities.end())
733 << "current " << name << " is not in the list of the supported ones " 753 << "value returned by " << name << "() = " << testing::PrintToString(currentValue)
734 << toString(capabilities); 754 << " is not in the list of the supported ones " << toString(capabilities);
735 } 755 }
736 756
737 // Check that all declared supported values are indeed supported 757 // Check that all declared supported values are indeed supported
@@ -757,7 +777,7 @@ Result getSupportedChannelMasks(IStream* stream,
757 hidl_vec<hidl_bitfield<AudioChannelMask>>& channels) { 777 hidl_vec<hidl_bitfield<AudioChannelMask>>& channels) {
758 Result res; 778 Result res;
759 EXPECT_OK( 779 EXPECT_OK(
760 stream->getSupportedSampleRates(extract(stream->getFormat()), returnIn(res, channels))); 780 stream->getSupportedChannelMasks(extract(stream->getFormat()), returnIn(res, channels)));
761 return res; 781 return res;
762} 782}
763 783
@@ -1039,8 +1059,30 @@ TEST_P(InputStreamTest, getCapturePosition) {
1039 ASSERT_RESULT(invalidStateOrNotSupported, res); 1059 ASSERT_RESULT(invalidStateOrNotSupported, res);
1040} 1060}
1041 1061
1062TEST_P(InputStreamTest, updateSinkMetadata) {
1063 doc::test("The HAL should not crash on metadata change");
1064
1065 hidl_enum_iterator<AudioSource> range;
1066 // Test all possible track configuration
1067 for (AudioSource source : range) {
1068 for (float volume : {0.0, 0.5, 1.0}) {
1069 const SinkMetadata metadata = {{{source, volume}}};
1070 ASSERT_OK(stream->updateSinkMetadata(metadata))
1071 << "source=" << toString(source) << ", volume=" << volume;
1072 }
1073 }
1074
1075 // Do not test concurrent capture as this is not officially supported
1076
1077 // Set no metadata as if all stream track had stopped
1078 ASSERT_OK(stream->updateSinkMetadata({}));
1079
1080 // Restore initial
1081 ASSERT_OK(stream->updateSinkMetadata(initialMetadata));
1082}
1083
1042////////////////////////////////////////////////////////////////////////////// 1084//////////////////////////////////////////////////////////////////////////////
1043///////////////////////////////// StreamIn /////////////////////////////////// 1085///////////////////////////////// StreamOut //////////////////////////////////
1044////////////////////////////////////////////////////////////////////////////// 1086//////////////////////////////////////////////////////////////////////////////
1045 1087
1046TEST_P(OutputStreamTest, getLatency) { 1088TEST_P(OutputStreamTest, getLatency) {
@@ -1195,7 +1237,7 @@ TEST_P(OutputStreamTest, Pause) {
1195 doc::partialTest("The output stream does not support pause"); 1237 doc::partialTest("The output stream does not support pause");
1196 return; 1238 return;
1197 } 1239 }
1198 ASSERT_RESULT(Result::INVALID_STATE, stream->resume()); 1240 ASSERT_RESULT(Result::INVALID_STATE, stream->pause());
1199} 1241}
1200 1242
1201static void testDrain(IStreamOut* stream, AudioDrain type) { 1243static void testDrain(IStreamOut* stream, AudioDrain type) {
@@ -1261,6 +1303,37 @@ TEST_P(OutputStreamTest, SelectPresentation) {
1261 ASSERT_RESULT(okOrNotSupported, stream->selectPresentation(0, 0)); 1303 ASSERT_RESULT(okOrNotSupported, stream->selectPresentation(0, 0));
1262} 1304}
1263 1305
1306TEST_P(OutputStreamTest, updateSourceMetadata) {
1307 doc::test("The HAL should not crash on metadata change");
1308
1309 hidl_enum_iterator<AudioUsage> usageRange;
1310 hidl_enum_iterator<AudioContentType> contentRange;
1311 // Test all possible track configuration
1312 for (auto usage : usageRange) {
1313 for (auto content : contentRange) {
1314 for (float volume : {0.0, 0.5, 1.0}) {
1315 const SourceMetadata metadata = {{{usage, content, volume}}};
1316 ASSERT_OK(stream->updateSourceMetadata(metadata))
1317 << "usage=" << toString(usage) << ", content=" << toString(content)
1318 << ", volume=" << volume;
1319 }
1320 }
1321 }
1322
1323 // Set many track of different configuration
1324 ASSERT_OK(stream->updateSourceMetadata(
1325 {{{AudioUsage::MEDIA, AudioContentType::MUSIC, 0.1},
1326 {AudioUsage::VOICE_COMMUNICATION, AudioContentType::SPEECH, 1.0},
1327 {AudioUsage::ALARM, AudioContentType::SONIFICATION, 0.0},
1328 {AudioUsage::ASSISTANT, AudioContentType::UNKNOWN, 0.3}}}));
1329
1330 // Set no metadata as if all stream track had stopped
1331 ASSERT_OK(stream->updateSourceMetadata({}));
1332
1333 // Restore initial
1334 ASSERT_OK(stream->updateSourceMetadata(initialMetadata));
1335}
1336
1264////////////////////////////////////////////////////////////////////////////// 1337//////////////////////////////////////////////////////////////////////////////
1265/////////////////////////////// PrimaryDevice //////////////////////////////// 1338/////////////////////////////// PrimaryDevice ////////////////////////////////
1266////////////////////////////////////////////////////////////////////////////// 1339//////////////////////////////////////////////////////////////////////////////
@@ -1271,19 +1344,16 @@ TEST_F(AudioPrimaryHidlTest, setVoiceVolume) {
1271} 1344}
1272 1345
1273TEST_F(AudioPrimaryHidlTest, setMode) { 1346TEST_F(AudioPrimaryHidlTest, setMode) {
1274 doc::test( 1347 doc::test("Make sure setMode always succeeds if mode is valid and fails otherwise");
1275 "Make sure setMode always succeeds if mode is valid "
1276 "and fails otherwise");
1277 // Test Invalid values 1348 // Test Invalid values
1278 for (int mode : {-1, 0, int(AudioMode::IN_COMMUNICATION) + 1}) { 1349 for (int mode : {-2, -1, int(AudioMode::IN_COMMUNICATION) + 1}) {
1279 SCOPED_TRACE("mode=" + to_string(mode)); 1350 ASSERT_RESULT(Result::INVALID_ARGUMENTS, device->setMode(AudioMode(mode)))
1280 ASSERT_RESULT(Result::INVALID_ARGUMENTS, device->setMode(AudioMode(mode))); 1351 << "mode=" << mode;
1281 } 1352 }
1282 // Test valid values 1353 // Test valid values
1283 for (AudioMode mode : {AudioMode::IN_CALL, AudioMode::IN_COMMUNICATION, AudioMode::RINGTONE, 1354 for (AudioMode mode : {AudioMode::IN_CALL, AudioMode::IN_COMMUNICATION, AudioMode::RINGTONE,
1284 AudioMode::NORMAL /* Make sure to leave the test in normal mode */}) { 1355 AudioMode::NORMAL /* Make sure to leave the test in normal mode */}) {
1285 SCOPED_TRACE("mode=" + toString(mode)); 1356 ASSERT_OK(device->setMode(mode)) << "mode=" << toString(mode);
1286 ASSERT_OK(device->setMode(mode));
1287 } 1357 }
1288} 1358}
1289 1359