python/samba/tests: make sure samba-tool is called with ${PYTHON}
[amitay/samba.git] / python / samba / tests / docs.py
index 1462600b3b1f88fa331a39303045beefe1b942b8..e54c754a62ad8ca499950f780774030a9491b601 100644 (file)
@@ -27,11 +27,12 @@ import re
 import subprocess
 import xml.etree.ElementTree as ET
 
+
 class TestCase(samba.tests.TestCaseInTempDir):
 
     def _format_message(self, parameters, message):
         parameters = list(parameters)
-        parameters = map(str, parameters)
+        parameters = list(map(str, parameters))
         parameters.sort()
         return message + '\n\n    %s' % ('\n    '.join(parameters))
 
@@ -42,7 +43,7 @@ def get_documented_parameters(sourcedir):
         raise Exception("Unable to find parameters.all.xml")
     try:
         p = open(os.path.join(path, "parameters.all.xml"), 'r')
-    except IOError, e:
+    except IOError as e:
         raise Exception("Error opening parameters file")
     out = p.read()
 
@@ -50,7 +51,7 @@ def get_documented_parameters(sourcedir):
     for parameter in root:
         name = parameter.attrib.get('name')
         if parameter.attrib.get('removed') == "1":
-           continue
+            continue
         yield name
         syn = parameter.findall('synonym')
         if syn is not None:
@@ -65,7 +66,7 @@ def get_documented_tuples(sourcedir, omit_no_default=True):
         raise Exception("Unable to find parameters.all.xml")
     try:
         p = open(os.path.join(path, "parameters.all.xml"), 'r')
-    except IOError, e:
+    except IOError as e:
         raise Exception("Error opening parameters file")
     out = p.read()
 
@@ -74,7 +75,7 @@ def get_documented_tuples(sourcedir, omit_no_default=True):
         name = parameter.attrib.get("name")
         param_type = parameter.attrib.get("type")
         if parameter.attrib.get('removed') == "1":
-           continue
+            continue
         values = parameter.findall("value")
         defaults = []
         for value in values:
@@ -96,6 +97,7 @@ def get_documented_tuples(sourcedir, omit_no_default=True):
         yield name, default_text, context, param_type
     p.close()
 
+
 class SmbDotConfTests(TestCase):
 
     # defines the cases where the defaults may differ from the documentation
@@ -103,7 +105,7 @@ class SmbDotConfTests(TestCase):
                          'panic action', 'homedir map', 'NIS homedir',
                          'server string', 'netbios name', 'socket options', 'use mmap',
                          'ctdbd socket', 'printing', 'printcap name', 'queueresume command',
-                         'queuepause command','lpresume command', 'lppause command',
+                         'queuepause command', 'lpresume command', 'lppause command',
                          'lprm command', 'lpq command', 'print command', 'template homedir',
                          'max open files',
                          'include system krb5 conf', 'rpc server dynamic port range',
@@ -146,7 +148,6 @@ class SmbDotConfTests(TestCase):
         except:
             self.fail("Unable to load parameters")
 
-
     def tearDown(self):
         super(SmbDotConfTests, self).tearDown()
         os.unlink(self.smbconf)
@@ -163,19 +164,24 @@ class SmbDotConfTests(TestCase):
                           'registry shares',
                           'smb ports',
                           'rpc server dynamic port range',
-                          'name resolve order'])
+                          'name resolve order',
+                          'clustering'])
         self._test_empty(['bin/testparm'])
 
     def test_default_s4(self):
         self._test_default(['bin/samba-tool', 'testparm'])
         self._set_defaults(['bin/samba-tool', 'testparm'])
         self._set_arbitrary(['bin/samba-tool', 'testparm'],
-            exceptions = ['smb ports',
-                          'rpc server dynamic port range',
-                          'name resolve order'])
+                            exceptions=['smb ports',
+                                        'rpc server dynamic port range',
+                                        'name resolve order'])
         self._test_empty(['bin/samba-tool', 'testparm'])
 
     def _test_default(self, program):
+
+        if program[0] == 'bin/samba-tool' and os.getenv("PYTHON", None):
+            program = [os.environ["PYTHON"]] + program
+
         failset = set()
         count = 0
 
@@ -193,20 +199,31 @@ class SmbDotConfTests(TestCase):
             elif context == "S":
                 section = "test"
             else:
-                 self.fail("%s has no valid context" % param)
-            p = subprocess.Popen(program + ["-s", self.smbconf,
-                    "--section-name", section, "--parameter-name", param],
-                    stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.topdir).communicate()
-            if p[0].upper().strip() != default.upper():
-                if not (p[0].upper().strip() == "" and default == '""'):
+                self.fail("%s has no valid context" % param)
+            p = subprocess.Popen(program + ["-s",
+                                            self.smbconf,
+                                            "--section-name",
+                                            section,
+                                            "--parameter-name",
+                                            param],
+                                 stdout=subprocess.PIPE,
+                                 stderr=subprocess.PIPE,
+                                 cwd=self.topdir).communicate()
+            result = p[0].decode().upper().strip()
+            if result != default.upper():
+                if not (result == "" and default == '""'):
                     doc_triple = "%s\n      Expected: %s" % (param, default)
-                    failset.add("%s\n      Got: %s" % (doc_triple, p[0].upper().strip()))
+                    failset.add("%s\n      Got: %s" % (doc_triple, result))
 
         if len(failset) > 0:
             self.fail(self._format_message(failset,
-                "Parameters that do not have matching defaults:"))
+                                           "Parameters that do not have matching defaults:"))
 
     def _set_defaults(self, program):
+
+        if program[0] == 'bin/samba-tool' and os.getenv("PYTHON", None):
+            program = [os.environ["PYTHON"]] + program
+
         failset = set()
         count = 0
 
@@ -222,35 +239,47 @@ class SmbDotConfTests(TestCase):
             elif context == "S":
                 section = "test"
             else:
-                 self.fail("%s has no valid context" % param)
-            p = subprocess.Popen(program + ["-s", self.smbconf,
-                    "--section-name", section, "--parameter-name", param,
-                    "--option", "%s = %s" % (param, default)],
-                    stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.topdir).communicate()
-            if p[0].upper().strip() != default.upper():
-                if not (p[0].upper().strip() == "" and default == '""'):
+                self.fail("%s has no valid context" % param)
+            p = subprocess.Popen(program + ["-s",
+                                            self.smbconf,
+                                            "--section-name",
+                                            section,
+                                            "--parameter-name",
+                                            param,
+                                            "--option",
+                                            "%s = %s" % (param, default)],
+                                 stdout=subprocess.PIPE,
+                                 stderr=subprocess.PIPE,
+                                 cwd=self.topdir).communicate()
+            result = p[0].decode().upper().strip()
+            if result != default.upper():
+                if not (result == "" and default == '""'):
                     doc_triple = "%s\n      Expected: %s" % (param, default)
-                    failset.add("%s\n      Got: %s" % (doc_triple, p[0].upper().strip()))
+                    failset.add("%s\n      Got: %s" % (doc_triple, result))
 
         if len(failset) > 0:
             self.fail(self._format_message(failset,
-                "Parameters that do not have matching defaults:"))
+                                           "Parameters that do not have matching defaults:"))
 
     def _set_arbitrary(self, program, exceptions=None):
+
+        if program[0] == 'bin/samba-tool' and os.getenv("PYTHON", None):
+            program = [os.environ["PYTHON"]] + program
+
         arbitrary = {'string': 'string', 'boolean': 'yes', 'integer': '5',
                      'boolean-rev': 'yes',
                      'cmdlist': 'a b c',
                      'bytes': '10',
                      'octal': '0123',
                      'ustring': 'ustring',
-                     'enum':'', 'boolean-auto': '', 'char': 'a', 'list': 'a, b, c'}
+                     'enum': '', 'boolean-auto': '', 'char': 'a', 'list': 'a, b, c'}
         opposite_arbitrary = {'string': 'string2', 'boolean': 'no', 'integer': '6',
                               'boolean-rev': 'no',
                               'cmdlist': 'd e f',
                               'bytes': '11',
                               'octal': '0567',
                               'ustring': 'ustring2',
-                              'enum':'', 'boolean-auto': '', 'char': 'b', 'list': 'd, e, f'}
+                              'enum': '', 'boolean-auto': '', 'char': 'b', 'list': 'd, e, f'}
 
         failset = set()
         count = 0
@@ -275,20 +304,28 @@ class SmbDotConfTests(TestCase):
             elif context == "S":
                 section = "test"
             else:
-                 self.fail("%s has no valid context" % param)
+                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()
-            if p[0].upper().strip() != value_to_use.upper():
+            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(p[0].upper().strip().split()) == value_to_use.upper():
+                    if ", ".join(result.split()) == value_to_use.upper():
                         continue
 
                 # currently no way to identify octal
@@ -312,15 +349,20 @@ class SmbDotConfTests(TestCase):
             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()
+            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].splitlines():
+                for line in p[0].decode().splitlines():
                     if not line.strip().startswith(param):
                         continue
 
@@ -342,17 +384,24 @@ class SmbDotConfTests(TestCase):
                         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,
-                "Parameters that were unexpectedly not set:"))
+                                           "Parameters that were unexpectedly not set:"))
 
     def _test_empty(self, program):
-        p = subprocess.Popen(program + ["-s", self.blankconf, "--suppress-prompt"],
-                stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=self.topdir).communicate()
+
+        if program[0] == 'bin/samba-tool' and os.getenv("PYTHON", None):
+            program = [os.environ["PYTHON"]] + program
+
+        p = subprocess.Popen(program + ["-s",
+                                        self.blankconf,
+                                        "--suppress-prompt"],
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE,
+                             cwd=self.topdir).communicate()
         output = ""
 
-        for line in p[0].splitlines():
+        for line in p[0].decode().splitlines():
             if line.strip().startswith('#'):
                 continue
             if line.strip().startswith("idmap config *"):