/firmware/tests/T0-Utilities/src/T0.2.TimeoutTest.cc

http://github.com/makerbot/G3Firmware · C++ · 172 lines · 147 code · 19 blank · 6 comment · 10 complexity · c0d458281562233d523d282d6270fc32 MD5 · raw file

  1. #define __STDC_LIMIT_MACROS
  2. #include <gtest/gtest.h>
  3. #include <stdlib.h>
  4. #include <stdint.h>
  5. using namespace std;
  6. /// This doesn't test compiled code atm; instead it's an algorithmic
  7. /// testbed to make sure our timer overflow works correctly in all instances.
  8. typedef uint32_t micros_t;
  9. micros_t current_time;
  10. micros_t getCurrentMicros() { return current_time; }
  11. class Timeout {
  12. private:
  13. bool active;
  14. bool elapsed;
  15. micros_t start_stamp_micros;
  16. micros_t duration_micros;
  17. public:
  18. Timeout();
  19. void start(micros_t duration_micros);
  20. bool hasElapsed();
  21. bool isActive() const { return active; }
  22. void abort();
  23. };
  24. Timeout::Timeout() : active(false), elapsed(false) {}
  25. void Timeout::start(micros_t duration_micros_in) {
  26. active = true;
  27. elapsed = false;
  28. start_stamp_micros = getCurrentMicros();
  29. duration_micros = duration_micros_in;
  30. }
  31. bool Timeout::hasElapsed() {
  32. if (active && !elapsed) {
  33. micros_t delta = getCurrentMicros() - start_stamp_micros;
  34. if (delta >= duration_micros) {
  35. active = false;
  36. elapsed = true;
  37. }
  38. }
  39. return elapsed;
  40. }
  41. void Timeout::abort() {
  42. active = false;
  43. }
  44. void runTest(micros_t start_time,
  45. uint32_t duration,
  46. micros_t simulated_time,
  47. bool expected) {
  48. current_time = start_time;
  49. Timeout t;
  50. t.start(duration);
  51. current_time = simulated_time;
  52. ASSERT_EQ(expected,t.hasElapsed()) <<
  53. " Start " << start_time << endl <<
  54. " Dur. " << duration << endl <<
  55. " Time " << simulated_time;
  56. }
  57. TEST(TimeoutTest, OrdinaryCase)
  58. {
  59. srandom(time(NULL));
  60. for (int i = 0; i < 100; i++) {
  61. uint32_t duration = random() % (UINT32_MAX/4);
  62. if (duration < 2) duration = 2;
  63. micros_t start = random() % (UINT32_MAX-duration);
  64. runTest(start,duration,start-1,true);
  65. runTest(start,duration,start,false);
  66. runTest(start,duration,start+1,false);
  67. runTest(start,duration,start+duration-1,false);
  68. runTest(start,duration,start+duration,true);
  69. runTest(start,duration,start+duration+1,true);
  70. }
  71. }
  72. TEST(TimeoutTest, IntervalWrapCase)
  73. {
  74. srandom(time(NULL));
  75. for (int i = 0; i < 100; i++) {
  76. uint32_t duration = random() % (UINT32_MAX/4);
  77. if (duration < 2) duration = 2;
  78. micros_t start = random() % duration + (UINT32_MAX-duration);
  79. runTest(start,duration,start-1,true);
  80. runTest(start,duration,start,false);
  81. runTest(start,duration,start+1,false);
  82. runTest(start,duration,start+duration-1,false);
  83. runTest(start,duration,start+duration,true);
  84. runTest(start,duration,start+duration+1,true);
  85. }
  86. }
  87. TEST(TimeoutTest, TimerWrapCase)
  88. {
  89. srandom(time(NULL));
  90. for (int i = 0; i < 100; i++) {
  91. uint32_t duration = random() % (UINT32_MAX/4);
  92. micros_t start = random() % UINT32_MAX;
  93. micros_t when = start - random()%(UINT32_MAX-duration);
  94. runTest(start,duration,when,true);
  95. }
  96. }
  97. TEST(TimeoutTest, BoundryCase1)
  98. {
  99. // start time = 0;
  100. srandom(time(NULL));
  101. uint32_t duration = random() % (UINT32_MAX/4);
  102. if (duration < 2) duration = 2;
  103. micros_t start = 0;
  104. runTest(start,duration,start-1,true);
  105. runTest(start,duration,start,false);
  106. runTest(start,duration,start+1,false);
  107. runTest(start,duration,start+duration-1,false);
  108. runTest(start,duration,start+duration,true);
  109. runTest(start,duration,start+duration+1,true);
  110. }
  111. TEST(TimeoutTest, BoundryCase2)
  112. {
  113. // start time = max-1;
  114. srandom(time(NULL));
  115. uint32_t duration = random() % (UINT32_MAX/4);
  116. if (duration < 2) duration = 2;
  117. micros_t start = UINT32_MAX-1;
  118. runTest(start,duration,start-1,true);
  119. runTest(start,duration,start,false);
  120. runTest(start,duration,start+1,false);
  121. runTest(start,duration,start+duration-1,false);
  122. runTest(start,duration,start+duration,true);
  123. runTest(start,duration,start+duration+1,true);
  124. }
  125. TEST(TimeoutTest, BoundryCase3)
  126. {
  127. // end time = max-1;
  128. srandom(time(NULL));
  129. micros_t start = random() % UINT32_MAX;
  130. micros_t duration = (UINT32_MAX-1) - start;
  131. runTest(start,duration,start-1,true);
  132. runTest(start,duration,start,false);
  133. runTest(start,duration,start+1,false);
  134. runTest(start,duration,start+duration-1,false);
  135. runTest(start,duration,start+duration,true);
  136. runTest(start,duration,start+duration+1,true);
  137. }
  138. TEST(TimeoutTest, BoundryCase4)
  139. {
  140. // end time = 0;
  141. srandom(time(NULL));
  142. micros_t start = random() % UINT32_MAX;
  143. micros_t duration = 0 - start;
  144. runTest(start,duration,start-1,true);
  145. runTest(start,duration,start,false);
  146. runTest(start,duration,start+1,false);
  147. runTest(start,duration,start+duration-1,false);
  148. runTest(start,duration,start+duration,true);
  149. runTest(start,duration,start+duration+1,true);
  150. }
  151. micros_t call(micros_t in) {
  152. return in;
  153. }