Ok Plamen, I looked at the functionality, made some fixes in
docstrings and such, and applied to next, thanks!

Lucas

On Fri, Sep 21, 2012 at 10:54 AM, Plamen Dimitrov
<[email protected]> wrote:
>
> Signed-off-by: Plamen Dimitrov <[email protected]>
> ---
>  .../shared/test_utils/config_change_validation.py  | 163 
> +++++++++++++++++++++
>  1 file changed, 163 insertions(+)
>  create mode 100644 client/shared/test_utils/config_change_validation.py
>
> diff --git a/client/shared/test_utils/config_change_validation.py 
> b/client/shared/test_utils/config_change_validation.py
> new file mode 100644
> index 0000000..997b2e3
> --- /dev/null
> +++ b/client/shared/test_utils/config_change_validation.py
> @@ -0,0 +1,163 @@
> +"""
> +Module for testing config file changes.
> +
> +@author: Kristof Katus and Plamen Dimitrov
> +@copyright: Intra2net AG 2012
> +@license: GPL v2
> +"""
> +
> +import os
> +import shutil
> +import commands
> +
> +
> +def get_temp_file_path(file_path):
> +    """ Generates a temporary filename """
> +    return file_path + '.tmp'
> +
> +
> +def make_temp_file_copies(file_paths):
> +    """ Creates temporary copies of the provided files """
> +    for file_path in file_paths:
> +        temp_file_path = get_temp_file_path(file_path)
> +        shutil.copyfile(file_path, temp_file_path)
> +
> +
> +def del_temp_file_copies(file_paths):
> +    """ Deletes all the provided files """
> +    for file_path in file_paths:
> +        temp_file_path = get_temp_file_path(file_path)
> +        os.remove(temp_file_path)
> +
> +
> +def parse_unified_diff_output(lines):
> +    """ Parses the unified diff output of two files
> +
> +    Returns a pair of adds and removes, where each is a list of trimmed lines
> +
> +    """
> +    adds = []
> +    removes = []
> +    for line in lines:
> +        # ignore filepaths in the output
> +        if (len(line) > 2 and
> +           (line[:3] == "+++" or
> +            line[:3] == "---")):
> +            continue
> +        # ignore line range information in the output
> +        elif len(line) > 1 and line[:2] == "@@":
> +            continue
> +        # gather adds
> +        elif len(line) > 0 and line[0] == "+":
> +            added_line = line[1:].lstrip().rstrip()
> +            if len(added_line) == 0:
> +                continue
> +            adds = adds + [added_line]
> +        # gather removes
> +        elif len(line) > 0 and line[0] == "-":
> +            removed_line = line[1:].lstrip().rstrip()
> +            if len(removed_line) == 0:
> +                continue
> +            removes = removes + [removed_line]
> +    return (adds, removes)
> +
> +
> +def extract_config_changes(file_paths, compared_file_paths = []):
> +    """ Extracts diff information based on the new and
> +        temporarily saved old config files
> +
> +        Returns a dictionary of file path and corresponding
> +        diff information key-value pairs.
> +    """
> +    changes = {}
> +
> +    #print file_paths, compared_file_paths
> +
> +    for i in range(len(file_paths)):
> +        temp_file_path = get_temp_file_path(file_paths[i])
> +
> +        if len(compared_file_paths) > i:
> +            command = ("diff -U 0 -b " + compared_file_paths[i]
> +                       + " " + file_paths[i])
> +        else:
> +            command = "diff -U 0 -b " + temp_file_path + " " + file_paths[i]
> +
> +        (_, output) = commands.getstatusoutput(command)
> +        lines = output.split('\n')
> +        changes[file_paths[i]] = parse_unified_diff_output(lines)
> +    return changes
> +
> +
> +def assert_config_change_dict(actual_result, expected_result):
> +    """ Calculates unexpected line changes.
> +
> +        The arguments actual_result and expected_results are of
> +        the same data structure type: Dict[file_path] --> (adds, removes),
> +        where adds = [added_line, ...] and removes = [removed_line, ...].
> +
> +        The return value has the following structure:
> +        Dict[file_path] --> (unexpected_adds,
> +                             not_present_adds,
> +                             unexpected_removes,
> +                             not_present_removes)
> +    """
> +    change_diffs = {}
> +    for file_path, actual_changes in actual_result.items():
> +        expected_changes = expected_result[file_path]
> +
> +        actual_adds = actual_changes[0]
> +        actual_removes = actual_changes[1]
> +        expected_adds = expected_changes[0]
> +        expected_removes = expected_changes[1]
> +
> +        # Additional unexpected adds -- they should have been not added
> +        unexpected_adds = sorted(set(actual_adds) - set(expected_adds))
> +        # Not present expected adds -- they should have been added
> +        not_present_adds = sorted(set(expected_adds) - set(actual_adds))
> +        # Additional unexpected removes - they should have been not removed
> +        unexpected_removes = sorted(set(actual_removes) - 
> set(expected_removes))
> +        # Not present expected removes - they should have been removed
> +        not_present_removes = sorted(set(expected_removes) -
> +                                     set(actual_removes))
> +
> +        change_diffs[file_path] = (unexpected_adds, not_present_adds,
> +                                   unexpected_removes, not_present_removes)
> +
> +    return change_diffs
> +
> +
> +def assert_config_change(actual_result, expected_result):
> +    """ Wrapper of the upper method returning boolean true if no config 
> changes
> +        were detected.
> +    """
> +    change_diffs = assert_config_change_dict(actual_result, expected_result)
> +    for file_change in change_diffs.values():
> +        for line_change in file_change:
> +            if len(line_change) != 0:
> +                return False
> +    return True
> +
> +
> +def print_change_diffs(change_diffs):
> +    """ Pretty prints the output of the evaluate_config_changes function """
> +    diff_strings = []
> +    for file_path, change_diff in change_diffs.items():
> +        if not (change_diff[0] or change_diff[1] or
> +                change_diff[2] or change_diff[3]):
> +            continue
> +        diff_strings.append("--- %s" % get_temp_file_path(file_path))
> +        diff_strings.append("+++ %s" % file_path)
> +        for iter_category in range(4):
> +            change_category = change_diff[iter_category]
> +            if iter_category == 0 and change_category:
> +                diff_strings.append("*++ Additional unexpected adds")
> +            elif iter_category == 1 and change_category:
> +                diff_strings.append("/++ Not present expected adds")
> +            elif iter_category == 2 and change_category:
> +                diff_strings.append( "*-- Additional unexpected removes")
> +            elif iter_category == 3 and change_category:
> +                diff_strings.append("/-- Not present expected removes")
> +            for line_change in change_category:
> +                diff_strings.append(str(line_change).encode("string-escape"))
> +    return "\n".join(diff_strings)
> +
> --
> 1.7.11.4
>
> _______________________________________________
> Autotest-kernel mailing list
> [email protected]
> https://www.redhat.com/mailman/listinfo/autotest-kernel



-- 
Lucas

_______________________________________________
Autotest-kernel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/autotest-kernel

Reply via email to