test_task.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <unity.h>
  2. #include <atomic>
  3. #include "kbf.h"
  4. #include "kbf/task.h"
  5. /** delay between cycles */
  6. #define KBF_TASK_TEST_DELAY 100
  7. /** counter increase factor for the "runner" task */
  8. #define KBF_TASK_TEST_RUNNER_INC 10
  9. /** counter increase factor for the "quitter" task */
  10. #define KBF_TASK_TEST_QUITTER_INC 1
  11. /** number of cycles to run for each testing stage */
  12. #define KBF_TASK_TEST_CYCLES 5
  13. using namespace std;
  14. atomic<int> counter{0};
  15. /** function that runs until stopped */
  16. [[noreturn]] void runner(void *arg);
  17. /** function that stops after KBF_TASK_TEST_CYCLES cycles */
  18. void quitter(void *arg);
  19. struct QuitterArg {
  20. int delay;
  21. int cycles;
  22. };
  23. TEST_CASE("Task handling functions", "[kbf_task]") {
  24. counter = 0;
  25. int delay = KBF_TASK_TEST_DELAY;
  26. QuitterArg arg = {KBF_TASK_TEST_DELAY, KBF_TASK_TEST_CYCLES};
  27. auto runnerTask = new kbf::Task("test_runner", runner, &delay);
  28. auto quitterTask = kbf::Task("test_quitter", quitter, &arg);
  29. kbf::sleep(40); // make sure the tasks have started
  30. int expected = 0;
  31. // both tasks are running
  32. for (int i = 0; i < KBF_TASK_TEST_CYCLES; i++) {
  33. expected += KBF_TASK_TEST_RUNNER_INC + KBF_TASK_TEST_QUITTER_INC;
  34. TEST_ASSERT_EQUAL(expected, counter);
  35. TEST_ASSERT_TRUE(runnerTask->isRunning())
  36. TEST_ASSERT_TRUE(quitterTask.isRunning())
  37. kbf::sleep(KBF_TASK_TEST_DELAY);
  38. }
  39. // quitter has quit, only runner is left
  40. for (int i = 0; i < KBF_TASK_TEST_CYCLES; i++) {
  41. expected += KBF_TASK_TEST_RUNNER_INC;
  42. TEST_ASSERT_EQUAL(expected, counter);
  43. TEST_ASSERT_TRUE(runnerTask->isRunning())
  44. TEST_ASSERT_FALSE(quitterTask.isRunning())
  45. kbf::sleep(KBF_TASK_TEST_DELAY);
  46. }
  47. // killing runner via destructor; no more updates
  48. delete runnerTask;
  49. expected += KBF_TASK_TEST_RUNNER_INC; // runner went another cycle while we were sleeping
  50. for (int i = 0; i < KBF_TASK_TEST_CYCLES; i++) {
  51. TEST_ASSERT_EQUAL(expected, counter);
  52. kbf::sleep(KBF_TASK_TEST_DELAY);
  53. }
  54. }
  55. [[noreturn]] void runner(void *arg) {
  56. auto delay = static_cast<int *>(arg);
  57. TEST_ASSERT_EQUAL(KBF_TASK_TEST_DELAY, *delay);
  58. while (true) {
  59. counter += KBF_TASK_TEST_RUNNER_INC;
  60. kbf::sleep(*delay);
  61. }
  62. }
  63. void quitter(void *arg) {
  64. auto argData = static_cast<QuitterArg *>(arg);
  65. TEST_ASSERT_EQUAL(KBF_TASK_TEST_DELAY, argData->delay);
  66. TEST_ASSERT_EQUAL(KBF_TASK_TEST_CYCLES, argData->cycles);
  67. for (int i = 0; i < argData->cycles; i++) {
  68. counter += KBF_TASK_TEST_QUITTER_INC;
  69. kbf::sleep(argData->delay);
  70. }
  71. }