configurationengine/source/testautomation/testautomation/base_testcase.py
author m2lahtel
Tue, 10 Aug 2010 14:29:28 +0300
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
permissions -rw-r--r--
ConE 1.2.11 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     1
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     2
# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     3
# All rights reserved.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     4
# This component and the accompanying materials are made available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     6
# which accompanies this distribution, and is available
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     8
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
     9
# Initial Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    11
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    12
# Contributors:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    13
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    14
# Description: 
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    15
#
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    16
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    17
import sys, os, re, unittest, shutil, zipfile, filecmp, subprocess
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    18
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    19
class BaseTestCase(unittest.TestCase):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    20
    def set_modification_reference_time(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    21
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    22
        Set modification reference time for a subsequent call to assert_modified()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    23
        or assert_not_modified().
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    24
        @param path: The path to use, can be a file or a directory.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    25
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    26
        if not hasattr(self, '_mod_refs'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    27
            self._mod_refs = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    28
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    29
        if os.path.isdir(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    30
            self._mod_refs[path] = self._get_dir_modtime_dict(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    31
        elif os.path.isfile(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    32
            self._mod_refs[path] = os.stat(path).st_mtime
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    33
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    34
            self.fail("'%s' does not exist" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    35
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    36
    def assert_modified(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    37
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    38
        Assert that a given file or directory has been modified since the last
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    39
        call to set_modification_reference_time() with the same path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    40
        """
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    41
        # This fails on linux for some reason, probably because the modification
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    42
        # timestamps are not accurate enough
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    43
        if sys.platform == "win32":
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
    44
            self._assert_modification(path, assert_not_modified=False)
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    45
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    46
    def assert_not_modified(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    47
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    48
        Assert that a given file or directory has NOT been modified since the last
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    49
        call to set_modification_reference_time() with the same path.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    50
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    51
        self._assert_modification(path, assert_not_modified=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    52
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    53
    def remove_if_exists(self, path_or_paths):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    54
        """Remove files or directories if they exist.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    55
        @param path_or_paths: The path to remove. Can also be a list of paths."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    56
        if isinstance(path_or_paths, list):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    57
            paths = path_or_paths
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    58
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    59
            paths = [path_or_paths]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    60
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    61
        for path in paths:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    62
            if os.path.isdir(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    63
                shutil.rmtree(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    64
            elif os.path.isfile(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    65
                os.remove(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    66
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    67
    def create_dir(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    68
        """Create the given directory if it doesn't exist."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    69
        if not os.path.exists(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    70
            os.makedirs(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    71
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    72
    def recreate_dir(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    73
        """Remove the given directory if it exists, and recreate it."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    74
        if os.path.exists(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    75
            shutil.rmtree(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    76
        os.makedirs(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    77
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    78
    def create_dir_for_file_path(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    79
        """Create the directories for the given file"""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    80
        dir = os.path.dirname(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    81
        if dir != '' and not os.path.exists(dir):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    82
            os.makedirs(dir)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    83
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    84
    def assert_exists_and_contains_something(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    85
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    86
        Assert that the given path is a file or a directory and contains some data.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    87
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    88
        if os.path.isdir(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    89
            if len(os.listdir(path)) == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    90
                self.fail("Path '%s' exists (is a directory) but does not contain anything)" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    91
        elif os.path.isfile(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    92
            if os.stat(path).st_size == 0:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    93
                self.fail("Path '%s' exists (is a file) but does not contain anything)" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    94
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    95
            self.fail("Path '%s' does not exist" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    96
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    97
    def assert_dir_contents_equal(self, dir1, dir2, ignore=[], custom_comparison_functions={}, current_root_dir=''):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    98
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
    99
        Assert recursively that the contents of two directories are equal.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   100
        @param ignore: List containing names that should be ignored in the comparison (e.g. '.svn').
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   101
            The entries can either be relative, e.g. 'file.txt', which would ignore 'file.txt'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   102
            in any directory, or they can be absolute, e.g. '/some/dir/file.txt', which would
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   103
            ignore 'file.txt' only under 'some/dir/', relative to the comparison root.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   104
        @param custom_comparison_functions: Dictionary containing custom comparison functions
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   105
            for files. Each entry in the dict should contain the following contents:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   106
                Key: The relative path of the file under the directories, e.g.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   107
                    'some/path/file.txt'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   108
                Value: The function used to compare the file contents. The function should
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   109
                    take as parameters the raw binary data of the files, and should return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   110
                    True if the contents are equal.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   111
        @param current_root_dir: For internal use.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   112
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   113
        msg = "Directory contents are not equal ('%s' vs. '%s')\n" % (dir1, dir2)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   114
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   115
        ignore_list = []
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   116
        for entry in ignore:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   117
            if entry.startswith('/'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   118
                dirname, entryname = entry.rsplit('/', 1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   119
                dirname = dirname.lstrip('/')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   120
                #print "dirname = %r" % dirname
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   121
                #print "entryname = %r" % entryname
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   122
                #print "current_root_dir = %r" % current_root_dir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   123
                if dirname == current_root_dir.rstrip('/'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   124
                    ignore_list.append(entryname)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   125
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   126
                ignore_list.append(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   127
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   128
        # Compare files with the custom comparison functions if necessary
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   129
        for path, func in custom_comparison_functions.iteritems():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   130
            dirname  = os.path.dirname(path).replace('\\', '/')
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   131
            filename = os.path.basename(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   132
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   133
            filepath1 = os.path.join(dir1, filename)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   134
            filepath2 = os.path.join(dir2, filename)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   135
            
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   136
            # Compare if the file is in the current path and they both exist
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   137
            if dirname == current_root_dir and \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   138
                os.path.isfile(filepath1) and \
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   139
                os.path.isfile(filepath2):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   140
                comp_result = func(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   141
                    self.read_data_from_file(filepath1),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   142
                    self.read_data_from_file(filepath2))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   143
                if not comp_result:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   144
                    # The files are not equal -> fail
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   145
                    self.fail(msg + "File '%s' differs" % filename)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   146
                else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   147
                    # The files are equal -> ignore from dircmp comparison
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   148
                    ignore_list.append(filename)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   149
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   150
        dcmp = filecmp.dircmp(dir1, dir2, ignore=ignore_list)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   151
        self.assertEquals(0, len(dcmp.left_only), msg + "Files only on left: %s" % dcmp.left_only)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   152
        self.assertEquals(0, len(dcmp.right_only), msg + "Files only on right: %s" % dcmp.right_only)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   153
        self.assertEquals(0, len(dcmp.diff_files), msg + "Differing files: %s" % dcmp.diff_files)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   154
        self.assertEquals(0, len(dcmp.funny_files), msg + "Funny files: %s" % dcmp.funny_files)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   155
        # Recurse into sub-directories
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   156
        for d in dcmp.common_dirs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   157
            if current_root_dir:    cr = current_root_dir + '/' + d
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   158
            else:                   cr = d
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   159
            self.assert_dir_contents_equal(
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   160
                os.path.join(dir1, d), os.path.join(dir2, d),
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   161
                ignore, custom_comparison_functions, cr)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   162
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   163
    def assert_file_contents_equal(self, file1, file2, ignore_patterns=[], ignore_endline_style=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   164
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   165
        Assert the the given two files exist and their contents are equal.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   166
        @param ignore_patterns: List of regular expressions for portions of the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   167
            file content to ignore in the comparison. The ignored parts are
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   168
            deleted from the files before actual comparison.
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   169
        @param ignore_endline_style: If True, the endline style (CRLF or LF) is
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   170
            ignored during the comparison.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   171
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   172
        self.assertTrue(os.path.exists(file1), "File '%s' does not exist!" % file1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   173
        self.assertTrue(os.path.exists(file2), "File '%s' does not exist!" % file2)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   174
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   175
        data1 = self.read_data_from_file(file1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   176
        data2 = self.read_data_from_file(file2)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   177
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   178
        def remove_ignored(data, pattern_list):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   179
            for i, pattern in enumerate(pattern_list):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   180
                data = re.sub(pattern, '{{{ignore_%d}}}' % i, data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   181
            return data
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   182
        data1 = remove_ignored(data1, ignore_patterns)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   183
        data2 = remove_ignored(data2, ignore_patterns)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   184
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   185
        if ignore_endline_style:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   186
            data1 = data1.replace('\r\n', '\n')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   187
            data2 = data2.replace('\r\n', '\n')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   188
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   189
        import difflib
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   190
        difseq = difflib.ndiff(data1, data2)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   191
        # take only the first ten rows of the difference
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   192
        difference = ''.join(list(difseq)[:10])
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   193
        if data1 != data2:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   194
            if len(ignore_patterns) > 0:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   195
                self.write_data_to_file(file1 + '.diff', ''.join(difseq))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   196
                self.write_data_to_file(file1 + '.comparetemp', data1)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   197
                self.write_data_to_file(file2 + '.comparetemp', data2)
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   198
                self.fail("Data of the files '%s' and '%s' are not equal\nSee *.comparetemp files for the actual data that was compared.\nDifference %s" % (file1, file2, difference))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   199
            else:
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   200
                self.fail("Data of the files '%s' and '%s' are not equal\nDifference %s" % (file1, file2, difference))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   201
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   202
    def assert_file_content_equals(self, filepath, expected_data, ignore_endline_style=False):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   203
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   204
        Assert that the content of the given file is equals to the given expected data.
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   205
        @param ignore_endline_style: If True, the endline style (CRLF or LF) is
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   206
            ignored during the comparison.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   207
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   208
        self.assertTrue(os.path.exists(filepath), "'%s' does not exist!" % filepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   209
        self.assertTrue(os.path.isfile(filepath), "'%s' is not a file!" % filepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   210
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   211
        f = open(filepath, "rb")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   212
        try:        filedata = f.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   213
        finally:    f.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   214
        
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   215
        if ignore_endline_style:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   216
            filedata = filedata.replace('\r\n', '\n')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   217
            expected_data = expected_data.replace('\r\n', '\n')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   218
        
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   219
        if filedata != expected_data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   220
            msg = ("The content of the file '%s' is not what was expected!\n" % filepath) +\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   221
                  ("Expected: %r\nActual: %r" % (expected_data, filedata))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   222
            self.fail(msg)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   223
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   224
    def assert_file_contains(self, filepath, data, encoding=None, regexes=[]):
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   225
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   226
        Assert that the given file contains the given text somewhere in its contents.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   227
        @param filepath: Path to the file to check.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   228
        @param data: The data the file is expected to contain.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   229
        @param encoding: Encoding used to decode the contents of the file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   230
            If None, noe decoding is done.
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   231
        @param regexes: A list of regular expressions that are used to search for
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   232
            a match in the file data. If any of them doesn't find a match,
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   233
            the assertion fails.
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   234
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   235
        self.assertTrue(os.path.exists(filepath), "'%s' does not exist!" % filepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   236
        self.assertTrue(os.path.isfile(filepath), "'%s' is not a file!" % filepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   237
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   238
        f = open(filepath, "rb")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   239
        try:        filedata = f.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   240
        finally:    f.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   241
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   242
        if encoding is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   243
            filedata = filedata.decode(encoding)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   244
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   245
        if not isinstance(data, list):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   246
            data = [data]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   247
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   248
        for entry in data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   249
            if not filedata.find(entry) != -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   250
                self.fail("The file '%s' does not contain the data '%s'" % (filepath, entry))
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   251
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   252
        for regex in regexes:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   253
            if re.search(regex, filedata, re.MULTILINE) is None:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   254
                self.fail("The regex %r does not match anything in file '%s'" % (regex, filepath))
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   255
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   256
    def assert_file_does_not_contain(self, filepath, data, encoding=None):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   257
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   258
        Assert that the given file doesn't contain the given text somewhere in its contents.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   259
        @param filepath: Path to the file to check.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   260
        @param data: The data the file is expected to not contain.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   261
        @param encoding: Encoding used to decode the contents of the file.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   262
            If None, noe decoding is done.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   263
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   264
        self.assertTrue(os.path.exists(filepath), "'%s' does not exist!" % filepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   265
        self.assertTrue(os.path.isfile(filepath), "'%s' is not a file!" % filepath)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   266
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   267
        f = open(filepath, "rb")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   268
        try:        filedata = f.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   269
        finally:    f.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   270
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   271
        if encoding is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   272
            filedata = filedata.decode(encoding)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   273
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   274
        if not isinstance(data, list):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   275
            data = [data]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   276
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   277
        for entry in data:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   278
            if not filedata.find(entry) == -1:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   279
                self.fail("The file '%s' contains the data '%s'" % (filepath, entry))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   280
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   281
    def read_data_from_file(self, path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   282
        """Read the raw binary data from the given file."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   283
        f = open(path, "rb")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   284
        try:        return f.read()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   285
        finally:    f.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   286
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   287
    def read_data_from_zip_file(self, path, entry):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   288
        """Read the raw binary data from the given ZIP file with the given ZIP entry."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   289
        zf = zipfile.ZipFile(path, "r")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   290
        try:        return zf.read(entry)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   291
        finally:    zf.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   292
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   293
    def write_data_to_file(self, path, data):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   294
        """Write raw binary data into the given file."""
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   295
        f = open(path, "wb")
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   296
        try:        f.write(data)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   297
        finally:    f.close()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   298
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   299
    def run_command(self, command, expected_return_code=0):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   300
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   301
        Run the given command, asserting that it returns the expected value.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   302
        @param command: The command to run.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   303
        @param expected_return_code: The expected return code. Can be None if the return
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   304
            code doesn't matter.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   305
        @return: The command output.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   306
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   307
        # Using shell=True on windows uses
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   308
        #    cmd.exe /c <command>
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   309
        # to run the actual command, and if cmd.exe sees that the first
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   310
        # character in the command is ", it strips that and a trailing ".
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   311
        # For this reason we add quotes to the command to prevent e.g.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   312
        #   "C:\some\command.cmd" --some-arg "xyz"
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   313
        # from becoming
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   314
        #   C:\some\command.cmd" --some-arg "xyz
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   315
        if sys.platform == 'win32' and command.startswith('"'):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   316
            command = '"' + command + '"'
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   317
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   318
        p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   319
        out, err = p.communicate()
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   320
        if expected_return_code is not None:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   321
            self.assertTrue(p.returncode == expected_return_code,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   322
                            "Could not execute command (%s)\n"\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   323
                            "Return code is not what was expected (expected %d, got %d)\n"\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   324
                            "Output: \n%s" % (command, expected_return_code, p.returncode, out))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   325
        return out
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   326
    
3
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   327
    def assert_problem_lists_equal(self, actual, expected, outdir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   328
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   329
        Assert that two lists of api.Problem objects are equal.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   330
        @param actual: The list of actual problems.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   331
        @param expected: The list of expected problems.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   332
        @param outdir: The directory where output is written if the assertion
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   333
            fails.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   334
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   335
        act = sorted([repr(p) for p in actual])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   336
        exp = sorted([repr(p) for p in expected])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   337
        if act != exp:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   338
            if not os.path.exists(outdir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   339
                os.makedirs(outdir)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   340
            self.write_data_to_file(os.path.join(outdir, 'actual.txt'), os.linesep.join(act))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   341
            self.write_data_to_file(os.path.join(outdir, 'expected.txt'), os.linesep.join(exp))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   342
            self.fail("Problem lists not equal, see the files in '%s'" % outdir)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   343
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   344
    def assert_problem_list_equals_expected(self, actual, expected_file, outdir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   345
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   346
        Assert that the given list of api.Problem objects is equal to the
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   347
        list specified in the given file.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   348
        @param actual: The list of actual problems.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   349
        @param expected_file: Path to the file containing the list of
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   350
            expected problems. The file should contain the repr() output
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   351
            for an api.Problem object on each line.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   352
        @param outdir: The directory where output is written if the assertion
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   353
            fails.
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   354
        """
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   355
        act = sorted([repr(p) for p in actual])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   356
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   357
        if not os.path.isfile(expected_file):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   358
            raise RuntimeError("Expected problem file '%s' does not exist or is not a file!" % expected_file)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   359
        f = open(expected_file, 'r')
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   360
        try:        exp = sorted([line.rstrip('\r\n') for line in f])
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   361
        finally:    f.close()
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   362
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   363
        # Delete lines starting with #
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   364
        for i in reversed(range(len(exp))):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   365
            if exp[i].startswith('#'):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   366
                del exp[i]
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   367
        
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   368
        if act != exp:
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   369
            if not os.path.exists(outdir):
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   370
                os.makedirs(outdir)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   371
            self.write_data_to_file(os.path.join(outdir, 'actual.txt'), os.linesep.join(act))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   372
            self.write_data_to_file(os.path.join(outdir, 'expected.txt'), os.linesep.join(exp))
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   373
            self.fail("Problem list is not what was expected, see the files in '%s'" % outdir)
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   374
    
e7e0ae78773e ConE 1.2.11 release
m2lahtel
parents: 0
diff changeset
   375
    
0
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   376
    # =====================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   377
    # Private helper methods
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   378
    # =====================================================
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   379
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   380
    def _get_dir_modtime_dict(self, dir_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   381
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   382
        Return a dictionary of all files and directories and their last
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   383
        modification times in a given directory.
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   384
        """
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   385
        refdict = {}
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   386
        for root, dirs, files in os.walk(dir_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   387
            for f in files:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   388
                path = os.path.join(root, f)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   389
                refdict[path] = os.stat(path).st_mtime
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   390
            for d in dirs:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   391
                path = os.path.join(root, d)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   392
                refdict[path] = os.stat(path).st_mtime
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   393
        return refdict
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   394
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   395
    def _assert_modification(self, path, assert_not_modified=True):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   396
        if os.path.isdir(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   397
            if assert_not_modified:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   398
                self._assert_dir_not_modified(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   399
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   400
                self.assert_dir_modified(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   401
        elif os.path.isfile(path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   402
            if assert_not_modified:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   403
                self._assert_file_not_modified(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   404
            else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   405
                self._assert_file_modified(path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   406
        else:
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   407
            self.fail("'%s' does not exist" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   408
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   409
    def _assert_dir_not_modified(self, dir_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   410
        refdict = self._mod_refs[dir_path]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   411
        curdict = self._get_dir_modtime_dict(dir_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   412
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   413
        # If the keys of the dicts are not the same, the contents of the
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   414
        # dir have been modified (added or removed files/subdirs)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   415
        self.assertEquals(curdict.keys(), refdict.keys())
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   416
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   417
        # Compare manually so that assertion error output shows the specific file/dir
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   418
        for path in curdict.iterkeys():
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   419
            self.assertEquals(curdict[path], refdict[path], "File or dir '%s' modified" % path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   420
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   421
    def assert_dir_modified(self, dir_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   422
        refdict = self._mod_refs[dir_path]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   423
        curdict = self._get_dir_modtime_dict(dir_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   424
        
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   425
        self.assertNotEqual(curdict, refdict, "Directory '%s' has not been modified when it was expected to be" % dir_path)
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   426
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   427
    def _assert_file_not_modified(self, file_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   428
        time1 = self._mod_refs[file_path]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   429
        time2 = os.stat(file_path).st_mtime
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   430
        self.assertEquals(time1, time2,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   431
            ("File '%s' was modified when it should not have been "+\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   432
            "(mod time %f vs. %f)") % (file_path, time1, time2))
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   433
    
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   434
    def _assert_file_modified(self, file_path):
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   435
        time1 = self._mod_refs[file_path]
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   436
        time2 = os.stat(file_path).st_mtime
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   437
        self.assertNotEqual(time1, time2,
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   438
            ("File '%s' was modified not when it should have been "+\
2e8eeb919028 Adding EPL version of configurationengine.
terytkon
parents:
diff changeset
   439
            "(mod time %f vs. %f)") % (file_path, time1, time2))