Salome HOME
Add the test command first version
[tools/sat.git] / src / test / TOOLS.py
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3
4 # ToolBox for test framework
5
6 import os
7 import string
8 import subprocess
9
10 """
11 Exception class for test errors.
12 """
13 class SatTestError(Exception):
14     def __init__(self, value):
15         self.value = value
16     def __str__(self):
17         return repr(self.value)
18
19 class SatNotApplicableError(Exception):
20     def __init__(self, value):
21         self.value = value
22     def __str__(self):
23         return repr(self.value)
24
25 def ERROR(message):
26     print message
27     raise SatTestError(message)
28     
29 def NOT_APPLICABLE(message):
30     print message
31     raise SatNotApplicableError(message)
32
33 ##
34 # Compares 2 numbers with tolerance tol.
35 def compFloat(f1, f2, tol=10e-10):
36     diff = abs(f1 - f2)
37     print "|f1-f2| = %s (tol=%s)" % (str(diff), str(tol))
38     if diff <= tol:
39         comp = "OK"
40     else:
41         comp = "KO"
42     return comp
43
44 ##
45 # Compares 2 files.
46 def compFiles(f1, f2, tol=0):
47     assert os.path.exists(f1), "compFiles: file not found: %s" % f1
48     assert os.path.exists(f2), "compFiles: file not found: %s" % f2
49     diffLine = os.popen("diff -y --suppress-common-lines %s %s" % (f1, f2))
50     diff = len(string.split(diffLine.read(), "\n"))
51     diffLine.close()
52     print "nb of diff lines = %s (tol=%s)" % (str(diff), str(tol))
53     if diff <= tol:
54         comp = "OK"
55     else:
56         comp = "KO"
57     return comp
58
59 ##
60 # Uses mdump to dump a med file.
61 def mdump_med(med_file, dump_file, options):
62     assert isinstance(options, list), "Bad options for mdump: %s" % options
63     assert len(options) == 3, "Bad options for mdump: %s" % options
64     cmd = "mdump %s %s" % (med_file, " ".join(options))
65     #print cmd
66
67     df = open(dump_file, "w")
68     pdump = subprocess.Popen(cmd, shell=True, stdout=df)
69     st = pdump.wait()
70     df.close()
71
72     return st
73
74 ##
75 # Compares 2 med files by using mdump.
76 def compMED(file1, file2, tol=0, diff_flags=""):
77     assert os.path.exists(file1), "compMED: file not found: %s" % file1
78     assert os.path.exists(file2), "compMED: file not found: %s" % file2
79     
80     print
81     print ">>>> compMED"
82     print " file1:", file1
83     print " file2:", file2
84     
85     def do_dump(med):
86         dump = os.path.join(os.environ['TT_TMP_RESULT'], os.path.basename(med) + ".mdump")
87         st = mdump_med(med, dump, ["1", "NODALE", "FULL_INTERLACE"])
88         if st != 0 or not os.path.exists(dump):
89             raise Exception("Error mpdump %s" % med)
90
91         # replace file name with "filename"
92         lines = open(dump, "r").readlines()
93         dumpfile = open(dump, "w")
94         for line in lines:
95             try:
96                 line.index('Nom universel du maillage')
97                 continue
98             except:
99                 dumpfile.write(line.replace(med, 'filename'))
100         return dump
101
102     dump1 = do_dump(file1)
103     dump2 = do_dump(file2)
104
105     diff_cmd = "diff %s %s %s" % (diff_flags, dump1, dump2)
106     print " >" + diff_cmd
107     pdiff = subprocess.Popen(diff_cmd, shell=True, stdout=subprocess.PIPE)
108     status = pdiff.wait()
109     print " Diff =", status
110     if status != 0:
111         print pdiff.stdout.read()
112
113     print "<<<< compMED"
114     print
115
116     return status
117
118
119 class TOOLS_class:
120     def __init__(self, base_ressources_dir, tmp_dir, test_ressources_dir):
121         self.base_ressources_dir = base_ressources_dir
122         self.tmp_dir = tmp_dir
123         self.test_ressources_dir = test_ressources_dir
124         pass
125
126     def init(self):
127         self.inFiles = []
128
129     def ERROR(self, message):
130         # Simulation d'un plantage
131         ERROR(message)
132
133     def compMED(self, file1, file2, tol=0):
134         return compMED(file1, file2, tol, "--ignore-all-space")
135
136     def compFloat(self, f1, f2, tol=10e-10):
137         return compFloat(f1, f2, tol)
138
139     def compFiles(self, f1, f2, tol=0):
140         return compFiles(f1, f2, tol)
141
142     def get_inFile(self, name=None):
143         if not name:
144             return self.base_ressources_dir
145         self.inFiles.append(name)
146         return os.path.join(self.base_ressources_dir, name)
147
148     def get_outFile(self, name=None):
149         if not name:
150             return self.tmp_dir
151         return os.path.join(self.tmp_dir, name)
152
153     def writeInFiles(self, pylog):
154         pylog.write('inFiles=%s\n' % str(self.inFiles))
155