|  | #!/usr/bin/env python | 
|  |  | 
|  | r""" | 
|  | This module contains file functions such as file_diff. | 
|  | """ | 
|  |  | 
|  | import time | 
|  | import os | 
|  | import re | 
|  | from gen_cmd import cmd_fnc_u | 
|  | robot_env = 1 | 
|  | try: | 
|  | from robot.libraries.BuiltIn import BuiltIn | 
|  | from robot.libraries import DateTime | 
|  | except ImportError: | 
|  | robot_env = 0 | 
|  |  | 
|  |  | 
|  | def file_diff(file1_path, | 
|  | file2_path, | 
|  | diff_file_path, | 
|  | skip_string): | 
|  | r""" | 
|  | Compare the contents of two text files.  The comparison uses the Unix | 
|  | 'diff' command.  Differences can be selectively ignored by use of | 
|  | the skip_string parameter.  The output of diff command is written | 
|  | to a user-specified file and is also written (logged) to the console. | 
|  |  | 
|  | Description of arguments: | 
|  | file1_path       File containing text data. | 
|  | file2_path       Text file to compare to file1. | 
|  | diff_file_path   Text file which will contain the diff output. | 
|  | skip_string      To allow for differences which may expected or immaterial, | 
|  | skip_string parameter is a word or a string of comma | 
|  | separated words which specify what should be ignored. | 
|  | For example, "size,speed".  Any line containing the word | 
|  | size or the word speed will be ignored when the diff is | 
|  | performed.  This parameter is optional. | 
|  |  | 
|  | Returns: | 
|  | 0 if both files contain the same information or they differ only in | 
|  | items specified by the skip_string. | 
|  | 2 if FILES_DO_NOT_MATCH. | 
|  | 3 if INPUT_FILE_DOES_NOT_EXIST. | 
|  | 4 if IO_EXCEPTION_READING_FILE. | 
|  | 5 if IO_EXCEPTION_WRITING_FILE. | 
|  | 6 if INPUT_FILE_MALFORMED | 
|  | """ | 
|  |  | 
|  | FILES_MATCH = 0 | 
|  | FILES_DO_NOT_MATCH = 2 | 
|  | INPUT_FILE_DOES_NOT_EXIST = 3 | 
|  | IO_EXCEPTION_READING_FILE = 4 | 
|  | IO_EXCEPTION_WRITING_FILE = 5 | 
|  | INPUT_FILE_MALFORMED = 6 | 
|  |  | 
|  | # The minimum size in bytes a file must be. | 
|  | min_file_byte_size = 1 | 
|  |  | 
|  | now = time.strftime("%Y-%m-%d %H:%M:%S") | 
|  |  | 
|  | if (not os.path.exists(file1_path) or (not os.path.exists(file2_path))): | 
|  | return INPUT_FILE_DOES_NOT_EXIST | 
|  | try: | 
|  | with open(file1_path, 'r') as file: | 
|  | initial = file.readlines() | 
|  | with open(file2_path, 'r') as file: | 
|  | final = file.readlines() | 
|  | except IOError: | 
|  | file.close() | 
|  | return IO_EXCEPTION_READING_FILE | 
|  | except ValueError: | 
|  | file.close() | 
|  | return INPUT_FILE_MALFORMED | 
|  | else: | 
|  | file.close() | 
|  |  | 
|  | # Must have more than a trivial number of bytes. | 
|  | if len(initial) < min_file_byte_size: | 
|  | return INPUT_FILE_MALFORMED | 
|  |  | 
|  | if (initial == final): | 
|  | try: | 
|  | file = open(diff_file_path, 'w') | 
|  | except IOError: | 
|  | file.close() | 
|  | line_to_print = "Specified skip (ignore) string = " + \ | 
|  | skip_string + "\n\n" | 
|  | file.write(line_to_print) | 
|  | line_to_print = now + " found no difference between file " + \ | 
|  | file1_path + " and " + \ | 
|  | file2_path + "\n" | 
|  | file.write(line_to_print) | 
|  | file.close() | 
|  | return FILES_MATCH | 
|  |  | 
|  | # Find the differences and write difference report to diff_file_path file | 
|  | try: | 
|  | file = open(diff_file_path, 'w') | 
|  | except IOError: | 
|  | file.close() | 
|  | return IO_EXCEPTION_WRITING_FILE | 
|  |  | 
|  | # Form a UNIX diff command and its parameters as a string.  For example, | 
|  | # if skip_string="size,capacity",  command = 'diff  -I "size" | 
|  | # -I "capacity"  file1_path file2_path'. | 
|  | skip_list = filter(None, re.split(r"[ ]*,[ ]*", skip_string)) | 
|  | ignore_string = ' '.join([("-I " + '"' + x + '"') for x in skip_list]) | 
|  | command = ' '.join(filter(None, ["diff", ignore_string, file1_path, | 
|  | file2_path])) | 
|  |  | 
|  | line_to_print = now + "   " + command + "\n" | 
|  | file.write(line_to_print) | 
|  |  | 
|  | # Run the command and get the differences | 
|  | rc, out_buf = cmd_fnc_u(command, quiet=0, print_output=0, show_err=0) | 
|  |  | 
|  | # Write the differences to the specified diff_file and console. | 
|  | if robot_env == 1: | 
|  | BuiltIn().log_to_console("DIFF:\n" + out_buf) | 
|  | else: | 
|  | print ("DIFF:\n", out_buf) | 
|  |  | 
|  | file.write(out_buf) | 
|  | file.close() | 
|  |  | 
|  | if rc == 0: | 
|  | # Any differences found were on the skip_string. | 
|  | return FILES_MATCH | 
|  | else: | 
|  | # We have at least one difference not in the skip_string. | 
|  | return FILES_DO_NOT_MATCH |