VirtualBox

source: vbox/trunk/src/VBox/Devices/Audio/testcase/tstAudioTestService.cpp@ 90778

Last change on this file since 90778 was 90555, checked in by vboxsync, 3 years ago

Audio/ValKit: Try harder finding a free service port in tstAudioTestService(). ​bugref:10008

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.1 KB
Line 
1/* $Id: tstAudioTestService.cpp 90555 2021-08-06 15:42:16Z vboxsync $ */
2/** @file
3 * Audio testcase - Tests for the Audio Test Service (ATS).
4 */
5
6/*
7 * Copyright (C) 2021 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*********************************************************************************************************************************
20* Header Files *
21*********************************************************************************************************************************/
22
23#include <iprt/errcore.h>
24#include <iprt/file.h>
25#include <iprt/initterm.h>
26#include <iprt/mem.h>
27#include <iprt/rand.h>
28#include <iprt/stream.h>
29#include <iprt/string.h>
30#include <iprt/test.h>
31
32#include "../AudioTestService.h"
33#include "../AudioTestServiceClient.h"
34
35
36static size_t g_cToRead = _1M;
37static size_t g_cbRead = 0;
38
39
40/** @copydoc ATSCALLBACKS::pfnTestSetSendRead */
41static DECLCALLBACK(int) tstTestSetSendReadCallback(void const *pvUser,
42 const char *pszTag, void *pvBuf, size_t cbBuf, size_t *pcbRead)
43{
44 RT_NOREF(pvUser, pszTag);
45
46 size_t cbToRead = RT_MIN(g_cToRead - g_cbRead, cbBuf);
47 if (cbToRead)
48 {
49 memset(pvBuf, 0x42, cbToRead);
50 g_cbRead += cbToRead;
51 }
52
53 *pcbRead = cbToRead;
54
55 return VINF_SUCCESS;
56}
57
58int main(int argc, char **argv)
59{
60 RTR3InitExe(argc, &argv, 0);
61
62 /*
63 * Initialize IPRT and create the test.
64 */
65 RTTEST hTest;
66 int rc = RTTestInitAndCreate("tstAudioTestService", &hTest);
67 if (rc)
68 return rc;
69 RTTestBanner(hTest);
70
71 ATSCALLBACKS Callbacks;
72 RT_ZERO(Callbacks);
73 Callbacks.pfnTestSetSendRead = tstTestSetSendReadCallback;
74
75 ATSCLIENT Client;
76
77 ATSSERVER Srv;
78 rc = AudioTestSvcCreate(&Srv);
79 RTTEST_CHECK_RC_OK(hTest, rc);
80 if (RT_SUCCESS(rc))
81 {
82 RTGETOPTUNION Val;
83 RT_ZERO(Val);
84
85 Val.psz = "server";
86 rc = AudioTestSvcHandleOption(&Srv, ATSTCPOPT_MODE, &Val);
87 RTTEST_CHECK_RC_OK(hTest, rc);
88
89 rc = AudioTestSvcInit(&Srv, &Callbacks);
90 RTTEST_CHECK_RC_OK(hTest, rc);
91 if (RT_SUCCESS(rc))
92 {
93 uint16_t uPort = ATS_TCP_DEF_BIND_PORT_HOST;
94
95 for (unsigned i = 0; i < 64; i++)
96 {
97 Val.u16 = uPort;
98 rc = AudioTestSvcHandleOption(&Srv, ATSTCPOPT_BIND_PORT, &Val);
99 RTTEST_CHECK_RC_OK(hTest, rc);
100
101 rc = AudioTestSvcStart(&Srv);
102 if (RT_SUCCESS(rc))
103 break;
104
105 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Port %RU32 already used\n", uPort);
106
107 /* Use a different port base in case VBox already is running
108 * with the same service using ATS_TCP_DEF_BIND_PORT_HOST. */
109 uPort = ATS_TCP_DEF_BIND_PORT_HOST + RTRandU32Ex(0, 4242);
110 }
111
112 if (RT_SUCCESS(rc))
113 {
114 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "Using port %RU32\n", uPort);
115
116 rc = AudioTestSvcClientCreate(&Client);
117 RTTEST_CHECK_RC_OK(hTest, rc);
118
119 Val.psz = "client";
120 rc = AudioTestSvcClientHandleOption(&Client, ATSTCPOPT_MODE, &Val);
121 RTTEST_CHECK_RC_OK(hTest, rc);
122
123 Val.psz = ATS_TCP_DEF_CONNECT_HOST_ADDR_STR;
124 rc = AudioTestSvcClientHandleOption(&Client, ATSTCPOPT_CONNECT_ADDRESS, &Val);
125 RTTEST_CHECK_RC_OK(hTest, rc);
126
127 Val.u16 = uPort;
128 rc = AudioTestSvcClientHandleOption(&Client, ATSTCPOPT_CONNECT_PORT, &Val);
129 RTTEST_CHECK_RC_OK(hTest, rc);
130
131 rc = AudioTestSvcClientConnect(&Client);
132 RTTEST_CHECK_RC_OK(hTest, rc);
133 }
134 }
135 }
136
137 if (RT_SUCCESS(rc))
138 {
139 char szTemp[RTPATH_MAX];
140 rc = RTPathTemp(szTemp, sizeof(szTemp));
141 RTTEST_CHECK_RC_OK(hTest, rc);
142 if (RT_SUCCESS(rc))
143 {
144 char szName[RTPATH_MAX];
145 RTTESTI_CHECK_RC(rc = RTStrCopy(szName, sizeof(szName), szTemp), VINF_SUCCESS);
146 RTTESTI_CHECK_RC(rc = RTPathAppend(szName, sizeof(szName), "tstAudioTestService-XXXXX"), VINF_SUCCESS);
147 if (RT_SUCCESS(rc))
148 {
149 rc = AudioTestSvcClientTestSetDownload(&Client, "ignored", szName);
150 RTTEST_CHECK_RC_OK(hTest, rc);
151
152 /* ignore rc */ RTFileDelete(szName);
153 }
154 }
155 }
156
157 rc = AudioTestSvcClientClose(&Client);
158 RTTEST_CHECK_RC_OK(hTest, rc);
159
160 rc = AudioTestSvcShutdown(&Srv);
161 RTTEST_CHECK_RC_OK(hTest, rc);
162
163 /*
164 * Summary
165 */
166 return RTTestSummaryAndDestroy(hTest);
167}
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use