helpers.sh 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #!/bin/sh
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # Copyright (c) 2022, 2024 Collabora Ltd
  5. SYSFS_SUPPLIES=/sys/class/power_supply
  6. calc() {
  7. awk "BEGIN { print $* }";
  8. }
  9. test_sysfs_prop() {
  10. PROP="$1"
  11. VALUE="$2" # optional
  12. PROP_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP"
  13. TEST_NAME="$DEVNAME".sysfs."$PROP"
  14. if [ -z "$VALUE" ]; then
  15. ktap_test_result "$TEST_NAME" [ -f "$PROP_PATH" ]
  16. else
  17. ktap_test_result "$TEST_NAME" grep -q "$VALUE" "$PROP_PATH"
  18. fi
  19. }
  20. to_human_readable_unit() {
  21. VALUE="$1"
  22. UNIT="$2"
  23. case "$VALUE" in
  24. *[!0-9]* ) return ;; # Not a number
  25. esac
  26. if [ "$UNIT" = "uA" ]; then
  27. new_unit="mA"
  28. div=1000
  29. elif [ "$UNIT" = "uV" ]; then
  30. new_unit="V"
  31. div=1000000
  32. elif [ "$UNIT" = "uAh" ]; then
  33. new_unit="Ah"
  34. div=1000000
  35. elif [ "$UNIT" = "uW" ]; then
  36. new_unit="mW"
  37. div=1000
  38. elif [ "$UNIT" = "uWh" ]; then
  39. new_unit="Wh"
  40. div=1000000
  41. else
  42. return
  43. fi
  44. value_converted=$(calc "$VALUE"/"$div")
  45. echo "$value_converted" "$new_unit"
  46. }
  47. _check_sysfs_prop_available() {
  48. PROP=$1
  49. PROP_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP"
  50. TEST_NAME="$DEVNAME".sysfs."$PROP"
  51. if [ ! -e "$PROP_PATH" ] ; then
  52. ktap_test_skip "$TEST_NAME"
  53. return 1
  54. fi
  55. if ! cat "$PROP_PATH" >/dev/null; then
  56. ktap_print_msg "Failed to read"
  57. ktap_test_fail "$TEST_NAME"
  58. return 1
  59. fi
  60. return 0
  61. }
  62. test_sysfs_prop_optional() {
  63. PROP=$1
  64. UNIT=$2 # optional
  65. TEST_NAME="$DEVNAME".sysfs."$PROP"
  66. _check_sysfs_prop_available "$PROP" || return
  67. DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
  68. ktap_print_msg "Reported: '$DATA' $UNIT ($(to_human_readable_unit "$DATA" "$UNIT"))"
  69. ktap_test_pass "$TEST_NAME"
  70. }
  71. test_sysfs_prop_optional_range() {
  72. PROP=$1
  73. MIN=$2
  74. MAX=$3
  75. UNIT=$4 # optional
  76. TEST_NAME="$DEVNAME".sysfs."$PROP"
  77. _check_sysfs_prop_available "$PROP" || return
  78. DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
  79. if [ "$DATA" -lt "$MIN" ] || [ "$DATA" -gt "$MAX" ]; then
  80. ktap_print_msg "'$DATA' is out of range (min=$MIN, max=$MAX)"
  81. ktap_test_fail "$TEST_NAME"
  82. else
  83. ktap_print_msg "Reported: '$DATA' $UNIT ($(to_human_readable_unit "$DATA" "$UNIT"))"
  84. ktap_test_pass "$TEST_NAME"
  85. fi
  86. }
  87. test_sysfs_prop_optional_list() {
  88. PROP=$1
  89. LIST=$2
  90. TEST_NAME="$DEVNAME".sysfs."$PROP"
  91. _check_sysfs_prop_available "$PROP" || return
  92. DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
  93. valid=0
  94. OLDIFS=$IFS
  95. IFS=","
  96. for item in $LIST; do
  97. if [ "$DATA" = "$item" ]; then
  98. valid=1
  99. break
  100. fi
  101. done
  102. if [ "$valid" -eq 1 ]; then
  103. ktap_print_msg "Reported: '$DATA'"
  104. ktap_test_pass "$TEST_NAME"
  105. else
  106. ktap_print_msg "'$DATA' is not a valid value for this property"
  107. ktap_test_fail "$TEST_NAME"
  108. fi
  109. IFS=$OLDIFS
  110. }
  111. dump_file() {
  112. FILE="$1"
  113. while read -r line; do
  114. ktap_print_msg "$line"
  115. done < "$FILE"
  116. }
  117. __test_uevent_prop() {
  118. PROP="$1"
  119. OPTIONAL="$2"
  120. VALUE="$3" # optional
  121. UEVENT_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/uevent
  122. TEST_NAME="$DEVNAME".uevent."$PROP"
  123. if ! grep -q "POWER_SUPPLY_$PROP=" "$UEVENT_PATH"; then
  124. if [ "$OPTIONAL" -eq 1 ]; then
  125. ktap_test_skip "$TEST_NAME"
  126. else
  127. ktap_print_msg "Missing property"
  128. ktap_test_fail "$TEST_NAME"
  129. fi
  130. return
  131. fi
  132. if ! grep -q "POWER_SUPPLY_$PROP=$VALUE" "$UEVENT_PATH"; then
  133. ktap_print_msg "Invalid value for uevent property, dumping..."
  134. dump_file "$UEVENT_PATH"
  135. ktap_test_fail "$TEST_NAME"
  136. else
  137. ktap_test_pass "$TEST_NAME"
  138. fi
  139. }
  140. test_uevent_prop() {
  141. __test_uevent_prop "$1" 0 "$2"
  142. }
  143. test_uevent_prop_optional() {
  144. __test_uevent_prop "$1" 1 "$2"
  145. }