109
187
return EXIT_FAILURE;
112
world= new Framework();
116
Error << "Failed to create Framework()";
120
libtest::SignalThread signal;
121
if (not signal.setup())
131
void *creators_ptr= world->create(error);
139
Out << "SKIP " << argv[0];
145
case TEST_MEMORY_ALLOCATION_FAILURE:
150
char *collection_to_run= NULL;
153
collection_to_run= argv[1];
155
else if (getenv("TEST_COLLECTION"))
157
if (strlen(getenv("TEST_COLLECTION")))
159
collection_to_run= getenv("TEST_COLLECTION");
163
if (collection_to_run)
165
Out << "Only testing " << collection_to_run;
168
char *wildcard= NULL;
174
for (collection_st *next= world->collections; next->name and (not signal.is_shutdown()); next++)
176
test_return_t collection_rc= TEST_SUCCESS;
180
if (collection_to_run && fnmatch(collection_to_run, next->name, 0))
183
stats.collection_total++;
185
collection_rc= world->startup(creators_ptr);
187
if (collection_rc == TEST_SUCCESS and next->pre)
189
collection_rc= world->runner()->pre(next->pre, creators_ptr);
192
switch (collection_rc)
192
exit_code= EXIT_SUCCESS;
193
Framework *world= new Framework();
197
Error << "Failed to create Framework()";
201
assert(sigignore(SIGPIPE) == 0);
203
libtest::SignalThread signal;
204
if (not signal.setup())
206
Error << "Failed to setup signals";
215
void *creators_ptr= world->create(error);
194
219
case TEST_SUCCESS:
223
Out << "SKIP " << argv[0];
198
228
case TEST_FAILURE:
199
Out << next->name << " [ failed ]";
201
signal.set_shutdown(SHUTDOWN_GRACEFUL);
205
Out << next->name << " [ skipping ]";
209
229
case TEST_MEMORY_ALLOCATION_FAILURE:
210
test_assert(0, "Allocation failure, or unknown return");
213
Out << "Collection: " << next->name;
215
for (test_st *run= next->tests; run->name; run++)
217
struct timeval start_time, end_time;
218
long int load_time= 0;
220
if (wildcard && fnmatch(wildcard, run->name, 0))
234
if (getenv("TEST_COLLECTION"))
236
if (strlen(getenv("TEST_COLLECTION")))
238
collection_to_run= getenv("TEST_COLLECTION");
242
if (collection_to_run.empty() == false)
244
Out << "Only testing " << collection_to_run;
247
char *wildcard= NULL;
253
for (collection_st *next= world->collections; next and next->name and (not signal.is_shutdown()); next++)
258
if (collection_to_run.empty() == false and fnmatch(collection_to_run.c_str(), next->name, 0))
225
test_return_t return_code;
226
if (test_success(return_code= world->item.startup(creators_ptr)))
228
if (test_success(return_code= world->item.flush(creators_ptr, run)))
230
// @note pre will fail is SKIPPED is returned
231
if (test_success(return_code= world->item.pre(creators_ptr)))
234
gettimeofday(&start_time, NULL);
235
assert(world->runner());
236
assert(run->test_fn);
237
return_code= world->runner()->run(run->test_fn, creators_ptr);
238
gettimeofday(&end_time, NULL);
239
load_time= timedif(end_time, start_time);
243
// @todo do something if post fails
244
(void)world->item.post(creators_ptr);
246
else if (return_code == TEST_SKIPPED)
248
else if (return_code == TEST_FAILURE)
250
Error << " item.flush(failure)";
251
signal.set_shutdown(SHUTDOWN_GRACEFUL);
254
else if (return_code == TEST_SKIPPED)
256
else if (return_code == TEST_FAILURE)
258
Error << " item.startup(failure)";
259
signal.set_shutdown(SHUTDOWN_GRACEFUL);
263
stats.collection_total++;
265
test_return_t collection_rc= world->startup(creators_ptr);
267
if (collection_rc == TEST_SUCCESS and next->pre)
269
collection_rc= world->runner()->pre(next->pre, creators_ptr);
272
switch (collection_rc)
266
274
case TEST_SUCCESS:
267
Out << "\tTesting " << run->name << "\t\t\t\t\t" << load_time / 1000 << "." << load_time % 1000 << "[ " << test_strerror(return_code) << " ]";
272
278
case TEST_FAILURE:
279
Out << next->name << " [ failed ]";
275
Out << "\tTesting " << run->name << "\t\t\t\t\t" << "[ " << test_strerror(return_code) << " ]";
281
signal.set_shutdown(SHUTDOWN_GRACEFUL);
278
284
case TEST_SKIPPED:
285
Out << next->name << " [ skipping ]";
281
Out << "\tTesting " << run->name << "\t\t\t\t\t" << "[ " << test_strerror(return_code) << " ]";
284
289
case TEST_MEMORY_ALLOCATION_FAILURE:
285
test_assert(0, "Memory Allocation Error");
290
test_assert(0, "Allocation failure, or unknown return");
288
if (test_failed(world->on_error(return_code, creators_ptr)))
293
Out << "Collection: " << next->name;
295
for (test_st *run= next->tests; run->name; run++)
290
Error << "Failed while running on_error()";
291
signal.set_shutdown(SHUTDOWN_GRACEFUL);
297
struct timeval start_time, end_time;
298
long int load_time= 0;
300
if (wildcard && fnmatch(wildcard, run->name, 0))
305
test_return_t return_code;
307
if (test_success(return_code= world->item.startup(creators_ptr)))
309
if (test_success(return_code= world->item.flush(creators_ptr, run)))
311
// @note pre will fail is SKIPPED is returned
312
if (test_success(return_code= world->item.pre(creators_ptr)))
315
gettimeofday(&start_time, NULL);
316
assert(world->runner());
317
assert(run->test_fn);
318
return_code= world->runner()->run(run->test_fn, creators_ptr);
319
gettimeofday(&end_time, NULL);
320
load_time= timedif(end_time, start_time);
324
// @todo do something if post fails
325
(void)world->item.post(creators_ptr);
327
else if (return_code == TEST_SKIPPED)
329
else if (return_code == TEST_FAILURE)
331
Error << " item.flush(failure)";
332
signal.set_shutdown(SHUTDOWN_GRACEFUL);
335
else if (return_code == TEST_SKIPPED)
337
else if (return_code == TEST_FAILURE)
339
Error << " item.startup(failure)";
340
signal.set_shutdown(SHUTDOWN_GRACEFUL);
344
catch (std::exception &e)
346
Error << "Exception was thrown: " << e.what();
347
return_code= TEST_FAILURE;
351
Error << "Unknown exception occurred";
352
return_code= TEST_FAILURE;
360
Out << "\tTesting " << run->name << "\t\t\t\t\t" << load_time / 1000 << "." << load_time % 1000 << "[ " << test_strerror(return_code) << " ]";
368
Out << "\tTesting " << run->name << "\t\t\t\t\t" << "[ " << test_strerror(return_code) << " ]";
374
Out << "\tTesting " << run->name << "\t\t\t\t\t" << "[ " << test_strerror(return_code) << " ]";
377
case TEST_MEMORY_ALLOCATION_FAILURE:
378
test_assert(0, "Memory Allocation Error");
381
if (test_failed(world->on_error(return_code, creators_ptr)))
383
Error << "Failed while running on_error()";
384
signal.set_shutdown(SHUTDOWN_GRACEFUL);
296
(void) world->runner()->post(next->post, creators_ptr);
389
(void) world->runner()->post(next->post, creators_ptr);
299
if (failed == false and skipped == false)
301
stats.collection_success++;
306
stats.collection_failed++;
311
stats.collection_skipped++;
314
world->shutdown(creators_ptr);
318
if (not signal.is_shutdown())
320
signal.set_shutdown(SHUTDOWN_GRACEFUL);
323
int exit_code= EXIT_SUCCESS;
324
shutdown_t status= signal.get_shutdown();
325
if (status == SHUTDOWN_FORCED)
327
Out << "Tests were aborted.";
328
exit_code= EXIT_FAILURE;
330
else if (stats.collection_failed)
332
Out << "Some test failed.";
333
exit_code= EXIT_FAILURE;
335
else if (stats.collection_skipped and stats.collection_failed and stats.collection_success)
337
Out << "Some tests were skipped.";
339
else if (stats.collection_success and stats.collection_failed == 0)
341
Out << "All tests completed successfully.";
348
Outn(); // Generate a blank to break up the messages if make check/test has been run
392
if (failed == false and skipped == false)
394
stats.collection_success++;
399
stats.collection_failed++;
404
stats.collection_skipped++;
407
world->shutdown(creators_ptr);
411
if (not signal.is_shutdown())
413
signal.set_shutdown(SHUTDOWN_GRACEFUL);
416
shutdown_t status= signal.get_shutdown();
417
if (status == SHUTDOWN_FORCED)
419
Out << "Tests were aborted.";
420
exit_code= EXIT_FAILURE;
422
else if (stats.collection_failed)
424
Out << "Some test failed.";
425
exit_code= EXIT_FAILURE;
427
else if (stats.collection_skipped and stats.collection_failed and stats.collection_success)
429
Out << "Some tests were skipped.";
431
else if (stats.collection_success and stats.collection_failed == 0)
433
Out << "All tests completed successfully.";
440
Outn(); // Generate a blank to break up the messages if make check/test has been run
441
} while (exit_code == EXIT_SUCCESS and opt_repeat);
350
443
return exit_code;