furiac_test.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "flipper.h"
  4. #include "log.h"
  5. /*
  6. Test: creating and killing task
  7. 1. create task
  8. 2. delay 10 ms
  9. 3. kill task
  10. 4. check that value changes
  11. 5. delay 2 ms
  12. 6. check that value stay unchanged
  13. */
  14. void create_kill_app(void* p) {
  15. // this app simply increase counter
  16. uint8_t* counter = (uint8_t*)p;
  17. while(1) {
  18. *counter = *counter + 1;
  19. delay(1);
  20. }
  21. }
  22. bool test_furi_ac_create_kill(FuriRecordSubscriber* log) {
  23. uint8_t counter = 0;
  24. uint8_t value_a = counter;
  25. FuriApp* widget = furiac_start(create_kill_app, "create_kill_app", (void*)&counter);
  26. if(widget == NULL) {
  27. fuprintf(log, "create widget fail\n");
  28. return false;
  29. }
  30. delay(10);
  31. if(!furiac_kill(widget)) {
  32. fuprintf(log, "kill widget fail\n");
  33. return false;
  34. }
  35. if(value_a == counter) {
  36. fuprintf(log, "counter unchanged\n");
  37. return false;
  38. }
  39. value_a = counter;
  40. delay(10);
  41. if(value_a != counter) {
  42. fuprintf(log, "counter changes after kill (counter = %d vs %d)\n", value_a, counter);
  43. return false;
  44. }
  45. return true;
  46. }
  47. /*
  48. Test: switch between tasks
  49. 1. init s
  50. 2. create task A, add 'A" to sequence'
  51. 3. switch to task B, add 'B' to sequence
  52. 4. exit from task B -> switch to A and add 'A' to sequence
  53. 5. cleanup: exit from task A
  54. 6. check sequence
  55. */
  56. #define TEST_SWITCH_CONTEXT_SEQ_SIZE 8
  57. typedef struct {
  58. char sequence[TEST_SWITCH_CONTEXT_SEQ_SIZE];
  59. size_t count;
  60. } TestSwitchSequence;
  61. void task_a(void*);
  62. void task_b(void*);
  63. void task_a(void *p) {
  64. // simply starts, add 'A' letter to sequence and switch
  65. // if sequence counter = 0, call task B, exit otherwise
  66. TestSwitchSequence* seq = (TestSwitchSequence*)p;
  67. seq->sequence[seq->count] = 'A';
  68. seq->count++;
  69. if(seq->count == 1) {
  70. furiac_switch(task_b, "task B", p);
  71. // if switch unsuccessfull, this code will executed
  72. seq->sequence[seq->count] = 'x';
  73. seq->count++;
  74. } else {
  75. // add '/' symbol on exit
  76. seq->sequence[seq->count] = '/';
  77. seq->count++;
  78. furiac_exit(NULL);
  79. }
  80. }
  81. // application simply add 'B' end exit
  82. void task_b(void* p) {
  83. TestSwitchSequence* seq = (TestSwitchSequence*)p;
  84. seq->sequence[seq->count] = 'B';
  85. seq->count++;
  86. furiac_exit(p);
  87. }
  88. bool test_furi_ac_switch_exit(FuriRecordSubscriber* log) {
  89. // init sequence
  90. TestSwitchSequence seq;
  91. seq.count = 0;
  92. furiac_start(task_a, "task A", (void*)&seq);
  93. // TODO how to check that all child task ends?
  94. delay(10); // wait while task do its work
  95. seq.sequence[seq.count] = '\0';
  96. if(strcmp(seq.sequence, "ABA/") != 0) {
  97. fuprintf(log, "wrong sequence: %s\n", seq.sequence);
  98. return false;
  99. }
  100. return true;
  101. }