1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_socket_thread_test.h"
17 #include <thread>
18 #include <string>
19 #include <memory>
20 #include <vector>
21 #include <sys/socket.h>
22 #include <cerrno>
23 #include <fstream>
24 #include <algorithm>
25 #include <unistd.h>
26 #include "audio_policy_log.h"
27 #include "audio_errors.h"
28 #include "audio_pnp_server.h"
29 using namespace std;
30 using namespace std::chrono;
31 using namespace testing::ext;
32
33 namespace OHOS {
34 namespace AudioStandard {
35 namespace {
36 const int32_t HDF_ERR_INVALID_PARAM = -3;
37 } // namespace
38
SetUpTestCase(void)39 void AudioSocketThreadUnitTest::SetUpTestCase(void) {}
TearDownTestCase(void)40 void AudioSocketThreadUnitTest::TearDownTestCase(void) {}
SetUp(void)41 void AudioSocketThreadUnitTest::SetUp(void) {}
TearDown(void)42 void AudioSocketThreadUnitTest::TearDown(void) {}
43
44
45 #define PRINT_LINE printf("debug __LINE__:%d\n", __LINE__)
46
47 /**
48 * @tc.name : Test AudioSocketThread.
49 * @tc.number: AudioSocketThread_001
50 * @tc.desc : Test IsUpdatePnpDeviceState.
51 */
52 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_001, TestSize.Level1)
53 {
54 AudioEvent event1;
55 event1.eventType = 1;
56 event1.deviceType = 2;
57 event1.name = "Device1";
58 event1.address = "Address1";
59 event1.anahsName = "AnahsName1";
60
61 audioSocketThread_.UpdatePnpDeviceState(&event1);
62
63 //Test the exact same event
64 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event1), false);
65
66 //Test events with different eventtypes
67 AudioEvent event2;
68 event2.eventType = 2; // change eventType
69 event2.deviceType = 2;
70 event2.name = "Device1";
71 event2.address = "Address1";
72 event2.anahsName = "AnahsName1";
73 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event2), true);
74
75 //Test for events with different deviceTypes
76 AudioEvent event3;
77 event3.eventType = 1;
78 event3.deviceType = 1;
79 event3.name = "Device1";
80 event3.address = "Address1";
81 event3.anahsName = "AnahsName1";
82 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event3), true);
83
84 //Test events with different names
85 AudioEvent event4;
86 event4.eventType = 1;
87 event4.deviceType = 1;
88 event4.name = "Device2";
89 event4.address = "Address1";
90 event4.anahsName = "AnahsName1";
91 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event4), true);
92
93 // Test events with different addresses
94 AudioEvent event5;
95 event5.eventType = 1;
96 event5.deviceType = 1;
97 event5.name = "Device1";
98 event5.address = "Address2";
99 event5.anahsName = "AnahsName1";
100 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event5), true);
101
102 //Test the anahsName for different events
103 AudioEvent event6;
104 event6.eventType = 1;
105 event6.deviceType = 1;
106 event6.name = "Device1";
107 event6.address = "Address1";
108 event6.anahsName = "AnahsName2";
109
110 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event6), true);
111 }
112
113 /**
114 * @tc.name : Test AudioSocketThread.
115 * @tc.number: AudioSocketThread_002
116 * @tc.desc : Test IsUpdatePnpDeviceState.
117 */
118 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_002, TestSize.Level1)
119 {
120 AudioEvent event1;
121 event1.eventType = 1;
122 event1.deviceType = 1;
123 event1.name = "Device1";
124 event1.address = "Address1";
125 event1.anahsName = "AnahsName1";
126
127 //Set the start state
128 audioSocketThread_.UpdatePnpDeviceState(&event1);
129
130 //Test completely different events
131 AudioEvent event2;
132 event2.eventType = 2;
133 event2.deviceType = 2;
134 event2.name = "Device2";
135 event2.address = "Address2";
136 event2.anahsName = "AnahsName2";
137 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event2), true);
138
139 //Test events where both eventType and eventType are different
140 AudioEvent event3;
141 event3.eventType = 2;
142 event3.deviceType = 2;
143 event3.name = "Device1";
144 event3.address = "Address1";
145 event3.anahsName = "AnahsName1";
146 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event3), true);
147
148 //Test for events where deviceType and name are different
149 AudioEvent event4;
150 event4.eventType = 1;
151 event4.deviceType = 2;
152 event4.name = "Device2";
153 event4.address = "Address1";
154 event4.anahsName = "AnahsName1";
155 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event4), true);
156
157 //Test for events where both name and adress are different
158 AudioEvent event5;
159 event5.eventType = 1;
160 event5.deviceType = 1;
161 event5.name = "Device2";
162 event5.address = "Address2";
163 event5.anahsName = "AnahsName1";
164 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event5), true);
165
166 //Test for events where both adress and anahsName are different
167 AudioEvent event6;
168 event6.eventType = 1;
169 event6.deviceType = 1;
170 event6.name = "Device1";
171 event6.address = "Address2";
172 event6.anahsName = "AnahsName2";
173 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event6), true);
174 }
175
176 /**
177 * @tc.name : Test AudioSocketThread.
178 * @tc.number: AudioSocketThread_003
179 * @tc.desc : Test IsUpdatePnpDeviceState.
180 */
181 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_003, TestSize.Level1)
182 {
183 AudioEvent event1;
184 event1.eventType = 1;
185 event1.deviceType = 1;
186 event1.name = "Device1";
187 event1.address = "Address1";
188 event1.anahsName = "AnahsName1";
189
190 audioSocketThread_.UpdatePnpDeviceState(&event1);
191
192 //Test events with different eventType, eventType, and name
193 AudioEvent event2;
194 event2.eventType = 2;
195 event2.eventType = 2;
196 event2.name = "Device2";
197 event2.address = "Address1";
198 event2.anahsName = "AnahsName1";
199 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event2), true);
200
201 //Test events with different eventType, name, and address
202 AudioEvent event3;
203 event3.eventType = 2;
204 event3.eventType = 2;
205 event3.name = "Device2";
206 event3.address = "Address1";
207 event3.anahsName = "AnahsName1";
208 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event3), true);
209
210 //Test for events where name, address, and anahsName are different
211 AudioEvent event4;
212 event4.eventType = 2;
213 event4.eventType = 2;
214 event4.name = "Device2";
215 event4.address = "Address1";
216 event4.anahsName = "AnahsName1";
217 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event4), true);
218
219 // Test foraddress,anahsName and eventType are different
220 AudioEvent event5;
221 event5.eventType = 2;
222 event5.eventType = 1;
223 event5.name = "Device1";
224 event5.address = "Address2";
225 event5.anahsName = "AnahsName2";
226 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event5), true);
227
228 //Test for events where address, anahsName, and eventType are different
229 AudioEvent event6;
230 event6.eventType = 2;
231 event6.eventType = 2;
232 event6.name = "Device1";
233 event6.address = "Address1";
234 event6.anahsName = "AnahsName2";
235 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event6), true);
236 }
237
238 /**
239 * @tc.name : Test AudioSocketThread.
240 * @tc.number: AudioSocketThread_004
241 * @tc.desc : Test IsUpdatePnpDeviceState.
242 */
243 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_004, TestSize.Level1)
244 {
245 AudioEvent event1;
246 event1.eventType = 1;
247 event1.deviceType = 1;
248 event1.name = "Device1";
249 event1.address = "Address1";
250 event1.anahsName = "AnahsName1";
251
252 audioSocketThread_.UpdatePnpDeviceState(&event1);
253
254 //Test events that are different for eventType, eventType, name, and adress
255 AudioEvent event2;
256 event2.eventType = 2;
257 event2.deviceType = 2;
258 event2.name = "Device2";
259 event2.address = "Address2";
260 event2.anahsName = "AnahsName1";
261 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event2), true);
262
263 //Test events where eventType, name, adress, and anahsName are all different
264 AudioEvent event3;
265 event3.eventType = 1;
266 event3.deviceType = 2;
267 event3.name = "Device2";
268 event3.address = "Address2";
269 event3.anahsName = "AnahsName2";
270 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event3), true);
271
272 //Test for events where name, adress, anahsName, and eventType are all different
273 AudioEvent event4;
274 event4.eventType = 2;
275 event4.deviceType = 1;
276 event4.name = "Device2";
277 event4.address = "Address2";
278 event4.anahsName = "AnahsName2";
279 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event4), true);
280
281 //Test for events where adress, anahsName, eventType, and deviceType are all different
282 AudioEvent event5;
283 event5.eventType = 2;
284 event5.deviceType = 2;
285 event5.name = "Device1";
286 event5.address = "Address2";
287 event5.anahsName = "AnahsName2";
288 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event5), true);
289
290 //Test for events where anahsName, eventType, deviceType, and name are all different
291 AudioEvent event6;
292 event6.eventType = 2;
293 event6.deviceType = 2;
294 event6.name = "Device2";
295 event6.address = "Address1";
296 event6.anahsName = "AnahsName2";
297 EXPECT_EQ(audioSocketThread_.IsUpdatePnpDeviceState(&event6), true);
298 }
299
300 /**
301 * @tc.name : Test AudioSocketThread.
302 * @tc.number: AudioSocketThread_005
303 * @tc.desc : Test SetAudioPnpUevent REMOVE_AUDIO_DEVICE
304 */
305 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_005, TestSize.Level1)
306 {
307 AudioPnpUevent uevent = {
308 .action = "remove",
309 .name = "TestDevice",
310 .state = "removed",
311 .devType = "headset",
312 .subSystem = "audio",
313 .switchName = "h2w",
314 .switchState = "0",
315 .hidName = "hid",
316 .devName = "TestDevName",
317 .anahsName = "anahs"
318 };
319
320 AudioEvent event;
321 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
322 EXPECT_NE(result, SUCCESS);
323 EXPECT_NE(event.eventType, PNP_EVENT_DEVICE_REMOVE);
324 EXPECT_NE(event.deviceType, PNP_DEVICE_HEADSET);
325 EXPECT_NE(event.name, "TestDevice");
326 EXPECT_NE(event.address, "TestDevName");
327 }
328
329 /**
330 * @tc.name : Test AudioSocketThread.
331 * @tc.number: AudioSocketThread_006
332 * @tc.desc : Test SetAudioPnpUevent ADD_DEVICE_HEADSET
333 */
334 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_006, TestSize.Level1)
335 {
336 AudioPnpUevent uevent = {
337 .action = "add",
338 .name = "TestDevice",
339 .state = "added",
340 .devType = "headset",
341 .subSystem = "switch",
342 .switchName = "h2w",
343 .switchState = "1",
344 .hidName = "hid",
345 .devName = "TestDevName",
346 .anahsName = "anahs"
347 };
348
349 AudioEvent event;
350 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
351 EXPECT_EQ(result, SUCCESS);
352 EXPECT_EQ(event.eventType, PNP_EVENT_DEVICE_ADD);
353 EXPECT_EQ(event.deviceType, PNP_DEVICE_HEADSET);
354 EXPECT_EQ(event.name, "TestDevice");
355 EXPECT_EQ(event.address, "TestDevName");
356 }
357
358 /**
359 * @tc.name : Test AudioSocketThread.
360 * @tc.number: AudioSocketThread_007
361 * @tc.desc : Test SetAudioPnpUevent ADD_DEVICE_HEADSET_WITHOUT_MIC
362 */
363 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_007, TestSize.Level1)
364 {
365 AudioPnpUevent uevent = {
366 .action = "add",
367 .name = "TestDevice",
368 .state = "added",
369 .devType = "headset_without_mic",
370 .subSystem = "switch",
371 .switchName = "h2w",
372 .switchState = "2",
373 .hidName = "hid",
374 .devName = "TestDevName",
375 .anahsName = "anahs"
376 };
377
378 AudioEvent event;
379 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
380
381 EXPECT_EQ(result, SUCCESS);
382 EXPECT_EQ(event.eventType, PNP_EVENT_DEVICE_ADD);
383 EXPECT_EQ(event.deviceType, PNP_DEVICE_HEADPHONE);
384 EXPECT_EQ(event.name, "TestDevice");
385 EXPECT_EQ(event.address, "TestDevName");
386 }
387
388 /**
389 * @tc.name : Test AudioSocketThread.
390 * @tc.number: AudioSocketThread_008
391 * @tc.desc : Test SetAudioPnpUevent_ADD_DEVICE_ADAPTER
392 */
393 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_008, TestSize.Level1)
394 {
395 AudioPnpUevent uevent = {
396 .action = "add",
397 .name = "TestDevice",
398 .state = "added",
399 .devType = "adapter",
400 .subSystem = "switch",
401 .switchName = "h2w",
402 .switchState = "4",
403 .hidName = "hid",
404 .devName = "TestDevName",
405 .anahsName = "anahs"
406 };
407
408 AudioEvent event;
409 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
410
411 EXPECT_EQ(result, SUCCESS);
412 EXPECT_EQ(event.eventType, PNP_EVENT_DEVICE_ADD);
413 EXPECT_EQ(event.deviceType, PNP_DEVICE_ADAPTER_DEVICE);
414 EXPECT_EQ(event.name, "TestDevice");
415 EXPECT_EQ(event.address, "TestDevName");
416 }
417
418 /**
419 * @tc.name : Test AudioSocketThread.
420 * @tc.number: AudioSocketThread_009
421 * @tc.desc : Test SetAudioPnpUevent_ADD_DEVICE_MIC_BLOCKED
422 */
423 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_009, TestSize.Level1)
424 {
425 AudioPnpUevent uevent = {
426 .action = "block",
427 .name = "TestDevice",
428 .state = "blocked",
429 .devType = "mic",
430 .subSystem = "switch",
431 .switchName = "h2w",
432 .switchState = "5",
433 .hidName = "hid",
434 .devName = "TestDevName",
435 .anahsName = "anahs"
436 };
437
438 AudioEvent event;
439 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
440
441 EXPECT_EQ(result, SUCCESS);
442 EXPECT_EQ(event.eventType, PNP_EVENT_DEVICE_ADD);
443 EXPECT_EQ(event.deviceType, PNP_DEVICE_UNKNOWN);
444 EXPECT_EQ(event.name, "TestDevice");
445 EXPECT_EQ(event.address, "TestDevName");
446 }
447
448 /**
449 * @tc.name : Test AudioSocketThread.
450 * @tc.number: AudioSocketThread_010
451 * @tc.desc : Test SetAudioPnpUevent_ADD_DEVICE_MIC_UN_BLOCKED
452 */
453 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_010, TestSize.Level1)
454 {
455 AudioPnpUevent uevent = {
456 .action = "unblock",
457 .name = "TestDevice",
458 .state = "unblocked",
459 .devType = "mic",
460 .subSystem = "switch",
461 .switchName = "h2w",
462 .switchState = "6",
463 .hidName = "hid",
464 .devName = "TestDevName",
465 .anahsName = "anahs"
466 };
467
468 AudioEvent event;
469 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
470
471 EXPECT_EQ(result, SUCCESS);
472 EXPECT_EQ(event.eventType, PNP_EVENT_DEVICE_ADD);
473 EXPECT_EQ(event.deviceType, PNP_DEVICE_UNKNOWN);
474 EXPECT_EQ(event.name, "TestDevice");
475 EXPECT_EQ(event.address, "TestDevName");
476 }
477
478 /**
479 * @tc.name : Test AudioSocketThread.
480 * @tc.number: AudioSocketThread_011
481 * @tc.desc : Test SetAudioPnpUevent_UnknownState
482 */
483 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_011, TestSize.Level1)
484 {
485 AudioPnpUevent uevent = {
486 .action = "unknown",
487 .name = "TestDevice",
488 .state = "unknown",
489 .devType = "unknown",
490 .subSystem = "switch",
491 .switchName = "h2w",
492 .switchState = "X", // 'X' UnknownState
493 .hidName = "hid",
494 .devName = "TestDevName",
495 .anahsName = "anahs"
496 };
497
498 AudioEvent event;
499 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
500
501 EXPECT_EQ(result, SUCCESS);
502 EXPECT_EQ(event.eventType, PNP_EVENT_DEVICE_ADD);
503 EXPECT_EQ(event.deviceType, PNP_DEVICE_UNKNOWN);
504 EXPECT_EQ(event.name, "TestDevice");
505 EXPECT_EQ(event.address, "TestDevName");
506 }
507
508 /**
509 * @tc.name : Test AudioSocketThread.
510 * @tc.number: AudioSocketThread_012
511 * @tc.desc : Test SetAudioPnpUevent_NonSwitchSubsystem
512 */
513 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_012, TestSize.Level1)
514 {
515 AudioPnpUevent uevent = {
516 .action = "change",
517 .name = "headset",
518 .state = "analog_hs0",
519 .devType = "extcon",
520 .subSystem = "other",
521 .switchName = "h2w",
522 .switchState = "0",
523 .hidName = "hid",
524 .devName = "TestDevName",
525 .anahsName = "anahs"
526 };
527
528 AudioEvent event;
529 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
530 EXPECT_EQ(result, ERROR);
531 }
532
533 /**
534 * @tc.name : Test AudioSocketThread.
535 * @tc.number: AudioSocketThread_013
536 * @tc.desc : Test SetAudioPnpUevent_InvalidSwitchName
537 */
538 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_013, TestSize.Level1)
539 {
540 AudioPnpUevent uevent = {
541 .action = "remove",
542 .name = "TestDevice",
543 .state = "removed",
544 .devType = "headset",
545 .subSystem = "switch",
546 .switchName = "invalid",
547 .switchState = "0",
548 .hidName = "hid",
549 .devName = "TestDevName",
550 .anahsName = "anahs"
551 };
552
553 AudioEvent event;
554 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
555 EXPECT_EQ(result, ERROR);
556 }
557
558 /**
559 * @tc.name : Test AudioSocketThread.
560 * @tc.number: AudioSocketThread_014
561 * @tc.desc : Test SetAudioPnpUevent_InvalidAction
562 */
563 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_014, TestSize.Level1)
564 {
565 AudioPnpUevent uevent = {
566 .action = "invalid",
567 .name = "headset",
568 .state = "analog_hs0",
569 .devType = "extcon",
570 .subSystem = "other",
571 .switchName = "h2w",
572 .switchState = "0",
573 .hidName = "hid",
574 .devName = "TestDevName",
575 .anahsName = "anahs"
576 };
577
578 AudioEvent event;
579 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
580 EXPECT_EQ(result, ERROR);
581 }
582
583 /**
584 * @tc.name : Test AudioSocketThread.
585 * @tc.number: AudioSocketThread_015
586 * @tc.desc : Test SetAudioPnpUevent_InvalidDevType
587 */
588 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_015, TestSize.Level1)
589 {
590 AudioPnpUevent uevent = {
591 .action = "change",
592 .name = "headset",
593 .state = "analog_hs0",
594 .devType = "invalid",
595 .subSystem = "other",
596 .switchName = "h2w",
597 .switchState = "0",
598 .hidName = "hid",
599 .devName = "TestDevName",
600 .anahsName = "anahs"
601 };
602 AudioEvent event;
603 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
604 EXPECT_EQ(result, ERROR);
605 }
606
607 /**
608 * @tc.name : Test AudioSocketThread.
609 * @tc.number: AudioSocketThread_016
610 * @tc.desc : Test SetAudioPnpUevent_InvalidState
611 */
612 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_016, TestSize.Level1)
613 {
614 AudioPnpUevent uevent = {
615 .action = "change",
616 .name = "headset",
617 .state = "invalid",
618 .devType = "extcon",
619 .subSystem = "other",
620 .switchName = "h2w",
621 .switchState = "0",
622 .hidName = "hid",
623 .devName = "TestDevName",
624 .anahsName = "anahs"
625 };
626 AudioEvent event;
627 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
628 EXPECT_EQ(result, ERROR);
629 }
630
631 /**
632 * @tc.name : Test AudioSocketThread.
633 * @tc.number: AudioSocketThread_017
634 * @tc.desc : Test SetAudioPnpUevent REMOVE by ANALOG_HS0 in non-switch subsystem
635 */
636 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_017, TestSize.Level4)
637 {
638 AudioPnpUevent uevent = {
639 .action = "change",
640 .name = "headset",
641 .state = "MICROPHONE=0",
642 .devType = "extcon3",
643 .subSystem = "audio",
644 .switchName = "h2w",
645 .switchState = "0",
646 .hidName = "hid",
647 .devName = "TestDevName0",
648 .anahsName = "anahs"
649 };
650
651 AudioEvent event;
652 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
653
654 EXPECT_EQ(event.eventType, PNP_EVENT_DEVICE_REMOVE);
655 EXPECT_EQ(event.deviceType, PNP_DEVICE_HEADSET);
656 EXPECT_EQ(result, SUCCESS);
657 }
658
659 /**
660 * @tc.name : Test AudioSocketThread.
661 * @tc.number: AudioSocketThread_018
662 * @tc.desc : Test SetAudioPnpUevent ADD by ANALOG_HS1 in non-switch subsystem
663 */
664 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_018, TestSize.Level4)
665 {
666 AudioPnpUevent uevent = {
667 .action = "change",
668 .name = "headset",
669 .state = "MICROPHONE=1",
670 .devType = "extcon3",
671 .subSystem = "audio",
672 .switchName = "h2w",
673 .switchState = "1",
674 .hidName = "hid",
675 .devName = "TestDevName1",
676 .anahsName = "anahs"
677 };
678
679 AudioEvent event;
680 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
681
682 EXPECT_EQ(event.eventType, PNP_EVENT_DEVICE_ADD);
683 EXPECT_EQ(event.deviceType, PNP_DEVICE_HEADSET);
684 EXPECT_EQ(result, SUCCESS);
685 }
686
687 /**
688 * @tc.name : Test AudioSocketThread.
689 * @tc.number: AudioSocketThread_019
690 * @tc.desc : Test SetAudioPnpUevent with unsupported ANALOG_HSx state
691 */
692 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_019, TestSize.Level4)
693 {
694 AudioPnpUevent uevent = {
695 .action = "change",
696 .name = "headset",
697 .state = "unsupported",
698 .devType = "extcon3",
699 .subSystem = "audio",
700 .switchName = "h2w",
701 .switchState = "1",
702 .hidName = "hid",
703 .devName = "TestDevNameInvalid",
704 .anahsName = "anahs"
705 };
706
707 AudioEvent event;
708 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
709
710 EXPECT_EQ(result, ERROR);
711 }
712
713 /**
714 * @tc.name : Test AudioSocketThread.
715 * @tc.number: AudioSocketThread_020
716 * @tc.desc : Test SetAudioPnpUevent with switchState = '0' (REMOVE_AUDIO_DEVICE)
717 */
718 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_020, TestSize.Level4)
719 {
720 AudioPnpUevent uevent = {
721 .action = "remove",
722 .name = "TestDevice_Remove",
723 .state = "removed",
724 .devType = "headset",
725 .subSystem = "switch",
726 .switchName = "h2w",
727 .switchState = "0",
728 .hidName = "hid",
729 .devName = "TestDevName_Remove",
730 .anahsName = "anahs"
731 };
732
733 AudioEvent event;
734 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
735
736 EXPECT_EQ(result, SUCCESS);
737 EXPECT_EQ(event.name, "TestDevice_Remove");
738 EXPECT_EQ(event.address, "TestDevName_Remove");
739 }
740
741 /**
742 * @tc.name : Test AudioSocketThread.
743 * @tc.number: AudioSocketThread_029
744 * @tc.desc : Test AudioDpDetectDevice
745 */
746 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_029, TestSize.Level1)
747 {
748 AudioSocketThread audioSocketThread;
749 // Test case 1: Invalid parameter (NULL audioPnpUevent)
750 {
751 int32_t result = audioSocketThread.AudioDpDetectDevice(nullptr);
752 EXPECT_EQ(result, HDF_ERR_INVALID_PARAM);
753 }
754 // Test case 2: Invalid subSystem
755 {
756 AudioPnpUevent uevent = {
757 .subSystem = "invalid",
758 .switchName = "hdmi_audio",
759 .action = "change",
760 .switchState = "1"
761 };
762 int32_t result = audioSocketThread.AudioDpDetectDevice(&uevent);
763 EXPECT_EQ(result, HDF_ERR_INVALID_PARAM);
764 }
765 // Test case 3: Invalid switchName
766 {
767 AudioPnpUevent uevent = {
768 .subSystem = "switch",
769 .switchName = "invalid",
770 .action = "change",
771 .switchState = "1"
772 };
773 int32_t result = audioSocketThread.AudioDpDetectDevice(&uevent);
774 EXPECT_EQ(result, HDF_ERR_INVALID_PARAM);
775 }
776 }
777
778 /**
779 * @tc.name : Test AudioSocketThread.
780 * @tc.number: AudioSocketThread_030
781 * @tc.desc : Test AudioDpDetectDevice
782 */
783 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_030, TestSize.Level1)
784 {
785 AudioSocketThread audioSocketThread;
786 // Test case 4: Invalid action
787 {
788 AudioPnpUevent uevent = {
789 .subSystem = "switch",
790 .switchName = "hdmi_audio",
791 .action = "invalid",
792 .switchState = "1"
793 };
794 int32_t result = audioSocketThread.AudioDpDetectDevice(&uevent);
795 EXPECT_EQ(result, HDF_ERR_INVALID_PARAM);
796 }
797 // Test case 5: Device Add Event
798 {
799 AudioPnpUevent uevent = {
800 .subSystem = "switch",
801 .switchName = "hdmi_audio1device_port=1",
802 .action = "change",
803 .switchState = "1"
804 };
805 int32_t result = audioSocketThread.AudioDpDetectDevice(&uevent);
806 EXPECT_EQ(result, SUCCESS);
807 // Additional checks can be added here to verify the internal state
808 }
809 // Test case 6: Device Remove Event
810 {
811 AudioPnpUevent uevent = {
812 .subSystem = "switch",
813 .switchName = "hdmi_audio1device_port=1",
814 .action = "change",
815 .switchState = "0"
816 };
817 int32_t result = audioSocketThread.AudioDpDetectDevice(&uevent);
818 EXPECT_EQ(result, SUCCESS);
819 // Additional checks can be added here to verify the internal state
820 }
821 }
822
823 /**
824 * @tc.name : Test AudioSocketThread.
825 * @tc.number: AudioSocketThread_031
826 * @tc.desc : Test AudioDpDetectDevice
827 */
828 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_031, TestSize.Level1)
829 {
830 AudioSocketThread audioSocketThread;
831 // Test case 7: Invalid switchState
832 {
833 AudioPnpUevent uevent = {
834 .subSystem = "switch",
835 .switchName = "hdmi_audio1device_port=1",
836 .action = "change",
837 .switchState = "invalid"
838 };
839 int32_t result = audioSocketThread.AudioDpDetectDevice(&uevent);
840 EXPECT_EQ(result, ERROR);
841 }
842 // Test case 8: No device_port in switchName
843 {
844 AudioPnpUevent uevent = {
845 .subSystem = "switch",
846 .switchName = "hdmi_audio1",
847 .action = "change",
848 .switchState = "1"
849 };
850 int32_t result = audioSocketThread.AudioDpDetectDevice(&uevent);
851 EXPECT_EQ(result, SUCCESS);
852 }
853 }
854
855 /**
856 * @tc.name : Test AudioSocketThread.
857 * @tc.number: AudioSocketThread_032
858 * @tc.desc : Test AudioDpDetectDevice when same device state is reported again
859 */
860 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_032, TestSize.Level4)
861 {
862 AudioSocketThread audioSocketThread;
863
864 AudioPnpUevent uevent = {
865 .subSystem = "switch",
866 .switchName = "hdmi_audio1device_port=HDMI-0",
867 .action = "change",
868 .switchState = "1"};
869
870 auto ret = audioSocketThread.AudioDpDetectDevice(&uevent);
871 EXPECT_EQ(ret, SUCCESS);
872 EXPECT_EQ(audioSocketThread.AudioDpDetectDevice(&uevent), SUCCESS);
873 }
874
875 /**
876 * @tc.name : Test AudioSocketThread.
877 * @tc.number: AudioSocketThread_033
878 * @tc.desc : Test UpdateDeviceState
879 */
880 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_033, TestSize.Level1)
881 {
882 AudioSocketThread audioSocketThread;
883 //Test: No update required
884 AudioEvent noUpdateEvent = {1, 1, "device", "address", "anahs"};
885 AudioEvent audioSocketEvent_ = noUpdateEvent;
886 audioSocketThread.UpdateDeviceState(noUpdateEvent);
887 //Test: Successful update
888 AudioEvent successUpdateEvent = {1, 2, "device", "address", "anahs"};
889 audioSocketThread.UpdateDeviceState(successUpdateEvent);
890 //Test:snprintf_s failed
891 AudioEvent snprintfFailEvent = {1, 2, "device", "address", "anahs"};
892 audioSocketThread.UpdateDeviceState(snprintfFailEvent);
893 AudioEvent snprintfSuccessEvent = {1, 2, "device", "address", "anahs"};
894 audioSocketThread.UpdateDeviceState(snprintfSuccessEvent);
895 }
896
897 /**
898 * @tc.name : Test AudioSocketThread.
899 * @tc.number: AudioSocketThread_034
900 * @tc.desc : Test AudioAnalogHeadsetDetectDevice
901 */
902 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_034, TestSize.Level1)
903 {
904 AudioSocketThread audioSocketThread;
905 AudioPnpUevent audioPnpUevent = {
906 .action = "change",
907 .name = "headset",
908 .state = "analog_hs1",
909 .devType = "extcon",
910 .subSystem = "switch",
911 .switchName = "h2w",
912 .switchState = "on",
913 .hidName = "hid_name",
914 .devName = "test_dev_name",
915 .anahsName = "anahs_name"
916 };
917 EXPECT_EQ(audioSocketThread.AudioAnalogHeadsetDetectDevice(&audioPnpUevent), SUCCESS);
918 }
919
920 /**
921 * @tc.name : Test AudioSocketThread.
922 * @tc.number: AudioSocketThread_035
923 * @tc.desc : Test SetAudioPnpServerEventValue
924 */
925 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_035, TestSize.Level1)
926 {
927 AudioSocketThread audioSocketThread;
928 AudioPnpUevent audioPnpUevent = {
929 .action = "change",
930 .name = "headset",
931 .state = "analog_hs1",
932 .devType = "extcon",
933 .subSystem = "switch",
934 .switchName = "h2w",
935 .switchState = "on",
936 .hidName = "hid_name",
937 .devName = "dev_name",
938 .anahsName = "anahs_name"
939 };
940 AudioEvent audioEvent;
941
942 EXPECT_EQ(audioSocketThread.SetAudioPnpServerEventValue(&audioEvent, &audioPnpUevent), SUCCESS);
943 EXPECT_EQ(audioEvent.eventType, PNP_EVENT_DEVICE_ADD);
944 EXPECT_NE(audioEvent.deviceType, PNP_DEVICE_HEADSET);
945 EXPECT_EQ(audioEvent.name, "headset");
946 EXPECT_EQ(audioEvent.address, "dev_name");
947 }
948
949 /**
950 * @tc.name : Test AudioSocketThread.
951 * @tc.number: AudioSocketThread_036
952 * @tc.desc : Test SetAudioPnpServerEventValue
953 */
954 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_036, TestSize.Level1)
955 {
956 AudioSocketThread audioSocketThread;
957 AudioPnpUevent audioPnpUevent = {
958 .action = "change",
959 .name = "headset",
960 .state = "analog_hs0",
961 .devType = "extcon",
962 .subSystem = "not_switch",
963 .switchName = "h2w",
964 .switchState = "on",
965 .hidName = "hid_name",
966 .devName = "dev_name",
967 .anahsName = "anahs_name"
968 };
969 AudioEvent audioEvent;
970
971 EXPECT_NE(audioSocketThread.SetAudioPnpServerEventValue(&audioEvent, &audioPnpUevent), SUCCESS);
972 EXPECT_NE(audioEvent.eventType, PNP_EVENT_DEVICE_REMOVE);
973 EXPECT_NE(audioEvent.deviceType, PNP_DEVICE_HEADSET);
974 }
975
976 /**
977 * @tc.name : Test AudioSocketThread.
978 * @tc.number: AudioSocketThread_037
979 * @tc.desc : Test AudioAnahsDetectDevice
980 */
981 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_037, TestSize.Level1)
982 {
983 AudioSocketThread audioSocketThread;
984 // Test case 1: NULL input
985 EXPECT_EQ(HDF_ERR_INVALID_PARAM, audioSocketThread.AudioAnahsDetectDevice(nullptr));
986
987 // Test case 2: Valid input with UEVENT_INSERT
988 struct AudioPnpUevent validUeventInsert = {
989 .subSystem = UEVENT_PLATFORM,
990 .anahsName = UEVENT_INSERT
991 };
992 EXPECT_EQ(SUCCESS, audioSocketThread.AudioAnahsDetectDevice(&validUeventInsert));
993 EXPECT_STREQ(UEVENT_INSERT, AudioSocketThread::audioSocketEvent_.anahsName.c_str());
994
995 // Test case 3: Valid input with UEVENT_REMOVE
996 struct AudioPnpUevent validUeventRemove = {
997 .subSystem = UEVENT_PLATFORM,
998 .anahsName = UEVENT_REMOVE
999 };
1000 EXPECT_EQ(SUCCESS, audioSocketThread.AudioAnahsDetectDevice(&validUeventRemove));
1001 EXPECT_STREQ(UEVENT_REMOVE, AudioSocketThread::audioSocketEvent_.anahsName.c_str());
1002
1003 // Test case 4: Invalid subsystem
1004 struct AudioPnpUevent invalidSubsystem = {
1005 .subSystem = "invalid",
1006 .anahsName = UEVENT_INSERT
1007 };
1008 EXPECT_EQ(ERROR, audioSocketThread.AudioAnahsDetectDevice(&invalidSubsystem));
1009
1010 // Test case 5: Invalid anahsName
1011 struct AudioPnpUevent invalidAnahsName = {
1012 .subSystem = UEVENT_PLATFORM,
1013 .anahsName = "invalid"
1014 };
1015 EXPECT_EQ(ERROR, audioSocketThread.AudioAnahsDetectDevice(&invalidAnahsName));
1016
1017 // Test case 6: Same anahsName as previous event
1018 EXPECT_EQ(SUCCESS, audioSocketThread.AudioAnahsDetectDevice(&validUeventRemove));
1019 EXPECT_STREQ(UEVENT_REMOVE, AudioSocketThread::audioSocketEvent_.anahsName.c_str());
1020 }
1021
1022 /**
1023 * @tc.name : Test AudioSocketThread.
1024 * @tc.number: AudioSocketThread_038
1025 * @tc.desc : Test SetAudioPnpServerEventValue
1026 */
1027 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_038, TestSize.Level1)
1028 {
1029 AudioPnpUevent uevent = {
1030 .action = "change",
1031 .name = "headset",
1032 .state = "invalid",
1033 .devType = "extcon",
1034 .subSystem = "other",
1035 .switchName = "h2w",
1036 .switchState = "01",
1037 .hidName = "hid",
1038 .devName = "TestDevName",
1039 .anahsName = "anahs"
1040 };
1041 AudioEvent event;
1042 int32_t result = AudioSocketThread::SetAudioPnpServerEventValue(&event, &uevent);
1043 EXPECT_EQ(result, ERROR);
1044 }
1045
1046 /**
1047 * @tc.name : Test AudioSocketThread.
1048 * @tc.number: AudioSocketThread_039
1049 * @tc.desc : Test AudioAnalogHeadsetDetectDevice
1050 */
1051 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_039, TestSize.Level1)
1052 {
1053 AudioSocketThread audioSocketThread;
1054 // Test case 1: NULL input
1055 EXPECT_EQ(HDF_ERR_INVALID_PARAM, audioSocketThread.AudioAnalogHeadsetDetectDevice(nullptr));
1056
1057 AudioPnpUevent audioPnpUevent = {
1058 .action = "add",
1059 .name = "TestDevice",
1060 .state = "added",
1061 .devType = "headset",
1062 .subSystem = "switch",
1063 .switchName = "h2w",
1064 .switchState = "1",
1065 .hidName = "hid",
1066 .devName = "TestDevName",
1067 .anahsName = "anahs"
1068 };
1069 int32_t ret = audioSocketThread.AudioAnalogHeadsetDetectDevice(&audioPnpUevent);
1070 EXPECT_EQ(ret, SUCCESS);
1071 }
1072
1073 /**
1074 * @tc.name : Test AudioSocketThread.
1075 * @tc.number: AudioSocketThread_040
1076 * @tc.desc : Test AudioHDMIDetectDevice
1077 */
1078 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_040, TestSize.Level1)
1079 {
1080 AudioSocketThread audioSocketThread;
1081 // Test case 1: Invalid parameter (NULL audioPnpUevent)
1082 {
1083 int32_t result = audioSocketThread.AudioHDMIDetectDevice(nullptr);
1084 EXPECT_EQ(result, HDF_ERR_INVALID_PARAM);
1085 }
1086 // Test case 2: Invalid subSystem
1087 {
1088 AudioPnpUevent uevent = {
1089 .subSystem = "invalid",
1090 .switchName = "hdmi_mipi_audio",
1091 .action = "change",
1092 .switchState = "1"
1093 };
1094 int32_t result = audioSocketThread.AudioHDMIDetectDevice(&uevent);
1095 EXPECT_EQ(result, HDF_ERR_INVALID_PARAM);
1096 }
1097 // Test case 3: Invalid switchName
1098 {
1099 AudioPnpUevent uevent = {
1100 .subSystem = "switch",
1101 .switchName = "invalid",
1102 .action = "change",
1103 .switchState = "1"
1104 };
1105 int32_t result = audioSocketThread.AudioHDMIDetectDevice(&uevent);
1106 EXPECT_EQ(result, HDF_ERR_INVALID_PARAM);
1107 }
1108 }
1109
1110 /**
1111 * @tc.name : Test AudioSocketThread.
1112 * @tc.number: AudioSocketThread_041
1113 * @tc.desc : Test AudioHDMIDetectDevice
1114 */
1115 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_041, TestSize.Level1)
1116 {
1117 AudioSocketThread audioSocketThread;
1118 // Test case 4: Invalid action
1119 {
1120 AudioPnpUevent uevent = {
1121 .subSystem = "switch",
1122 .switchName = "hdmi_mipi_audio",
1123 .action = "invalid",
1124 .switchState = "1"
1125 };
1126 int32_t result = audioSocketThread.AudioHDMIDetectDevice(&uevent);
1127 EXPECT_EQ(result, HDF_ERR_INVALID_PARAM);
1128 }
1129 // Test case 5: Device Add Event
1130 {
1131 AudioPnpUevent uevent = {
1132 .subSystem = "switch",
1133 .switchName = "hdmi_mipi_audio,device_port=HDMI-0",
1134 .action = "change",
1135 .switchState = "1"
1136 };
1137 int32_t result = audioSocketThread.AudioHDMIDetectDevice(&uevent);
1138 EXPECT_EQ(result, SUCCESS);
1139 // Additional checks can be added here to verify the internal state
1140 }
1141 // Test case 6: Device Remove Event
1142 {
1143 AudioPnpUevent uevent = {
1144 .subSystem = "switch",
1145 .switchName = "hdmi_mipi_audio,device_port=HDMI-0",
1146 .action = "change",
1147 .switchState = "0"
1148 };
1149 int32_t result = audioSocketThread.AudioHDMIDetectDevice(&uevent);
1150 EXPECT_EQ(result, SUCCESS);
1151 // Additional checks can be added here to verify the internal state
1152 }
1153 }
1154
1155 /**
1156 * @tc.name : Test AudioSocketThread.
1157 * @tc.number: AudioSocketThread_042
1158 * @tc.desc : Test AudioHDMIDetectDevice
1159 */
1160 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_042, TestSize.Level1)
1161 {
1162 AudioSocketThread audioSocketThread;
1163 // Test case 7: Invalid switchState
1164 {
1165 AudioPnpUevent uevent = {
1166 .subSystem = "switch",
1167 .switchName = "hdmi_mipi_audio,device_port=HDMI-0",
1168 .action = "change",
1169 .switchState = "invalid"
1170 };
1171 int32_t result = audioSocketThread.AudioHDMIDetectDevice(&uevent);
1172 EXPECT_EQ(result, ERROR);
1173 }
1174 // Test case 8: No device_port in switchName
1175 {
1176 AudioPnpUevent uevent = {
1177 .subSystem = "switch",
1178 .switchName = "hdmi_mipi_audio,",
1179 .action = "change",
1180 .switchState = "1"
1181 };
1182 int32_t result = audioSocketThread.AudioHDMIDetectDevice(&uevent);
1183 EXPECT_EQ(result, SUCCESS);
1184 }
1185 }
1186
1187 /**
1188 * @tc.name : Test AudioSocketThread.
1189 * @tc.number: AudioSocketThread_043
1190 * @tc.desc : Test AudioAnalogHeadsetDetectDevice when device state is the same, should early return.
1191 */
1192 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_043, TestSize.Level4)
1193 {
1194 AudioSocketThread audioSocketThread;
1195
1196 AudioPnpUevent ueventInit = {
1197 .action = "add",
1198 .name = "SameDevice",
1199 .state = "added",
1200 .devType = "headset",
1201 .subSystem = "switch",
1202 .switchName = "h2w",
1203 .switchState = "1",
1204 .hidName = "hid",
1205 .devName = "SameDevAddress",
1206 .anahsName = "SameAnahs"
1207 };
1208
1209 auto ret = audioSocketThread.AudioAnalogHeadsetDetectDevice(&ueventInit);
1210 EXPECT_EQ(ret, SUCCESS);
1211 EXPECT_EQ(audioSocketThread.AudioAnalogHeadsetDetectDevice(&ueventInit), SUCCESS);
1212 }
1213
1214 /**
1215 * @tc.name : DetectAnalogHeadsetState_Headset_Remove
1216 * @tc.number: Audio_AudioSocketThread_DetectAnalogHeadsetState_003
1217 * @tc.desc : Test DetectAnalogHeadsetState function when headset is removed.
1218 */
1219 HWTEST_F(AudioSocketThreadUnitTest, DetectAnalogHeadsetState_Headset_Remove, TestSize.Level0)
1220 {
1221 AudioEvent audioEvent;
1222 // Act
1223 int32_t ret = audioSocketThread_.DetectAnalogHeadsetState(&audioEvent);
1224
1225 // Assert
1226 EXPECT_EQ(ret, HDF_ERR_INVALID_PARAM);
1227 }
1228
1229 /**
1230 * @tc.name : DetectDPState_Success_WhenStateAndNameValid
1231 * @tc.number: AudioSocketThreadTest_001
1232 * @tc.desc : Test DetectDPState function when state and name are valid.
1233 */
1234 HWTEST_F(AudioSocketThreadUnitTest, DetectDPState_Success_WhenStateAndNameValid, TestSize.Level0)
1235 {
1236 AudioEvent audioEvent;
1237 // Arrange
1238 audioEvent.eventType = PNP_EVENT_DEVICE_ADD;
1239 audioEvent.name = "testName";
1240
1241 // Act
1242 int32_t result = audioSocketThread_.DetectDPState(&audioEvent);
1243
1244 // Assert
1245 EXPECT_NE(result, SUCCESS);
1246 EXPECT_EQ(audioEvent.deviceType, 0);
1247 EXPECT_EQ(audioEvent.address, "");
1248 }
1249
1250 /**
1251 * @tc.name : DetectDPState_Fail_WhenStateInvalid
1252 * @tc.number: AudioSocketThreadTest_002
1253 * @tc.desc : Test DetectDPState function when state is invalid.
1254 */
1255 HWTEST_F(AudioSocketThreadUnitTest, DetectDPState_Fail_WhenStateInvalid, TestSize.Level0)
1256 {
1257 AudioEvent audioEvent;
1258 // Arrange
1259 audioEvent.eventType = PNP_EVENT_DEVICE_ADD;
1260 audioEvent.name = "testName";
1261
1262 // Act
1263 int32_t result = audioSocketThread_.DetectDPState(&audioEvent);
1264
1265 // Assert
1266 EXPECT_EQ(result, ERROR);
1267 }
1268
1269 /**
1270 * @tc.name : ReadAndScanDpState_Success_WhenFileContains1
1271 * @tc.number: Audio_AudioSocketThread_ReadAndScanDpState_001
1272 * @tc.desc : Test ReadAndScanDpState function when file contains '1'
1273 */
1274 HWTEST_F(AudioSocketThreadUnitTest, ReadAndScanDpState_Success_WhenFileContains1, TestSize.Level0)
1275 {
1276 std::string testPath = "/tmp/test_path";
1277 // Given
1278 std::ofstream file(testPath);
1279 file << '1';
1280 file.close();
1281
1282 uint32_t eventType;
1283 // When
1284 int32_t ret = audioSocketThread_.ReadAndScanDpState(testPath, eventType);
1285
1286 // Then
1287 EXPECT_EQ(ret, SUCCESS);
1288 EXPECT_EQ(eventType, PNP_EVENT_DEVICE_ADD);
1289 }
1290
1291 /**
1292 * @tc.name : ReadAndScanDpState_Failure_WhenFileContainsInvalidChar
1293 * @tc.number: Audio_AudioSocketThread_ReadAndScanDpState_002
1294 * @tc.desc : Test ReadAndScanDpState function when file contains invalid character (not '1' or '0')
1295 */
1296 HWTEST_F(AudioSocketThreadUnitTest, ReadAndScanDpState_Failure_WhenFileContainsInvalidChar, TestSize.Level4)
1297 {
1298 std::string testPath = "/tmp/test_path_invalid";
1299
1300 std::ofstream file(testPath);
1301 file << 'x';
1302 file.close();
1303
1304 uint32_t eventType = 0;
1305 int32_t ret = audioSocketThread_.ReadAndScanDpState(testPath, eventType);
1306
1307 EXPECT_EQ(ret, ERROR);
1308 }
1309
1310 /**
1311 * @tc.name : AudioNnDetectDevice_InvalidParam_Test
1312 * @tc.number: Audio_AudioSocketThread_AudioNnDetectDevice_001
1313 * @tc.desc : Test AudioNnDetectDevice function with invalid parameters.
1314 */
1315 HWTEST_F(AudioSocketThreadUnitTest, AudioNnDetectDevice_InvalidParam_Test, TestSize.Level2)
1316 {
1317 EXPECT_EQ(audioSocketThread_.AudioNnDetectDevice(NULL), -3);
1318 struct AudioPnpUevent audioPnpUevent;
1319 audioPnpUevent.action = "add";
1320 audioPnpUevent.name = "send_nn_state1";
1321 EXPECT_EQ(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), -3);
1322 audioPnpUevent.action = "change";
1323 audioPnpUevent.name = "test_send_nn_state1";
1324 EXPECT_EQ(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), -3);
1325 }
1326
1327 /**
1328 * @tc.name : AudioNnDetectDevice_ValidParam_Test
1329 * @tc.number: Audio_AudioSocketThread_AudioNnDetectDevice_002
1330 * @tc.desc : Test AudioNnDetectDevice function with valid parameters.
1331 */
1332 HWTEST_F(AudioSocketThreadUnitTest, AudioNnDetectDevice_ValidParam_Test, TestSize.Level2)
1333 {
1334 struct AudioPnpUevent audioPnpUevent;
1335 audioPnpUevent.action = "change";
1336 audioPnpUevent.name = "send_nn_state1";
1337 EXPECT_NE(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), SUCCESS);
1338 }
1339
1340 /**
1341 * @tc.name : AudioNnDetectDevice_StateNotSupported_Test
1342 * @tc.number: Audio_AudioSocketThread_AudioNnDetectDevice_003
1343 * @tc.desc : Test AudioNnDetectDevice function with state not supported.
1344 */
1345 HWTEST_F(AudioSocketThreadUnitTest, AudioNnDetectDevice_StateNotSupported_Test, TestSize.Level2)
1346 {
1347 struct AudioPnpUevent audioPnpUevent;
1348 audioPnpUevent.action = "change";
1349 audioPnpUevent.name = "send_nn_state00";
1350 EXPECT_NE(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), SUCCESS);
1351 }
1352
1353 /**
1354 * @tc.name : AudioNnDetectDevice_StateNnOff_Test
1355 * @tc.number: Audio_AudioSocketThread_AudioNnDetectDevice_004
1356 * @tc.desc : Test AudioNnDetectDevice function with state nn off.
1357 */
1358 HWTEST_F(AudioSocketThreadUnitTest, AudioNnDetectDevice_StateNnOff_Test, TestSize.Level2)
1359 {
1360 struct AudioPnpUevent audioPnpUevent;
1361 audioPnpUevent.action = "change";
1362 audioPnpUevent.name = "send_nn_state01";
1363 EXPECT_EQ(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), STATE_NN_OFF);
1364 }
1365
1366 /**
1367 * @tc.name : AudioNnDetectDevice_StateNnOn_Test
1368 * @tc.number: Audio_AudioSocketThread_AudioNnDetectDevice_005
1369 * @tc.desc : Test AudioNnDetectDevice function with state nn on.
1370 */
1371 HWTEST_F(AudioSocketThreadUnitTest, AudioNnDetectDevice_StateNnOn_Test, TestSize.Level2)
1372 {
1373 struct AudioPnpUevent audioPnpUevent;
1374 audioPnpUevent.action = "change";
1375 audioPnpUevent.name = "send_nn_state02";
1376 EXPECT_NE(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), SUCCESS);
1377 }
1378
1379 /**
1380 * @tc.name : AudioNnDetectDevice_InvalidState_Test
1381 * @tc.number: Audio_AudioSocketThread_AudioNnDetectDevice_006
1382 * @tc.desc : Test AudioNnDetectDevice function with invalid state.
1383 */
1384 HWTEST_F(AudioSocketThreadUnitTest, AudioNnDetectDevice_InvalidState_Test, TestSize.Level2)
1385 {
1386 struct AudioPnpUevent audioPnpUevent;
1387 audioPnpUevent.action = "change";
1388 audioPnpUevent.name = "send_nn_state04";
1389 EXPECT_EQ(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), HDF_ERR_INVALID_PARAM);
1390 }
1391
1392 /**
1393 * @tc.name : AudioNnDetectDevice_SendNnStateChangeCallback_Failed_Test
1394 * @tc.number: Audio_AudioSocketThread_AudioNnDetectDevice_007
1395 * @tc.desc : Test AudioNnDetectDevice function with failed SendNnStateChangeCallback.
1396 */
1397 HWTEST_F(AudioSocketThreadUnitTest, AudioNnDetectDevice_SendNnStateChangeCallback_Failed_Test, TestSize.Level2)
1398 {
1399 struct AudioPnpUevent audioPnpUevent;
1400 audioPnpUevent.action = "change";
1401 audioPnpUevent.name = "send_nn_state03";
1402 EXPECT_EQ(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), HDF_ERR_INVALID_PARAM);
1403 }
1404
1405 /**
1406 * @tc.name : AudioPnpUeventParse_Test_01
1407 * @tc.number: Audio_AudioPnpUeventParse_001
1408 * @tc.desc : Test AudioPnpUeventParse function when msg starts with "libudev"
1409 */
1410 HWTEST_F(AudioSocketThreadUnitTest, Audio_AudioPnpUeventParse_001, TestSize.Level0)
1411 {
1412 const char *msg = "libudev";
1413 ssize_t strLength = strlen(msg);
1414 EXPECT_FALSE(audioSocketThread_.AudioPnpUeventParse(msg, strLength));
1415 }
1416
1417 /**
1418 * @tc.name : AudioPnpUeventParse_Test_02
1419 * @tc.number: Audio_AudioPnpUeventParse_002
1420 * @tc.desc : Test AudioPnpUeventParse function when strLength > UEVENT_MSG_LEN + 1
1421 */
1422 HWTEST_F(AudioSocketThreadUnitTest, Audio_AudioPnpUeventParse_002, TestSize.Level0)
1423 {
1424 const char *msg = "test message";
1425 ssize_t strLength = UEVENT_MSG_LEN + 2;
1426 EXPECT_FALSE(audioSocketThread_.AudioPnpUeventParse(msg, strLength));
1427 }
1428
1429 /**
1430 * @tc.name : AudioPnpUeventParse_Test_03
1431 * @tc.number: Audio_AudioPnpUeventParse_003
1432 * @tc.desc : Test AudioPnpUeventParse function when no matching UEVENT_ARR_SIZE is found
1433 */
1434 HWTEST_F(AudioSocketThreadUnitTest, Audio_AudioPnpUeventParse_003, TestSize.Level0)
1435 {
1436 const char *msg = "unmatched event";
1437 ssize_t strLength = strlen(msg);
1438 EXPECT_FALSE(audioSocketThread_.AudioPnpUeventParse(msg, strLength));
1439 }
1440
1441 /**
1442 * @tc.name : AudioPnpUeventParse_Test_04
1443 * @tc.number: Audio_AudioPnpUeventParse_004
1444 * @tc.desc : Test AudioPnpUeventParse function when all detect devices return SUCCESS
1445 */
1446 HWTEST_F(AudioSocketThreadUnitTest, Audio_AudioPnpUeventParse_004, TestSize.Level0)
1447 {
1448 const char *msg = "matched event";
1449 ssize_t strLength = strlen(msg);
1450 EXPECT_FALSE(audioSocketThread_.AudioPnpUeventParse(msg, strLength));
1451 }
1452
1453 /**
1454 * @tc.name : AudioPnpUeventParse_Test_05
1455 * @tc.number: Audio_AudioPnpUeventParse_005
1456 * @tc.desc : Cover branch where *msgTmp == '\0' to test skip behavior
1457 */
1458 HWTEST_F(AudioSocketThreadUnitTest, Audio_AudioPnpUeventParse_005, TestSize.Level4)
1459 {
1460 AudioSocketThread audioSocketThread;
1461
1462 std::vector<char> msgVec;
1463 const char *seg1 = "ACTION=change";
1464 const char *seg2 = "";
1465 const char *seg3 = "NAME=mic_blocked";
1466 msgVec.insert(msgVec.end(), seg1, seg1 + strlen(seg1) + 1);
1467 msgVec.insert(msgVec.end(), seg2, seg2 + strlen(seg2) + 1);
1468 msgVec.insert(msgVec.end(), seg3, seg3 + strlen(seg3) + 1);
1469
1470 ssize_t strLength = msgVec.size();
1471 const char *msg = msgVec.data();
1472
1473 EXPECT_EQ(audioSocketThread.AudioPnpUeventParse(msg, strLength), true);
1474 }
1475
1476 /**
1477 * @tc.name : DetectAnalogHeadsetState_Fail_OpenFile
1478 * @tc.number: Audio_AudioSocketThread_DetectAnalogHeadsetState_001
1479 * @tc.desc : Test DetectAnalogHeadsetState function when open file fail.
1480 */
1481 HWTEST_F(AudioSocketThreadUnitTest, DetectAnalogHeadsetState_Fail_OpenFile, TestSize.Level0)
1482 {
1483 std::ofstream ofs;
1484 ofs.open(SWITCH_STATE_PATH, std::ofstream::out);
1485 ofs.close();
1486 unlink(SWITCH_STATE_PATH);
1487 AudioEvent audioEvent;
1488 int32_t ret = audioSocketThread_.DetectAnalogHeadsetState(&audioEvent);
1489 EXPECT_EQ(ret, HDF_ERR_INVALID_PARAM);
1490 }
1491
1492 /**
1493 * @tc.name : DetectAnalogHeadsetState_Fail_ReadFile
1494 * @tc.number: Audio_AudioSocketThread_DetectAnalogHeadsetState_002
1495 * @tc.desc : Test DetectAnalogHeadsetState function when read file fail.
1496 */
1497 HWTEST_F(AudioSocketThreadUnitTest, DetectAnalogHeadsetState_Fail_ReadFile, TestSize.Level0)
1498 {
1499 std::ofstream ofs(SWITCH_STATE_PATH);
1500 ofs.close();
1501 AudioEvent audioEvent;
1502 int32_t ret = audioSocketThread_.DetectAnalogHeadsetState(&audioEvent);
1503 EXPECT_NE(ret, SUCCESS);
1504 }
1505
1506 /**
1507 * @tc.name : DetectAnalogHeadsetState_Headset_Remove_003
1508 * @tc.number: Audio_AudioSocketThread_DetectAnalogHeadsetState_003
1509 * @tc.desc : Test DetectAnalogHeadsetState function when headset is removed.
1510 */
1511 HWTEST_F(AudioSocketThreadUnitTest, DetectAnalogHeadsetState_Headset_Remove_003, TestSize.Level0)
1512 {
1513 AudioEvent audioEvent;
1514 audioSocketThread_.SetAudioPnpUevent(&audioEvent, REMOVE_AUDIO_DEVICE);
1515 EXPECT_EQ(audioEvent.eventType, PNP_EVENT_DEVICE_REMOVE);
1516 }
1517
1518 /**
1519 * @tc.name : DetectAnalogHeadsetState_Headset_Add_004
1520 * @tc.number: Audio_AudioSocketThread_DetectAnalogHeadsetState_004
1521 * @tc.desc : Test DetectAnalogHeadsetState function when headset is added.
1522 */
1523 HWTEST_F(AudioSocketThreadUnitTest, DetectAnalogHeadsetState_Headset_Add_004, TestSize.Level0)
1524 {
1525 AudioEvent audioEvent;
1526 audioSocketThread_.SetAudioPnpUevent(&audioEvent, ADD_DEVICE_HEADSET);
1527 EXPECT_EQ(audioEvent.eventType, PNP_EVENT_DEVICE_ADD);
1528 }
1529
1530 /**
1531 * @tc.name : ReadAndScanDpName_Success_WhenFileExists
1532 * @tc.number: Audio_AudioSocketThread_ReadAndScanDpName_001
1533 * @tc.desc : Test ReadAndScanDpName function when file exists and can be read successfully.
1534 */
1535 HWTEST_F(AudioSocketThreadUnitTest, ReadAndScanDpName_Success_WhenFileExists, TestSize.Level0)
1536 {
1537 std::string testPath = "/tmp/test_path";
1538 std::string testName = "test_name";
1539 std::ofstream file(testPath);
1540 file << testName;
1541 file.close();
1542 std::string name;
1543 int32_t ret = audioSocketThread_.ReadAndScanDpName(testPath, name);
1544 EXPECT_EQ(ret, ERROR);
1545 remove(testPath.c_str());
1546 }
1547
1548 /**
1549 * @tc.name : ReadAndScanDpName_Fail_WhenFileNotExists
1550 * @tc.number: Audio_AudioSocketThread_ReadAndScanDpName_002
1551 * @tc.desc : Test ReadAndScanDpName function when file does not exist.
1552 */
1553 HWTEST_F(AudioSocketThreadUnitTest, ReadAndScanDpName_Fail_WhenFileNotExists, TestSize.Level0)
1554 {
1555 std::string testPath = "/tmp/test_path";
1556 std::string testName = "test_name";
1557 std::ofstream file(testPath);
1558 file << testName;
1559 file.close();
1560 std::string name;
1561 int32_t ret = audioSocketThread_.ReadAndScanDpName("/invalid/path", name);
1562 EXPECT_EQ(ret, HDF_ERR_INVALID_PARAM);
1563 remove(testPath.c_str());
1564 }
1565
1566 /**
1567 * @tc.name : ReadAndScanDpName_Fail_WhenFileReadFails
1568 * @tc.number: Audio_AudioSocketThread_ReadAndScanDpName_003
1569 * @tc.desc : Test ReadAndScanDpName function when file read fails.
1570 */
1571 HWTEST_F(AudioSocketThreadUnitTest, ReadAndScanDpName_Fail_WhenFileReadFails, TestSize.Level0)
1572 {
1573 std::string testPath = "/tmp/test_path";
1574 std::string testName = "test_name";
1575 std::ofstream file(testPath);
1576 file << testName;
1577 file.close();
1578 std::string name;
1579 int32_t ret = audioSocketThread_.ReadAndScanDpName("/dev/null", name);
1580 EXPECT_EQ(ret, ERROR);
1581 remove(testPath.c_str());
1582 }
1583
1584 /**
1585 * @tc.name : ReadAndScanDpName_Fail_WhenDevicePortNotFound
1586 * @tc.number: Audio_AudioSocketThread_ReadAndScanDpName_004
1587 * @tc.desc : Test ReadAndScanDpName function when device port not found in file content.
1588 */
1589 HWTEST_F(AudioSocketThreadUnitTest, ReadAndScanDpName_Fail_WhenDevicePortNotFound, TestSize.Level0)
1590 {
1591 std::string testName = "invalid_name";
1592 std::string testPath = "/tmp/test_path";
1593 std::ofstream file(testPath);
1594 file << testName;
1595 file.close();
1596
1597 std::string name;
1598 int32_t ret = audioSocketThread_.ReadAndScanDpName(testPath, name);
1599 EXPECT_NE(ret, SUCCESS);
1600 remove(testPath.c_str());
1601 }
1602
1603 /**
1604 * @tc.name : ReadAndScanDpName_Success_WhenDevicePortFound
1605 * @tc.number: Audio_AudioSocketThread_ReadAndScanDpName_005
1606 * @tc.desc : Test ReadAndScanDpName function when device port string exists and ends with '\n'.
1607 */
1608 HWTEST_F(AudioSocketThreadUnitTest, ReadAndScanDpName_Success_WhenDevicePortFound, TestSize.Level4)
1609 {
1610 std::string testPath = "/tmp/test_path";
1611 std::string testContent = "some_prefix" + std::string(DEVICE_PORT) + "dp-name\n";
1612 std::ofstream file(testPath);
1613 file << testContent;
1614 file.close();
1615
1616 std::string name;
1617 int32_t ret = audioSocketThread_.ReadAndScanDpName(testPath, name);
1618
1619 EXPECT_EQ(ret, SUCCESS);
1620 EXPECT_EQ(name, "dp-name");
1621 remove(testPath.c_str());
1622 }
1623
1624 /**
1625 * @tc.name : Test AudioSocketThread
1626 * @tc.number: AudioSocketThread_101
1627 * @tc.desc : Test AudioSocketThread
1628 */
1629 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_101, TestSize.Level0)
1630 {
1631 auto audioSocketThread = std::make_shared<AudioSocketThread>();
1632 EXPECT_NE(audioSocketThread, nullptr);
1633
1634 struct AudioPnpUevent *audioPnpUevent = nullptr;
1635 auto ret = audioSocketThread->AudioMicBlockDevice(audioPnpUevent);
1636 EXPECT_EQ(ret, HDF_ERR_INVALID_PARAM);
1637 }
1638
1639 /**
1640 * @tc.name : Test AudioSocketThread
1641 * @tc.number: AudioSocketThread_102
1642 * @tc.desc : Test AudioSocketThread
1643 */
1644 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_102, TestSize.Level0)
1645 {
1646 auto audioSocketThread = std::make_shared<AudioSocketThread>();
1647 EXPECT_NE(audioSocketThread, nullptr);
1648
1649 struct AudioPnpUevent *audioPnpUevent = new AudioPnpUevent();
1650 EXPECT_NE(audioPnpUevent, nullptr);
1651 audioPnpUevent->name = "mic_blocked";
1652 auto ret = audioSocketThread->AudioMicBlockDevice(audioPnpUevent);
1653 EXPECT_EQ(ret, SUCCESS);
1654
1655 if (audioPnpUevent != nullptr) {
1656 delete audioPnpUevent;
1657 audioPnpUevent = nullptr;
1658 }
1659 }
1660
1661 /**
1662 * @tc.name : Test AudioSocketThread
1663 * @tc.number: AudioSocketThread_103
1664 * @tc.desc : Test AudioMicBlockDevice with "mic_un_blocked"
1665 */
1666 HWTEST_F(AudioSocketThreadUnitTest, AudioSocketThread_103, TestSize.Level4)
1667 {
1668 auto audioSocketThread = std::make_shared<AudioSocketThread>();
1669 EXPECT_NE(audioSocketThread, nullptr);
1670
1671 struct AudioPnpUevent *audioPnpUevent = new AudioPnpUevent();
1672 EXPECT_NE(audioPnpUevent, nullptr);
1673 audioPnpUevent->name = "mic_un_blocked";
1674 int32_t ret = audioSocketThread->AudioMicBlockDevice(audioPnpUevent);
1675 EXPECT_EQ(ret, SUCCESS);
1676 delete audioPnpUevent;
1677 }
1678 } // namespace AudioStandard
1679 } // namespace OHOS
1680