xref: /openbmc/openbmc-test-automation/lib/gen_robot_valid.py (revision e635ddc0cb252f30990a509ac8314adef394c369)
1e7e9171eSGeorge Keishing#!/usr/bin/env python3
218176322SMichael Walsh
318176322SMichael Walshr"""
4410b1787SMichael WalshThis module provides validation functions like valid_value(), valid_integer(), etc. for robot programs.
518176322SMichael Walsh"""
618176322SMichael Walsh
784230c20SMichael Walshimport re
8c108e429SMichael Walshimport gen_print as gp
918176322SMichael Walshimport gen_valid as gv
10*e635ddc0SGeorge Keishingimport func_args as fa
11*e635ddc0SGeorge Keishing
1218176322SMichael Walshfrom robot.libraries.BuiltIn import BuiltIn
1318176322SMichael Walsh
1418176322SMichael Walsh
1584230c20SMichael Walshdef valid_var_name(var_name):
1618176322SMichael Walsh    r"""
1784230c20SMichael Walsh    Validate the robot variable name and return its value.
183e26e109SMichael Walsh
19410b1787SMichael Walsh    If the variable is undefined, this function will print an error message and call BuiltIn().fail().
2018176322SMichael Walsh
2184230c20SMichael Walsh    Description of arguments():
22410b1787SMichael Walsh    var_name                        The name of the robot variable (e.g. "var1").  Do not include "${}" (e.g.
23410b1787SMichael Walsh                                    "${var1}".  Just provide the simple name of the variable.
2418176322SMichael Walsh    """
2518176322SMichael Walsh
2618176322SMichael Walsh    # Note: get_variable_value() seems to have no trouble with local variables.
2718176322SMichael Walsh    var_value = BuiltIn().get_variable_value("${" + var_name + "}")
2818176322SMichael Walsh    if var_value is None:
2984230c20SMichael Walsh        var_value = "<undefined>"
30*e635ddc0SGeorge Keishing        error_message = gv.valid_value(var_value, invalid_values=[var_value],
31*e635ddc0SGeorge Keishing                                       var_name=var_name)
3218176322SMichael Walsh        BuiltIn().fail(error_message)
3318176322SMichael Walsh
3484230c20SMichael Walsh    return var_value
3518176322SMichael Walsh
3684230c20SMichael Walsh
3784230c20SMichael Walshdef valid_init(var_name, *args, **kwargs):
3818176322SMichael Walsh    r"""
39410b1787SMichael Walsh    Do initialization for variable validation and return var_name, args and kwargs.
403e26e109SMichael Walsh
41410b1787SMichael Walsh    This function is to be called by all of the various validation functions in this module.
4218176322SMichael Walsh
4384230c20SMichael Walsh    This function is designed solely for use by other functions in this file.
4418176322SMichael Walsh
4584230c20SMichael Walsh    Description of argument(s):
4684230c20SMichael Walsh    var_name                        The name of the variable to be validated.
47410b1787SMichael Walsh    args                            The positional arguments to be passed to a validation function.
48410b1787SMichael Walsh    kwargs                          The keyword arguments to be passed to a validation function.
4918176322SMichael Walsh    """
5018176322SMichael Walsh
5184230c20SMichael Walsh    var_value = valid_var_name(var_name)
52410b1787SMichael Walsh    # Convert python string object definitions to objects (useful for robot callers).
5384230c20SMichael Walsh    args = fa.args_to_objects(args)
5484230c20SMichael Walsh    kwargs = fa.args_to_objects(kwargs)
5584230c20SMichael Walsh    return var_value, args, kwargs
562c687e98SMichael Walsh
572c687e98SMichael Walsh
5884230c20SMichael Walshdef process_error_message(error_message):
592c687e98SMichael Walsh    r"""
6084230c20SMichael Walsh    Process an error message.
612c687e98SMichael Walsh
6284230c20SMichael Walsh    If error_message is non-blank, fail.  Otherwise, do nothing.
632c687e98SMichael Walsh
6484230c20SMichael Walsh    This function is designed solely for use by other functions in this file.
652c687e98SMichael Walsh
6684230c20SMichael Walsh    Description of argument(s):
6784230c20SMichael Walsh    error_message                   The error message to be processed.
682c687e98SMichael Walsh    """
692c687e98SMichael Walsh
7084230c20SMichael Walsh    if error_message:
71c108e429SMichael Walsh        error_message = gp.sprint_error_report(error_message)
722c687e98SMichael Walsh        BuiltIn().fail(error_message)
7384230c20SMichael Walsh
7484230c20SMichael Walsh
75410b1787SMichael Walsh# The docstring header will be pre-pended to each validation function's existing docstring.
76*e635ddc0SGeorge Keishingdocstring_header = \
77*e635ddc0SGeorge Keishing    r"""
7884230c20SMichael Walsh    Fail if the variable named by var_name is invalid.
7984230c20SMichael Walsh    """
8084230c20SMichael Walsh
8184230c20SMichael Walsh
8284230c20SMichael Walshdef customize_doc_string(doc_string):
8384230c20SMichael Walsh    r"""
8484230c20SMichael Walsh    Customize a gen_valid function docstring and return the result.
8584230c20SMichael Walsh
8684230c20SMichael Walsh    This function is designed solely for use by other functions in this file.
8784230c20SMichael Walsh
88410b1787SMichael Walsh    The caller should pass a docstring from a gen_valid.py validation function.  This docstring will be
89410b1787SMichael Walsh    changed to make a suitable docstring for this module's corresponding validation function.
9084230c20SMichael Walsh
9184230c20SMichael Walsh    For example:
9284230c20SMichael Walsh
93410b1787SMichael Walsh    Let's suppose that gen_valid.py has a function called "valid_value()".  This module could make the
94410b1787SMichael Walsh    following call to essentially copy gen_valid's "valid_value()" function, modify it and then assign it to
95410b1787SMichael Walsh    the local version of the valid_value() function.
9684230c20SMichael Walsh
9784230c20SMichael Walsh    valid.__doc__ = customize_doc_string(gv.valid.__doc__)
9884230c20SMichael Walsh
9984230c20SMichael Walsh    Description of argument(s):
10084230c20SMichael Walsh    doc_string                      The docstring to be customized.
10184230c20SMichael Walsh    """
10284230c20SMichael Walsh
10384230c20SMichael Walsh    doc_string = docstring_header + doc_string
10484230c20SMichael Walsh    doc_string = doc_string.split("\n")
10584230c20SMichael Walsh
10684230c20SMichael Walsh    start_ix = 0
10784230c20SMichael Walsh    # Find the "var_value" line.
108*e635ddc0SGeorge Keishing    start_ix = next((index for index, value in
109*e635ddc0SGeorge Keishing                     enumerate(doc_string[start_ix:], start_ix)
110*e635ddc0SGeorge Keishing                     if re.match("[ ]+var_value  ", value)), None)
11184230c20SMichael Walsh    # Replace the "var_value" line with our "var_name" line.
112*e635ddc0SGeorge Keishing    doc_string[start_ix] = "    var_name                        " \
11384230c20SMichael Walsh        + "The name of the variable to be validated."
11484230c20SMichael Walsh
11584230c20SMichael Walsh    return "\n".join(doc_string)
11684230c20SMichael Walsh
11784230c20SMichael Walsh
118410b1787SMichael Walsh# All of the following functions are robot wrappers for the equivalent functions defined in gen_valid.py.
119410b1787SMichael Walsh# Note that the only difference between any two of these locally defined functions is the function name and
120410b1787SMichael Walsh# the gv.<function name> which they call.  Also, note that the docstring for each is created by modifying the
121410b1787SMichael Walsh# docstring from the supporting gen_valid.py function.
12284230c20SMichael Walsh
1235731818dSPatrick Williamsdef valid_type(var_name, *args, **kwargs):
124*e635ddc0SGeorge Keishing
12584230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
126*e635ddc0SGeorge Keishing    error_message = \
127*e635ddc0SGeorge Keishing        gv.valid_type(var_value, *args, var_name=var_name, **kwargs)
12884230c20SMichael Walsh    process_error_message(error_message)
12984230c20SMichael Walsh
13084230c20SMichael Walsh
13184230c20SMichael Walshdef valid_value(var_name, *args, **kwargs):
132*e635ddc0SGeorge Keishing
13384230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
134*e635ddc0SGeorge Keishing    error_message = \
135*e635ddc0SGeorge Keishing        gv.valid_value(var_value, *args, var_name=var_name, **kwargs)
13684230c20SMichael Walsh    process_error_message(error_message)
13784230c20SMichael Walsh
13884230c20SMichael Walsh
13984230c20SMichael Walshdef valid_range(var_name, *args, **kwargs):
140*e635ddc0SGeorge Keishing
14184230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
142*e635ddc0SGeorge Keishing    error_message = \
143*e635ddc0SGeorge Keishing        gv.valid_range(var_value, *args, var_name=var_name, **kwargs)
14484230c20SMichael Walsh    process_error_message(error_message)
14584230c20SMichael Walsh
14684230c20SMichael Walsh
14784230c20SMichael Walshdef valid_integer(var_name, *args, **kwargs):
148*e635ddc0SGeorge Keishing
14984230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
150*e635ddc0SGeorge Keishing    error_message = \
151*e635ddc0SGeorge Keishing        gv.valid_integer(var_value, *args, var_name=var_name, **kwargs)
15284230c20SMichael Walsh    process_error_message(error_message)
15384230c20SMichael Walsh
15484230c20SMichael Walsh
1558333a18dSMichael Walshdef valid_float(var_name, *args, **kwargs):
156*e635ddc0SGeorge Keishing
1578333a18dSMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
158*e635ddc0SGeorge Keishing    error_message = \
159*e635ddc0SGeorge Keishing        gv.valid_float(var_value, *args, var_name=var_name, **kwargs)
1608333a18dSMichael Walsh    process_error_message(error_message)
1618333a18dSMichael Walsh
1628333a18dSMichael Walsh
1638333a18dSMichael Walshdef valid_date_time(var_name, *args, **kwargs):
164*e635ddc0SGeorge Keishing
1658333a18dSMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
166*e635ddc0SGeorge Keishing    error_message = \
167*e635ddc0SGeorge Keishing        gv.valid_date_time(var_value, *args, var_name=var_name, **kwargs)
1688333a18dSMichael Walsh    process_error_message(error_message)
1698333a18dSMichael Walsh
1708333a18dSMichael Walsh
17184230c20SMichael Walshdef valid_dir_path(var_name, *args, **kwargs):
172*e635ddc0SGeorge Keishing
17384230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
174*e635ddc0SGeorge Keishing    error_message = \
175*e635ddc0SGeorge Keishing        gv.valid_dir_path(var_value, *args, var_name=var_name, **kwargs)
17684230c20SMichael Walsh    process_error_message(error_message)
17784230c20SMichael Walsh
17884230c20SMichael Walsh
17984230c20SMichael Walshdef valid_file_path(var_name, *args, **kwargs):
180*e635ddc0SGeorge Keishing
18184230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
182*e635ddc0SGeorge Keishing    error_message = \
183*e635ddc0SGeorge Keishing        gv.valid_file_path(var_value, *args, var_name=var_name, **kwargs)
18484230c20SMichael Walsh    process_error_message(error_message)
18584230c20SMichael Walsh
18684230c20SMichael Walsh
18784230c20SMichael Walshdef valid_path(var_name, *args, **kwargs):
188*e635ddc0SGeorge Keishing
18984230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
190*e635ddc0SGeorge Keishing    error_message = \
191*e635ddc0SGeorge Keishing        gv.valid_path(var_value, *args, var_name=var_name, **kwargs)
19284230c20SMichael Walsh    process_error_message(error_message)
19384230c20SMichael Walsh
19484230c20SMichael Walsh
19584230c20SMichael Walshdef valid_list(var_name, *args, **kwargs):
196*e635ddc0SGeorge Keishing
19784230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
198*e635ddc0SGeorge Keishing    error_message = \
199*e635ddc0SGeorge Keishing        gv.valid_list(var_value, *args, var_name=var_name, **kwargs)
20084230c20SMichael Walsh    process_error_message(error_message)
20184230c20SMichael Walsh
20284230c20SMichael Walsh
20384230c20SMichael Walshdef valid_dict(var_name, *args, **kwargs):
204*e635ddc0SGeorge Keishing
20584230c20SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
206*e635ddc0SGeorge Keishing    error_message = \
207*e635ddc0SGeorge Keishing        gv.valid_dict(var_value, *args, var_name=var_name, **kwargs)
20884230c20SMichael Walsh    process_error_message(error_message)
20984230c20SMichael Walsh
21084230c20SMichael Walsh
211be3a8150SMichael Walshdef valid_program(var_name, *args, **kwargs):
212*e635ddc0SGeorge Keishing
213be3a8150SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
214*e635ddc0SGeorge Keishing    error_message = \
215*e635ddc0SGeorge Keishing        gv.valid_program(var_value, *args, var_name=var_name, **kwargs)
216be3a8150SMichael Walsh    process_error_message(error_message)
217be3a8150SMichael Walsh
218be3a8150SMichael Walsh
219b9d8dfd2SMichael Walshdef valid_length(var_name, *args, **kwargs):
220*e635ddc0SGeorge Keishing
221b9d8dfd2SMichael Walsh    var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
222*e635ddc0SGeorge Keishing    error_message = \
223*e635ddc0SGeorge Keishing        gv.valid_length(var_value, *args, var_name=var_name, **kwargs)
224b9d8dfd2SMichael Walsh    process_error_message(error_message)
225b9d8dfd2SMichael Walsh
226b9d8dfd2SMichael Walsh
227410b1787SMichael Walsh# Modify the validation function docstrings by calling customize_doc_string for each function in the
228410b1787SMichael Walsh# func_names list.
22984230c20SMichael Walshfunc_names = [
230*e635ddc0SGeorge Keishing    "valid_type", "valid_value", "valid_range", "valid_integer",
231*e635ddc0SGeorge Keishing    "valid_dir_path", "valid_file_path", "valid_path", "valid_list",
232*e635ddc0SGeorge Keishing    "valid_dict", "valid_program", "valid_length", "valid_float",
233*e635ddc0SGeorge Keishing    "valid_date_time"
23484230c20SMichael Walsh]
23584230c20SMichael Walsh
23684230c20SMichael Walshfor func_name in func_names:
237*e635ddc0SGeorge Keishing    cmd_buf = func_name \
238*e635ddc0SGeorge Keishing        + ".__doc__ = customize_doc_string(gv.raw_doc_strings['" \
239*e635ddc0SGeorge Keishing        + func_name + "'])"
24084230c20SMichael Walsh    exec(cmd_buf)
241