VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTMp-1.cpp@ 62570

Last change on this file since 62570 was 62477, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 9.2 KB
Line 
1/* $Id: tstRTMp-1.cpp 62477 2016-07-22 18:27:37Z vboxsync $ */
2/** @file
3 * IPRT Testcase - RTMp.
4 */
5
6/*
7 * Copyright (C) 2008-2016 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 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*********************************************************************************************************************************
29* Header Files *
30*********************************************************************************************************************************/
31#include <iprt/mp.h>
32#include <iprt/cpuset.h>
33#include <iprt/err.h>
34#include <iprt/string.h>
35#include <iprt/test.h>
36
37
38
39int main()
40{
41 RTTEST hTest;
42 RTEXITCODE rcExit = RTTestInitAndCreate("tstRTMp-1", &hTest);
43 if (rcExit != RTEXITCODE_SUCCESS)
44 return rcExit;
45 RTTestBanner(hTest);
46
47 /*
48 * Present and possible CPUs.
49 */
50 RTCPUID cCpus = RTMpGetCount();
51 if (cCpus > 0)
52 RTTestIPrintf(RTTESTLVL_ALWAYS, "RTMpGetCount -> %u\n", cCpus);
53 else
54 {
55 RTTestIFailed("RTMpGetCount returned zero");
56 cCpus = 1;
57 }
58
59 RTCPUID cCoreCpus = RTMpGetCoreCount();
60 if (cCoreCpus > 0)
61 RTTestIPrintf(RTTESTLVL_ALWAYS, "RTMpGetCoreCount -> %d\n", (int)cCoreCpus);
62 else
63 {
64 RTTestIFailed("RTMpGetCoreCount returned zero");
65 cCoreCpus = 1;
66 }
67 RTTESTI_CHECK(cCoreCpus <= cCpus);
68
69 RTCPUSET Set;
70 PRTCPUSET pSet = RTMpGetSet(&Set);
71 RTTESTI_CHECK(pSet == &Set);
72 if (pSet == &Set)
73 {
74 RTTESTI_CHECK((RTCPUID)RTCpuSetCount(&Set) == cCpus);
75
76 RTTestIPrintf(RTTESTLVL_ALWAYS, "Possible CPU mask:\n");
77 for (int iCpu = 0; iCpu < RTCPUSET_MAX_CPUS; iCpu++)
78 {
79 RTCPUID idCpu = RTMpCpuIdFromSetIndex(iCpu);
80 if (RTCpuSetIsMemberByIndex(&Set, iCpu))
81 {
82 RTTestIPrintf(RTTESTLVL_ALWAYS, "%2d - id %d: %u/%u MHz", iCpu, (int)idCpu,
83 RTMpGetCurFrequency(idCpu), RTMpGetMaxFrequency(idCpu));
84 if (RTMpIsCpuPresent(idCpu))
85 RTTestIPrintf(RTTESTLVL_ALWAYS, RTMpIsCpuOnline(idCpu) ? " online\n" : " offline\n");
86 else
87 {
88 if (!RTMpIsCpuOnline(idCpu))
89 RTTestIPrintf(RTTESTLVL_ALWAYS, " absent\n");
90 else
91 {
92 RTTestIPrintf(RTTESTLVL_ALWAYS, " online but absent!\n");
93 RTTestIFailed("Cpu with index %d is report as !RTIsCpuPresent while RTIsCpuOnline returns true!\n", iCpu);
94 }
95 }
96 if (!RTMpIsCpuPossible(idCpu))
97 RTTestIFailed("Cpu with index %d is returned by RTCpuSet but not RTMpIsCpuPossible!\n", iCpu);
98 }
99 else if (RTMpIsCpuPossible(idCpu))
100 RTTestIFailed("Cpu with index %d is returned by RTMpIsCpuPossible but not RTCpuSet!\n", iCpu);
101 else if (RTMpGetCurFrequency(idCpu) != 0)
102 RTTestIFailed("RTMpGetCurFrequency(%d[idx=%d]) didn't return 0 as it should\n", (int)idCpu, iCpu);
103 else if (RTMpGetMaxFrequency(idCpu) != 0)
104 RTTestIFailed("RTMpGetMaxFrequency(%d[idx=%d]) didn't return 0 as it should\n", (int)idCpu, iCpu);
105 }
106 }
107 else
108 {
109 RTCpuSetEmpty(&Set);
110 RTCpuSetAdd(&Set, RTMpCpuIdFromSetIndex(0));
111 }
112
113 /*
114 * Online CPUs.
115 */
116 RTCPUID cCpusOnline = RTMpGetOnlineCount();
117 if (cCpusOnline > 0)
118 {
119 if (cCpusOnline <= cCpus)
120 RTTestIPrintf(RTTESTLVL_ALWAYS, "RTMpGetOnlineCount -> %d\n", (int)cCpusOnline);
121 else
122 {
123 RTTestIFailed("RTMpGetOnlineCount -> %d, expected <= %d\n", (int)cCpusOnline, (int)cCpus);
124 cCpusOnline = cCpus;
125 }
126 }
127 else
128 {
129 RTTestIFailed("RTMpGetOnlineCount -> %d\n", (int)cCpusOnline);
130 cCpusOnline = 1;
131 }
132
133 RTCPUID cCoresOnline = RTMpGetOnlineCoreCount();
134 if (cCoresOnline > 0)
135 RTTestIPrintf(RTTESTLVL_ALWAYS, "RTMpGetOnlineCoreCount -> %d\n", (int)cCoresOnline);
136 else
137 {
138 RTTestIFailed("RTMpGetOnlineCoreCount -> %d, expected <= %d\n", (int)cCoresOnline, (int)cCpusOnline);
139 cCoresOnline = 1;
140 }
141 RTTESTI_CHECK(cCoresOnline <= cCpusOnline);
142
143 RTCPUSET SetOnline;
144 pSet = RTMpGetOnlineSet(&SetOnline);
145 if (pSet == &SetOnline)
146 {
147 if (RTCpuSetCount(&SetOnline) <= 0)
148 RTTestIFailed("RTMpGetOnlineSet returned an empty set!\n");
149 else if ((RTCPUID)RTCpuSetCount(&SetOnline) > cCpus)
150 RTTestIFailed("RTMpGetOnlineSet returned a too high value; %d, expected <= %d\n",
151 RTCpuSetCount(&SetOnline), cCpus);
152 RTTestIPrintf(RTTESTLVL_ALWAYS, "Online CPU mask:\n");
153 for (int iCpu = 0; iCpu < RTCPUSET_MAX_CPUS; iCpu++)
154 if (RTCpuSetIsMemberByIndex(&SetOnline, iCpu))
155 {
156 RTCPUID idCpu = RTMpCpuIdFromSetIndex(iCpu);
157 RTTestIPrintf(RTTESTLVL_ALWAYS, "%2d - id %d: %u/%u MHz %s\n", iCpu, (int)idCpu, RTMpGetCurFrequency(idCpu),
158 RTMpGetMaxFrequency(idCpu), RTMpIsCpuOnline(idCpu) ? "online" : "offline");
159 if (!RTCpuSetIsMemberByIndex(&Set, iCpu))
160 RTTestIFailed("online cpu with index %2d is not a member of the possible cpu set!\n", iCpu);
161 }
162
163 /* There isn't any sane way of testing RTMpIsCpuOnline really... :-/ */
164 }
165 else
166 RTTestIFailed("RTMpGetOnlineSet -> %p, expected %p\n", pSet, &Set);
167
168 /*
169 * Present CPUs.
170 */
171 RTCPUID cCpusPresent = RTMpGetPresentCount();
172 if (cCpusPresent > 0)
173 {
174 if ( cCpusPresent <= cCpus
175 && cCpusPresent >= cCpusOnline)
176 RTTestIPrintf(RTTESTLVL_ALWAYS, "RTMpGetPresentCount -> %d\n", (int)cCpusPresent);
177 else
178 RTTestIFailed("RTMpGetPresentCount -> %d, expected <= %d and >= %d\n",
179 (int)cCpusPresent, (int)cCpus, (int)cCpusOnline);
180 }
181 else
182 {
183 RTTestIFailed("RTMpGetPresentCount -> %d\n", (int)cCpusPresent);
184 cCpusPresent = 1;
185 }
186
187 RTCPUSET SetPresent;
188 pSet = RTMpGetPresentSet(&SetPresent);
189 if (pSet == &SetPresent)
190 {
191 if (RTCpuSetCount(&SetPresent) <= 0)
192 RTTestIFailed("RTMpGetPresentSet returned an empty set!\n");
193 else if ((RTCPUID)RTCpuSetCount(&SetPresent) != cCpusPresent)
194 RTTestIFailed("RTMpGetPresentSet returned a bad value; %d, expected = %d\n",
195 RTCpuSetCount(&SetPresent), cCpusPresent);
196 RTTestIPrintf(RTTESTLVL_ALWAYS, "Present CPU mask:\n");
197 for (int iCpu = 0; iCpu < RTCPUSET_MAX_CPUS; iCpu++)
198 if (RTCpuSetIsMemberByIndex(&SetPresent, iCpu))
199 {
200 RTCPUID idCpu = RTMpCpuIdFromSetIndex(iCpu);
201 RTTestIPrintf(RTTESTLVL_ALWAYS, "%2d - id %d: %u/%u MHz %s\n", iCpu, (int)idCpu, RTMpGetCurFrequency(idCpu),
202 RTMpGetMaxFrequency(idCpu), RTMpIsCpuPresent(idCpu) ? "present" : "absent");
203 if (!RTCpuSetIsMemberByIndex(&Set, iCpu))
204 RTTestIFailed("online cpu with index %2d is not a member of the possible cpu set!\n", iCpu);
205 }
206
207 /* There isn't any sane way of testing RTMpIsCpuPresent really... :-/ */
208 }
209 else
210 RTTestIFailed("RTMpGetPresentSet -> %p, expected %p\n", pSet, &Set);
211
212
213 /* Find an online cpu for the next test. */
214 RTCPUID idCpuOnline;
215 for (idCpuOnline = 0; idCpuOnline < RTCPUSET_MAX_CPUS; idCpuOnline++)
216 if (RTMpIsCpuOnline(idCpuOnline))
217 break;
218
219 /*
220 * Quick test of RTMpGetDescription.
221 */
222 char szBuf[64];
223 int rc = RTMpGetDescription(idCpuOnline, &szBuf[0], sizeof(szBuf));
224 if (RT_SUCCESS(rc))
225 {
226 RTTestIPrintf(RTTESTLVL_ALWAYS, "RTMpGetDescription -> '%s'\n", szBuf);
227
228 size_t cch = strlen(szBuf);
229 rc = RTMpGetDescription(idCpuOnline, &szBuf[0], cch);
230 if (rc != VERR_BUFFER_OVERFLOW)
231 RTTestIFailed("RTMpGetDescription -> %Rrc, expected VERR_BUFFER_OVERFLOW\n", rc);
232
233 rc = RTMpGetDescription(idCpuOnline, &szBuf[0], cch + 1);
234 if (RT_FAILURE(rc))
235 RTTestIFailed("RTMpGetDescription -> %Rrc, expected VINF_SUCCESS\n", rc);
236 }
237 else
238 RTTestIFailed("RTMpGetDescription -> %Rrc\n", rc);
239
240 return RTTestSummaryAndDestroy(hTest);
241}
242
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette