selftest: Create instructions for generating skip file entries
authorNoel Power <noel.power@suse.com>
Fri, 6 Dec 2019 07:50:24 +0000 (07:50 +0000)
committerRalph Boehme <slow@samba.org>
Fri, 3 Apr 2020 15:08:33 +0000 (15:08 +0000)
create_smb1_fail_skipfile.txt provides both
  + instructions
  + patch to perform the pre-requisite steps to be able to
    modify the environment and parse test output

Signed-off-by: Noel Power <noel.power@suse.com>
Reviewed-by: Ralph Boehme <slow@samba.org>
selftest/create_smb1_fail_skipfile.txt [new file with mode: 0644]

diff --git a/selftest/create_smb1_fail_skipfile.txt b/selftest/create_smb1_fail_skipfile.txt
new file mode 100644 (file)
index 0000000..aea772f
--- /dev/null
@@ -0,0 +1,190 @@
+From a85b0a942ef07b6188255b2fee2fc379e9310409 Mon Sep 17 00:00:00 2001
+From: Noel Power <noel.power@suse.com>
+Date: Fri, 27 Sep 2019 15:24:25 +0100
+Subject: [PATCH] selftest: Generate a list of skip entries for SMB1
+
+The following changes prepare the test system so we can generate
+the list of tests that fail when SMB1 can no longer be negotiated
+
+1.
+Change the values of 'min protocol' set for the various test
+environments to be SMB2_02.
+
+Servers will only offer protocols starting with the min specified in the
+conf files, we don't need to change the client value here yet (until SMB1 is
+truely gone)
+
+2.
+The following environments will still negotiate SMB1
+   ad_dc_ntvfs, rpc_proxy & s4member
+
+3.
+Make test wont stop on first error
+
+Once this patch is applied either
+a. Commit to gitlab or
+b. Run a private autobuild
+
+For the failing test jobs gather the stdout logs and run the parser
+
+   source4/scripting/devel/test_errors_regrex.py logfile
+
+over the output. This script will generate lines suitable for a
+skipfile.
+
+It is a good idea as a final step to say create a file e.g.
+
+    selftest/skip_smb1_fails
+
+and then exclude those tests, running CI with patch similar to wscript
+below will verify that the list of tests is complete.
+
+--- a/selftest/wscript
++++ b/selftest/wscript
+@@ -179,6 +179,9 @@ def cmd_testonly(opt):
+     else:
+         env.FILTER_OPTIONS = '${FILTER_XFAIL}'
+
++    # Maybe this should be optional
++    env.OPTIONS += ' --exclude=${srcdir}/selftest/skip_smb1_fails'
++
+---
+ script/autobuild.py                           |  2 +-
+ selftest/target/Samba3.pm                     |  4 +--
+ selftest/target/Samba4.pm                     | 14 ++++++--
+ source4/scripting/devel/test_errors_regrex.py | 49 +++++++++++++++++++++++++++
+ 4 files changed, 63 insertions(+), 6 deletions(-)
+ create mode 100755 source4/scripting/devel/test_errors_regrex.py
+
+diff --git a/script/autobuild.py b/script/autobuild.py
+index 85167cfa993..5bf087f652c 100755
+--- a/script/autobuild.py
++++ b/script/autobuild.py
+@@ -184,7 +184,7 @@ def format_option(name, value=None):
+ def make_test(
+         cmd='make test',
+-        FAIL_IMMEDIATELY=1,
++        FAIL_IMMEDIATELY=0,
+         TESTS='',
+         include_envs=None,
+         exclude_envs=None):
+diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
+index 41d439ea91a..ca14f86e0a4 100755
+--- a/selftest/target/Samba3.pm
++++ b/selftest/target/Samba3.pm
+@@ -1708,8 +1708,8 @@ sub provision($$$$$$$$$)
+       panic action = cd $self->{srcdir} && $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
+       smbd:suicide mode = yes
+-      client min protocol = CORE
+-      server min protocol = LANMAN1
++       client min protocol = SMB2_02
++       server min protocol = SMB2_02
+       workgroup = $domain
+diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
+index 1310e2ff09f..dd7fc807703 100755
+--- a/selftest/target/Samba4.pm
++++ b/selftest/target/Samba4.pm
+@@ -713,8 +713,8 @@ sub provision_raw_step1($$)
+       log level = $ctx->{server_loglevel}
+       lanman auth = Yes
+       ntlm auth = Yes
+-      client min protocol = CORE
+-      server min protocol = LANMAN1
++       client min protocol = SMB2_02
++       server min protocol = SMB2_02
+       mangled names = yes
+       dns update command = $ctx->{samba_dnsupdate}
+       spn update command = $ctx->{python} $ENV{SRCDIR_ABS}/source4/scripting/bin/samba_spnupdate -s $ctx->{smb_conf}
+@@ -1188,6 +1188,9 @@ rpc_server:winreg = embedded
+ rpc_server:spoolss = embedded
+ rpc_daemon:spoolssd = embedded
+ rpc_server:tcpip = no
++       # override the new SMB2 only default
++       client min protocol = CORE
++       server min protocol = LANMAN1
+ ";
+       if ($more_conf) {
+               $extra_smb_conf = $extra_smb_conf . $more_conf . "\n";
+@@ -1238,7 +1241,9 @@ sub provision_rpc_proxy($$$)
+       dcerpc endpoint servers = epmapper, remote
+       dcerpc_remote:interfaces = rpcecho
+       dcerpc_remote:allow_anonymous_fallback = yes
+-
++      # override the new SMB2 only default
++      client min protocol = CORE
++      server min protocol = LANMAN1
+ [cifs_to_dc]
+       path = /tmp/_ignore_cifs_to_dc_/_none_
+       read only = no
+@@ -1470,6 +1475,9 @@ sub provision_ad_dc_ntvfs($$$)
+       dsdb password event notification = true
+       dsdb group change notification = true
+       server schannel = auto
++      # override the new SMB2 only default
++      client min protocol = CORE
++      server min protocol = LANMAN1
+       ";
+       push (@{$extra_provision_options}, "--use-ntvfs");
+       my $ret = $self->provision($prefix,
+diff --git a/source4/scripting/devel/test_errors_regrex.py b/source4/scripting/devel/test_errors_regrex.py
+new file mode 100755
+index 00000000000..eedfdbb6c35
+--- /dev/null
++++ b/source4/scripting/devel/test_errors_regrex.py
+@@ -0,0 +1,49 @@
++#!/usr/bin/env python3
++#
++# Simple script to parse make test stdout results
++# to find the tests that are in error, the scrip
++# then creates a line for each error suitable for
++# putting into a skip file.
++# This scripts intended use is in SMB1 to SMB2 test
++# porting where it can be used to parse for failing
++# scripts in the case where the test envs are set
++# to not negotiate SMB1
++#
++import sys
++import re
++import os
++
++def parse_errors(infile):
++    all_tests = []
++    error_tests = []
++    # get all test lines
++    last_err = ""
++    for line in infile:
++        line = line.rstrip(os.linesep)
++        if re.match("^\[.* at .*\]", line):
++            test_info = line.split(',')
++            if len(test_info) > 1:
++                err = test_info[1].split()[0]
++                if err != last_err:
++                    error_tests.append(all_tests[-1])
++                last_err = err
++            all_tests.append(line.split(']',1)[1].lstrip())
++    return error_tests
++
++def main():
++    if len(sys.argv) < 2:
++        print ("no args passed")
++        sys.exit(1)
++    print ("processing %s" % sys.argv[1])
++    inputf = sys.argv[1]
++    f = open(inputf, "r")
++    failing_tests = parse_errors(f)
++    f.close()
++    for t in failing_tests:
++        # adust t fo regex
++        t = t.replace('(', '\\(').replace(')', '\\)')
++        t = t.replace('[', '\\[').replace(']', '\\]')
++        t = "^" + t
++        print("%s" % t)
++if __name__ == '__main__':
++    main()
+-- 
+2.16.4
+