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
