ThreadTests.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. module Tests;
  2. import Core.Test;
  3. import Core.Thread;
  4. import Core.Meta;
  5. import ErrorSimulator;
  6. static int runDone = 0;
  7. struct IntHolder {
  8. int value;
  9. };
  10. static void run(void*) {
  11. runDone = 1;
  12. }
  13. static void testStart() {
  14. runDone = 0;
  15. {
  16. Core::Thread t;
  17. Core::testFalse(t.start(run, nullptr));
  18. }
  19. Core::test(1, runDone);
  20. }
  21. static void testLambda() {
  22. IntHolder i(0);
  23. Core::Thread t;
  24. Core::testFalse(t.start(
  25. [](void* p) {
  26. IntHolder* ip = static_cast<IntHolder*>(p);
  27. ip->value = 2;
  28. },
  29. &i));
  30. Core::testFalse(t.join());
  31. Core::test(2, i.value);
  32. }
  33. static void testJoinWithoutStart() {
  34. Core::Thread t;
  35. Core::testFalse(t.join());
  36. }
  37. static void testAutoJoin() {
  38. Core::Thread t;
  39. Core::testFalse(t.start([](void*) {}, nullptr));
  40. }
  41. static void testMove() {
  42. Core::Thread t;
  43. Core::testFalse(t.start([](void*) {}, nullptr));
  44. Core::Thread m = Core::move(t);
  45. Core::testFalse(m.join());
  46. }
  47. static void testMoveAssignment() {
  48. Core::Thread t;
  49. Core::testFalse(t.start([](void*) {}, nullptr));
  50. Core::Thread m;
  51. m = Core::move(t);
  52. Core::testFalse(m.join());
  53. }
  54. static void testMoveIntoActive() {
  55. Core::Thread t;
  56. Core::testFalse(t.start([](void*) {}, nullptr));
  57. Core::Thread m;
  58. t = Core::move(m);
  59. }
  60. static void testDoubleJoin() {
  61. Core::Thread t;
  62. Core::testFalse(t.start([](void*) {}, nullptr));
  63. Core::testFalse(t.join());
  64. Core::testFalse(t.join());
  65. }
  66. struct MutexCounter {
  67. Core::Mutex m{};
  68. int counter = 0;
  69. };
  70. static void incrementMutexCounter(void* p) {
  71. MutexCounter* mcp = static_cast<MutexCounter*>(p);
  72. for(int i = 0; i < 100'000; i++) {
  73. Core::MutexGuard mg(mcp->m);
  74. mcp->counter++;
  75. }
  76. }
  77. static void testMutex() {
  78. MutexCounter mc;
  79. Core::Thread t[2];
  80. Core::testFalse(t[0].start(incrementMutexCounter, &mc));
  81. Core::testFalse(t[1].start(incrementMutexCounter, &mc));
  82. Core::testFalse(t[0].join());
  83. Core::testFalse(t[1].join());
  84. Core::test(200'000, mc.counter);
  85. }
  86. static void testDoubleStart() {
  87. Core::Thread t;
  88. Core::testFalse(t.start([](void*) {}, nullptr));
  89. Core::testTrue(t.start([](void*) {}, nullptr));
  90. }
  91. static void testFail() {
  92. #ifdef ERROR_SIMULATOR
  93. Core::Mutex m;
  94. failStepThrow = 1;
  95. m.lock();
  96. failStepThrow = 1;
  97. m.unlock();
  98. Core::Thread t;
  99. failStepThrow = 1;
  100. Core::testTrue(t.start([](void*) {}, nullptr));
  101. Core::testFalse(t.start([](void*) {}, nullptr));
  102. failStepThrow = 1;
  103. Core::testTrue(t.join());
  104. #endif
  105. }
  106. void testThread() {
  107. testStart();
  108. testLambda();
  109. testJoinWithoutStart();
  110. testAutoJoin();
  111. testMove();
  112. testMoveAssignment();
  113. testMoveIntoActive();
  114. testDoubleJoin();
  115. testMutex();
  116. testDoubleStart();
  117. testFail();
  118. }