1*7687d0d8SRobert Mustacchi#!/usr/bin/ksh
2*7687d0d8SRobert Mustacchi#
3*7687d0d8SRobert Mustacchi#
4*7687d0d8SRobert Mustacchi# This file and its contents are supplied under the terms of the
5*7687d0d8SRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0.
6*7687d0d8SRobert Mustacchi# You may only use this file in accordance with the terms of version
7*7687d0d8SRobert Mustacchi# 1.0 of the CDDL.
8*7687d0d8SRobert Mustacchi#
9*7687d0d8SRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this
10*7687d0d8SRobert Mustacchi# source.  A copy of the CDDL is also available via the Internet at
11*7687d0d8SRobert Mustacchi# http://www.illumos.org/license/CDDL.
12*7687d0d8SRobert Mustacchi#
13*7687d0d8SRobert Mustacchi
14*7687d0d8SRobert Mustacchi#
15*7687d0d8SRobert Mustacchi# Copyright 2021 Oxide Computer Company
16*7687d0d8SRobert Mustacchi#
17*7687d0d8SRobert Mustacchi
18*7687d0d8SRobert Mustacchiunalias -a
19*7687d0d8SRobert Mustacchiset -o pipefail
20*7687d0d8SRobert Mustacchi
21*7687d0d8SRobert Mustacchipcieadm_arg0="$(basename $0)"
22*7687d0d8SRobert Mustacchipcieadm_prog="/usr/lib/pci/pcieadm"
23*7687d0d8SRobert Mustacchipcieadm_data="$(dirname $0)/pci"
24*7687d0d8SRobert Mustacchipcieadm_exit=0
25*7687d0d8SRobert Mustacchipcieadm_tmpfile="/tmp/pcieadmtest.$$"
26*7687d0d8SRobert Mustacchi
27*7687d0d8SRobert Mustacchiwarn()
28*7687d0d8SRobert Mustacchi{
29*7687d0d8SRobert Mustacchi	typeset msg="$*"
30*7687d0d8SRobert Mustacchi	[[ -z "$msg" ]] && msg="failed"
31*7687d0d8SRobert Mustacchi	echo "TEST FAILED: $pcieadm_arg0: $msg" >&2
32*7687d0d8SRobert Mustacchi	pcieadm_exit=1
33*7687d0d8SRobert Mustacchi}
34*7687d0d8SRobert Mustacchi
35*7687d0d8SRobert Mustacchipcieadm_bad_args()
36*7687d0d8SRobert Mustacchi{
37*7687d0d8SRobert Mustacchi	if $pcieadm_prog $@ 2>/dev/null 1>/dev/null; then
38*7687d0d8SRobert Mustacchi		warn "should have failed with args "$@", but passed"
39*7687d0d8SRobert Mustacchi		return
40*7687d0d8SRobert Mustacchi	fi
41*7687d0d8SRobert Mustacchi
42*7687d0d8SRobert Mustacchi	printf "TEST PASSED: invalid arguments %s\n" "$*"
43*7687d0d8SRobert Mustacchi}
44*7687d0d8SRobert Mustacchi
45*7687d0d8SRobert Mustacchipcieadm_validate_output()
46*7687d0d8SRobert Mustacchi{
47*7687d0d8SRobert Mustacchi	typeset input="$pcieadm_data/$1"
48*7687d0d8SRobert Mustacchi	shift
49*7687d0d8SRobert Mustacchi	typeset outfile="$pcieadm_data/$1"
50*7687d0d8SRobert Mustacchi	shift
51*7687d0d8SRobert Mustacchi	typeset expexit=$1
52*7687d0d8SRobert Mustacchi	shift
53*7687d0d8SRobert Mustacchi
54*7687d0d8SRobert Mustacchi	$pcieadm_prog $@ <$input >"$pcieadm_tmpfile" 2>&1
55*7687d0d8SRobert Mustacchi	if (( $? != expexit)); then
56*7687d0d8SRobert Mustacchi		warn "$@: mismatched exit status, found $?, expected $expexit"
57*7687d0d8SRobert Mustacchi	fi
58*7687d0d8SRobert Mustacchi
59*7687d0d8SRobert Mustacchi	if ! diff $outfile $pcieadm_tmpfile; then
60*7687d0d8SRobert Mustacchi		warn "$@: output mismatched"
61*7687d0d8SRobert Mustacchi	else
62*7687d0d8SRobert Mustacchi		printf "TEST PASSED: %s\n" "$*"
63*7687d0d8SRobert Mustacchi	fi
64*7687d0d8SRobert Mustacchi}
65*7687d0d8SRobert Mustacchi
66*7687d0d8SRobert Mustacchi
67*7687d0d8SRobert Mustacchiif [[ -n $PCIEADM ]]; then
68*7687d0d8SRobert Mustacchi	pcieadm_prog=$PCIEADM
69*7687d0d8SRobert Mustacchifi
70*7687d0d8SRobert Mustacchi
71*7687d0d8SRobert Mustacchi#
72*7687d0d8SRobert Mustacchi# Before we begin execution, set up the environment such that we have a
73*7687d0d8SRobert Mustacchi# standard locale and that umem will help us catch mistakes.
74*7687d0d8SRobert Mustacchi#
75*7687d0d8SRobert Mustacchiexport LC_ALL=C.UTF-8
76*7687d0d8SRobert Mustacchiexport LD_PRELOAD=libumem.so
77*7687d0d8SRobert Mustacchiexport UMEM_DEBUG=default
78*7687d0d8SRobert Mustacchi
79*7687d0d8SRobert Mustacchiif [[ ! -d $pcieadm_data ]]; then
80*7687d0d8SRobert Mustacchi	printf "failed to find data directory %s\n" "$pcieadm_data" >&2
81*7687d0d8SRobert Mustacchi	exit 1
82*7687d0d8SRobert Mustacchifi
83*7687d0d8SRobert Mustacchi
84*7687d0d8SRobert Mustacchi#
85*7687d0d8SRobert Mustacchi# First work through bad options.
86*7687d0d8SRobert Mustacchi#
87*7687d0d8SRobert Mustacchipcieadm_bad_args
88*7687d0d8SRobert Mustacchipcieadm_bad_args -d
89*7687d0d8SRobert Mustacchipcieadm_bad_args foobar
90*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace
91*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace -a
92*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace -d
93*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace -d final
94*7687d0d8SRobert Mustacchipcieadm_bad_args save-cfgspace -a -d fantasy
95*7687d0d8SRobert Mustacchipcieadm_bad_args show-devs -h
96*7687d0d8SRobert Mustacchipcieadm_bad_args show-devs -p
97*7687d0d8SRobert Mustacchipcieadm_bad_args show-devs -s -o
98*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace
99*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -d -H
100*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -d
101*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -f
102*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -h
103*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -L
104*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -L -n -f "$pcieadm_data/igb.pci"
105*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -L -p -f "$pcieadm_data/igb.pci"
106*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -p -f "$pcieadm_data/igb.pci"
107*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -o foo -f "$pcieadm_data/igb.pci"
108*7687d0d8SRobert Mustacchipcieadm_bad_args show-cfgspace -L -o foo -f "$pcieadm_data/igb.pci"
109*7687d0d8SRobert Mustacchi
110*7687d0d8SRobert Mustacchi#
111*7687d0d8SRobert Mustacchi# Test different output cases
112*7687d0d8SRobert Mustacchi#
113*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-basic.out 0 \
114*7687d0d8SRobert Mustacchi    show-cfgspace -f /dev/stdin header0.vendor header0.device
115*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-basic-L.out 0 \
116*7687d0d8SRobert Mustacchi    show-cfgspace -L -f /dev/stdin header0.vendor header0.device
117*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-basic-n.out 0 \
118*7687d0d8SRobert Mustacchi    show-cfgspace -n -f /dev/stdin header0.vendor header0.device
119*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-basic-LH.out 0 \
120*7687d0d8SRobert Mustacchi    show-cfgspace -L -H -f /dev/stdin header0.vendor header0.device
121*7687d0d8SRobert Mustacchi
122*7687d0d8SRobert Mustacchi#
123*7687d0d8SRobert Mustacchi# Specific filter behavior. We want to validate the following:
124*7687d0d8SRobert Mustacchi#
125*7687d0d8SRobert Mustacchi#  o An inexact filter (e.g. a cap or subcap) matches in human mode,
126*7687d0d8SRobert Mustacchi#    but not parsable.
127*7687d0d8SRobert Mustacchi#  o An exact filter will show its contents in human mode, but not
128*7687d0d8SRobert Mustacchi#    parsable.
129*7687d0d8SRobert Mustacchi#  o A missing filter causes to exit non-zero, but still show what we
130*7687d0d8SRobert Mustacchi#    found with other filters or because of a prefix match.
131*7687d0d8SRobert Mustacchi#
132*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci igb-ltr.out 0 \
133*7687d0d8SRobert Mustacchi    show-cfgspace -f /dev/stdin ltr
134*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci igb-ltr-p.out 1 \
135*7687d0d8SRobert Mustacchi    show-cfgspace -p -o short,value -f /dev/stdin ltr
136*7687d0d8SRobert Mustacchipcieadm_validate_output igb.pci header0-parse.out 0 \
137*7687d0d8SRobert Mustacchi    show-cfgspace -p -o short,value -f /dev/stdin header0.vendor header0.device
138*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.out 0 \
139*7687d0d8SRobert Mustacchi    show-cfgspace -f /dev/stdin ht
140*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.out 0 \
141*7687d0d8SRobert Mustacchi    show-cfgspace -f /dev/stdin ht.msi
142*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.out 0 \
143*7687d0d8SRobert Mustacchi    show-cfgspace -f /dev/stdin ht.msi.command
144*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht-p.out 1 \
145*7687d0d8SRobert Mustacchi    show-cfgspace -p -o value,short -f /dev/stdin ht
146*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.msi-p.out 1 \
147*7687d0d8SRobert Mustacchi    show-cfgspace -p -o value,short -f /dev/stdin ht.msi
148*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-ht.msi.command-p.out 0 \
149*7687d0d8SRobert Mustacchi    show-cfgspace -p -o value,short -f /dev/stdin ht.msi.command
150*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-efilt.out 1 \
151*7687d0d8SRobert Mustacchi    show-cfgspace -f /dev/stdin pcie.linksts atelier
152*7687d0d8SRobert Mustacchipcieadm_validate_output bridge.pci bridge-efilt-p.out 1 \
153*7687d0d8SRobert Mustacchi    show-cfgspace -p -o short,value -f /dev/stdin pcie.linksts atelier
154*7687d0d8SRobert Mustacchi
155*7687d0d8SRobert Mustacchiif (( pcieadm_exit == 0 )); then
156*7687d0d8SRobert Mustacchi	printf "All tests passed successfully!\n"
157*7687d0d8SRobert Mustacchifi
158*7687d0d8SRobert Mustacchi
159*7687d0d8SRobert Mustacchirm -f "$pcieadm_tmpfile"
160*7687d0d8SRobert Mustacchiexit $pcieadm_exit
161