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

Reply via email to