[PATCH] Remove unused stf directory

Jeremy Allison jra at samba.org
Mon Jul 11 23:57:48 UTC 2016


On Tue, Jul 05, 2016 at 12:35:14PM +1200, Douglas Bagnall wrote:
> How about this?
> 
> For newcomers like me, stf is an old test framework that doesn't seem to
> be used anywhere.

LGTM. Removing unused code is always good. Thanks Douglas !

Can I get a second Team reviewer ?

> From ceefa90979bc0ba2c478e61a153b8da9a7ffc967 Mon Sep 17 00:00:00 2001
> From: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
> Date: Fri, 3 Jun 2016 14:39:21 +1200
> Subject: [PATCH] Remove unused stf directory
> 
> Signed-off-by: Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
> ---
>  source3/stf/README.stf       |   3 -
>  source3/stf/comfychair.py    | 443 -------------------------------------------
>  source3/stf/example.py       |  36 ----
>  source3/stf/notes.txt        | 175 -----------------
>  source3/stf/osver.py         |  55 ------
>  source3/stf/pythoncheck.py   |  46 -----
>  source3/stf/smbcontrol.py    | 238 -----------------------
>  source3/stf/spoolss.py       | 288 ----------------------------
>  source3/stf/standardcheck.py |  32 ----
>  source3/stf/stf.py           | 101 ----------
>  source3/stf/test.py          |  33 ----
>  11 files changed, 1450 deletions(-)
>  delete mode 100644 source3/stf/README.stf
>  delete mode 100644 source3/stf/comfychair.py
>  delete mode 100755 source3/stf/example.py
>  delete mode 100644 source3/stf/notes.txt
>  delete mode 100755 source3/stf/osver.py
>  delete mode 100755 source3/stf/pythoncheck.py
>  delete mode 100755 source3/stf/smbcontrol.py
>  delete mode 100755 source3/stf/spoolss.py
>  delete mode 100644 source3/stf/standardcheck.py
>  delete mode 100755 source3/stf/stf.py
>  delete mode 100755 source3/stf/test.py
> 
> diff --git a/source3/stf/README.stf b/source3/stf/README.stf
> deleted file mode 100644
> index 3fbd33c..0000000
> --- a/source3/stf/README.stf
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -This directory contains the Samba Testing Framework, a Python-based
> -system for exercising Samba in various ways.  It is quite small at the
> -moment.
> diff --git a/source3/stf/comfychair.py b/source3/stf/comfychair.py
> deleted file mode 100644
> index 247915d..0000000
> --- a/source3/stf/comfychair.py
> +++ /dev/null
> @@ -1,443 +0,0 @@
> -#! /usr/bin/env python
> -
> -# Copyright (C) 2002, 2003 by Martin Pool <mbp at samba.org>
> -# Copyright (C) 2003 by Tim Potter <tpot at samba.org>
> -# 
> -# This program is free software; you can redistribute it and/or
> -# modify it under the terms of the GNU General Public License as
> -# published by the Free Software Foundation; either version 3 of the
> -# License, or (at your option) any later version.
> -# 
> -# This program is distributed in the hope that it will be useful, but
> -# WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -# General Public License for more details.
> -# 
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, see <http://www.gnu.org/licenses/>.
> -
> -"""comfychair: a Python-based instrument of software torture.
> -
> -Copyright (C) 2002, 2003 by Martin Pool <mbp at samba.org>
> -Copyright (C) 2003 by Tim Potter <tpot at samba.org>
> -
> -This is a test framework designed for testing programs written in
> -Python, or (through a fork/exec interface) any other language.
> -
> -For more information, see the file README.comfychair.
> -
> -To run a test suite based on ComfyChair, just run it as a program.
> -"""
> -
> -import sys, re
> -
> -
> -class TestCase:
> -    """A base class for tests.  This class defines required functions which
> -    can optionally be overridden by subclasses.  It also provides some
> -    utility functions for"""
> -
> -    def __init__(self):
> -        self.test_log = ""
> -        self.background_pids = []
> -        self._cleanups = []
> -        self._enter_rundir()
> -        self._save_environment()
> -        self.add_cleanup(self.teardown)
> -
> -
> -    # --------------------------------------------------
> -    # Save and restore directory
> -    def _enter_rundir(self):
> -        import os
> -        self.basedir = os.getcwd()
> -        self.add_cleanup(self._restore_directory)
> -        self.rundir = os.path.join(self.basedir,
> -                                   'testtmp', 
> -                                   self.__class__.__name__)
> -        self.tmpdir = os.path.join(self.rundir, 'tmp')
> -        os.system("rm -fr %s" % self.rundir)
> -        os.makedirs(self.tmpdir)
> -        os.system("mkdir -p %s" % self.rundir)
> -        os.chdir(self.rundir)
> -
> -    def _restore_directory(self):
> -        import os
> -        os.chdir(self.basedir)
> -
> -    # --------------------------------------------------
> -    # Save and restore environment
> -    def _save_environment(self):
> -        import os
> -        self._saved_environ = os.environ.copy()
> -        self.add_cleanup(self._restore_environment)
> -
> -    def _restore_environment(self):
> -        import os
> -        os.environ.clear()
> -        os.environ.update(self._saved_environ)
> -
> -    
> -    def setup(self):
> -        """Set up test fixture."""
> -        pass
> -
> -    def teardown(self):
> -        """Tear down test fixture."""
> -        pass
> -
> -    def runtest(self):
> -        """Run the test."""
> -        pass
> -
> -
> -    def add_cleanup(self, c):
> -        """Queue a cleanup to be run when the test is complete."""
> -        self._cleanups.append(c)
> -        
> -
> -    def fail(self, reason = ""):
> -        """Say the test failed."""
> -        raise AssertionError(reason)
> -
> -
> -    #############################################################
> -    # Requisition methods
> -
> -    def require(self, predicate, message):
> -        """Check a predicate for running this test.
> -
> -If the predicate value is not true, the test is skipped with a message explaining
> -why."""
> -        if not predicate:
> -            raise NotRunError, message
> -
> -    def require_root(self):
> -        """Skip this test unless run by root."""
> -        import os
> -        self.require(os.getuid() == 0,
> -                     "must be root to run this test")
> -
> -    #############################################################
> -    # Assertion methods
> -
> -    def assert_(self, expr, reason = ""):
> -        if not expr:
> -            raise AssertionError(reason)
> -
> -    def assert_equal(self, a, b):
> -        if not a == b:
> -            raise AssertionError("assertEquals failed: %s" % `(a, b)`)
> -            
> -    def assert_notequal(self, a, b):
> -        if a == b:
> -            raise AssertionError("assertNotEqual failed: %s" % `(a, b)`)
> -
> -    def assert_re_match(self, pattern, s):
> -        """Assert that a string matches a particular pattern
> -
> -        Inputs:
> -          pattern      string: regular expression
> -          s            string: to be matched
> -
> -        Raises:
> -          AssertionError if not matched
> -          """
> -        if not re.match(pattern, s):
> -            raise AssertionError("string does not match regexp\n"
> -                                 "    string: %s\n"
> -                                 "    re: %s" % (`s`, `pattern`))
> -
> -    def assert_re_search(self, pattern, s):
> -        """Assert that a string *contains* a particular pattern
> -
> -        Inputs:
> -          pattern      string: regular expression
> -          s            string: to be searched
> -
> -        Raises:
> -          AssertionError if not matched
> -          """
> -        if not re.search(pattern, s):
> -            raise AssertionError("string does not contain regexp\n"
> -                                 "    string: %s\n"
> -                                 "    re: %s" % (`s`, `pattern`))
> -
> -
> -    def assert_no_file(self, filename):
> -        import os.path
> -        assert not os.path.exists(filename), ("file exists but should not: %s" % filename)
> -
> -
> -    #############################################################
> -    # Methods for running programs
> -
> -    def runcmd_background(self, cmd):
> -        import os
> -        self.test_log = self.test_log + "Run in background:\n" + `cmd` + "\n"
> -        pid = os.fork()
> -        if pid == 0:
> -            # child
> -            try:
> -                os.execvp("/bin/sh", ["/bin/sh", "-c", cmd])
> -            finally:
> -                os._exit(127)
> -        self.test_log = self.test_log + "pid: %d\n" % pid
> -        return pid
> -
> -
> -    def runcmd(self, cmd, expectedResult = 0):
> -        """Run a command, fail if the command returns an unexpected exit
> -        code.  Return the output produced."""
> -        rc, output, stderr = self.runcmd_unchecked(cmd)
> -        if rc != expectedResult:
> -            raise AssertionError("""command returned %d; expected %s: \"%s\"
> -stdout:
> -%s
> -stderr:
> -%s""" % (rc, expectedResult, cmd, output, stderr))
> -
> -        return output, stderr
> -
> -
> -    def run_captured(self, cmd):
> -        """Run a command, capturing stdout and stderr.
> -
> -        Based in part on popen2.py
> -
> -        Returns (waitstatus, stdout, stderr)."""
> -        import os, types
> -        pid = os.fork()
> -        if pid == 0:
> -            # child
> -            try: 
> -                pid = os.getpid()
> -                openmode = os.O_WRONLY|os.O_CREAT|os.O_TRUNC
> -
> -                outfd = os.open('%d.out' % pid, openmode, 0666)
> -                os.dup2(outfd, 1)
> -                os.close(outfd)
> -
> -                errfd = os.open('%d.err' % pid, openmode, 0666)
> -                os.dup2(errfd, 2)
> -                os.close(errfd)
> -
> -                if isinstance(cmd, types.StringType):
> -                    cmd = ['/bin/sh', '-c', cmd]
> -
> -                os.execvp(cmd[0], cmd)
> -            finally:
> -                os._exit(127)
> -        else:
> -            # parent
> -            exited_pid, waitstatus = os.waitpid(pid, 0)
> -            stdout = open('%d.out' % pid).read()
> -            stderr = open('%d.err' % pid).read()
> -            return waitstatus, stdout, stderr
> -
> -
> -    def runcmd_unchecked(self, cmd, skip_on_noexec = 0):
> -        """Invoke a command; return (exitcode, stdout, stderr)"""
> -        import os
> -        waitstatus, stdout, stderr = self.run_captured(cmd)
> -        assert not os.WIFSIGNALED(waitstatus), \
> -               ("%s terminated with signal %d" % (`cmd`, os.WTERMSIG(waitstatus)))
> -        rc = os.WEXITSTATUS(waitstatus)
> -        self.test_log = self.test_log + ("""Run command: %s
> -Wait status: %#x (exit code %d, signal %d)
> -stdout:
> -%s
> -stderr:
> -%s""" % (cmd, waitstatus, os.WEXITSTATUS(waitstatus), os.WTERMSIG(waitstatus),
> -         stdout, stderr))
> -        if skip_on_noexec and rc == 127:
> -            # Either we could not execute the command or the command
> -            # returned exit code 127.  According to system(3) we can't
> -            # tell the difference.
> -            raise NotRunError, "could not execute %s" % `cmd`
> -        return rc, stdout, stderr
> -    
> -
> -    def explain_failure(self, exc_info = None):
> -        print "test_log:"
> -        print self.test_log
> -
> -
> -    def log(self, msg):
> -        """Log a message to the test log.  This message is displayed if
> -        the test fails, or when the runtests function is invoked with
> -        the verbose option."""
> -        self.test_log = self.test_log + msg + "\n"
> -
> -
> -class NotRunError(Exception):
> -    """Raised if a test must be skipped because of missing resources"""
> -    def __init__(self, value = None):
> -        self.value = value
> -
> -
> -def _report_error(case, debugger):
> -    """Ask the test case to explain failure, and optionally run a debugger
> -
> -    Input:
> -      case         TestCase instance
> -      debugger     if true, a debugger function to be applied to the traceback
> -"""
> -    import sys
> -    ex = sys.exc_info()
> -    print "-----------------------------------------------------------------"
> -    if ex:
> -        import traceback
> -        traceback.print_exc(file=sys.stdout)
> -    case.explain_failure()
> -    print "-----------------------------------------------------------------"
> -
> -    if debugger:
> -        tb = ex[2]
> -        debugger(tb)
> -
> -
> -def runtests(test_list, verbose = 0, debugger = None):
> -    """Run a series of tests.
> -
> -    Inputs:
> -      test_list    sequence of TestCase classes
> -      verbose      print more information as testing proceeds
> -      debugger     debugger object to be applied to errors
> -
> -    Returns:
> -      unix return code: 0 for success, 1 for failures, 2 for test failure
> -    """
> -    import traceback
> -    ret = 0
> -    for test_class in test_list:
> -        print "%-30s" % _test_name(test_class),
> -        # flush now so that long running tests are easier to follow
> -        sys.stdout.flush()
> -
> -        obj = None
> -        try:
> -            try: # run test and show result
> -                obj = test_class()
> -                obj.setup()
> -                obj.runtest()
> -                print "OK"
> -            except KeyboardInterrupt:
> -                print "INTERRUPT"
> -                _report_error(obj, debugger)
> -                ret = 2
> -                break
> -            except NotRunError, msg:
> -                print "NOTRUN, %s" % msg.value
> -            except:
> -                print "FAIL"
> -                _report_error(obj, debugger)
> -                ret = 1
> -        finally:
> -            while obj and obj._cleanups:
> -                try:
> -                    apply(obj._cleanups.pop())
> -                except KeyboardInterrupt:
> -                    print "interrupted during teardown"
> -                    _report_error(obj, debugger)
> -                    ret = 2
> -                    break
> -                except:
> -                    print "error during teardown"
> -                    _report_error(obj, debugger)
> -                    ret = 1
> -        # Display log file if we're verbose
> -        if ret == 0 and verbose:
> -            obj.explain_failure()
> -            
> -    return ret
> -
> -
> -def _test_name(test_class):
> -    """Return a human-readable name for a test class.
> -    """
> -    try:
> -        return test_class.__name__
> -    except:
> -        return `test_class`
> -
> -
> -def print_help():
> -    """Help for people running tests"""
> -    import sys
> -    print """%s: software test suite based on ComfyChair
> -
> -usage:
> -    To run all tests, just run this program.  To run particular tests,
> -    list them on the command line.
> -
> -options:
> -    --help              show usage message
> -    --list              list available tests
> -    --verbose, -v       show more information while running tests
> -    --post-mortem, -p   enter Python debugger on error
> -""" % sys.argv[0]
> -
> -
> -def print_list(test_list):
> -    """Show list of available tests"""
> -    for test_class in test_list:
> -        print "    %s" % _test_name(test_class)
> -
> -
> -def main(tests, extra_tests=[]):
> -    """Main entry point for test suites based on ComfyChair.
> -
> -    inputs:
> -      tests       Sequence of TestCase subclasses to be run by default.
> -      extra_tests Sequence of TestCase subclasses that are available but
> -                  not run by default.
> -
> -Test suites should contain this boilerplate:
> -
> -    if __name__ == '__main__':
> -        comfychair.main(tests)
> -
> -This function handles standard options such as --help and --list, and
> -by default runs all tests in the suggested order.
> -
> -Calls sys.exit() on completion.
> -"""
> -    from sys import argv
> -    import getopt, sys
> -
> -    opt_verbose = 0
> -    debugger = None
> -
> -    opts, args = getopt.getopt(argv[1:], 'pv',
> -                               ['help', 'list', 'verbose', 'post-mortem'])
> -    for opt, opt_arg in opts:
> -        if opt == '--help':
> -            print_help()
> -            return
> -        elif opt == '--list':
> -            print_list(tests + extra_tests)
> -            return
> -        elif opt == '--verbose' or opt == '-v':
> -            opt_verbose = 1
> -        elif opt == '--post-mortem' or opt == '-p':
> -            import pdb
> -            debugger = pdb.post_mortem
> -
> -    if args:
> -        all_tests = tests + extra_tests
> -        by_name = {}
> -        for t in all_tests:
> -            by_name[_test_name(t)] = t
> -        which_tests = []
> -        for name in args:
> -            which_tests.append(by_name[name])
> -    else:
> -        which_tests = tests
> -
> -    sys.exit(runtests(which_tests, verbose=opt_verbose,
> -                      debugger=debugger))
> -
> -
> -if __name__ == '__main__':
> -    print __doc__
> diff --git a/source3/stf/example.py b/source3/stf/example.py
> deleted file mode 100755
> index 9c97cb7..0000000
> --- a/source3/stf/example.py
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -#! /usr/bin/env python
> -
> -# Copyright (C) 2003 by Martin Pool <mbp at samba.org>
> -# 
> -# This program is free software; you can redistribute it and/or
> -# modify it under the terms of the GNU General Public License as
> -# published by the Free Software Foundation; either version 3 of the
> -# License, or (at your option) any later version.
> -# 
> -# This program is distributed in the hope that it will be useful, but
> -# WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -# General Public License for more details.
> -# 
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, see <http://www.gnu.org/licenses/>.
> -
> -
> -"""example of using ComfyChair"""
> -
> -import comfychair
> -
> -class OnePlusOne(comfychair.TestCase):
> -    def runtest(self):
> -        self.assert_(1 + 1 == 2)
> -
> -class FailTest(comfychair.TestCase):
> -    def runtest(self):
> -        self.assert_(1 + 1 == 3)
> -
> -tests = [OnePlusOne]
> -extra_tests = [FailTest]
> -
> -if __name__ == '__main__':
> -    comfychair.main(tests, extra_tests=extra_tests)
> -
> diff --git a/source3/stf/notes.txt b/source3/stf/notes.txt
> deleted file mode 100644
> index 68aca63..0000000
> --- a/source3/stf/notes.txt
> +++ /dev/null
> @@ -1,175 +0,0 @@
> -		-*- indented-text -*-
> -
> -(set lotus no)
> -
> -
> -
> -Notes on using comfychair with Samba (samba testing framework units):
> -
> -The tests need to rely on some external resources, such as 
> -
> -If suitable resources are not available, need to skip particular
> -tests.  Must include a message indicating what resources would be
> -needed to run that test.  (e.g. must be root.)
> -
> -We want to be able to select and run particular subsets of tests, such
> -as "all winbind tests".
> -
> -We want to keep the number of configurable parameters down as much as
> -possible, to make it easy on people running the tests.
> -
> -Wherever possible, the tests should set up their preconditions, but a
> -few basic resources need to be provided by the people running the
> -tests.  So for example, rather than asking the user for the name of a
> -non-root user, we should give the tests the administrator name and
> -password, and it can create a new user to use.
> -
> -This makes it simpler to get the tests running, and possible also
> -makes them more reproducible.
> -
> -In the future, rather than using NT machines provided by the test
> -person, we might have a way to drive VMWare non-persistent sessions,
> -to make tests even more tightly controlled.
> -
> -
> -Another design question is how to communicate this information to the
> -tests.  If there's a lot of settings, then it might need to be stored
> -in a configuration file.  
> -
> -However, if we succeed in cutting down the number of parameters, then
> -it might be straightforward to pass the information on the command
> -line or in an environment variable.  
> -
> -Environment variables are probably better because they can't be seen
> -by other users, and they are more easily passed down through an
> -invocation of "make check".
> -
> -
> -

> -Notes on Samba Testing Framework for Unittests
> -----------------------------------------------
> -
> -This is to be read after reading the notes.txt from comfychair.  I'm
> -proposing a slightly more concrete description of what's described
> -there.
> -
> -The model of having tests require named resources looks useful for
> -incorporation into a framework that can be run by many people in
> -widely different environments.
> -
> -Some possible environments for running the test framework in are:
> -
> -    - Casual downloader of Samba compiling from source and just wants
> -      to run 'make check'.  May only have one Unix machine and a
> -      handful of clients.
> -
> -    - Samba team member with access to a small number of other
> -      machines or VMware sessions.
> -
> -    - PSA developer who may not have intimate knowledge of Samba
> -      internals and is only interested in testing against the PSA.
> -
> -    - Non-team hacker wanting to run test suite after making small
> -      hacks. 
> -
> -    - Build farm environment (loaner machine with no physical access
> -      or root privilege).
> -
> -    - HP BAT.
> -
> -Developers in most of these environments are also potential test case
> -authors.  It should be easy for people unfamiliar with the framework
> -to write new tests and have them work.  We should provide examples and
> -the existing tests should well written and understandable.
> -
> -Different types of tests:
> -
> -    - Tests that check Samba internals and link against
> -      libbigballofmud.so.  For example:
> -
> -        - Upper/lowercase string functions
> -        - user_in_list() for large lists
> -
> -    - Tests that use the Samba Python extensions.
> -
> -    - Tests that execute Samba command line programs, for example
> -      smbpasswd. 
> -
> -    - Tests that require other resources on the network such as domain
> -      controllers or PSAs.
> -
> -    - Tests that are performed on the documentation or the source code
> -      such as:
> -
> -        - grep for common spelling mistakes made by abartlet (-:
> -        - grep for company copyright (IBM, HP)
> -                         
> -    - Link to other existing testing frameworks (smbtorture,
> -      abartlet's bash based build farm tests)
> -
> -I propose a TestResourceManager which would be instantiated by a test
> -case.  The test case would require("resourcename") as part of its
> -constructor and raise a comfychair.NotRun exception if the resource
> -was not present.  A TestResource class could be defined which could
> -read a configuration file or examine a environment variable and
> -register a resource only if some condition was satisfied.
> -
> -It would be nice to be able to completely separate the PSA testing
> -from the test framework.  This would entail being able to define test
> -resources dynamically, possibly with a plugin type system.
> -
> -class TestResourceManager:
> -    def __init__(self, name):
> -        self.resources = {}
> -
> -    def register(self, resource):
> -        name = resource.name()
> -        if self.resources.has_key(name):
> -            raise "Test manager already has resource %s" % name
> -        self.resources[name] = resource
> -
> -    def require(self, resource_name):
> -        if not self.resources.has_key(resource_name):
> -            raise "Test manager does not have resources %s" % resource_name
> -
> -class TestResource:
> -    def __init__(self, name):
> -        self.name = name
> -
> -    def name(self):
> -        return self.name
> -
> -import os
> -
> -trm = TestResourceManager()
> -
> -if os.getuid() == 0:
> -    trm.register(TestResource("root"))
> -
> -A config-o-matic Python module can take a list of machines and
> -administrator%password entries and classify them by operating system
> -version and service pack.  These resources would be registered with
> -the TestResourceManager.
> -
> -Some random thoughts about named resources for network servers:
> -
> -require("nt4.sp3")
> -require("nt4.domaincontroller")
> -require("psa")
> -
> -Some kind of format for location of passwords, libraries:
> -
> -require("exec(smbpasswd)")
> -require("lib(bigballofmud)")
> -
> -maybe require("exec.smbpasswd") looks nicer...
> -
> -The require() function could return a dictionary of configuration
> -information or some handle to fetch dynamic information on.  We may
> -need to create and destroy extra users or print queues.  How to manage
> -cleanup of dynamic resources?
> -
> -Requirements for running stf:
> -
> -    - Python, obviously
> -    - Samba python extensions
> diff --git a/source3/stf/osver.py b/source3/stf/osver.py
> deleted file mode 100755
> index 68601fa..0000000
> --- a/source3/stf/osver.py
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -#!/usr/bin/python
> -#
> -# Utilities for determining the Windows operating system version remotely.
> -#
> -
> -from samba import srvsvc
> -
> -# Constants
> -
> -PLATFORM_UNKNOWN = 0
> -PLATFORM_WIN9X = 1
> -PLATFORM_NT4 = 2
> -PLATFORM_NT5 = 3                        # Windows 2000
> -
> -def platform_name(platform_type):
> -
> -    platform_names = { PLATFORM_UNKNOWN: "Unknown",
> -                       PLATFORM_WIN9X: "Windows 9x",
> -                       PLATFORM_NT4: "Windows NT",
> -                       PLATFORM_NT5: "Windows 2000" }
> -
> -    if platform_names.has_key(platform_type):
> -        return platform_names[platform_type]
> -
> -    return "Unknown"
> -
> -def platform_type(info101):
> -    """Determine the operating system type from a SRV_INFO_101."""
> -
> -    if info101['major_version'] == 4 and info101['minor_version'] == 0:
> -        return PLATFORM_NT4
> -
> -    if info101['major_version'] == 5 and info101['minor_version'] == 0:
> -        return PLATFORM_NT5
> -
> -    return PLATFORM_UNKNOWN
> -
> -def is_domain_controller(info101):
> -    """Return true if the server_type field from a  SRV_INFO_101
> -    indicates a domain controller."""
> -    return info101['server_type'] & srvsvc.SV_TYPE_DOMAIN_CTRL
> -
> -def os_version(name):
> -    info = srvsvc.netservergetinfo("\\\\%s" % name, 101)
> -    return platform_type(info)
> -
> -if __name__ == "__main__":
> -    import sys
> -    if len(sys.argv) != 2:
> -        print "Usage: osver.py server"
> -        sys.exit(0)
> -    info = srvsvc.netservergetinfo("\\\\%s" % sys.argv[1], 101)
> -    print "platform type = %d" % platform_type(info)
> -    if is_domain_controller(info):
> -        print "%s is a domain controller" % sys.argv[1]
> diff --git a/source3/stf/pythoncheck.py b/source3/stf/pythoncheck.py
> deleted file mode 100755
> index a13f1b3..0000000
> --- a/source3/stf/pythoncheck.py
> +++ /dev/null
> @@ -1,46 +0,0 @@
> -#! /usr/bin/python
> -
> -# Comfychair test cases for Samba python extensions
> -
> -# Copyright (C) 2003 by Tim Potter <tpot at samba.org>
> -# 
> -# This program is free software; you can redistribute it and/or
> -# modify it under the terms of the GNU General Public License as
> -# published by the Free Software Foundation; either version 3 of the
> -# License, or (at your option) any later version.
> -# 
> -# This program is distributed in the hope that it will be useful, but
> -# WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -# General Public License for more details.
> -# 
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, see <http://www.gnu.org/licenses/>.
> -
> -"""These tests are run by Samba's "make check"."""
> -
> -import sys, comfychair
> -
> -class ImportTest(comfychair.TestCase):
> -    """Check that all modules can be imported without error."""
> -    def runtest(self):
> -        python_modules = ['spoolss', 'lsa', 'samr', 'winbind', 'winreg',
> -                          'srvsvc', 'tdb', 'smb', 'tdbpack']
> -        for m in python_modules:
> -            try:
> -                __import__('samba.%s' % m)
> -            except ImportError, msg:
> -                self.log(str(msg))
> -                self.fail('error importing %s module' % m)
> -
> -tests = [ImportTest]
> -
> -if __name__ == '__main__':
> -    # Some magic to repend build directory to python path so we see the
> -    # objects we have built and not previously installed stuff.
> -    from distutils.util import get_platform
> -    from os import getcwd
> -    sys.path.insert(0, '%s/build/lib.%s-%s' %
> -                    (getcwd(), get_platform(), sys.version[0:3]))
> -
> -    comfychair.main(tests)
> diff --git a/source3/stf/smbcontrol.py b/source3/stf/smbcontrol.py
> deleted file mode 100755
> index 30c3318..0000000
> --- a/source3/stf/smbcontrol.py
> +++ /dev/null
> @@ -1,238 +0,0 @@
> -#!/usr/bin/python
> -#
> -# Test for smbcontrol command line argument handling.
> -#
> -
> -import comfychair
> -
> -class NoArgs(comfychair.TestCase):
> -    """Test no arguments produces usage message."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol", expectedResult = 1)
> -        self.assert_re_match("Usage: smbcontrol", out[1])
> -        
> -class OneArg(comfychair.TestCase):
> -    """Test single argument produces usage message."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol foo", expectedResult = 1)
> -        self.assert_re_match("Usage: smbcontrol", out[1])
> -        
> -class SmbdDest(comfychair.TestCase):
> -    """Test the broadcast destination 'smbd'."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol smbd noop")
> -
> -class NmbdDest(comfychair.TestCase):
> -    """Test the destination 'nmbd'."""
> -    def runtest(self):
> -        # We need a way to start/stop/whatever nmbd
> -        raise comfychair.NotRunError, "not implemented"
> -
> -class PidDest(comfychair.TestCase):
> -    """Test a pid number destination'."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol 1234 noop")
> -
> -class SelfDest(comfychair.TestCase):
> -    """Test the destination 'self'."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol self noop")
> -
> -class WinbinddDest(comfychair.TestCase):
> -    """Test the destination 'winbindd'."""
> -    def runtest(self):
> -        # We need a way to start/stop/whatever winbindd
> -        raise comfychair.NotRunError, "not implemented"
> -
> -class BadDest(comfychair.TestCase):
> -    """Test a bad destination."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol foo noop", expectedResult = 1)
> -
> -class BadCmd(comfychair.TestCase):
> -    """Test a bad command."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol self spottyfoot", expectedResult = 1)
> -        self.assert_re_match("smbcontrol: unknown command", out[1]);
> -
> -class NoArgCmdTest(comfychair.TestCase):
> -    """A test class that tests a command with no argument."""
> -    def runtest(self):
> -        self.require_root()
> -        out = self.runcmd("smbcontrol self %s" % self.cmd)
> -        out = self.runcmd("smbcontrol self %s spottyfoot" % self.cmd,
> -                          expectedResult = 1)
> -
> -class ForceElection(NoArgCmdTest):
> -    """Test a force-election message."""
> -    def setup(self):
> -        self.cmd = "force-election"
> -
> -class SamSync(NoArgCmdTest):
> -    """Test a samsync message."""
> -    def setup(self):
> -        self.cmd = "samsync"
> -
> -class SamRepl(NoArgCmdTest):
> -    """Test a samrepl message."""
> -    def setup(self):
> -        self.cmd = "samrepl"
> -
> -class DmallocChanged(NoArgCmdTest):
> -    """Test a dmalloc-changed message."""
> -    def setup(self):
> -        self.cmd = "dmalloc-log-changed"
> -
> -class DmallocMark(NoArgCmdTest):
> -    """Test a dmalloc-mark message."""
> -    def setup(self):
> -        self.cmd = "dmalloc-mark"
> -
> -class Shutdown(NoArgCmdTest):
> -    """Test a shutdown message."""
> -    def setup(self):
> -        self.cmd = "shutdown"
> -
> -class Ping(NoArgCmdTest):
> -    """Test a ping message."""
> -    def setup(self):
> -        self.cmd = "ping"
> -
> -class Debuglevel(NoArgCmdTest):
> -    """Test a debuglevel message."""
> -    def setup(self):
> -        self.cmd = "debuglevel"
> -
> -class OneArgCmdTest(comfychair.TestCase):
> -    """A test class that tests a command with one argument."""
> -    def runtest(self):
> -        self.require_root()
> -        out = self.runcmd("smbcontrol self %s spottyfoot" % self.cmd)
> -        out = self.runcmd("smbcontrol self %s" % self.cmd, expectedResult = 1)
> -
> -class DrvUpgrade(OneArgCmdTest):
> -    """Test driver upgrade message."""
> -    def setup(self):
> -        self.cmd = "drvupgrade"
> -        
> -class CloseShare(OneArgCmdTest):
> -    """Test close share message."""
> -    def setup(self):
> -        self.cmd = "close-share"
> -        
> -class Debug(OneArgCmdTest):
> -    """Test a debug message."""
> -    def setup(self):
> -        self.cmd = "debug"
> -
> -class PrintNotify(comfychair.TestCase):
> -    """Test print notification commands."""
> -    def runtest(self):
> -
> -        # No subcommand
> -
> -        out = self.runcmd("smbcontrol self printnotify", expectedResult = 1)
> -        self.assert_re_match("Must specify subcommand", out[1]);
> -
> -        # Invalid subcommand name
> -
> -        out = self.runcmd("smbcontrol self printnotify spottyfoot",
> -                          expectedResult = 1)
> -        self.assert_re_match("Invalid subcommand", out[1]);
> -
> -        # Queue commands
> -
> -        for cmd in ["queuepause", "queueresume"]:
> -
> -            out = self.runcmd("smbcontrol self printnotify %s" % cmd,
> -                              expectedResult = 1)
> -            self.assert_re_match("Usage:", out[1])
> -        
> -            out = self.runcmd("smbcontrol self printnotify %s spottyfoot"
> -                              % cmd)
> -
> -        # Job commands
> -
> -        for cmd in ["jobpause", "jobresume", "jobdelete"]:
> -
> -            out = self.runcmd("smbcontrol self printnotify %s" % cmd,
> -                              expectedResult = 1)
> -            self.assert_re_match("Usage:", out[1])
> -
> -            out = self.runcmd("smbcontrol self printnotify %s spottyfoot"
> -                              % cmd, expectedResult = 1)
> -            self.assert_re_match("Usage:", out[1])
> -
> -            out = self.runcmd("smbcontrol self printnotify %s spottyfoot 123"
> -                              % cmd)
> -
> -        # Printer properties
> -
> -        out = self.runcmd("smbcontrol self printnotify printer",
> -                          expectedResult = 1)
> -        self.assert_re_match("Usage", out[1])
> -
> -        out = self.runcmd("smbcontrol self printnotify printer spottyfoot",
> -                          expectedResult = 1)
> -        self.assert_re_match("Usage", out[1])
> -
> -        for cmd in ["comment", "port", "driver"]:
> -
> -            out = self.runcmd("smbcontrol self printnotify printer spottyfoot "
> -                              "%s" % cmd, expectedResult = 1)
> -            self.assert_re_match("Usage", out[1])
> -
> -            out = self.runcmd("smbcontrol self printnotify printer spottyfoot "
> -                              "%s value" % cmd)
> -
> -class Profile(comfychair.TestCase):
> -    """Test setting the profiling level."""
> -    def runtest(self):
> -        self.require_root()
> -        out = self.runcmd("smbcontrol self profile", expectedResult = 1)
> -        self.assert_re_match("Usage", out[1])
> -        
> -        out = self.runcmd("smbcontrol self profile spottyfoot",
> -                          expectedResult = 1)
> -        self.assert_re_match("Unknown", out[1])
> -        
> -        for cmd in ["off", "count", "on", "flush"]:
> -            out = self.runcmd("smbcontrol self profile %s" % cmd)
> -
> -class ProfileLevel(comfychair.TestCase):
> -    """Test requesting the current profiling level."""
> -    def runtest(self):
> -        self.require_root()
> -        out = self.runcmd("smbcontrol self profilelevel spottyfoot",
> -                          expectedResult = 1)
> -        self.assert_re_match("Usage", out[1])
> -        
> -        out = self.runcmd("smbcontrol self profilelevel")
> -        
> -class TimeoutArg(comfychair.TestCase):
> -    """Test the --timeout argument."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol --timeout 5 self noop")
> -        out = self.runcmd("smbcontrol --timeout spottyfoot self noop",
> -                          expectedResult = 1)
> -
> -class ConfigFileArg(comfychair.TestCase):
> -    """Test the --configfile argument."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol --configfile /dev/null self noop")
> -
> -class BogusArg(comfychair.TestCase):
> -    """Test a bogus command line argument."""
> -    def runtest(self):
> -        out = self.runcmd("smbcontrol --bogus self noop", expectedResult = 1)
> -
> -tests = [NoArgs, OneArg, SmbdDest, NmbdDest, WinbinddDest, PidDest,
> -         SelfDest, BadDest, BadCmd, Debug, ForceElection, SamSync,
> -         SamRepl, DmallocMark, DmallocChanged, Shutdown, DrvUpgrade,
> -         CloseShare, Ping, Debuglevel, PrintNotify, Profile, ProfileLevel,
> -         TimeoutArg, ConfigFileArg, BogusArg]
> -
> -# Handle execution of this file as a main program
> -
> -if __name__ == '__main__':
> -    comfychair.main(tests)
> diff --git a/source3/stf/spoolss.py b/source3/stf/spoolss.py
> deleted file mode 100755
> index 7352915..0000000
> --- a/source3/stf/spoolss.py
> +++ /dev/null
> @@ -1,288 +0,0 @@
> -#!/usr/bin/python
> -
> -import re
> -import comfychair, stf
> -from samba import spoolss
> -
> -class PrintServerTest(comfychair.TestCase):
> -    """An abstract class requiring a print server."""
> -    def setUp(self):
> -        # TODO: create a test printer
> -        self.server = stf.get_server(platform = "nt")
> -        self.require(self.server != None, "print server required")
> -        # TODO: remove hardcoded printer name
> -        self.printername = "p"
> -        self.uncname = "\\\\%s\\%s" % \
> -                           (self.server["hostname"], self.printername)
> -
> -class W2kPrintServerTest(comfychair.TestCase):
> -    """An abstract class requiring a print server."""
> -    def setUp(self):
> -        # TODO: create a test printer
> -        self.server = stf.get_server(platform = "nt5")
> -        self.require(self.server != None, "print server required")
> -        # TODO: remove hardcoded printer name
> -        self.printername = "p"
> -        self.uncname = "\\\\%s\\%s" % \
> -                           (self.server["hostname"], self.printername)
> -
> -class CredentialTest(PrintServerTest):
> -    """An class that calls a function with various sets of credentials."""
> -    def runTest(self):
> -
> -        bad_user_creds = {"username": "spotty",
> -                          "domain": "dog",
> -                          "password": "bone"}
> -                        
> -        cases = ((self.server["administrator"], "Admin credentials", 1),
> -                 (bad_user_creds,               "Bad credentials",   0))
> -
> -        # TODO: add unpriv user case
> -
> -        for creds, testname, result in cases:
> -            try:
> -                self.runTestArg(creds)
> -            except:
> -                if result:
> -                    import traceback
> -                    traceback.print_exc()
> -                    self.fail("rpc with creds %s failed when it "
> -                              "should have suceeded" % creds)
> -                return
> -
> -            if not result:
> -                self.fail("rpc with creds %s suceeded when it should "
> -                          "have failed" % creds)
> -        
> -class ArgTestServer(PrintServerTest):
> -    """Test a RPC that takes a UNC print server name."""
> -    def runTest(self):
> -
> -        # List of test cases, %s substituted for server name
> -
> -        cases = (("",             "No server name",          0),
> -                 ("\\\\%s",       "Valid server name",       1),
> -                 ("\\%s",         "Invalid unc server name", 0),
> -                 ("\\\\%s__",     "Invalid unc server name", 0))
> -
> -        for unc, testname, result in cases:
> -            unc = re.sub("%s", self.server["hostname"], unc)
> -            try:
> -                self.runTestArg(unc)
> -            except:
> -                if result:
> -                    self.fail("rpc(\"%s\") failed when it should have "
> -                              "suceeded" % unc)
> -                return
> -
> -            if not result:
> -                # Suceeded when we should have failed
> -                self.fail("rpc(\"%s\") suceeded when it should have "
> -                          "failed" % unc)
> -
> -class ArgTestServerAndPrinter(ArgTestServer):
> -    """Test a RPC that takes a UNC print server or UNC printer name."""
> -    def runTest(self):
> -
> -        ArgTestServer.runTest(self)
> -        
> -        # List of test cases, %s substituted for server name, %p substituted
> -        # for printer name.
> -
> -        cases = (("\\\\%s\\%p",   "Valid server and printer name",      1),
> -                 ("\\\\%s\\%p__", "Valid server, invalid printer name", 0),
> -                 ("\\\\%s__\\%p", "Invalid server, valid printer name", 0))
> -
> -        for unc, testname, result in cases:
> -            unc = re.sub("%s", self.server["hostname"], unc)
> -            unc = re.sub("%p", self.printername, unc)
> -            try:
> -                self.runTestArg(unc)
> -            except:
> -                if result:
> -                    self.fail("openprinter(\"%s\") failed when it should have "
> -                              "suceeded" % unc)
> -                return
> -
> -            if not result:
> -                # Suceeded when we should have failed
> -                self.fail("openprinter(\"%s\") suceeded when it should have "
> -                          "failed" % unc)
> -
> -class OpenPrinterArg(ArgTestServerAndPrinter):
> -    """Test the OpenPrinter RPC with combinations of valid and invalid
> -    server and printer names."""
> -    def runTestArg(self, unc):
> -        spoolss.openprinter(unc)
> -
> -class OpenPrinterCred(CredentialTest):
> -    """Test opening printer with good and bad credentials."""
> -    def runTestArg(self, creds):
> -        spoolss.openprinter(self.uncname, creds = creds)
> -
> -class ClosePrinter(PrintServerTest):
> -    """Test the ClosePrinter RPC on a printer handle."""
> -    def runTest(self):
> -        hnd = spoolss.openprinter(self.uncname)
> -        spoolss.closeprinter(hnd)
> -        
> -class ClosePrinterServer(PrintServerTest):
> -    """Test the ClosePrinter RPC on a print server handle."""
> -    def runTest(self):
> -        hnd = spoolss.openprinter("\\\\%s" % self.server["hostname"])
> -        spoolss.closeprinter(hnd)
> -        
> -class GetPrinterInfo(PrintServerTest):
> -    """Retrieve printer info at various levels."""
> -
> -    # Sample printer data
> -
> -    sample_info = {
> -        0: {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '\\\\win2kdc1', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': 1114112, 'name': '\\\\win2kdc1\\p', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 2, 'status': 1, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0},
> -        1: {'comment': "I'm a teapot!", 'level': 1, 'flags': 8388608, 'name': '\\\\win2kdc1\\p', 'description': '\\\\win2kdc1\\p,HP LaserJet 4,Canberra office'},
> -        2: {'comment': "I'm a teapot!", 'status': 1, 'print_processor': 'WinPrint', 'until_time': 0, 'share_name': 'p', 'start_time': 0, 'device_mode': {'icm_method': 1, 'bits_per_pel': 0, 'log_pixels': 0, 'orientation': 1, 'panning_width': 0, 'color': 2, 'pels_width': 0, 'print_quality': 600, 'driver_version': 24, 'display_flags': 0, 'y_resolution': 600, 'media_type': 0, 'display_frequency': 0, 'icm_intent': 0, 'pels_height': 0, 'reserved1': 0, 'size': 220, 'scale': 100, 'dither_type': 0, 'panning_height': 0, 'default_source': 7, 'duplex': 1, 'fields': 16131, 'spec_version': 1025, 'copies': 1, 'device_name': '\\\\win2kdc1\\p', 'paper_size': 1, 'paper_length': 0, 'private': 'private', 'collate': 0, 'paper_width': 0, 'form_name': 'Letter', 'reserved2': 0, 'tt_option': 0}, 'port_name': 'LPT1:', 'sepfile': '', 'parameters': '', 'security_descriptor': {'group_sid': 'S-1-5-21-1606980848-1677128483-854245398-513', 'sacl': None, 'dacl': {'ace_list': [{'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-544'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-544'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1121'}, {'flags': 10, 'type': 0, 'mask': 131072, 'trustee': 'S-1-3-0'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-3-0'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1124'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-1-0'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-550'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-550'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-549'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-549'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1106'}], 'revision': 2}, 'owner_sid': 'S-1-5-32-544', 'revision': 1}, 'name': '\\\\win2kdc1\\p', 'server_name': '\\\\win2kdc1', 'level': 2, 'datatype': 'RAW', 'cjobs': 0, 'average_ppm': 0, 'priority': 1, 'driver_name': 'HP LaserJet 4', 'location': 'Canberra office', 'attributes': 8776, 'default_priority': 0},
> -        3: {'flags': 4, 'security_descriptor': {'group_sid': 'S-1-5-21-1606980848-1677128483-854245398-513', 'sacl': None, 'dacl': {'ace_list': [{'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-544'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-544'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1121'}, {'flags': 10, 'type': 0, 'mask': 131072, 'trustee': 'S-1-3-0'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-3-0'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1124'}, {'flags': 0, 'type': 0, 'mask': 131080, 'trustee': 'S-1-1-0'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-550'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-550'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-32-549'}, {'flags': 9, 'type': 0, 'mask': 983056, 'trustee': 'S-1-5-32-549'}, {'flags': 0, 'type': 0, 'mask': 983052, 'trustee': 'S-1-5-21-1606980848-1677128483-854245398-1106'}], 'revision': 2}, 'owner_sid': 'S-1-5-32-544', 'revision': 1}, 'level': 3}
> -        }
> -
> -    def runTest(self):
> -        self.hnd = spoolss.openprinter(self.uncname)
> -
> -        # Everyone should have getprinter levels 0-3
> -
> -        for i in (0, 1, 2, 3):
> -            info = self.hnd.getprinter(level = i)
> -            try:
> -                stf.dict_check(self.sample_info[i], info)
> -            except ValueError, msg:
> -                raise "info%d: %s" % (i, msg)
> -
> -class EnumPrinters(PrintServerTest):
> -    """Enumerate print info at various levels."""
> -
> -    sample_info = {
> -
> -        0: {'q': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': -1833435136, 'name': 'q', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 0, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}, 'p': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': -1831337984, 'name': 'p', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 1, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}, 'magpie': {'printer_errors': 0, 'unknown18': 0, 'unknown13': 0, 'unknown26': 0, 'cjobs': 0, 'unknown11': 0, 'server_name': '', 'total_pages': 0, 'unknown15': 586, 'unknown16': 0, 'month': 2, 'unknown20': 0, 'second': 23, 'unknown22': 983040, 'unknown25': 0, 'total_bytes': 0, 'unknown27': 0, 'year': 2003, 'build_version': 2195, 'unknown28': 0, 'global_counter': 4, 'day': 13, 'minute': 53, 'total_jobs': 0, 'unknown29': 1114112, 'name': 'magpie', 'hour': 2, 'level': 0, 'c_setprinter': 0, 'change_id': 522454169, 'major_version': 5, 'unknown23': 15, 'day_of_week': 4, 'unknown14': 1, 'session_counter': 1, 'status': 0, 'unknown7': 1, 'unknown8': 0, 'unknown9': 0, 'milliseconds': 421, 'unknown24': 0}},
> -
> -        1: {'q': {'comment': 'cheepy birds', 'level': 1, 'flags': 8388608, 'name': 'q', 'description': 'q,HP LaserJet 4,'}, 'p': {'comment': "I'm a teapot!", 'level': 1, 'flags': 8388608, 'name': 'p', 'description': 'p,HP LaserJet 4,Canberra office'}, 'magpie': {'comment': '', 'level': 1, 'flags': 8388608, 'name': 'magpie', 'description': 'magpie,Generic / Text Only,'}}
> -        }
> -
> -    def runTest(self):
> -        for i in (0, 1):
> -            info = spoolss.enumprinters(
> -                "\\\\%s" % self.server["hostname"], level = i)
> -            try:
> -                stf.dict_check(self.sample_info[i], info)
> -            except ValueError, msg:
> -                raise "info%d: %s" % (i, msg)
> -
> -class EnumPrintersArg(ArgTestServer):
> -    def runTestArg(self, unc):
> -        spoolss.enumprinters(unc)
> -
> -class EnumPrintersCred(CredentialTest):
> -    """Test opening printer with good and bad credentials."""
> -    def runTestArg(self, creds):
> -        spoolss.enumprinters(
> -            "\\\\%s" % self.server["hostname"], creds = creds)
> -
> -class EnumPrinterdrivers(PrintServerTest):
> -
> -    sample_info = {
> -        1: {'Okipage 10ex (PCL5E) : STANDARD': {'name': 'Okipage 10ex (PCL5E) : STANDARD', 'level': 1}, 'Generic / Text Only': {'name': 'Generic / Text Only', 'level': 1}, 'Brother HL-1030 series': {'name': 'Brother HL-1030 series', 'level': 1}, 'Brother HL-1240 series': {'name': 'Brother HL-1240 series', 'level': 1}, 'HP DeskJet 1220C Printer': {'name': 'HP DeskJet 1220C Printer', 'level': 1}, 'HP LaserJet 4100 PCL 6': {'name': 'HP LaserJet 4100 PCL 6', 'level': 1}, 'HP LaserJet 4': {'name': 'HP LaserJet 4', 'level': 1}},
> -        2: {'Okipage 10ex (PCL5E) : STANDARD': {'version': 2, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\RASDDUI.DLL', 'name': 'Okipage 10ex (PCL5E) : STANDARD', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\2\\RASDD.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\OKIPAGE.DLL', 'level': 2, 'architecture': 'Windows NT x86'}, 'Generic / Text Only': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\UNIDRVUI.DLL', 'name': 'Generic / Text Only', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\UNIDRV.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\TTY.GPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'Brother HL-1030 series': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BRUHL99A.DLL', 'name': 'Brother HL-1030 series', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL99A.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL103.PPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'Brother HL-1240 series': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BRUHL99A.DLL', 'name': 'Brother HL-1240 series', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL99A.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\BROHL124.PPD', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP DeskJet 1220C Printer': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'name': 'HP DeskJet 1220C Printer', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPW8KMD.DLL', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP LaserJet 4100 PCL 6': {'version': 3, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042E.DLL', 'name': 'HP LaserJet 4100 PCL 6', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042G.DLL', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\3\\HPBF042I.PMD', 'level': 2, 'architecture': 'Windows NT x86'}, 'HP LaserJet 4': {'version': 2, 'config_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff0.dll', 'name': 'HP LaserJet 4', 'driver_path': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff2.dll', 'data_file': '\\\\WIN2KDC1\\print$\\W32X86\\2\\hpblff39.pmd', 'level': 2, 'architecture': 'Windows NT x86'}}
> -        }
> -
> -    def runTest(self):
> -        for i in (1, 2):
> -            info = spoolss.enumprinterdrivers(
> -                "\\\\%s" % self.server["hostname"], level = i)
> -            try:
> -                if not self.sample_info.has_key(i):
> -                    self.log("%s" % info)
> -                    self.fail()
> -                stf.dict_check(self.sample_info[i], info)
> -            except ValueError, msg:
> -                raise "info%d: %s" % (i, msg)
> -
> -class EnumPrinterdriversArg(ArgTestServer):
> -    def runTestArg(self, unc):
> -        spoolss.enumprinterdrivers(unc)
> -
> -class EnumPrinterdriversCred(CredentialTest):
> -    """Test opening printer with good and bad credentials."""
> -    def runTestArg(self, creds):
> -        spoolss.enumprinterdrivers(
> -            "\\\\%s" % self.server["hostname"], creds = creds)
> -
> -def usage():
> -    print "Usage: spoolss.py [options] [test1[,test2...]]"
> -    print "\t -v/--verbose     Display debugging information"
> -    print "\t -l/--list-tests  List available tests"
> -    print
> -    print "A list of comma separated test names or regular expressions"
> -    print "can be used to filter the tests performed."
> -            
> -def test_match(subtest_list, test_name):
> -    """Return true if a test matches a comma separated list of regular
> -    expression of test names."""
> -    # re.match does an implicit ^ at the start of the pattern.
> -    # Explicitly anchor to end to avoid matching substrings.
> -    for s in string.split(subtest_list, ","):
> -        if re.match(s + "$", test_name):
> -            return 1
> -    return 0
> -           
> -if __name__ == "__main__":
> -    import os, sys, string
> -    import getopt
> -    
> -    try:
> -        opts, args = getopt.getopt(sys.argv[1:], "vl", \
> -                                   ["verbose", "list-tests"])
> -    except getopt.GetoptError:
> -        usage()
> -        sys.exit(0)
> -
> -    verbose = 0
> -    list_tests = 0
> -
> -    for opt, arg in opts:
> -        if opt in ("-v", "--verbose"):
> -            verbose = 1
> -        if opt in ("-l", "--list-tests"):
> -            list_tests = 1
> -
> -    if len(args) > 1:
> -        usage()
> -        sys.exit(0)
> -
> -    test_list = [
> -        OpenPrinterArg,
> -        OpenPrinterCred,
> -        ClosePrinter,
> -        ClosePrinterServer,
> -        GetPrinterInfo,
> -        EnumPrinters,
> -        EnumPrintersCred,
> -        EnumPrintersArg,
> -        EnumPrinterdrivers,
> -        EnumPrinterdriversCred,
> -        EnumPrinterdriversArg,
> -        ]
> -
> -    if len(args):
> -        t = []
> -        for test in test_list:
> -            if test_match(args[0], test.__name__):
> -                t.append(test)
> -        test_list = t
> -
> -    if os.environ.has_key("SAMBA_DEBUG"):
> -        spoolss.setup_logging(interactive = 1)
> -        spoolss.set_debuglevel(10)
> -
> -    if list_tests:
> -        for test in test_list:
> -            print test.__name__
> -    else:
> -        comfychair.runtests(test_list, verbose = verbose)
> diff --git a/source3/stf/standardcheck.py b/source3/stf/standardcheck.py
> deleted file mode 100644
> index 3261aed..0000000
> --- a/source3/stf/standardcheck.py
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -#! /usr/bin/python
> -
> -# Comfychair test cases for Samba
> -
> -# Copyright (C) 2003 by Martin Pool <mbp at samba.org>
> -# 
> -# This program is free software; you can redistribute it and/or
> -# modify it under the terms of the GNU General Public License as
> -# published by the Free Software Foundation; either version 3 of the
> -# License, or (at your option) any later version.
> -# 
> -# This program is distributed in the hope that it will be useful, but
> -# WITHOUT ANY WARRANTY; without even the implied warranty of
> -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -# General Public License for more details.
> -# 
> -# You should have received a copy of the GNU General Public License
> -# along with this program; if not, see <http://www.gnu.org/licenses/>.
> -
> -"""These tests are run by Samba's "make check"."""
> -
> -import strings, comfychair
> -import smbcontrol, sambalib
> -
> -# There should not be any actual tests in here: this file just serves
> -# to define the ones run by default.  They're imported from other
> -# modules.
> -
> -tests = strings.tests + smbcontrol.tests + sambalib.tests
> -
> -if __name__ == '__main__':
> -    comfychair.main(tests)
> diff --git a/source3/stf/stf.py b/source3/stf/stf.py
> deleted file mode 100755
> index ee0ff73..0000000
> --- a/source3/stf/stf.py
> +++ /dev/null
> @@ -1,101 +0,0 @@
> -#!/usr/bin/python
> -#
> -# Samba Testing Framework for Unit-testing
> -#
> -
> -import os, string, re
> -import osver
> -
> -def get_server_list_from_string(s):
> -
> -    server_list = []
> -    
> -    # Format is a list of server:domain\username%password separated
> -    # by commas.
> -
> -    for entry in string.split(s, ","):
> -
> -        # Parse entry 
> -
> -        m = re.match("(.*):(.*)(\\\\|/)(.*)%(.*)", entry)
> -        if not m:
> -            raise "badly formed server list entry '%s'" % entry
> -
> -        server = m.group(1)
> -        domain = m.group(2)
> -        username = m.group(4)
> -        password = m.group(5)
> -
> -        # Categorise servers
> -
> -        server_list.append({"platform": osver.os_version(server),
> -                            "hostname": server,
> -                            "administrator": {"username": username,
> -                                              "domain": domain,
> -                                              "password" : password}})
> -
> -    return server_list
> -
> -def get_server_list():
> -    """Iterate through all sources of server info and append them all
> -    in one big list."""
> -    
> -    server_list = []
> -
> -    # The $STF_SERVERS environment variable
> -
> -    if os.environ.has_key("STF_SERVERS"):
> -        server_list = server_list + \
> -                      get_server_list_from_string(os.environ["STF_SERVERS"])
> -
> -    return server_list
> -
> -def get_server(platform = None):
> -    """Return configuration information for a server.  The platform
> -    argument can be a string either 'nt4' or 'nt5' for Windows NT or
> -    Windows 2000 servers, or just 'nt' for Windows NT and higher."""
> -    
> -    server_list = get_server_list()
> -
> -    for server in server_list:
> -        if platform:
> -            p = server["platform"]
> -            if platform == "nt":
> -                if (p == osver.PLATFORM_NT4 or p == osver.PLATFORM_NT5):
> -                    return server
> -            if platform == "nt4" and p == osver.PLATFORM_NT4:
> -                return server
> -            if platform == "nt5" and p == osver.PLATFORM_NT5:
> -                return server
> -        else:
> -            # No filter defined, return first in list
> -            return server
> -        
> -    return None
> -
> -def dict_check(sample_dict, real_dict):
> -    """Check that real_dict contains all the keys present in sample_dict
> -    and no extras.  Also check that common keys are of them same type."""
> -    tmp = real_dict.copy()
> -    for key in sample_dict.keys():
> -        # Check existing key and type
> -        if not real_dict.has_key(key):
> -            raise ValueError, "dict does not contain key '%s'" % key
> -        if type(sample_dict[key]) != type(real_dict[key]):
> -            raise ValueError, "dict has differing types (%s vs %s) for key " \
> -                  "'%s'" % (type(sample_dict[key]), type(real_dict[key]), key)
> -        # Check dictionaries recursively
> -        if type(sample_dict[key]) == dict:
> -            dict_check(sample_dict[key], real_dict[key])
> -        # Delete visited keys from copy
> -        del(tmp[key])
> -    # Any keys leftover are present in the real dict but not the sample
> -    if len(tmp) == 0:
> -        return
> -    result = "dict has extra keys: "
> -    for key in tmp.keys():
> -        result = result + key + " "
> -    raise ValueError, result
> -
> -if __name__ == "__main__":
> -    print get_server(platform = "nt")
> diff --git a/source3/stf/test.py b/source3/stf/test.py
> deleted file mode 100755
> index fb57926..0000000
> --- a/source3/stf/test.py
> +++ /dev/null
> @@ -1,33 +0,0 @@
> -#!/usr/bin/python
> -
> -# meta-test-case / example for comfychair.  Should demonstrate
> -# different kinds of failure.
> -
> -import comfychair
> -
> -class NormalTest(comfychair.TestCase):
> -    def runtest(self):
> -        pass
> -
> -class RootTest(comfychair.TestCase):
> -    def setup(self):
> -        self.require_root()
> -            
> -    def runTest(self):
> -        pass
> -
> -class GoodExecTest(comfychair.TestCase):
> -    def runtest(self):
> -        stdout = self.runcmd("ls -l")
> -
> -class BadExecTest(comfychair.TestCase):
> -    def setup(self):
> -        exit, stdout = self.runcmd_unchecked("spottyfoot --slobber",
> -                                             skip_on_noexec = 1)
> -
> -
> -tests = [NormalTest, RootTest, GoodExecTest, BadExecTest]
> -
> -if __name__ == '__main__':
> -    comfychair.main(tests)
> -    
> -- 
> 2.7.4
> 




More information about the samba-technical mailing list