#ifndef MANTID_KERNEL_THREADPOOLRUNNABLETEST_H_ #define MANTID_KERNEL_THREADPOOLRUNNABLETEST_H_ #include <cxxtest/TestSuite.h> #include <MantidKernel/Timer.h> #include <MantidKernel/System.h> #include <iostream> #include <iomanip> #include <MantidKernel/ThreadPoolRunnable.h> #include <MantidKernel/ThreadScheduler.h> using namespace Mantid::Kernel; int ThreadPoolRunnableTest_value; class ThreadPoolRunnableTest : public CxxTest::TestSuite { public: void test_constructor() { TS_ASSERT_THROWS(new ThreadPoolRunnable(0, NULL), std::invalid_argument); } //======================================================================================= class SimpleTask : public Task { void run() { ThreadPoolRunnableTest_value = 1234; } }; void test_run() { ThreadPoolRunnable *tpr; ThreadScheduler *sc = new ThreadSchedulerFIFO(); tpr = new ThreadPoolRunnable(0, sc); sc->push(new SimpleTask()); TS_ASSERT_EQUALS(sc->size(), 1); // Run it ThreadPoolRunnableTest_value = 0; tpr->run(); // The task worked TS_ASSERT_EQUALS(ThreadPoolRunnableTest_value, 1234); // Nothing more in the queue. TS_ASSERT_EQUALS(sc->size(), 0); delete tpr; delete sc; } //======================================================================================= /** Class that throws an exception */ class TaskThatThrows : public Task { void run() { ThreadPoolRunnableTest_value += 1; throw Mantid::Kernel::Exception::NotImplementedError( "Test exception from TaskThatThrows."); } }; void test_run_throws() { ThreadPoolRunnable *tpr; ThreadScheduler *sc = new ThreadSchedulerFIFO(); tpr = new ThreadPoolRunnable(0, sc); // Put 10 tasks in for (size_t i = 0; i < 10; i++) sc->push(new TaskThatThrows()); // The task throws but the runnable just aborts instead ThreadPoolRunnableTest_value = 0; TS_ASSERT_THROWS_NOTHING(tpr->run()); // Nothing more in the queue. TS_ASSERT_EQUALS(sc->size(), 0); // Yet only one task actually ran. TS_ASSERT_EQUALS(ThreadPoolRunnableTest_value, 1); TS_ASSERT(sc->getAborted()); // Get the reason for aborting std::runtime_error e = sc->getAbortException(); std::string what = e.what(); TS_ASSERT_EQUALS(what, "Test exception from TaskThatThrows."); delete tpr; delete sc; } }; #endif /* MANTID_KERNEL_THREADPOOLRUNNABLETEST_H_ */