Skip to content
Snippets Groups Projects
ThreadPoolRunnableTest.h 2.65 KiB
Newer Older
// Mantid Repository : https://github.com/mantidproject/mantid
//
// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
//     NScD Oak Ridge National Laboratory, European Spallation Source
//     & Institut Laue - Langevin
// SPDX - License - Identifier: GPL - 3.0 +
#ifndef MANTID_KERNEL_THREADPOOLRUNNABLETEST_H_
#define MANTID_KERNEL_THREADPOOLRUNNABLETEST_H_

#include <MantidKernel/System.h>
#include <MantidKernel/Timer.h>
#include <cxxtest/TestSuite.h>

#include <MantidKernel/ThreadPoolRunnable.h>
class ThreadPoolRunnableTest : public CxxTest::TestSuite {
  void test_constructor() {
    TS_ASSERT_THROWS(new ThreadPoolRunnable(0, nullptr), std::invalid_argument);
  //=======================================================================================
  class SimpleTask : public Task {
    void run() override { 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);
    TS_ASSERT_EQUALS(sc->size(), 0);
    delete tpr;
    delete sc;
  }

  //=======================================================================================
  /** Class that throws an exception */
  class TaskThatThrows : public Task {
    void run() override {
      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);
    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_ */