diff options
author | Matt Barden <mbarden@tintri.com> | 2021-06-03 19:17:48 -0400 |
---|---|---|
committer | Dan McDonald <danmcd@mnx.io> | 2022-10-04 23:16:26 -0400 |
commit | 1b38ec66a3ea040587c1b346f8c010a3b37c8080 (patch) | |
tree | 3c3604c459c557ff8499247fda53f3729bfce9b8 /usr/src | |
parent | 37e2cd25d56b334a2403f2540a0b0a1e6a40bcd1 (diff) | |
download | illumos-joyent-1b38ec66a3ea040587c1b346f8c010a3b37c8080.tar.gz |
15011 Want wrapper for rpc tests in smbsrv-tests
Reviewed by: Gordon Ross <gordon.w.ross@gmail.com>
Reviewed by: Evan Layton <elayton@tintri.com>
Approved by: Dan McDonald <danmcd@mnx.io>
Diffstat (limited to 'usr/src')
6 files changed, 273 insertions, 36 deletions
diff --git a/usr/src/pkg/manifests/system-test-smbsrvtest.p5m b/usr/src/pkg/manifests/system-test-smbsrvtest.p5m index cfcf885aeb..109cb6ccb9 100644 --- a/usr/src/pkg/manifests/system-test-smbsrvtest.p5m +++ b/usr/src/pkg/manifests/system-test-smbsrvtest.p5m @@ -24,9 +24,11 @@ file path=opt/smbsrv-tests/bin/run_smbtorture mode=0555 file path=opt/smbsrv-tests/bin/smbsrvtests mode=0555 dir path=opt/smbsrv-tests/include file path=opt/smbsrv-tests/include/default.cfg mode=0444 +file path=opt/smbsrv-tests/include/smbtor-excl-rpc.txt mode=0444 file path=opt/smbsrv-tests/include/smbtor-excl-smb2.txt mode=0444 dir path=opt/smbsrv-tests/tests dir path=opt/smbsrv-tests/tests/smbtorture +file path=opt/smbsrv-tests/tests/smbtorture/runst-rpc mode=0555 file path=opt/smbsrv-tests/tests/smbtorture/runst-smb2 mode=0555 license lic_CDDL license=lic_CDDL depend type=optional fmri=service/network/samba diff --git a/usr/src/test/smbsrv-tests/cmd/run_smbtorture.py b/usr/src/test/smbsrv-tests/cmd/run_smbtorture.py index fd008f7b19..6e972ba434 100644 --- a/usr/src/test/smbsrv-tests/cmd/run_smbtorture.py +++ b/usr/src/test/smbsrv-tests/cmd/run_smbtorture.py @@ -11,7 +11,7 @@ # # -# Copyright 2021 Tintri by DDN, Inc. All rights reserved. +# Copyright 2022 Tintri by DDN, Inc. All rights reserved. # # @@ -56,6 +56,7 @@ class TestResult(Enum): UNKNOWN = 2 SKIP = 3 KILLED = 4 + TEST_ERR = 5 def __str__(self): return self.name @@ -68,12 +69,12 @@ class TestCase: __slots__ = 'name', 'result' - def __init__(self, name, skip=False): + def __init__(self, name): self.name = name - self.result = TestResult.SKIP if skip else TestResult.UNKNOWN + self.result = TestResult.UNKNOWN def __str__(self): - return '{0.name} | {0.result}'.format(self) + return f'{self.name} | {self.result}' def run(self, rfd, wfd, timeout, cmd): """Run cmd, setting the last element to the test name, and setting result @@ -81,11 +82,11 @@ class TestCase: def finish(self, start, wfd): timediff = datetime.now() - start - wfd.write('END | {} | {}\n'.format(self, timediff)) + wfd.write(f'END | {self} | {timediff}\n') return self.result starttime = datetime.now() - wfd.write('START | {} | {}\n'.format(self.name, starttime.time())) + wfd.write(f'START | {self.name} | {starttime.time()}\n') if self.result == TestResult.SKIP: return finish(self, starttime, wfd) @@ -102,6 +103,8 @@ class TestCase: self.result = TestResult.PASS elif line.startswith('skip:'): self.result = TestResult.SKIP + elif line.startswith('INTERNAL ERROR:'): + self.result = TestResult.TEST_ERR except subprocess.TimeoutExpired: self.result = TestResult.KILLED wfd.write('\nKilled due to timeout\n') @@ -109,30 +112,75 @@ class TestCase: return finish(self, starttime, wfd) -def should_skip(test, pattern, verbose): - """Returns whether test matches pattern, indicating it should be skipped.""" +class TestSet: + """Class to track state associated with the entire test set""" - if not pattern or not pattern.match(test): - return False + __slots__ = 'excluded', 'tests' - if verbose: - print('{} matches exception pattern; marking as skipped'.format(test)) - return True + def __init__(self, tests, skip_pat, verbose): + self.excluded = 0 + + def should_skip(self, test, pattern, verbose): + """Returns whether test matches pattern, indicating it should be + skipped.""" + + if not pattern or not pattern.match(test): + return False + + if verbose: + print(f'{test} matches exception pattern; marking as skipped') + + self.excluded += 1 + return True + + self.tests = [TestCase(line) for line in tests + if not should_skip(self, line, skip_pat, verbose)] + + + def __iter__(self): + return iter(self.tests) + + def __len__(self): + return len(self.tests) def fnm2regex(fnm_pat): """Maps an fnmatch(7) pattern to a regex pattern that will match against any suite that encapsulates the test name""" rpat = fnmatch.translate(fnm_pat) - return r'{}|{}'.format(rpat, rpat.replace(r'\Z', r'\.')) + + # + # If the pattern doesn't end with '*', we also need it to match against + # any sub-module; '*test' needs to also match 'smb2.test.first', but + # not 'smb2.test-other.second'. + # + if not fnm_pat.endswith('*'): + rpat += '|' + fnmatch.translate(fnm_pat + '.*') + return rpat + +def verbose_fnm2regex(fnm_pat): + """fnm2regex(), but prints the input and output patterns""" + ret_pat = fnm2regex(fnm_pat) + print(f'fnmatch: {fnm_pat} regex: {ret_pat}') + return ret_pat def combine_patterns(iterable, verbose): """Combines patterns in an iterable into a single REGEX""" - pat = re.compile('|'.join(map(fnm2regex, iterable)), - flags=re.DEBUG if verbose > 1 else 0) if verbose > 1: - print('final pattern: {}'.format(pat.pattern)) + func = verbose_fnm2regex + else: + func = fnm2regex + + fnmatch_pat = '|'.join(map(func, iterable)) + + if not fnmatch_pat: + pat = None; + else: + pat = re.compile(fnmatch_pat, flags=re.DEBUG if verbose > 2 else 0) + + if verbose > 1: + print(f'final pattern: {pat.pattern if pat else "<None>"}') return pat class ArgumentFile(argparse.FileType): @@ -153,13 +201,13 @@ def main(): parser.add_argument('--except', '-e', type=ArgumentFile('r'), metavar='EXCEPTIONS_FILE', dest='skip_list', - help='A file containing fnmatch(5) patterns of tests to skip') + help='A file containing fnmatch(7) patterns of tests to skip') parser.add_argument('--list', '-l', type=ArgumentFile('r'), metavar='LIST_FILE', help='A file containing the list of tests to run') parser.add_argument('--match', '-m', action='append', metavar='FNMATCH', - help='An fnmatch(5) pattern to select tests from smbtorture --list') + help='An fnmatch(7) pattern to select tests from smbtorture --list') parser.add_argument('--output', '-o', default='/tmp/lastrun.log', metavar='LOG_FILE', help='Location to store full smbtorture output') @@ -197,26 +245,24 @@ def main(): if args.skip_list != None: skip_pat = combine_patterns(parse_tests(args.skip_list), args.verbose) if args.verbose > 1: - print('Exceptions pattern (in REGEX): {}'.format(skip_pat.pattern)) + exc_pat = skip_pat.pattern if skip_pat else '<NONE>' + print(f'Exceptions pattern (in REGEX): {exc_pat}') else: skip_pat = None - tests = [TestCase(line, should_skip(line, skip_pat, args.verbose)) - for line in parse_tests(testgen)] + tests = TestSet(parse_tests(testgen), skip_pat, args.verbose) if args.verbose: print('Tests to run:') for test in tests: - if test.result != TestResult.SKIP: - print(test.name) + print(test.name) outw = open(fout, 'w', buffering=1) outr = open(fout, 'r') - cmd = 'smbtorture //{srv}/{shr} -U{usr}%{pswd}'.format( - srv=server, shr=share, usr=user, pswd=pswd).split() + cmd = f'smbtorture //{server}/{share} -U{user}%{pswd}'.split() if args.seed != None: - cmd.append('--seed={}'.format(args.seed)) + cmd.append(f'--seed={args.seed}') cmd.append('TEST_HERE') if args.verbose: @@ -233,9 +279,10 @@ def main(): print('\n\nRESULTS:') print('=' * 22) for res in TestResult: - print('{}: {:>{}}'.format(res, results[res], 20 - len(res))) + print(f'{res}: {results[res]:>{20 - len(res)}}') print('=' * 22) - print('Total: {:>15}'.format(len(tests))) + print(f'Total: {len(tests):>15}') + print(f'Excluded: {tests.excluded:>12}') if __name__ == '__main__': try: diff --git a/usr/src/test/smbsrv-tests/cmd/smbsrvtests.ksh b/usr/src/test/smbsrv-tests/cmd/smbsrvtests.ksh index 934f4e26ed..aab3ad0c8f 100644 --- a/usr/src/test/smbsrv-tests/cmd/smbsrvtests.ksh +++ b/usr/src/test/smbsrv-tests/cmd/smbsrvtests.ksh @@ -29,12 +29,8 @@ function fail exit ${2:-1} } -while getopts b:c:o:t: c; do +while getopts c:o:t: c; do case $c in - 'b') - export BASEFILE=$OPTARG - [[ -f $BASEFILE ]] || fail "Cannot read file: $BASEFILE" - ;; 'c') CFGFILE=$OPTARG [[ -f $CFGFILE ]] || fail "Cannot read file: $CFGFILE" @@ -51,5 +47,5 @@ shift $((OPTIND - 1)) set -x -# Just one test for now. More to come. $SMBSRV_TESTS/tests/smbtorture/runst-smb2 +$SMBSRV_TESTS/tests/smbtorture/runst-rpc diff --git a/usr/src/test/smbsrv-tests/include/smbtor-excl-rpc.txt b/usr/src/test/smbsrv-tests/include/smbtor-excl-rpc.txt new file mode 100644 index 0000000000..075a4fdf9a --- /dev/null +++ b/usr/src/test/smbsrv-tests/include/smbtor-excl-rpc.txt @@ -0,0 +1,109 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# +# +# Copyright 2021 Tintri by DDN, Inc. All rights reserved. + +# +# smbtorture tests we choose to skip, either because the +# tests hang, or we disagree with the test, or whatever. +# + +#Disabled by default +rpc.spoolss + + +###Unimplemented Services/Features + +rpc.atsvc +rpc.autoidl +rpc.backupkey +rpc.bind +rpc.browser +rpc.clusapi +rpc.cracknames +rpc.drsuapi +rpc.drsuapi_wk28 +rpc.dsgetinfo +rpc.echo +rpc.epmapper +rpc.frsapi +rpc.fsrvp +rpc.handles.drsuapi +rpc.initshutdown +rpc.iremotewinspool +rpc.mgmt +rpc.ntsvcs +rpc.oxidresolve +rpc.remact +rpc.scanner +rpc.unixinfo +rpc.witness + + +###Unimplemented functions + +#GetDcAddress +rpc.dfs.netdfs.DcAddress +#FlushFtTable +rpc.dfs.netdfs.FtRoot +#ManagerInitialize +rpc.dfs.netdfs.ManagerInitialize + +#QueryTrustedomainInfoByName +rpc.lsa.forest +#CreateAccount +rpc.lsa.privileges +#CreatedTrustedDomain, QueryInfoPolicy2 unimplemented +#EnumTrustedDomains(Ex) are stubbed +rpc.lsa.trusted + +#GetAliasMembership +rpc.samba3.getaliasmembership + +#Connect5 +rpc.samr.accessmask.samr.Connect5 +rpc.samr.accessmask.samr.LookupDomain +rpc.samr.accessmask.samr.OpenDomain +rpc.samr.EnumDomains + +#Namesake function is unimplemented +rpc.srvsvc.srvsvc (admin access).NetCharDevQEnum +rpc.srvsvc.srvsvc (admin access).NetCharDevEnum +rpc.srvsvc.srvsvc (admin access).NetDiskEnum +rpc.srvsvc.srvsvc (admin access).NetTransportEnum +rpc.wkssvc.wkssvc.NetWkstaEnumUsers +rpc.wkssvc.wkssvc.NetrAddAlternateComputerName +rpc.wkssvc.wkssvc.NetrEnumerateComputerNames +rpc.wkssvc.wkssvc.NetrGetJoinInformation +rpc.wkssvc.wkssvc.NetrGetJoinableOus +rpc.wkssvc.wkssvc.NetrGetJoinableOus2 +rpc.wkssvc.wkssvc.NetrJoinDomain +rpc.wkssvc.wkssvc.NetrLogonDomainNameAdd +rpc.wkssvc.wkssvc.NetrLogonDomainNameDel +rpc.wkssvc.wkssvc.NetrMessageBufferSend +rpc.wkssvc.wkssvc.NetrRemoveAlternateComputerName +rpc.wkssvc.wkssvc.NetrUnjoinDomain +rpc.wkssvc.wkssvc.NetrUseAdd +rpc.wkssvc.wkssvc.NetrUseDel +rpc.wkssvc.wkssvc.NetrUseEnum +rpc.wkssvc.wkssvc.NetrUseGetInfo +rpc.wkssvc.wkssvc.NetrValidateName +rpc.wkssvc.wkssvc.NetrValidateName2 +rpc.wkssvc.wkssvc.NetrWkstaTransportAdd +rpc.wkssvc.wkssvc.NetrWkstaTransportDel +rpc.wkssvc.wkssvc.NetrWkstaUserGetInfo +rpc.wkssvc.wkssvc.NetrWorkstationStatisticsGet + + +###Benchmarks + +rpc.bench-rpc +rpc.bench-schannel1 diff --git a/usr/src/test/smbsrv-tests/tests/smbtorture/runst-rpc.ksh b/usr/src/test/smbsrv-tests/tests/smbtorture/runst-rpc.ksh new file mode 100644 index 0000000000..44e11dd965 --- /dev/null +++ b/usr/src/test/smbsrv-tests/tests/smbtorture/runst-rpc.ksh @@ -0,0 +1,83 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright 2021 Tintri by DDN, Inc. All rights reserved. +# + +export SMBSRV_TESTS="/opt/smbsrv-tests" +export SMBTOR="/usr/bin/smbtorture" + +runsmbtor=$SMBSRV_TESTS/bin/run_smbtorture +excl_file=$SMBSRV_TESTS/include/smbtor-excl-rpc.txt + +cfgfile=${CFGFILE:-$SMBSRV_TESTS/include/default.cfg} +outdir=${OUTDIR:-/var/tmp/test_results/smbsrv-tests} + +function fail +{ + echo $1 + exit ${2:-1} +} + +while getopts c:o:t: c; do + case $c in + 'c') + cfgfile=$OPTARG + [[ -f $cfgfile ]] || fail "Cannot read file: $cfgfile" + ;; + 'o') + outdir=$OPTARG + ;; + 't') + timeout="-t $OPTARG" + ;; + esac +done +shift $((OPTIND - 1)) + +. $cfgfile + +export PATH="$(dirname $SMBTOR):$PATH" + +mkdir -p $outdir +cd $outdir || fail "Could not cd to $outdir" + +tstamp=$(date +'%Y%m%dT%H%M%S') +logfile=$outdir/smbtor-rpc-${tstamp}.log +outfile=$outdir/smbtor-rpc-${tstamp}.summary + +if [[ -z "$timeout" && -n "$TIMEOUT" ]]; then + timeout="-t $TIMEOUT" +fi + +# Non-option args taken as list of match patterns +if [ -z "$1" ] ; then + match="-m rpc" +fi +for m +do + match="$match -m $m" +done + +#It would be nice to have a generic 'Can I connect to this server/share?' test +$SMBTOR -U "$SMBT_USER%${SMBT_PASS}" //$SMBT_HOST/IPC\$ \ + rpc.wkssvc.wkssvc.NetWkstaGetInfo > /dev/null 2>&1 || \ + fail "Cannot connect to //$SMBT_HOST/IPC\$" + +echo "Running smbtorture/RPC tests with //$SMBT_HOST/IPC\$" +$runsmbtor $match -e $excl_file -o $logfile $timeout \ + "$SMBT_HOST" "IPC\$" "$SMBT_USER" "${SMBT_PASS}" | + tee $outfile + +exit 0 diff --git a/usr/src/test/smbsrv-tests/tests/smbtorture/runst-smb2.ksh b/usr/src/test/smbsrv-tests/tests/smbtorture/runst-smb2.ksh index 6f8e51ffd1..f5af05aca1 100644 --- a/usr/src/test/smbsrv-tests/tests/smbtorture/runst-smb2.ksh +++ b/usr/src/test/smbsrv-tests/tests/smbtorture/runst-smb2.ksh @@ -51,7 +51,7 @@ shift $((OPTIND - 1)) export PATH="$(dirname $SMBTOR):$PATH" mkdir -p $outdir -cd $outdir +cd $outdir || fail "Could not cd to $outdir" tstamp=$(date +'%Y%m%dT%H%M%S') logfile=$outdir/smbtor-smb2-${tstamp}.log |