test_led.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * c-periphery
  3. * https://github.com/vsergeev/c-periphery
  4. * License: MIT
  5. */
  6. #include "test.h"
  7. #include <stdlib.h>
  8. #include <stdbool.h>
  9. #include <string.h>
  10. #include <unistd.h>
  11. #include "../src/led.h"
  12. const char *device;
  13. void test_arguments(void) {
  14. ptest();
  15. /* No real argument validation needed in the LED wrapper */
  16. }
  17. void test_open_config_close(void) {
  18. led_t *led;
  19. char name[16];
  20. unsigned int max_brightness;
  21. unsigned int brightness;
  22. bool value;
  23. ptest();
  24. /* Allocate LED */
  25. led = led_new();
  26. passert(led != NULL);
  27. /* Open non-existent LED */
  28. passert(led_open(led, "nonexistent") == LED_ERROR_OPEN);
  29. /* Open legitimate LED */
  30. passert(led_open(led, device) == 0);
  31. /* Check properties */
  32. passert(led_name(led, name, sizeof(name)) == 0);
  33. passert(strcmp(name, device) == 0);
  34. /* Check max brightness */
  35. passert(led_get_max_brightness(led, &max_brightness) == 0);
  36. passert(max_brightness > 0);
  37. /* Check setting invalid brightness */
  38. passert(led_set_brightness(led, max_brightness + 1) == LED_ERROR_ARG);
  39. /* Write true, read true, check brightness is max */
  40. passert(led_write(led, true) == 0);
  41. usleep(10000);
  42. passert(led_read(led, &value) == 0);
  43. passert(value == true);
  44. passert(led_get_brightness(led, &brightness) == 0);
  45. passert(brightness == max_brightness);
  46. /* Write false, read false, check brightness is zero */
  47. passert(led_write(led, false) == 0);
  48. usleep(10000);
  49. passert(led_read(led, &value) == 0);
  50. passert(value == false);
  51. passert(led_get_brightness(led, &brightness) == 0);
  52. passert(brightness == 0);
  53. /* Set brightness to 1, check brightness */
  54. passert(led_set_brightness(led, 1) == 0);
  55. usleep(10000);
  56. passert(led_get_brightness(led, &brightness) == 0);
  57. passert(brightness >= 1);
  58. /* Set brightness to 0, check brightness */
  59. passert(led_set_brightness(led, 0) == 0);
  60. usleep(10000);
  61. passert(led_get_brightness(led, &brightness) == 0);
  62. passert(brightness == 0);
  63. passert(led_close(led) == 0);
  64. /* Free LED */
  65. led_free(led);
  66. }
  67. void test_loopback(void) {
  68. ptest();
  69. }
  70. bool getc_yes(void) {
  71. char buf[4];
  72. fgets(buf, sizeof(buf), stdin);
  73. return (buf[0] == 'y' || buf[0] == 'Y');
  74. }
  75. void test_interactive(void) {
  76. char str[256];
  77. led_t *led;
  78. ptest();
  79. /* Allocate LED */
  80. led = led_new();
  81. passert(led != NULL);
  82. passert(led_open(led, device) == 0);
  83. printf("Starting interactive test...\n");
  84. printf("Press enter to continue...\n");
  85. getc(stdin);
  86. /* Check tostring */
  87. passert(led_tostring(led, str, sizeof(str)) > 0);
  88. printf("LED description: %s\n", str);
  89. printf("LED description looks OK? y/n\n");
  90. passert(getc_yes());
  91. /* Turn LED off */
  92. passert(led_write(led, false) == 0);
  93. printf("LED is off? y/n\n");
  94. passert(getc_yes());
  95. /* Turn LED on */
  96. passert(led_write(led, true) == 0);
  97. printf("LED is on? y/n\n");
  98. passert(getc_yes());
  99. /* Turn LED off */
  100. passert(led_write(led, false) == 0);
  101. printf("LED is off? y/n\n");
  102. passert(getc_yes());
  103. /* Turn LED on */
  104. passert(led_write(led, true) == 0);
  105. printf("LED is on? y/n\n");
  106. passert(getc_yes());
  107. passert(led_close(led) == 0);
  108. /* Free LED */
  109. led_free(led);
  110. }
  111. int main(int argc, char *argv[]) {
  112. if (argc < 2) {
  113. fprintf(stderr, "Usage: %s <LED name>\n\n", argv[0]);
  114. fprintf(stderr, "[1/4] Arguments test: No requirements.\n");
  115. fprintf(stderr, "[2/4] Open/close test: LED should be real.\n");
  116. fprintf(stderr, "[3/4] Loopback test: No test.\n");
  117. fprintf(stderr, "[4/4] Interactive test: LED should be observed.\n\n");
  118. fprintf(stderr, "Hint: for Raspberry Pi 3, disable triggers for led1:\n");
  119. fprintf(stderr, " $ echo none > /sys/class/leds/led1/trigger\n");
  120. fprintf(stderr, "Observe led1 (red power LED), and run this test:\n");
  121. fprintf(stderr, " %s led1\n\n", argv[0]);
  122. exit(1);
  123. }
  124. device = argv[1];
  125. test_arguments();
  126. printf(" " STR_OK " Arguments test passed.\n\n");
  127. test_open_config_close();
  128. printf(" " STR_OK " Open/close test passed.\n\n");
  129. test_loopback();
  130. printf(" " STR_OK " Loopback test passed.\n\n");
  131. test_interactive();
  132. printf(" " STR_OK " Interactive test passed.\n\n");
  133. printf("All tests passed!\n");
  134. return 0;
  135. }