xref: /openbmc/openbmc-test-automation/lib/gen_robot_valid.py (revision b9d8dfd2442dbdf7d1fcb11b8fd79317a6e95fda)
118176322SMichael Walsh#!/usr/bin/env python
218176322SMichael Walsh
318176322SMichael Walshr"""
484230c20SMichael WalshThis module provides validation functions like valid_value(), valid_integer(),
584230c20SMichael Walshetc. for robot programs.
618176322SMichael Walsh"""
718176322SMichael Walsh
884230c20SMichael Walshimport re
9c108e429SMichael Walshimport gen_print as gp
1018176322SMichael Walshimport gen_valid as gv
1184230c20SMichael Walshimport func_args as fa
1218176322SMichael Walsh
1318176322SMichael Walshfrom robot.libraries.BuiltIn import BuiltIn
1418176322SMichael Walsh
1518176322SMichael Walsh
1684230c20SMichael Walshdef valid_var_name(var_name):
1718176322SMichael Walsh    r"""
1884230c20SMichael Walsh    Validate the robot variable name and return its value.
193e26e109SMichael Walsh
2084230c20SMichael Walsh    If the variable is undefined, this function will print an error message
2184230c20SMichael Walsh    and call BuiltIn().fail().
2218176322SMichael Walsh
2384230c20SMichael Walsh    Description of arguments():
2484230c20SMichael Walsh    var_name                        The name of the robot variable (e.g.
2584230c20SMichael Walsh                                    "var1").  Do not include "${}" (e.g.
2684230c20SMichael Walsh                                    "${var1}".  Just provide the simple name
2784230c20SMichael Walsh                                    of the variable.
2818176322SMichael Walsh    """
2918176322SMichael Walsh
3018176322SMichael Walsh    # Note: get_variable_value() seems to have no trouble with local variables.
3118176322SMichael Walsh    var_value = BuiltIn().get_variable_value("${" + var_name + "}")
3218176322SMichael Walsh    if var_value is None:
3384230c20SMichael Walsh        var_value = "<undefined>"
3484230c20SMichael Walsh        error_message = gv.valid_value(var_value, invalid_values=[var_value],
3584230c20SMichael Walsh                                       var_name=var_name)
3618176322SMichael Walsh        BuiltIn().fail(error_message)
3718176322SMichael Walsh
3884230c20SMichael Walsh    return var_value
3918176322SMichael Walsh
4084230c20SMichael Walsh
4184230c20SMichael Walshdef valid_init(var_name, *args, **kwargs):
4218176322SMichael Walsh    r"""
4384230c20SMichael Walsh    Do initialization for variable validation and return var_name, args and
4484230c20SMichael Walsh    kwargs.
453e26e109SMichael Walsh
4684230c20SMichael Walsh    This function is to be called by all of the various validation functions
4784230c20SMichael Walsh    in this module.
4818176322SMichael Walsh
4984230c20SMichael Walsh    This function is designed solely for use by other functions in this file.
5018176322SMichael Walsh
5184230c20SMichael Walsh    Description of argument(s):
5284230c20SMichael Walsh    var_name                        The name of the variable to be validated.
5384230c20SMichael Walsh    args                            The positional arguments to be passed to a
5484230c20SMichael Walsh                                    validation function.
5584230c20SMichael Walsh    kwargs                          The keyword arguments to be passed to a
5684230c20SMichael Walsh                                    validation function.
5718176322SMichael Walsh    """
5818176322SMichael Walsh
5984230c20SMichael Walsh    var_value = valid_var_name(var_name)
6084230c20SMichael Walsh    # Convert python string object definitions to objects (useful for robot
6184230c20SMichael Walsh    # callers).
6284230c20SMichael Walsh    args = fa.args_to_objects(args)
6384230c20SMichael Walsh    kwargs = fa.args_to_objects(kwargs)
6484230c20SMichael Walsh    return var_value, args, kwargs
652c687e98SMichael Walsh
662c687e98SMichael Walsh
6784230c20SMichael Walshdef process_error_message(error_message):
682c687e98SMichael Walsh    r"""
6984230c20SMichael Walsh    Process an error message.
702c687e98SMichael Walsh
7184230c20SMichael Walsh    If error_message is non-blank, fail.  Otherwise, do nothing.
722c687e98SMichael Walsh
7384230c20SMichael Walsh    This function is designed solely for use by other functions in this file.
742c687e98SMichael Walsh
7584230c20SMichael Walsh    Description of argument(s):
7684230c20SMichael Walsh    error_message                   The error message to be processed.
772c687e98SMichael Walsh    """
782c687e98SMichael Walsh
7984230c20SMichael Walsh    if error_message:
80c108e429SMichael Walsh        error_message = gp.sprint_error_report(error_message)
812c687e98SMichael Walsh        BuiltIn().fail(error_message)
8284230c20SMichael Walsh
8384230c20SMichael Walsh
8484230c20SMichael Walsh# The docstring header will be pre-pended to each validation function's
8584230c20SMichael Walsh# existing docstring.
8684230c20SMichael Walshdocstring_header = \
8784230c20SMichael Walsh    r"""
8884230c20SMichael Walsh    Fail if the variable named by var_name is invalid.
8984230c20SMichael Walsh    """
9084230c20SMichael Walsh
9184230c20SMichael Walsh
9284230c20SMichael Walshdef customize_doc_string(doc_string):
9384230c20SMichael Walsh    r"""
9484230c20SMichael Walsh    Customize a gen_valid function docstring and return the result.
9584230c20SMichael Walsh
9684230c20SMichael Walsh    This function is designed solely for use by other functions in this file.
9784230c20SMichael Walsh
9884230c20SMichael Walsh    The caller should pass a docstring from a gen_valid.py validation
9984230c20SMichael Walsh    function.  This docstring will be changed to make a suitable docstring for
10084230c20SMichael Walsh    this module's corresponding validation function.
10184230c20SMichael Walsh
10284230c20SMichael Walsh    For example:
10384230c20SMichael Walsh
10484230c20SMichael Walsh    Let's suppose that gen_valid.py has a function called "valid_value()".
10584230c20SMichael Walsh    This module could make the following call to essentially copy gen_valid's
10684230c20SMichael Walsh    "valid_value()" function, modify it and then assign it to the local
10784230c20SMichael Walsh    version of the valid_value() function.
10884230c20SMichael Walsh
10984230c20SMichael Walsh    valid.__doc__ = customize_doc_string(gv.valid.__doc__)
11084230c20SMichael Walsh
11184230c20SMichael Walsh    Description of argument(s):
11284230c20SMichael Walsh    doc_string                      The docstring to be customized.
11384230c20SMichael Walsh    """
11484230c20SMichael Walsh
11584230c20SMichael Walsh    doc_string = docstring_header + doc_string
11684230c20SMichael Walsh    doc_string = doc_string.split("\n")
11784230c20SMichael Walsh
11884230c20SMichael Walsh    start_ix = 0
11984230c20SMichael Walsh    # Find the "var_value" line.
12084230c20SMichael Walsh    start_ix = next((index for index, value in
12184230c20SMichael Walsh                     enumerate(doc_string[start_ix:], start_ix)
12284230c20SMichael Walsh                     if re.match("[ ]+var_value  ", value)), None)
12384230c20SMichael Walsh    # Replace the "var_value" line with our "var_name" line.
12484230c20SMichael Walsh    doc_string[start_ix] = "    var_name                        " \
12584230c20SMichael Walsh        + "The name of the variable to be validated."
12684230c20SMichael Walsh
12784230c20SMichael Walsh    return "\n".join(doc_string)
12884230c20SMichael Walsh
12984230c20SMichael Walsh
13084230c20SMichael Walsh# All of the following functions are robot wrappers for the equivalent
13184230c20SMichael Walsh# functions defined in gen_valid.py.  Note that the only difference between
13284230c20SMichael Walsh# any two of these locally defined functions is the function name and the
13384230c20SMichael Walsh# gv.<function name> which they call.  Also, note that the docstring for each
13484230c20SMichael Walsh# is created by modifying the docstring from the supporting gen_valid.py
13584230c20SMichael Walsh# function.
13684230c20SMichael Walsh
13784230c20SMichael Walshdef valid_type(var_name, *args, **kwargs):
13884230c20SMichael Walsh
13984230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
14084230c20SMichael Walsh    error_message = \
14184230c20SMichael Walsh        gv.valid_type(var_value, *args, var_name=var_name, **kwargs)
14284230c20SMichael Walsh    process_error_message(error_message)
14384230c20SMichael Walsh
14484230c20SMichael Walsh
14584230c20SMichael Walshdef valid_value(var_name, *args, **kwargs):
14684230c20SMichael Walsh
14784230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
14884230c20SMichael Walsh    error_message = \
14984230c20SMichael Walsh        gv.valid_value(var_value, *args, var_name=var_name, **kwargs)
15084230c20SMichael Walsh    process_error_message(error_message)
15184230c20SMichael Walsh
15284230c20SMichael Walsh
15384230c20SMichael Walshdef valid_range(var_name, *args, **kwargs):
15484230c20SMichael Walsh
15584230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
15684230c20SMichael Walsh    error_message = \
15784230c20SMichael Walsh        gv.valid_range(var_value, *args, var_name=var_name, **kwargs)
15884230c20SMichael Walsh    process_error_message(error_message)
15984230c20SMichael Walsh
16084230c20SMichael Walsh
16184230c20SMichael Walshdef valid_integer(var_name, *args, **kwargs):
16284230c20SMichael Walsh
16384230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
16484230c20SMichael Walsh    error_message = \
16584230c20SMichael Walsh        gv.valid_integer(var_value, *args, var_name=var_name, **kwargs)
16684230c20SMichael Walsh    process_error_message(error_message)
16784230c20SMichael Walsh
16884230c20SMichael Walsh
16984230c20SMichael Walshdef valid_dir_path(var_name, *args, **kwargs):
17084230c20SMichael Walsh
17184230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
17284230c20SMichael Walsh    error_message = \
17384230c20SMichael Walsh        gv.valid_dir_path(var_value, *args, var_name=var_name, **kwargs)
17484230c20SMichael Walsh    process_error_message(error_message)
17584230c20SMichael Walsh
17684230c20SMichael Walsh
17784230c20SMichael Walshdef valid_file_path(var_name, *args, **kwargs):
17884230c20SMichael Walsh
17984230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
18084230c20SMichael Walsh    error_message = \
18184230c20SMichael Walsh        gv.valid_file_path(var_value, *args, var_name=var_name, **kwargs)
18284230c20SMichael Walsh    process_error_message(error_message)
18384230c20SMichael Walsh
18484230c20SMichael Walsh
18584230c20SMichael Walshdef valid_path(var_name, *args, **kwargs):
18684230c20SMichael Walsh
18784230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
18884230c20SMichael Walsh    error_message = \
18984230c20SMichael Walsh        gv.valid_path(var_value, *args, var_name=var_name, **kwargs)
19084230c20SMichael Walsh    process_error_message(error_message)
19184230c20SMichael Walsh
19284230c20SMichael Walsh
19384230c20SMichael Walshdef valid_list(var_name, *args, **kwargs):
19484230c20SMichael Walsh
19584230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
19684230c20SMichael Walsh    error_message = \
19784230c20SMichael Walsh        gv.valid_list(var_value, *args, var_name=var_name, **kwargs)
19884230c20SMichael Walsh    process_error_message(error_message)
19984230c20SMichael Walsh
20084230c20SMichael Walsh
20184230c20SMichael Walshdef valid_dict(var_name, *args, **kwargs):
20284230c20SMichael Walsh
20384230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
20484230c20SMichael Walsh    error_message = \
20584230c20SMichael Walsh        gv.valid_dict(var_value, *args, var_name=var_name, **kwargs)
20684230c20SMichael Walsh    process_error_message(error_message)
20784230c20SMichael Walsh
20884230c20SMichael Walsh
209be3a8150SMichael Walshdef valid_program(var_name, *args, **kwargs):
210be3a8150SMichael Walsh
211be3a8150SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
212be3a8150SMichael Walsh    error_message = \
213be3a8150SMichael Walsh        gv.valid_program(var_value, *args, var_name=var_name, **kwargs)
214be3a8150SMichael Walsh    process_error_message(error_message)
215be3a8150SMichael Walsh
216be3a8150SMichael Walsh
217*b9d8dfd2SMichael Walshdef valid_length(var_name, *args, **kwargs):
218*b9d8dfd2SMichael Walsh
219*b9d8dfd2SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
220*b9d8dfd2SMichael Walsh    error_message = \
221*b9d8dfd2SMichael Walsh        gv.valid_length(var_value, *args, var_name=var_name, **kwargs)
222*b9d8dfd2SMichael Walsh    process_error_message(error_message)
223*b9d8dfd2SMichael Walsh
224*b9d8dfd2SMichael Walsh
22584230c20SMichael Walsh# Modify the validation function docstrings by calling customize_doc_string
22684230c20SMichael Walsh# for each function in the func_names list.
22784230c20SMichael Walshfunc_names = [
22884230c20SMichael Walsh    "valid_type", "valid_value", "valid_range", "valid_integer",
22984230c20SMichael Walsh    "valid_dir_path", "valid_file_path", "valid_path", "valid_list",
230be3a8150SMichael Walsh    "valid_dict", "valid_program"
23184230c20SMichael Walsh]
23284230c20SMichael Walsh
23384230c20SMichael Walshfor func_name in func_names:
23484230c20SMichael Walsh    cmd_buf = func_name \
23584230c20SMichael Walsh        + ".__doc__ = customize_doc_string(gv.raw_doc_strings['" \
23684230c20SMichael Walsh        + func_name + "'])"
23784230c20SMichael Walsh    exec(cmd_buf)
238