Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / tools / testing / selftests / power_supply / helpers.sh
blob1ec90d7c91082e109f3b3c5ef07bf033f7a55f29
1 #!/bin/sh
2 # SPDX-License-Identifier: GPL-2.0
4 # Copyright (c) 2022, 2024 Collabora Ltd
5 SYSFS_SUPPLIES=/sys/class/power_supply
7 calc() {
8 awk "BEGIN { print $* }";
11 test_sysfs_prop() {
12 PROP="$1"
13 VALUE="$2" # optional
15 PROP_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP"
16 TEST_NAME="$DEVNAME".sysfs."$PROP"
18 if [ -z "$VALUE" ]; then
19 ktap_test_result "$TEST_NAME" [ -f "$PROP_PATH" ]
20 else
21 ktap_test_result "$TEST_NAME" grep -q "$VALUE" "$PROP_PATH"
25 to_human_readable_unit() {
26 VALUE="$1"
27 UNIT="$2"
29 case "$VALUE" in
30 *[!0-9]* ) return ;; # Not a number
31 esac
33 if [ "$UNIT" = "uA" ]; then
34 new_unit="mA"
35 div=1000
36 elif [ "$UNIT" = "uV" ]; then
37 new_unit="V"
38 div=1000000
39 elif [ "$UNIT" = "uAh" ]; then
40 new_unit="Ah"
41 div=1000000
42 elif [ "$UNIT" = "uW" ]; then
43 new_unit="mW"
44 div=1000
45 elif [ "$UNIT" = "uWh" ]; then
46 new_unit="Wh"
47 div=1000000
48 else
49 return
52 value_converted=$(calc "$VALUE"/"$div")
53 echo "$value_converted" "$new_unit"
56 _check_sysfs_prop_available() {
57 PROP=$1
59 PROP_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP"
60 TEST_NAME="$DEVNAME".sysfs."$PROP"
62 if [ ! -e "$PROP_PATH" ] ; then
63 ktap_test_skip "$TEST_NAME"
64 return 1
67 if ! cat "$PROP_PATH" >/dev/null; then
68 ktap_print_msg "Failed to read"
69 ktap_test_fail "$TEST_NAME"
70 return 1
73 return 0
76 test_sysfs_prop_optional() {
77 PROP=$1
78 UNIT=$2 # optional
80 TEST_NAME="$DEVNAME".sysfs."$PROP"
82 _check_sysfs_prop_available "$PROP" || return
83 DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
85 ktap_print_msg "Reported: '$DATA' $UNIT ($(to_human_readable_unit "$DATA" "$UNIT"))"
86 ktap_test_pass "$TEST_NAME"
89 test_sysfs_prop_optional_range() {
90 PROP=$1
91 MIN=$2
92 MAX=$3
93 UNIT=$4 # optional
95 TEST_NAME="$DEVNAME".sysfs."$PROP"
97 _check_sysfs_prop_available "$PROP" || return
98 DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
100 if [ "$DATA" -lt "$MIN" ] || [ "$DATA" -gt "$MAX" ]; then
101 ktap_print_msg "'$DATA' is out of range (min=$MIN, max=$MAX)"
102 ktap_test_fail "$TEST_NAME"
103 else
104 ktap_print_msg "Reported: '$DATA' $UNIT ($(to_human_readable_unit "$DATA" "$UNIT"))"
105 ktap_test_pass "$TEST_NAME"
109 test_sysfs_prop_optional_list() {
110 PROP=$1
111 LIST=$2
113 TEST_NAME="$DEVNAME".sysfs."$PROP"
115 _check_sysfs_prop_available "$PROP" || return
116 DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
118 valid=0
120 OLDIFS=$IFS
121 IFS=","
122 for item in $LIST; do
123 if [ "$DATA" = "$item" ]; then
124 valid=1
125 break
127 done
128 if [ "$valid" -eq 1 ]; then
129 ktap_print_msg "Reported: '$DATA'"
130 ktap_test_pass "$TEST_NAME"
131 else
132 ktap_print_msg "'$DATA' is not a valid value for this property"
133 ktap_test_fail "$TEST_NAME"
135 IFS=$OLDIFS
138 dump_file() {
139 FILE="$1"
140 while read -r line; do
141 ktap_print_msg "$line"
142 done < "$FILE"
145 __test_uevent_prop() {
146 PROP="$1"
147 OPTIONAL="$2"
148 VALUE="$3" # optional
150 UEVENT_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/uevent
151 TEST_NAME="$DEVNAME".uevent."$PROP"
153 if ! grep -q "POWER_SUPPLY_$PROP=" "$UEVENT_PATH"; then
154 if [ "$OPTIONAL" -eq 1 ]; then
155 ktap_test_skip "$TEST_NAME"
156 else
157 ktap_print_msg "Missing property"
158 ktap_test_fail "$TEST_NAME"
160 return
163 if ! grep -q "POWER_SUPPLY_$PROP=$VALUE" "$UEVENT_PATH"; then
164 ktap_print_msg "Invalid value for uevent property, dumping..."
165 dump_file "$UEVENT_PATH"
166 ktap_test_fail "$TEST_NAME"
167 else
168 ktap_test_pass "$TEST_NAME"
172 test_uevent_prop() {
173 __test_uevent_prop "$1" 0 "$2"
176 test_uevent_prop_optional() {
177 __test_uevent_prop "$1" 1 "$2"