blob: f01406873ba77068e6d86afc6c9f0ce5a83cb09a [file] [log] [blame]
Chris Waddellca0dd182022-11-25 17:15:30 +00001#include "tests/UsecaseValidator-test.h"
2
3#include <gtest/gtest.h>
4
5namespace android {
6namespace media {
7
8/**
9 * Helper test functions.
10 */
11
12/**
13 * Register a mock stream.
14 */
15audio_io_handle_t UsecaseValidatorTest::testRegisterStream(bool outputFlagGame) {
16 static int streamId = 0;
17 status_t result;
18 static audio_config_base_t audioConfig = AUDIO_CONFIG_BASE_INITIALIZER;
19 audio_output_flags_t outputFlags = outputFlagGame ? GAME_OUTPUT_FLAGS : MEDIA_OUTPUT_FLAGS;
20
21 result = m_validator->registerStream(++streamId, audioConfig, outputFlags);
22
23 return result == OK ? streamId : 0;
24}
25
26/**
27 * Create a mock portId.
28 */
29audio_port_handle_t UsecaseValidatorTest::testCreatePortId(audio_io_handle_t streamId) {
30 static int portId = 0;
31
32 return (streamId << 8) | (++portId);
33}
34
35/**
36 * Add a mock portId to a stream and verify.
37 */
38error::Result<audio_attributes_t> UsecaseValidatorTest::testStartClient(audio_io_handle_t streamId,
39 audio_port_handle_t portId,
40 audio_usage_t usage) {
41 content::AttributionSourceState attributionSource;
42 audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER;
43 attributes.usage = usage;
44
45 return m_validator->startClient(streamId, portId, attributionSource, attributes, NULL);
46}
47
48/**
49 * Verify a mock stream.
50 */
51error::Result<audio_attributes_t> UsecaseValidatorTest::testVerifyAudioAttributes(
52 audio_io_handle_t streamId,
53 audio_usage_t usage) {
54 content::AttributionSourceState attributionSource;
55 audio_attributes_t attributes = AUDIO_ATTRIBUTES_INITIALIZER;
56 attributes.usage = usage;
57
58 return m_validator->verifyAudioAttributes(streamId, attributionSource, attributes);
59}
60
61/**
62 * Test functions.
63 */
64
65/**
66 * Test adding and removing streams.
67 */
68TEST_F(UsecaseLookupTest, testAddAndRemoveStream) {
69 addStream(1, false);
70 addStream(2, true);
71
72 EXPECT_NE(m_streams.find(1), m_streams.end());
73 EXPECT_NE(m_streams.find(2), m_streams.end());
74 EXPECT_EQ(m_streams.find(3), m_streams.end());
75
76 EXPECT_FALSE(isGameStream(1));
77 EXPECT_TRUE(isGameStream(2));
78 EXPECT_FALSE(isGameStream(3));
79
80 removeStream(2);
81
82 EXPECT_FALSE(isGameStream(2));
83}
84
85/**
86 * Verify attributes usage for stream.
87 */
88TEST_F(UsecaseValidatorTest, testAttributesUsage) {
89 audio_io_handle_t gameStreamId, mediaStreamId;
90
91 // Register game and media stream.
92 gameStreamId = testRegisterStream(true);
93 mediaStreamId = testRegisterStream(false);
94 EXPECT_NE(gameStreamId, 0);
95 EXPECT_NE(mediaStreamId, 0);
96 EXPECT_NE(gameStreamId, mediaStreamId);
97
98 // Verify attributes on game stream.
99 auto attr = testVerifyAudioAttributes(gameStreamId, AUDIO_USAGE_GAME);
100 EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME);
101
102 // Verify attributes on media stream.
103 attr = testVerifyAudioAttributes(mediaStreamId, AUDIO_USAGE_MEDIA);
104 EXPECT_EQ(attr.value().usage, AUDIO_USAGE_MEDIA);
105
106 EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0);
107 EXPECT_EQ(m_validator->unregisterStream(mediaStreamId), 0);
108}
109
110/**
111 * Test hanging client.
112 */
113TEST_F(UsecaseValidatorTest, testHangingClient) {
114 audio_io_handle_t gameStreamId, mediaStreamId;
115 audio_port_handle_t gamePortId, mediaPortId;
116
117 // Register game and media stream.
118 gameStreamId = testRegisterStream(true);
119 EXPECT_NE(gameStreamId, 0);
120 mediaStreamId = testRegisterStream(false);
121 EXPECT_NE(mediaStreamId, 0);
122
123 // Assign portId.
124 gamePortId = testCreatePortId(gameStreamId);
125 EXPECT_NE(gamePortId, 0);
126 mediaPortId = testCreatePortId(mediaStreamId);
127 EXPECT_NE(mediaPortId, 0);
128
129 // Start client on game stream.
130 testStartClient(gameStreamId, gamePortId, AUDIO_USAGE_GAME);
131
132 // Start client on media stream.
133 testStartClient(mediaStreamId, mediaPortId, AUDIO_USAGE_MEDIA);
134
135 // Unregister media stream before stopClient.
136 EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0);
137 EXPECT_EQ(m_validator->unregisterStream(mediaStreamId), 0);
138}
139
140/**
141 * Verify attributes usage does not change.
142 */
143TEST_F(UsecaseValidatorTest, testAttributesUsageUnchanged) {
144 audio_io_handle_t gameStreamId, mediaStreamId;
145 audio_port_handle_t gamePortId, mediaPortId, unknownPortId, voiceCommPortId;
146
147 // Register game and media stream.
148 gameStreamId = testRegisterStream(true);
149 EXPECT_NE(gameStreamId, 0);
150 mediaStreamId = testRegisterStream(false);
151 EXPECT_NE(mediaStreamId, 0);
152
153 // Assign portId.
154 gamePortId = testCreatePortId(gameStreamId);
155 EXPECT_NE(gamePortId, 0);
156 mediaPortId = testCreatePortId(mediaStreamId);
157 EXPECT_NE(mediaPortId, 0);
158 unknownPortId = testCreatePortId(mediaStreamId);
159 EXPECT_NE(unknownPortId, 0);
160 voiceCommPortId = testCreatePortId(gameStreamId);
161 EXPECT_NE(voiceCommPortId, 0);
162
163 // Verify attributes on game stream.
164 auto attr = testStartClient(gameStreamId, gamePortId, AUDIO_USAGE_GAME);
165 EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME);
166
167 attr = testStartClient(gameStreamId, voiceCommPortId, AUDIO_USAGE_VOICE_COMMUNICATION);
168 EXPECT_EQ(attr.value().usage, AUDIO_USAGE_VOICE_COMMUNICATION);
169
170 // Verify attributes on media stream.
171 attr = testStartClient(mediaStreamId, mediaPortId, AUDIO_USAGE_MEDIA);
172 EXPECT_EQ(attr.value().usage, AUDIO_USAGE_MEDIA);
173
174 attr = testStartClient(mediaStreamId, unknownPortId, AUDIO_USAGE_UNKNOWN);
175 EXPECT_EQ(attr.value().usage, AUDIO_USAGE_UNKNOWN);
176
177 // Stop client on game and media stream.
178 EXPECT_EQ(m_validator->stopClient(gameStreamId, gamePortId), 0);
179 EXPECT_EQ(m_validator->stopClient(mediaStreamId, mediaPortId), 0);
180
181 // Unregister game and media stream.
182 EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0);
183 EXPECT_EQ(m_validator->unregisterStream(mediaStreamId), 0);
184}
185
186/**
187 * Verify attributes usage changes.
188 */
189TEST_F(UsecaseValidatorTest, testAttributesUsageChanged) {
190 audio_io_handle_t gameStreamId;
191 audio_port_handle_t mediaPortId, unknownPortId;
192
193 // Register game and media stream.
194 gameStreamId = testRegisterStream(true);
195 EXPECT_NE(gameStreamId, 0);
196
197 // Assign portId.
198 mediaPortId = testCreatePortId(gameStreamId);
199 EXPECT_NE(mediaPortId, 0);
200 unknownPortId = testCreatePortId(gameStreamId);
201 EXPECT_NE(unknownPortId, 0);
202
203 // Verify attributes on game stream.
204 auto attr = testStartClient(gameStreamId, mediaPortId, AUDIO_USAGE_MEDIA);
205 EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME);
206
207 attr = testStartClient(gameStreamId, unknownPortId, AUDIO_USAGE_UNKNOWN);
208 EXPECT_EQ(attr.value().usage, AUDIO_USAGE_GAME);
209
210 // Unregister game stream.
211 EXPECT_EQ(m_validator->unregisterStream(gameStreamId), 0);
212}
213
214} // namespace media
215} // namespace android