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