Audio: Add VTS tests for invalid enum-strings, Part 1b

Add missing checks for invalid channel mask and tags
in playback and record metadata. Fix the behavior of
the default wrapper.

Bug: 142480271
Test: atest VtsHalAudioV6_0TargetTest
Test: atest VtsHalAudioV7_0TargetTest
      with side-loaded V7 default wrapper
Change-Id: Ie0f82b2becc457b735349eb351ea29989a64f22c
diff --git a/audio/core/all-versions/default/StreamIn.cpp b/audio/core/all-versions/default/StreamIn.cpp
index 39a4c27..2c5e9f1 100644
--- a/audio/core/all-versions/default/StreamIn.cpp
+++ b/audio/core/all-versions/default/StreamIn.cpp
@@ -478,13 +478,24 @@
 }
 
 #if MAJOR_VERSION >= 4
-Result StreamIn::doUpdateSinkMetadata(const SinkMetadata& sinkMetadata,
-                                      bool abortOnConversionFailure) {
+Result StreamIn::doUpdateSinkMetadata(const SinkMetadata& sinkMetadata) {
     std::vector<record_track_metadata> halTracks;
-    if (status_t status = sinkMetadataToHal(sinkMetadata, &halTracks);
-        status != NO_ERROR && abortOnConversionFailure) {
+#if MAJOR_VERSION <= 6
+    (void)sinkMetadataToHal(sinkMetadata, &halTracks);
+#else
+    // Validate whether a conversion to V7 is possible. This is needed
+    // to have a consistent behavior of the HAL regardless of the API
+    // version of the legacy HAL (and also to be consistent with openInputStream).
+    std::vector<record_track_metadata_v7> halTracksV7;
+    if (status_t status = sinkMetadataToHalV7(sinkMetadata, &halTracksV7); status == NO_ERROR) {
+        halTracks.reserve(halTracksV7.size());
+        for (auto metadata_v7 : halTracksV7) {
+            halTracks.push_back(std::move(metadata_v7.base));
+        }
+    } else {
         return Stream::analyzeStatus("sinkMetadataToHal", status);
     }
+#endif  // MAJOR_VERSION <= 6
     const sink_metadata_t halMetadata = {
         .track_count = halTracks.size(),
         .tracks = halTracks.data(),
@@ -513,7 +524,7 @@
     if (mStream->update_sink_metadata == nullptr) {
         return Void();  // not supported by the HAL
     }
-    (void)doUpdateSinkMetadata(sinkMetadata, false /*abortOnConversionFailure*/);
+    (void)doUpdateSinkMetadata(sinkMetadata);
     return Void();
 }
 #elif MAJOR_VERSION >= 7
@@ -522,7 +533,7 @@
         if (mStream->update_sink_metadata == nullptr) {
             return Result::NOT_SUPPORTED;
         }
-        return doUpdateSinkMetadata(sinkMetadata, true /*abortOnConversionFailure*/);
+        return doUpdateSinkMetadata(sinkMetadata);
     } else {
         if (mStream->update_sink_metadata_v7 == nullptr) {
             return Result::NOT_SUPPORTED;
diff --git a/audio/core/all-versions/default/StreamOut.cpp b/audio/core/all-versions/default/StreamOut.cpp
index 0ff9182..ffd3b6b 100644
--- a/audio/core/all-versions/default/StreamOut.cpp
+++ b/audio/core/all-versions/default/StreamOut.cpp
@@ -586,13 +586,24 @@
 }
 
 #if MAJOR_VERSION >= 4
-Result StreamOut::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata,
-                                         bool abortOnConversionFailure) {
+Result StreamOut::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata) {
     std::vector<playback_track_metadata_t> halTracks;
-    if (status_t status = sourceMetadataToHal(sourceMetadata, &halTracks);
-        status != NO_ERROR && abortOnConversionFailure) {
+#if MAJOR_VERSION <= 6
+    (void)sourceMetadataToHal(sourceMetadata, &halTracks);
+#else
+    // Validate whether a conversion to V7 is possible. This is needed
+    // to have a consistent behavior of the HAL regardless of the API
+    // version of the legacy HAL (and also to be consistent with openOutputStream).
+    std::vector<playback_track_metadata_v7> halTracksV7;
+    if (status_t status = sourceMetadataToHalV7(sourceMetadata, &halTracksV7); status == NO_ERROR) {
+        halTracks.reserve(halTracksV7.size());
+        for (auto metadata_v7 : halTracksV7) {
+            halTracks.push_back(std::move(metadata_v7.base));
+        }
+    } else {
         return Stream::analyzeStatus("sourceMetadataToHal", status);
     }
+#endif  // MAJOR_VERSION <= 6
     const source_metadata_t halMetadata = {
         .track_count = halTracks.size(),
         .tracks = halTracks.data(),
@@ -621,7 +632,7 @@
     if (mStream->update_source_metadata == nullptr) {
         return Void();  // not supported by the HAL
     }
-    (void)doUpdateSourceMetadata(sourceMetadata, false /*abortOnConversionFailure*/);
+    (void)doUpdateSourceMetadata(sourceMetadata);
     return Void();
 }
 #elif MAJOR_VERSION >= 7
@@ -630,7 +641,7 @@
         if (mStream->update_source_metadata == nullptr) {
             return Result::NOT_SUPPORTED;
         }
-        return doUpdateSourceMetadata(sourceMetadata, true /*abortOnConversionFailure*/);
+        return doUpdateSourceMetadata(sourceMetadata);
     } else {
         if (mStream->update_source_metadata_v7 == nullptr) {
             return Result::NOT_SUPPORTED;
diff --git a/audio/core/all-versions/default/include/core/default/StreamIn.h b/audio/core/all-versions/default/include/core/default/StreamIn.h
index ccb5eed..651b3a6 100644
--- a/audio/core/all-versions/default/include/core/default/StreamIn.h
+++ b/audio/core/all-versions/default/include/core/default/StreamIn.h
@@ -130,7 +130,7 @@
 
   private:
 #if MAJOR_VERSION >= 4
-    Result doUpdateSinkMetadata(const SinkMetadata& sinkMetadata, bool abortOnConversionFailure);
+    Result doUpdateSinkMetadata(const SinkMetadata& sinkMetadata);
 #if MAJOR_VERSION >= 7
     Result doUpdateSinkMetadataV7(const SinkMetadata& sinkMetadata);
 #endif
diff --git a/audio/core/all-versions/default/include/core/default/StreamOut.h b/audio/core/all-versions/default/include/core/default/StreamOut.h
index b7f211e..b8e8515 100644
--- a/audio/core/all-versions/default/include/core/default/StreamOut.h
+++ b/audio/core/all-versions/default/include/core/default/StreamOut.h
@@ -148,8 +148,7 @@
 
   private:
 #if MAJOR_VERSION >= 4
-    Result doUpdateSourceMetadata(const SourceMetadata& sourceMetadata,
-                                  bool abortOnConversionFailure);
+    Result doUpdateSourceMetadata(const SourceMetadata& sourceMetadata);
 #if MAJOR_VERSION >= 7
     Result doUpdateSourceMetadataV7(const SourceMetadata& sourceMetadata);
 #endif
diff --git a/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp b/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp
index 2ed578d..3b6d5f2 100644
--- a/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp
+++ b/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp
@@ -401,6 +401,22 @@
     return invalid;
 }
 
+static const RecordTrackMetadata& getInvalidChannelMaskRecordTrackMetadata() {
+    static const RecordTrackMetadata invalid = {
+            .source = toString(xsd::AudioSource::AUDIO_SOURCE_DEFAULT),
+            .gain = 1,
+            .channelMask = "random_string"};
+    return invalid;
+}
+
+static const RecordTrackMetadata& getInvalidTagsRecordTrackMetadata() {
+    static const RecordTrackMetadata invalid = {
+            .source = toString(xsd::AudioSource::AUDIO_SOURCE_DEFAULT),
+            .gain = 1,
+            .tags = {{"random_string"}}};
+    return invalid;
+}
+
 static const PlaybackTrackMetadata& getValidPlaybackTrackMetadata() {
     static const PlaybackTrackMetadata valid = {
             .usage = toString(xsd::AudioUsage::AUDIO_USAGE_MEDIA),
@@ -425,24 +441,54 @@
     return invalid;
 }
 
+static const PlaybackTrackMetadata& getInvalidChannelMaskPlaybackTrackMetadata() {
+    static const PlaybackTrackMetadata invalid = {
+            .usage = toString(xsd::AudioUsage::AUDIO_USAGE_MEDIA),
+            .contentType = toString(xsd::AudioContentType::AUDIO_CONTENT_TYPE_MUSIC),
+            .gain = 1,
+            .channelMask = "random_string"};
+    return invalid;
+}
+
+static const PlaybackTrackMetadata& getInvalidTagsPlaybackTrackMetadata() {
+    static const PlaybackTrackMetadata invalid = {
+            .usage = toString(xsd::AudioUsage::AUDIO_USAGE_MEDIA),
+            .contentType = toString(xsd::AudioContentType::AUDIO_CONTENT_TYPE_MUSIC),
+            .gain = 1,
+            .tags = {{"random_string"}}};
+    return invalid;
+}
+
 static const std::vector<SourceMetadata>& getInvalidSourceMetadatas() {
     static const std::vector<SourceMetadata> invalids = {
             SourceMetadata{.tracks = {{getInvalidUsagePlaybackTrackMetadata()}}},
             SourceMetadata{.tracks = {{getInvalidContentTypePlaybackTrackMetadata()}}},
+            SourceMetadata{.tracks = {{getInvalidChannelMaskPlaybackTrackMetadata()}}},
+            SourceMetadata{.tracks = {{getInvalidTagsPlaybackTrackMetadata()}}},
             SourceMetadata{.tracks = {{getValidPlaybackTrackMetadata(),
                                        getInvalidUsagePlaybackTrackMetadata()}}},
             SourceMetadata{.tracks = {{getValidPlaybackTrackMetadata(),
-                                       getInvalidContentTypePlaybackTrackMetadata()}}}};
+                                       getInvalidContentTypePlaybackTrackMetadata()}}},
+            SourceMetadata{.tracks = {{getValidPlaybackTrackMetadata(),
+                                       getInvalidChannelMaskPlaybackTrackMetadata()}}},
+            SourceMetadata{.tracks = {{getValidPlaybackTrackMetadata(),
+                                       getInvalidTagsPlaybackTrackMetadata()}}}};
     return invalids;
 }
 static const std::vector<SinkMetadata>& getInvalidSinkMetadatas() {
     static const std::vector<SinkMetadata> invalids = {
             SinkMetadata{.tracks = {{getInvalidSourceRecordTrackMetadata()}}},
             SinkMetadata{.tracks = {{getRecordTrackMetadataWithInvalidDest()}}},
+            SinkMetadata{.tracks = {{getInvalidChannelMaskRecordTrackMetadata()}}},
+            SinkMetadata{.tracks = {{getInvalidTagsRecordTrackMetadata()}}},
             SinkMetadata{.tracks = {{getValidRecordTrackMetadata(),
                                      getInvalidSourceRecordTrackMetadata()}}},
             SinkMetadata{.tracks = {{getValidRecordTrackMetadata(),
-                                     getRecordTrackMetadataWithInvalidDest()}}}};
+                                     getRecordTrackMetadataWithInvalidDest()}}},
+            SinkMetadata{.tracks = {{getValidRecordTrackMetadata(),
+                                     getInvalidChannelMaskRecordTrackMetadata()}}},
+            SinkMetadata{.tracks = {{getValidRecordTrackMetadata(),
+                                     getInvalidTagsRecordTrackMetadata()}}}};
     return invalids;
 }
 template <typename T>