Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUItester/src/tester.cpp
3203 views
1
#include "tester.h"
2
3
Tester::Tester(QWidget *parent)
4
: QWidget(parent)
5
{
6
ui.setupUi(this);
7
8
connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(close()));
9
10
setWindowTitle("ElmerGUI installation tester");
11
setWindowIcon(QIcon(":/img/ElmerGUItester.ico"));
12
13
elmerHome = get("ELMER_HOME");
14
elmerGuiHome = get("ELMERGUI_HOME");
15
ok = true;
16
e = ui.verdict;
17
}
18
19
QString Tester::get(const QString &variable) const
20
{
21
QString value(getenv(qPrintable(variable)));
22
23
#ifdef Q_WS_WIN
24
while(value.endsWith("\\"))
25
value.chop(1);
26
#else
27
while(value.endsWith("/"))
28
value.chop(1);
29
#endif
30
31
return value;
32
}
33
34
bool Tester::testDir(const QString &variable, QLabel *label) const
35
{
36
QString value(get(variable));
37
38
label->setText(value);
39
label->setAutoFillBackground(true);
40
41
if(!value.isEmpty() && QDir(value).exists()) {
42
label->setPalette(QPalette(Qt::green));
43
return true;
44
}
45
46
label->setPalette(QPalette(Qt::red));
47
return false;
48
}
49
50
bool Tester::testFile(const QString &value, QLabel *label) const
51
{
52
label->setText(value);
53
label->setAutoFillBackground(true);
54
55
if(!value.isEmpty() && QFile(value).exists()) {
56
label->setPalette(QPalette(Qt::green));
57
return true;
58
}
59
60
label->setPalette(QPalette(Qt::red));
61
return false;
62
}
63
64
bool Tester::testPath(const QString &value, QLabel *label) const
65
{
66
QString path(get("PATH"));
67
68
#ifdef Q_WS_WIN
69
QStringList splitPath(path.toUpper().split(";"));
70
#else
71
QStringList splitPath(path.split(":"));
72
#endif
73
74
label->setText(value);
75
label->setAutoFillBackground(true);
76
77
#ifdef Q_WS_WIN
78
if(splitPath.contains(value.toUpper())) {
79
label->setPalette(QPalette(Qt::green));
80
return true;
81
}
82
#else
83
if(splitPath.contains(value)) {
84
label->setPalette(QPalette(Qt::green));
85
return true;
86
}
87
#endif
88
89
label->setPalette(QPalette(Qt::red));
90
return false;
91
}
92
93
bool Tester::testLdLibraryPath(const QString &value, QLabel *label) const
94
{
95
QString ldLibraryPath(get("LD_LIBRARY_PATH"));
96
97
#ifdef Q_WS_WIN
98
QStringList splitLdLibraryPath(ldLibraryPath.toUpper().split(";"));
99
#else
100
QStringList splitLdLibraryPath(ldLibraryPath.split(":"));
101
#endif
102
103
label->setText(value);
104
label->setAutoFillBackground(true);
105
106
#ifdef Q_WS_WIN
107
if(splitLdLibraryPath.contains(value.toUpper())) {
108
label->setPalette(QPalette(Qt::green));
109
return true;
110
}
111
#else
112
if(splitLdLibraryPath.contains(value)) {
113
label->setPalette(QPalette(Qt::green));
114
return true;
115
}
116
#endif
117
118
label->setPalette(QPalette(Qt::red));
119
return false;
120
}
121
122
void Tester::testEnvironment()
123
{
124
ok &= testDir("ELMER_HOME", ui.elmerHomeResult);
125
ok &= testDir("ELMERGUI_HOME", ui.elmerGuiHomeResult);
126
ok &= testDir("ELMER_POST_HOME", ui.elmerPostHomeResult);
127
128
#ifdef Q_WS_WIN
129
ui.ldLibraryPathLabel->setText("PATH");
130
ok &= testPath(elmerHome + "\\bin", ui.pathResult);
131
ok &= testPath(elmerHome + "\\lib", ui.ldLibraryPathResult);
132
#else
133
ok &= testPath(elmerHome + "/bin", ui.pathResult);
134
ok &= testLdLibraryPath(elmerHome + "/lib", ui.ldLibraryPathResult);
135
#endif
136
}
137
138
void Tester::testExecutables()
139
{
140
#ifdef Q_WS_WIN
141
ok &= testFile(elmerHome + "\\bin\\ElmerSolver.exe", ui.elmerSolverResult);
142
ok &= testFile(elmerHome + "\\bin\\ElmerGUI.exe", ui.elmerGuiResult);
143
ok &= testFile(elmerHome + "\\bin\\ElmerPost.exe", ui.elmerPostResult);
144
ok &= testFile(elmerHome + "\\bin\\ElmerGrid.exe", ui.elmerGridResult);
145
#else
146
ok &= testFile(elmerHome + "/bin/ElmerSolver", ui.elmerSolverResult);
147
ok &= testFile(elmerHome + "/bin/ElmerGUI", ui.elmerGuiResult);
148
ok &= testFile(elmerHome + "/bin/ElmerPost", ui.elmerPostResult);
149
ok &= testFile(elmerHome + "/bin/ElmerGrid", ui.elmerGridResult);
150
#endif
151
}
152
153
void Tester::verdict()
154
{
155
repaint();
156
157
if(ok) {
158
e->append("Elmer seems to be installed correctly on this system");
159
e->append("");
160
e->append("Performing some additional tests:");
161
162
testSolver();
163
testPost();
164
testGrid();
165
testTetgen();
166
167
return;
168
}
169
170
e->append("Elmer seems to be installed incorrectly on this system");
171
e->append("1) Make sure that ELMER_HOME has been set up properly");
172
e->append("2) Set ELMERGUI_HOME to ELMER_HOME/bin");
173
e->append("3) Set ELMER_POST_HOME to ELMER_HOME/share/elmerpost");
174
e->append("4) Make sure that ELMER_HOME/bin is in PATH");
175
#ifdef Q_WS_WIN
176
e->append("5) Make sure that ELMER_HOME/lib is in PATH");
177
#else
178
e->append("5) Make sure that ELMER_HOME/lib is in LD_LIBRARY_PATH");
179
#endif
180
e->append("6) Executables should be found from ELMER_HOME/bin");
181
}
182
183
void Tester::testSolver()
184
{
185
e->append("");
186
e->append("Checking whether ElmerSolver starts...");
187
188
QString solverName("ElmerSolver");
189
QStringList solverArgs;
190
solverArgs << "-v";
191
192
QProcess *solver = new QProcess(this);
193
solver->start(solverName, solverArgs);
194
195
if(!solver->waitForStarted()) {
196
e->append("ERROR: ElmerSolver does not start");
197
return;
198
}
199
200
if(!solver->waitForFinished()) {
201
e->append("ERROR: ElmerSolver does not finish");
202
return;
203
}
204
205
QString str(solver->readAllStandardOutput());
206
str.replace("\r", "");
207
QStringList list = str.split("\n");
208
209
foreach(QString line, list) {
210
if(line.contains("Library version"))
211
e->append(line.replace("MAIN:", "").trimmed());
212
}
213
214
e->append("OK: ElmerSolver seems functional");
215
216
repaint();
217
}
218
219
void Tester::testPost()
220
{
221
e->append("");
222
e->append("Checking whether ElmerPost starts...");
223
224
QString postName("ElmerPost");
225
QStringList postArgs;
226
postArgs << "-v";
227
228
QProcess *post = new QProcess(this);
229
post->start(postName, postArgs);
230
231
if(!post->waitForStarted()) {
232
e->append("ERROR: ElmerPost does not start");
233
return;
234
}
235
236
if(!post->waitForFinished()) {
237
e->append("ERROR: ElmerPost does not finish");
238
return;
239
}
240
241
QString str(post->readAllStandardOutput());
242
str.replace("\r", "");
243
str.replace("\n", "");
244
str = str.trimmed();
245
if(!str.isEmpty())
246
e->append(str);
247
248
e->append("OK: ElmerPost seems functional");
249
250
repaint();
251
}
252
253
void Tester::testGrid()
254
{
255
e->append("");
256
e->append("Checking whether ElmerGrid starts...");
257
258
QString gridName("ElmerGrid");
259
260
QProcess *grid = new QProcess(this);
261
grid->start(gridName);
262
263
if(!grid->waitForStarted()) {
264
e->append("ERROR: ElmerGrid does not start");
265
return;
266
}
267
268
if(!grid->waitForFinished()) {
269
e->append("ERROR: ElmerGrid does not finish");
270
return;
271
}
272
273
QString str(grid->readAllStandardOutput());
274
e->append("OK: ElmerGrid seems functional");
275
276
repaint();
277
}
278
279
void Tester::testTetgen()
280
{
281
e->append("");
282
e->append("Checking whether Tetgen plugin loads...");
283
284
QLibrary tetgen("tetplugin");
285
286
if(!tetgen.load()) {
287
e->append("INFO: Tetgen plugin is not available");
288
return;
289
}
290
291
if(!tetgen.resolve("CreateObjectOfTetgenio")) {
292
e->append("WARNING: libtet version mismatch");
293
return;
294
}
295
296
e->append("OK: Tetgen plugin seems functional");
297
}
298
299