summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorAndreas Schneider <asn@samba.org>2020-06-17 11:24:13 +0200
committerAndreas Schneider <asn@cryptomilk.org>2020-06-19 10:59:30 +0000
commite478470f20184cdf4210a1abf24d4e226c51d637 (patch)
treeebf880cca32a08db2c251f051219cb6cc45e2551 /python
parenta2bc150a31d990fd1dee05c2f6eaf7e1d1797c79 (diff)
downloadsamba-e478470f20184cdf4210a1abf24d4e226c51d637.tar.gz
python: Run cmdline tools for arbitary docs test in parallel
Running samba.tests.docs on my machine: before -> (2m6.952s) after -> (22.298s) Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Alexander Bokovoy <ab@samba.org> Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org> Autobuild-Date(master): Fri Jun 19 10:59:30 UTC 2020 on sn-devel-184
Diffstat (limited to 'python')
-rw-r--r--python/samba/tests/docs.py210
1 files changed, 120 insertions, 90 deletions
diff --git a/python/samba/tests/docs.py b/python/samba/tests/docs.py
index 04bfe5ae707..5fb04ab4e2e 100644
--- a/python/samba/tests/docs.py
+++ b/python/samba/tests/docs.py
@@ -27,6 +27,7 @@ import subprocess
import xml.etree.ElementTree as ET
import multiprocessing
import concurrent.futures
+import tempfile
config_h = os.path.join("bin/default/include/config.h")
config_hash = dict()
@@ -77,6 +78,70 @@ def check_or_set_smbconf_default(cmdline, topdir, param, default_param):
return None
+def set_smbconf_arbitary(cmdline, topdir, param, param_type, value_to_use):
+ p = subprocess.Popen(cmdline,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ cwd=topdir).communicate()
+ result = p[0].decode().upper().strip()
+ if result != value_to_use.upper():
+ # currently no way to distinguish command lists
+ if param_type == 'list':
+ if ", ".join(result.split()) == value_to_use.upper():
+ return None
+
+ # currently no way to identify octal
+ if param_type == 'integer':
+ try:
+ if int(value_to_use, 8) == int(p[0].strip(), 8):
+ return None
+ except:
+ pass
+
+ return result, param, value_to_use
+
+ return None
+
+def set_smbconf_arbitary_opposite(cmdline, topdir, tempdir, section, param, opposite_value, value_to_use):
+ g = tempfile.NamedTemporaryFile(mode='w', dir=tempdir, delete=False)
+ try:
+ towrite = section + "\n"
+ towrite += param + " = " + opposite_value
+ g.write(towrite)
+ finally:
+ g.close()
+
+ p = subprocess.Popen(cmdline + ["-s", g.name],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ cwd=topdir).communicate()
+ os.unlink(g.name)
+
+ # testparm doesn't display a value if they are equivalent
+ if (value_to_use.lower() != opposite_value.lower()):
+ for line in p[0].decode().splitlines():
+ if not line.strip().startswith(param):
+ return None
+
+ value_found = line.split("=")[1].upper().strip()
+ if value_found != value_to_use.upper():
+ # currently no way to distinguish command lists
+ if param_type == 'list':
+ if ", ".join(value_found.split()) == value_to_use.upper():
+ return None
+
+ # currently no way to identify octal
+ if param_type == 'integer':
+ try:
+ if int(value_to_use, 8) == int(value_found, 8):
+ continue
+ except:
+ pass
+
+ return param, value_to_use, value_found
+
+ return None
+
def get_documented_parameters(sourcedir):
path = os.path.join(sourcedir, "bin", "default", "docs-xml", "smbdotconf")
if not os.path.exists(os.path.join(path, "parameters.all.xml")):
@@ -360,105 +425,70 @@ class SmbDotConfTests(TestCase):
failset = set()
- for tuples in self.defaults_all:
- param, default, context, param_type = tuples
+ with concurrent.futures.ProcessPoolExecutor(max_workers=get_max_worker_count()) as executor:
+ result_futures1 = []
+ result_futures2 = []
- if param in ['printing', 'copy', 'include', 'log level']:
- continue
+ for tuples in self.defaults_all:
+ param, default, context, param_type = tuples
- # currently no easy way to set an arbitrary value for these
- if param_type in ['enum', 'boolean-auto']:
- continue
+ if param in ['printing', 'copy', 'include', 'log level']:
+ continue
- if exceptions is not None:
- if param in exceptions:
+ # currently no easy way to set an arbitrary value for these
+ if param_type in ['enum', 'boolean-auto']:
continue
- section = None
- if context == "G":
- section = "global"
- elif context == "S":
- section = "test"
- else:
- self.fail("%s has no valid context" % param)
-
- value_to_use = arbitrary.get(param_type)
- if value_to_use is None:
- self.fail("%s has an invalid type" % param)
-
- p = subprocess.Popen(program + ["-s",
- self.smbconf,
- "--section-name",
- section,
- "--parameter-name",
- param,
- "--option",
- "%s = %s" % (param, value_to_use)],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- cwd=self.topdir).communicate()
- result = p[0].decode().upper().strip()
- if result != value_to_use.upper():
- # currently no way to distinguish command lists
- if param_type == 'list':
- if ", ".join(result.split()) == value_to_use.upper():
+ if exceptions is not None:
+ if param in exceptions:
continue
- # currently no way to identify octal
- if param_type == 'integer':
- try:
- if int(value_to_use, 8) == int(p[0].strip(), 8):
- continue
- except:
- pass
+ section = None
+ if context == "G":
+ section = "global"
+ elif context == "S":
+ section = "test"
+ else:
+ self.fail("%s has no valid context" % param)
- doc_triple = "%s\n Expected: %s" % (param, value_to_use)
- failset.add("%s\n Got: %s" % (doc_triple, p[0].upper().strip()))
-
- opposite_value = opposite_arbitrary.get(param_type)
- tempconf = os.path.join(self.tempdir, "tempsmb.conf")
- g = open(tempconf, 'w')
- try:
- towrite = section + "\n"
- towrite += param + " = " + opposite_value
- g.write(towrite)
- finally:
- g.close()
-
- p = subprocess.Popen(program + ["-s",
- tempconf,
- "--suppress-prompt",
- "--option",
- "%s = %s" % (param, value_to_use)],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- cwd=self.topdir).communicate()
-
- os.unlink(tempconf)
-
- # testparm doesn't display a value if they are equivalent
- if (value_to_use.lower() != opposite_value.lower()):
- for line in p[0].decode().splitlines():
- if not line.strip().startswith(param):
- continue
+ value_to_use = arbitrary.get(param_type)
+ if value_to_use is None:
+ self.fail("%s has an invalid type" % param)
+
+ cmdline = program + ["-s",
+ self.smbconf,
+ "--section-name",
+ section,
+ "--parameter-name",
+ param,
+ "--option",
+ "%s = %s" % (param, value_to_use)]
+
+ future = executor.submit(set_smbconf_arbitary, cmdline, self.topdir, param, param_type, value_to_use)
+ result_futures1.append(future)
+
+ opposite_value = opposite_arbitrary.get(param_type)
+
+ cmdline = program + ["--suppress-prompt",
+ "--option",
+ "%s = %s" % (param, value_to_use)]
+
+ future = executor.submit(set_smbconf_arbitary_opposite, cmdline, self.topdir, self.tempdir, section, param, opposite_value, value_to_use)
+ result_futures2.append(future)
+
+ for f in concurrent.futures.as_completed(result_futures1):
+ if f.result():
+ result, param, value_to_use = f.result()
+
+ doc_triple = "%s\n Expected: %s" % (param, value_to_use)
+ failset.add("%s\n Got: %s" % (doc_triple, result))
+
+ for f in concurrent.futures.as_completed(result_futures2):
+ if f.result():
+ param, value_to_use, value_found = f.result()
- value_found = line.split("=")[1].upper().strip()
- if value_found != value_to_use.upper():
- # currently no way to distinguish command lists
- if param_type == 'list':
- if ", ".join(value_found.split()) == value_to_use.upper():
- continue
-
- # currently no way to identify octal
- if param_type == 'integer':
- try:
- if int(value_to_use, 8) == int(value_found, 8):
- continue
- except:
- pass
-
- doc_triple = "%s\n Expected: %s" % (param, value_to_use)
- failset.add("%s\n Got: %s" % (doc_triple, value_found))
+ doc_triple = "%s\n Expected: %s" % (param, value_to_use)
+ failset.add("%s\n Got: %s" % (doc_triple, value_found))
if len(failset) > 0:
self.fail(self._format_message(failset,