1*0cbe4818SRobert Mustacchi# 2*0cbe4818SRobert Mustacchi# This file and its contents are supplied under the terms of the 3*0cbe4818SRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0. 4*0cbe4818SRobert Mustacchi# You may only use this file in accordance with the terms of version 5*0cbe4818SRobert Mustacchi# 1.0 of the CDDL. 6*0cbe4818SRobert Mustacchi# 7*0cbe4818SRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this 8*0cbe4818SRobert Mustacchi# source. A copy of the CDDL is also available via the Internet at 9*0cbe4818SRobert Mustacchi# http://www.illumos.org/license/CDDL. 10*0cbe4818SRobert Mustacchi# 11*0cbe4818SRobert Mustacchi 12*0cbe4818SRobert Mustacchi# 13*0cbe4818SRobert Mustacchi# Copyright 2025 Oxide Computer Company 14*0cbe4818SRobert Mustacchi# 15*0cbe4818SRobert Mustacchi 16*0cbe4818SRobert Mustacchi# 17*0cbe4818SRobert Mustacchi# Common utility functions and data for I2C related tests, setup, and clean up. 18*0cbe4818SRobert Mustacchi# 19*0cbe4818SRobert Mustacchi 20*0cbe4818SRobert Mustacchi# 21*0cbe4818SRobert Mustacchi# Common environment and behavior settings. 22*0cbe4818SRobert Mustacchi# 23*0cbe4818SRobert Mustacchiexport LANG=C.UTF-8 24*0cbe4818SRobert Mustacchiexport LD_PRELOAD=libumem.so 25*0cbe4818SRobert Mustacchiexport UMEM_DEBUG=default 26*0cbe4818SRobert Mustacchiunalias -a 27*0cbe4818SRobert Mustacchiset -o errexit 28*0cbe4818SRobert Mustacchi 29*0cbe4818SRobert Mustacchi# 30*0cbe4818SRobert Mustacchi# Access to our program. 31*0cbe4818SRobert Mustacchi# 32*0cbe4818SRobert MustacchiI2CADM=${ISCADM:-/usr/sbin/i2cadm} 33*0cbe4818SRobert Mustacchi 34*0cbe4818SRobert Mustacchi# 35*0cbe4818SRobert Mustacchi# List of our known controllers. 36*0cbe4818SRobert Mustacchi# 37*0cbe4818SRobert MustacchiI2C_CTRLS=(i2csim0 smbussim1) 38*0cbe4818SRobert Mustacchi 39*0cbe4818SRobert Mustacchi# 40*0cbe4818SRobert Mustacchi# Common exit status to use. 41*0cbe4818SRobert Mustacchi# 42*0cbe4818SRobert Mustacchii2c_exit=0 43*0cbe4818SRobert Mustacchi 44*0cbe4818SRobert Mustacchifunction fatal 45*0cbe4818SRobert Mustacchi{ 46*0cbe4818SRobert Mustacchi typeset msg="$*" 47*0cbe4818SRobert Mustacchi echo "TEST FAILED: $msg" >&2 48*0cbe4818SRobert Mustacchi exit 1 49*0cbe4818SRobert Mustacchi} 50*0cbe4818SRobert Mustacchi 51*0cbe4818SRobert Mustacchifunction warn 52*0cbe4818SRobert Mustacchi{ 53*0cbe4818SRobert Mustacchi typeset msg="$*" 54*0cbe4818SRobert Mustacchi echo "TEST FAILED: $msg" >&2 55*0cbe4818SRobert Mustacchi i2c_exit=1 56*0cbe4818SRobert Mustacchi} 57*0cbe4818SRobert Mustacchi 58*0cbe4818SRobert Mustacchi# 59*0cbe4818SRobert Mustacchi# Given a path, clean up all I2C devices that match that path. 60*0cbe4818SRobert Mustacchi# 61*0cbe4818SRobert Mustacchifunction i2c_cleanup_path 62*0cbe4818SRobert Mustacchi{ 63*0cbe4818SRobert Mustacchi typeset path="$1" 64*0cbe4818SRobert Mustacchi 65*0cbe4818SRobert Mustacchi for dev in $(i2cadm device list -Hpo path $path | sort -r); do 66*0cbe4818SRobert Mustacchi if ! i2cadm device remove $dev; then 67*0cbe4818SRobert Mustacchi fatal "failed to remove $dev" 68*0cbe4818SRobert Mustacchi fi 69*0cbe4818SRobert Mustacchi done 70*0cbe4818SRobert Mustacchi} 71*0cbe4818SRobert Mustacchi 72*0cbe4818SRobert Mustacchi# 73*0cbe4818SRobert Mustacchi# Clean up all devices that may have been created in the kernel on our simulated 74*0cbe4818SRobert Mustacchi# controllers. 75*0cbe4818SRobert Mustacchi# 76*0cbe4818SRobert Mustacchifunction i2c_cleanup_devs 77*0cbe4818SRobert Mustacchi{ 78*0cbe4818SRobert Mustacchi for i in ${!I2C_CTRLS[*]}; do 79*0cbe4818SRobert Mustacchi i2c_cleanup_path "${I2C_CTRLS[$i]}" 80*0cbe4818SRobert Mustacchi done 81*0cbe4818SRobert Mustacchi} 82*0cbe4818SRobert Mustacchi 83*0cbe4818SRobert Mustacchifunction i2cadm_fail 84*0cbe4818SRobert Mustacchi{ 85*0cbe4818SRobert Mustacchi typeset ret= 86*0cbe4818SRobert Mustacchi "$I2CADM" $@ 1>/dev/null 2>/dev/null 87*0cbe4818SRobert Mustacchi ret=$? 88*0cbe4818SRobert Mustacchi 89*0cbe4818SRobert Mustacchi if (( ret == 0 )); then 90*0cbe4818SRobert Mustacchi warn "should have failed with args $@, but passed" 91*0cbe4818SRobert Mustacchi elif (( ret != 1 && ret != 2 )); then 92*0cbe4818SRobert Mustacchi warn "args $@ failed with status $ret, expected 1 or 2" 93*0cbe4818SRobert Mustacchi else 94*0cbe4818SRobert Mustacchi printf "TEST PASSED: program failed (exited %u): %s\n" "$ret" \ 95*0cbe4818SRobert Mustacchi "$*" 96*0cbe4818SRobert Mustacchi fi 97*0cbe4818SRobert Mustacchi} 98*0cbe4818SRobert Mustacchi 99*0cbe4818SRobert Mustacchifunction i2cadm_pass 100*0cbe4818SRobert Mustacchi{ 101*0cbe4818SRobert Mustacchi typeset ret= 102*0cbe4818SRobert Mustacchi "$I2CADM" $@ 1>/dev/null 2>/dev/null 103*0cbe4818SRobert Mustacchi ret=$? 104*0cbe4818SRobert Mustacchi if (( ret != 0 )); then 105*0cbe4818SRobert Mustacchi warn "$@ failed with status $?, but expected success" 106*0cbe4818SRobert Mustacchi return 107*0cbe4818SRobert Mustacchi fi 108*0cbe4818SRobert Mustacchi 109*0cbe4818SRobert Mustacchi printf "TEST PASSED: %s ran successfully\n" "$*" 110*0cbe4818SRobert Mustacchi} 111*0cbe4818SRobert Mustacchi 112*0cbe4818SRobert Mustacchi# 113*0cbe4818SRobert Mustacchi# Checks to see if the output of a command matches what we expect. This is 114*0cbe4818SRobert Mustacchi# expected to be used with the parseable ofmt output. 115*0cbe4818SRobert Mustacchi# 116*0cbe4818SRobert Mustacchifunction i2cadm_check_output 117*0cbe4818SRobert Mustacchi{ 118*0cbe4818SRobert Mustacchi typeset exp="$1" 119*0cbe4818SRobert Mustacchi typeset out= 120*0cbe4818SRobert Mustacchi typeset ret= 121*0cbe4818SRobert Mustacchi shift 122*0cbe4818SRobert Mustacchi 123*0cbe4818SRobert Mustacchi out=$("$I2CADM" $@ 2>/dev/null) 124*0cbe4818SRobert Mustacchi ret=$? 125*0cbe4818SRobert Mustacchi if (( ret != 0 )); then 126*0cbe4818SRobert Mustacchi warn "$@ failed with status $ret, but expected success" 127*0cbe4818SRobert Mustacchi return 128*0cbe4818SRobert Mustacchi fi 129*0cbe4818SRobert Mustacchi 130*0cbe4818SRobert Mustacchi if [[ "$out" != "$exp" ]]; then 131*0cbe4818SRobert Mustacchi warn "$@ had unexpected output ($out), expected: $exp" 132*0cbe4818SRobert Mustacchi return 133*0cbe4818SRobert Mustacchi fi 134*0cbe4818SRobert Mustacchi 135*0cbe4818SRobert Mustacchi printf "TEST PASSED: output from %s matched expected value: %s\n" "$*" \ 136*0cbe4818SRobert Mustacchi "$exp" 137*0cbe4818SRobert Mustacchi} 138