On 11/04/2011 07:01 PM, Don Zickus wrote:
> Lists the available tests based on either a local ./tests
> directory, a global /opt/autotest/tests directory or the
> packages AUTODIRTEST directory.
>
> The output will list the test name and a description based on the
> NAME field in the control file (or None if not found).
>
> The way this works is we walk each of the above directories looking
> for a "*control*" file.  The idea is each test has to have at least
> a /control file.  Some times tests will have different variants. Hence
> the wildcard approach.
>
> Because printing out<test>/control seemed redundant and defeats the
> point of the next command (run), any test directory that has a
> /control file in it, we only print the<test>  name instead of
> <test>/control.  For the control file variants we print the whole thing.
>
> Sample output:
>
> List of found tests on the system
> Unless otherwise specified, any output implies a /control file
>
> globally imported tests (/opt/autotest/tests)
>   None                                               [None]

Looks good, one minor comment about use of double underscores

> autotest's prepackaged tests (/ssd/dzickus/git/autotest/client/tests)
>   cpu_hotplug                                        ['cpu_hotplug']
>   crashtest                                          ["Sleeptest"]
>   crashtest/control2                                 ["Sleeptest"]
>   disktest                                           ['Disktest']
>   disktest/control.export                            ["Disktest using export"]
>   error_test_fail                                    ["error test for FAIL"]
>   error_test_na                                      ["error test for 
> TEST_NA"]
>   error_test_na/control2                             ["error test for top 
> level TestNAError == TEST
>
> Signed-off-by: Don Zickus<[email protected]>
> ---
>   client/bin/autotest     |    2 +
>   client/bin/cmdparser.py |   67 
> ++++++++++++++++++++++++++++++++++++++++++++++-
>   2 files changed, 68 insertions(+), 1 deletions(-)
>
> diff --git a/client/bin/autotest b/client/bin/autotest
> index 1d19cba..a82b512 100755
> --- a/client/bin/autotest
> +++ b/client/bin/autotest
> @@ -14,11 +14,13 @@ from autotest_lib.client.bin import cmdparser
>   # directory and ensure we have $AUTODIR in our environment.
>   autodirbin = os.path.dirname(os.path.realpath(sys.argv[0]))
>   autodir = os.path.dirname(autodirbin)
> +autodirtest = autodir + "/tests"
>
>   sys.path.insert(0, autodirbin)
>
>   os.environ['AUTODIR'] = autodir
>   os.environ['AUTODIRBIN'] = autodirbin
> +os.environ['AUTODIRTEST'] = autodirtest
>   os.environ['PYTHONPATH'] = autodirbin
>
>   parser = OptionParser(usage='Usage: %prog [options]<control-file>')
> diff --git a/client/bin/cmdparser.py b/client/bin/cmdparser.py
> index f2683f0..435e397 100644
> --- a/client/bin/cmdparser.py
> +++ b/client/bin/cmdparser.py
> @@ -8,16 +8,47 @@
>   import copy, os, platform, re, shutil, sys, time, traceback, types, glob
>   import logging, getpass, errno, weakref
>
> +LOCALDIRTEST = "/tests"
> +GLOBALDIRTEST = "/opt/autotest/tests"
> +
>   class CommandParser():
>       """A client-side command wrapper for newbies
>
>       """
>
> -    cmdlist = ['help']
> +    cmdlist = ['help', 'list']
>
>       def __init__(self):
>           return
>
> +    def __print_control_list(self, pipe, path):

We save double underscores only for occasions where we really need it 
(ie, we really want to make almost (almost) impossible to access this 
externally), because it makes unittesting unpractical. Changing to 
single underscore conveys the message (this is private-ish), and still 
let us to access it if we need to.

> +
> +        if not os.path.isdir(path):
> +            pipe.write(" %-50s [%s]\n" % ("None", "None"))
> +            return

^ Nice idea, just realized what you meant when I got to the bottom :)

> +        #The strategy here is to walk the root directory
> +        #looking for "*control*" files in some directory
> +        #and printing them out
> +        for root, dirs, files in sorted(os.walk(path)):
> +            for name in files:
> +                if re.search("control", name):
> +                    #strip full path
> +                    r = re.sub(path + "/", "", root)
> +                    text = "%s/%s" % (r, name)
> +                    desc = "None"
> +
> +                    if name == "control":
> +                        #imply /control by listing only directory name
> +                        text = "%s" % r
> +
> +                    for line in open(root + "/" + name).readlines():
> +                        if re.match("NAME", line):
> +                            #we have a description line
> +                            desc = re.split("=\s*", line, 
> maxsplit=1)[1].rstrip()
> +                            break
> +                    pipe.write(" %-50s [%s]\n" % (text, desc))

^ Ok, good

>       def parse_args(self, args):
>           """
>           Process a client side command
> @@ -50,5 +81,39 @@ class CommandParser():
>           """
>
>           print "help\t\tOutput a list of supported commands"
> +        print "list\t\tOutput a list of available tests"
>           raise SystemExit(0)
>
> +    def list(self, args):
> +        """
> +        List the available tests for users to choose from
> +        """
> +
> +        #a favorite feature from git :-)
> +        pipe = os.popen('less -FRSX', 'w')
> +
> +        pipe.write("List of found tests on the system\n")
> +        pipe.write("Unless otherwise specified, any output implies a 
> /control file\n")
> +        pipe.write("\n")
> +
> +        #walk local ./tests directory
> +        dirtest = os.environ['PWD'] + LOCALDIRTEST
> +        #don't repeat autodirtest results
> +        if not dirtest == os.environ['AUTODIRTEST']:
> +            pipe.write("locally found tests (%s)\n" % dirtest)
> +            self.__print_control_list(pipe, dirtest)
> +            pipe.write("\n")
> +
> +        #walk globaldirtests directory
> +        dirtest = GLOBALDIRTEST
> +        pipe.write("globally imported tests (%s)\n" % dirtest)
> +        self.__print_control_list(pipe, dirtest)
> +        pipe.write("\n")
> +
> +        #walk autodirtest directory
> +        dirtest = os.environ['AUTODIRTEST']
> +        pipe.write("autotest's prepackaged tests (%s)\n" % dirtest)
> +        self.__print_control_list(pipe, dirtest)
> +
> +        pipe.close()
> +        raise SystemExit(0)

_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to