18a37ae75SRobert Mustacchi#!/usr/bin/ksh
28a37ae75SRobert Mustacchi#
38a37ae75SRobert Mustacchi#
48a37ae75SRobert Mustacchi# This file and its contents are supplied under the terms of the
58a37ae75SRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0.
68a37ae75SRobert Mustacchi# You may only use this file in accordance with the terms of version
78a37ae75SRobert Mustacchi# 1.0 of the CDDL.
88a37ae75SRobert Mustacchi#
98a37ae75SRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this
108a37ae75SRobert Mustacchi# source.  A copy of the CDDL is also available via the Internet at
118a37ae75SRobert Mustacchi# http://www.illumos.org/license/CDDL.
128a37ae75SRobert Mustacchi#
138a37ae75SRobert Mustacchi
148a37ae75SRobert Mustacchi#
158a37ae75SRobert Mustacchi# Copyright 2021 Oxide Computer Company
168a37ae75SRobert Mustacchi#
178a37ae75SRobert Mustacchi
188a37ae75SRobert Mustacchiunalias -a
198a37ae75SRobert Mustacchiset -o pipefail
208a37ae75SRobert Mustacchi
218a37ae75SRobert Mustacchipcidb_arg0="$(basename $0)"
228a37ae75SRobert Mustacchipcidb_prog="/usr/lib/pci/pcidb"
238a37ae75SRobert Mustacchipcidb_exit=0
248a37ae75SRobert Mustacchi
258a37ae75SRobert Mustacchiwarn()
268a37ae75SRobert Mustacchi{
278a37ae75SRobert Mustacchi	typeset msg="$*"
288a37ae75SRobert Mustacchi	[[ -z "$msg" ]] && msg="failed"
298a37ae75SRobert Mustacchi	echo "TEST FAILED: $pcidb_arg0: $msg" >&2
308a37ae75SRobert Mustacchi}
318a37ae75SRobert Mustacchi
328a37ae75SRobert Mustacchi#
338a37ae75SRobert Mustacchi# The following is intended to catch bad filters.
348a37ae75SRobert Mustacchi#
358a37ae75SRobert Mustacchipcidb_bad_filter()
368a37ae75SRobert Mustacchi{
378a37ae75SRobert Mustacchi	typeset filt="$1"
388a37ae75SRobert Mustacchi
398a37ae75SRobert Mustacchi	if $pcidb_prog $filt 2>/dev/null; then
408a37ae75SRobert Mustacchi		warn "invalid filter $filt erroneously worked"
418a37ae75SRobert Mustacchi		pcidb_exit=1
428a37ae75SRobert Mustacchi		return
438a37ae75SRobert Mustacchi	fi
448a37ae75SRobert Mustacchi
458a37ae75SRobert Mustacchi	printf "TEST PASSED: invalid filter %s\n" "$filt"
468a37ae75SRobert Mustacchi
478a37ae75SRobert Mustacchi}
488a37ae75SRobert Mustacchi
498a37ae75SRobert Mustacchipcidb_bad_args()
508a37ae75SRobert Mustacchi{
518a37ae75SRobert Mustacchi	if $pcidb_prog $@ 2>/dev/null 1>/dev/null; then
528a37ae75SRobert Mustacchi		warn "should have failed with args "$@", but passed"
538a37ae75SRobert Mustacchi		pcidb_exit=1
548a37ae75SRobert Mustacchi		return
558a37ae75SRobert Mustacchi	fi
568a37ae75SRobert Mustacchi
578a37ae75SRobert Mustacchi	printf "TEST PASSED: invalid arguments %s\n" "$*"
588a37ae75SRobert Mustacchi}
598a37ae75SRobert Mustacchi
608a37ae75SRobert Mustacchipcidb_match()
618a37ae75SRobert Mustacchi{
628a37ae75SRobert Mustacchi	typeset output
638a37ae75SRobert Mustacchi	typeset match="$1"
648a37ae75SRobert Mustacchi	shift
658a37ae75SRobert Mustacchi
668a37ae75SRobert Mustacchi	output=$($pcidb_prog $@)
678a37ae75SRobert Mustacchi	if (( $? != 0)); then
688a37ae75SRobert Mustacchi		warn "failed to run pcidb with args: $@"
698a37ae75SRobert Mustacchi		pcidb_exit=1
708a37ae75SRobert Mustacchi		return
718a37ae75SRobert Mustacchi	fi
728a37ae75SRobert Mustacchi
738a37ae75SRobert Mustacchi	if [[ "$output" != "$match" ]]; then
748a37ae75SRobert Mustacchi		warn "output mismatch with args: $@\n found:    $output\n" \
758a37ae75SRobert Mustacchi		    "expected: $match"
768a37ae75SRobert Mustacchi		pcidb_exit=1
778a37ae75SRobert Mustacchi		return
788a37ae75SRobert Mustacchi	fi
798a37ae75SRobert Mustacchi
808a37ae75SRobert Mustacchi	printf "TEST PASSED: successfully matched against %s\n" "$*"
818a37ae75SRobert Mustacchi}
828a37ae75SRobert Mustacchi
838a37ae75SRobert Mustacchiif [[ -n $PCIDB ]]; then
848a37ae75SRobert Mustacchi	pcidb_prog=$PCIDB
858a37ae75SRobert Mustacchifi
868a37ae75SRobert Mustacchi
878a37ae75SRobert Mustacchi#
888a37ae75SRobert Mustacchi# Before we begin execution, set up the environment such that we have a
898a37ae75SRobert Mustacchi# standard locale and that umem will help us catch mistakes.
908a37ae75SRobert Mustacchi#
918a37ae75SRobert Mustacchiexport LC_ALL=C.UTF-8
928a37ae75SRobert Mustacchiexport LD_PRELOAD=libumem.so
938a37ae75SRobert Mustacchiexport UMEM_DEBUG=default
948a37ae75SRobert Mustacchi
958a37ae75SRobert Mustacchi#
968a37ae75SRobert Mustacchi# Validate that filters match either exactly one or at least one line of
978a37ae75SRobert Mustacchi# output using parsable mode. When we match more than one entry, we
988a37ae75SRobert Mustacchi# don't try to assert the count because we expect that it will actually
998a37ae75SRobert Mustacchi# change over time.
1008a37ae75SRobert Mustacchi#
1018a37ae75SRobert Mustacchiexp="1de
1028a37ae75SRobert Mustacchi8086"
1038a37ae75SRobert Mustacchipcidb_match "$exp" -v -p -o vid pci8086 pci1de
1048a37ae75SRobert Mustacchipcidb_match "Advanced Micro Devices, Inc. [AMD]" -v -p -o vendor pci1022
105*1b8ff185SRobert Mustacchipcidb_match "1af4:1044:Virtio 1.0 RNG" -p -o vid,did,device pci1af4,1044
1068a37ae75SRobert Mustacchipcidb_match "Dell:HBA330 Adapter" -s -p -o subvendor,subsystem \
1078a37ae75SRobert Mustacchi	pci1000,97.1028,1f45
1088a37ae75SRobert Mustacchipcidb_match "c:3:30:XHCI" -i -p -o bcc,scc,pi,interface pciclass,0c0330
1098a37ae75SRobert Mustacchipcidb_match "I2O" -S -p -o subclass pciexclass,0e
1108a37ae75SRobert Mustacchipcidb_match "Ethernet 1Gb 2-port 368i Adapter" -s -p -o subsystem pci1590,216,s
1118a37ae75SRobert Mustacchi
1128a37ae75SRobert Mustacchi#
1138a37ae75SRobert Mustacchi# We should get no output when we specify a class or device filter and
1148a37ae75SRobert Mustacchi# use a different table or we have an over specified filter.
1158a37ae75SRobert Mustacchi#
1168a37ae75SRobert Mustacchipcidb_match "" -d pciclass,03
1178a37ae75SRobert Mustacchipcidb_match "" -S pci1000
1188a37ae75SRobert Mustacchipcidb_match "" -v pci8086,1234
1198a37ae75SRobert Mustacchipcidb_match "" -c pciclass,010802
1208a37ae75SRobert Mustacchi
1218a37ae75SRobert Mustacchi#
1228a37ae75SRobert Mustacchi# Run through filter parsing
1238a37ae75SRobert Mustacchi#
1248a37ae75SRobert Mustacchipcidb_bad_filter "foo"
1258a37ae75SRobert Mustacchipcidb_bad_filter ";ffvi"
1268a37ae75SRobert Mustacchipcidb_bad_filter "12345"
1278a37ae75SRobert Mustacchipcidb_bad_filter "pc8086"
1288a37ae75SRobert Mustacchipcidb_bad_filter "pciqwer"
1298a37ae75SRobert Mustacchipcidb_bad_filter "pci12345"
1308a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,"
1318a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,locke"
1328a37ae75SRobert Mustacchipcidb_bad_filter "pci8086sigh"
1338a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,p"
1348a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,12345"
1358a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234zz"
1368a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234."
1378a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234,"
1388a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234,b"
1398a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234,8"
1408a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234,wat"
1418a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.terra"
1428a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.terra,celes"
1438a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.fffff"
1448a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.abcd,"
1458a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.abcd."
1468a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.abcdqr"
1478a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.abcd,2,p"
1488a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.abcd,2000000000"
1498a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.abcd,kefka"
1508a37ae75SRobert Mustacchipcidb_bad_filter "pci8086,1234.abcd,34ultros"
1518a37ae75SRobert Mustacchipcidb_bad_filter "pciexqwer"
1528a37ae75SRobert Mustacchipcidb_bad_filter "pciex12345"
1538a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,"
1548a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,locke"
1558a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086sigh"
1568a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,p"
1578a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,12345"
1588a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234zz"
1598a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234."
1608a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234,"
1618a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234,b"
1628a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234,8"
1638a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234,wat"
1648a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.terra"
1658a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.terra,celes"
1668a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.fffff"
1678a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.abcd,"
1688a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.abcd."
1698a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.abcdqr"
1708a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.abcd,2,p"
1718a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.abcd,2000000000"
1728a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.abcd,kefka"
1738a37ae75SRobert Mustacchipcidb_bad_filter "pciex8086,1234.abcd,34ultros"
1748a37ae75SRobert Mustacchipcidb_bad_filter "pciclas"
1758a37ae75SRobert Mustacchipcidb_bad_filter "pciclassedgar"
1768a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,sabin"
1778a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,0"
1788a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,013"
1798a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,01345"
1808a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,0134567"
1818a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,01,"
1828a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,010,"
1838a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,010aa,"
1848a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,0102as"
1858a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,0102.as"
1868a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,0102@as"
1878a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,010298aa"
1888a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,010298,"
1898a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,010298!"
1908a37ae75SRobert Mustacchipcidb_bad_filter "pciclass,010298!shadow"
1918a37ae75SRobert Mustacchipcidb_bad_filter "pciexclas"
1928a37ae75SRobert Mustacchipcidb_bad_filter "pciexclassedgar"
1938a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,sabin"
1948a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,0"
1958a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,013"
1968a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,01345"
1978a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,0134567"
1988a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,01,"
1998a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,010,"
2008a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,010aa,"
2018a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,0102as"
2028a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,0102.as"
2038a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,0102@as"
2048a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,010298aa"
2058a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,010298,"
2068a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,010298!"
2078a37ae75SRobert Mustacchipcidb_bad_filter "pciexclass,010298!shadow"
2088a37ae75SRobert Mustacchi
2098a37ae75SRobert Mustacchi#
2108a37ae75SRobert Mustacchi# Verify that if we ask for bad columns we error
2118a37ae75SRobert Mustacchi#
2128a37ae75SRobert Mustacchipcidb_bad_args -p
2138a37ae75SRobert Mustacchipcidb_bad_args -o
2148a37ae75SRobert Mustacchipcidb_bad_args -o -p
2158a37ae75SRobert Mustacchipcidb_bad_args -p -o terra
2168a37ae75SRobert Mustacchipcidb_bad_args -p -o subclass -v
2178a37ae75SRobert Mustacchipcidb_bad_args -v -d -c
2188a37ae75SRobert Mustacchi
2198a37ae75SRobert Mustacchiif (( pcidb_exit == 0 )); then
2208a37ae75SRobert Mustacchi	printf "All tests passed successfully!\n"
2218a37ae75SRobert Mustacchifi
2228a37ae75SRobert Mustacchi
2238a37ae75SRobert Mustacchiexit $pcidb_exit
224