8
* Desc: Command line version of the sanity check functions found in jack
16
#include "systemtest.h"
21
typedef int (*testfuncPtr) ();
22
typedef int (*testfuncOpPtr) (string);
26
string switchText; // ie -option
27
string swOptionText; // option arguments for just this swtich.
28
string descriptionText; // Help Text on what this does
29
string failureText; // What to say when this test fails
30
bool hasOption; // Set true if this switch has option paramters
31
testfuncPtr functionPtr; // Function to call
32
testfuncOpPtr opFunctionPtr; // Function with option string to call
33
string optionArg; // Storage used to hold any options passed in by the user
36
static vector<testRecord> gTestSet;
38
static vector<string> gValidSwitchList;
39
static vector<string> gSwitchDescriptionList;
41
static vector<string> gSwitchesReceived;
48
OK &= system_user_can_rtprio();
50
if (system_has_frequencyscaling()) {
51
OK &= !system_uses_frequencyscaling();
54
OK &= !(system_memlock_amount() == 0);
62
return system_has_group(name.c_str());
66
IsMemberOfGroup(string name)
68
return system_user_in_group(name.c_str());
76
if (system_has_frequencyscaling()) {
77
OK &= !system_uses_frequencyscaling();
86
return !(system_memlock_amount() == 0);
93
printf(" sanityCheck - A program to verify proper system settings for use with audio applications (Ardour/Jack/Mixbus).\n");
95
printf(" Usage: sanityCheck [OPTIONS]\n");
97
printf(" Options are as follows:\n");
101
vector<testRecord>::iterator itr;
103
for (itr = gTestSet.begin(); itr != gTestSet.end(); ++itr) {
104
printf("%20s %s :\t%s\n", (*itr).switchText.c_str(), (*itr).swOptionText.c_str(), (*itr).descriptionText.c_str());
118
rec.switchText = "-a";
119
rec.swOptionText = "";
120
rec.descriptionText = "Checks for a working RT system. Same as -rt -freqscaling -memlock";
121
rec.failureText = "";
122
rec.hasOption = false;
123
rec.functionPtr = &ExecuteAll;
125
gTestSet.push_back(rec);
127
rec.switchText = "-h";
128
rec.swOptionText = "";
129
rec.descriptionText = "Print usage";
130
rec.failureText = "";
131
rec.hasOption = false;
132
rec.functionPtr = &PrintUsage;
134
gTestSet.push_back(rec);
136
// Switches for various tests that can be performed.
137
rec.switchText = "-rt";
138
rec.swOptionText = "";
139
rec.descriptionText = "Verfiy that the user can run tasks with realtime priority";
140
rec.failureText = "";
141
rec.hasOption = false;
142
rec.functionPtr = &system_user_can_rtprio;
144
gTestSet.push_back(rec);
146
rec.switchText = "-hasrtlimits";
147
rec.swOptionText = "";
148
rec.descriptionText = "Verfiy the system has a limits.conf and the audio group can use realtime";
149
rec.failureText = "";
150
rec.hasOption = false;
151
rec.functionPtr = &system_has_rtprio_limits_conf;
153
gTestSet.push_back(rec);
155
rec.switchText = "-hasgroup";
156
rec.swOptionText = "<groupname>";
157
rec.descriptionText = "Verfiy that the system has a group named <groupname>";
158
rec.failureText = "";
159
rec.hasOption = true;
160
rec.opFunctionPtr = &HasGroup;
162
gTestSet.push_back(rec);
164
rec.switchText = "-hasaudiogroup";
165
rec.swOptionText = "";
166
rec.descriptionText = "Verfiy that the system has an audio group (audio or jackuser) defined";
167
rec.failureText = "";
168
rec.hasOption = false;
169
rec.functionPtr = &system_has_audiogroup;
171
gTestSet.push_back(rec);
173
rec.switchText = "-memberofgroup";
174
rec.swOptionText = "<groupname>";
175
rec.descriptionText = "Verfiy that the user is a member of the group named <groupname>";
176
rec.failureText = "";
177
rec.hasOption = true;
178
rec.opFunctionPtr = &IsMemberOfGroup;
180
gTestSet.push_back(rec);
182
rec.switchText = "-memberaudiogroup";
183
rec.swOptionText = "";
184
rec.descriptionText = "Verfiy that the user is a member of the audio group (audio or jackuser)";
185
rec.failureText = "";
186
rec.hasOption = false;
187
rec.functionPtr = &system_user_in_audiogroup;
189
gTestSet.push_back(rec);
191
rec.switchText = "-freqscaling";
192
rec.swOptionText = "";
193
rec.descriptionText = "Check to see if frequency scaling is being used by the CPU";
194
rec.failureText = "";
195
rec.hasOption = false;
196
rec.functionPtr = &CheckFreqScaling;
198
gTestSet.push_back(rec);
200
rec.switchText = "-memlock";
201
rec.swOptionText = "";
202
rec.descriptionText = "Check to see if the user is able to lock memory";
203
rec.failureText = "";
204
rec.hasOption = false;
205
rec.functionPtr = &CheckMemoryLocking;
207
gTestSet.push_back(rec);
217
vector<testRecord>::iterator itr;
222
gSwitchesReceived.push_back("-a");
225
for (i = 1; i < argc && OK == true; i++) {
228
for (itr = gTestSet.begin(); itr != gTestSet.end(); ++itr) {
229
if (tmp == (*itr).switchText) {
230
if ((*itr).hasOption == true) {
234
// reqiured option for this switch is missing
239
(*itr).optionArg = op;
243
// reqiured option for this switch is missing
253
if (OK && itr != gTestSet.end()) {
254
// Known option switch found
255
gSwitchesReceived.push_back(tmp);
265
// All switches are at least valid, now check to make sure they are all valid to
268
if (gSwitchesReceived.size() > 1) {
269
// make sure help is not mixed with other options
270
vector<string>::iterator swItr;
273
swItr = find(gSwitchesReceived.begin(), gSwitchesReceived.end(), tmp);
275
if (swItr != gSwitchesReceived.end()) {
276
gSwitchesReceived.clear();
277
gSwitchesReceived.push_back("-h");
280
// make sure -a is only used by itself
282
swItr = find(gSwitchesReceived.begin(), gSwitchesReceived.end(), tmp);
284
if (swItr != gSwitchesReceived.end()) {
285
gSwitchesReceived.clear();
286
gSwitchesReceived.push_back("-a");
293
fprintf(stderr, "\n");
294
fprintf(stderr, "ERROR - Invalid Option: %s\n", (const char *) argv[--i]);
295
fprintf(stderr, "Check syntax\n");
305
vector<string>::iterator itr;
306
vector<testRecord>::iterator testItr;
308
for (itr = gSwitchesReceived.begin(); itr != gSwitchesReceived.end(); ++itr) {
309
for (testItr = gTestSet.begin(); testItr != gTestSet.end(); ++testItr) {
310
if ((*itr) == (*testItr).switchText) {
316
if ((*testItr).hasOption) {
317
result = ((*testItr).opFunctionPtr((*testItr).optionArg) != 0);
320
result = ((*testItr).functionPtr() != 0);
324
// Check for a Failure message and print it if found.
325
if (!(*testItr).failureText.empty()) {
326
printf("\n%s\n", (*testItr).failureText.c_str());
345
if (ParseSwitches(argc, argv)) {
346
if (Execute() == false) {
347
printf("\nSanity Check Failed!\n\n");
351
printf("\nSanity Check OK!\n\n");