Module EDTestCasePluginExecute
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 __authors__ = [ "Marie-Francoise Incardona", "Olof Svensson", "Jérôme Kieffer" ]
31 __contact__ = "svensson@esrf.fr"
32 __license__ = "LGPLv3+"
33 __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
34 __date__ = "20120216"
35
36 import types
37
38 from EDVerbose import EDVerbose
39 from EDAssert import EDAssert
40 from EDUtilsPath import EDUtilsPath
41 from EDTestCasePlugin import EDTestCasePlugin
42 from EDFactoryPluginStatic import EDFactoryPluginStatic
43 from EDUtilsFile import EDUtilsFile
44 from EDUtilsParallel import EDUtilsParallel
45
47 """
48 This is the main class for all Plugin Execution tests
49 """
50
51 - def __init__(self, _strPluginName, _strPluginDir=None, _strTestName=None):
52 """
53 Initialise the Plugin Execution test
54 - Edna site
55 - Configuration files
56 - Data input file
57 - Plugin launcher
58 """
59 EDTestCasePlugin.__init__(self, _strPluginName, _strPluginDir, _strTestName)
60 self._strRefConfigFile = None
61 self._dictStrDataInputFiles = {}
62 self._strDefaultInputDataKey = "defaultInputData"
63 self._dictStrReferenceDataOutputFiles = {}
64 self._strDefaultOutputDataKey = "defaultOutputData"
65 self._iNoExpectedErrorMessages = 0
66 self._iNoExpectedWarningMessages = 0
67 self._bAcceptPluginFailure = False
68
69 self.m_edObtainedOutputDataFile = None
70 EDUtilsParallel.uninitializeNbThread()
71
72
74 """
75 Initialize the plugin to be launched
76 """
77 EDTestCasePlugin.preProcess(self)
78 if(EDUtilsPath.EDNA_SITE == None):
79 raise RuntimeError, "EDNA_SITE must be set"
80
81 self._edPlugin = EDFactoryPluginStatic.loadPlugin(self.getPluginName())
82 if(self._edPlugin is not None):
83 for strInputDataKey in self._dictStrDataInputFiles.keys():
84 if (type(self._dictStrDataInputFiles[ strInputDataKey ]) == types.ListType):
85 for strDataInputFile in self._dictStrDataInputFiles[ strInputDataKey ]:
86 strXMLData = self.readAndParseFile(strDataInputFile)
87 if (strInputDataKey == self._strDefaultInputDataKey):
88 self._edPlugin.setDataInput(strXMLData)
89 else:
90 self._edPlugin.setDataInput(strXMLData, strInputDataKey)
91 else:
92 strXMLData = self.readAndParseFile(self._dictStrDataInputFiles[ strInputDataKey ])
93 if (strInputDataKey == self._strDefaultInputDataKey):
94 self._edPlugin.setDataInput(strXMLData)
95 else:
96 self._edPlugin.setDataInput(strXMLData, strInputDataKey)
97
98 else:
99 EDVerbose.ERROR("Cannot load plugin: %s" % self.getPluginName())
100 raise RuntimeError
101 self._edPlugin.setConfig(self.getPluginConfig())
102
103
106
107
110
111
113 """
114 Returns the error messages for the plugin launcher
115 """
116 return self._edPlugin.getErrorMessages()
117 errorMessages = property(getErrorMessages, doc="read-only only property")
118
119
121 """
122 Returns the warning messages for the plugin launcher
123 """
124 return self._edPlugin.getWarningMessages()
125 warningMessages = property(getWarningMessages, doc="read-only only property")
126
127
129 """
130 Returns the reference configuration file (from edna/conf directory)
131 """
132 return self._strRefConfigFile
133
134
149
150
166
167
168
170 """
171 Sets the data input file
172 """
173 strDataOutputKey = _strDataOutputKey
174 if (strDataOutputKey is None):
175 strDataOutputKey = self._strDefaultOutputDataKey
176 if (strDataOutputKey == self._strDefaultOutputDataKey):
177
178 self._dictStrReferenceDataOutputFiles[ strDataOutputKey ] = _strReferenceDataOutputFile
179 else:
180 if (not strDataOutputKey in self._dictStrReferenceDataOutputFiles.keys()):
181 self._dictStrReferenceDataOutputFiles[ strDataOutputKey ] = []
182 self._dictStrReferenceDataOutputFiles[ strDataOutputKey ].append(_strReferenceDataOutputFile)
183
184
186 """
187 Returns the data input file
188 """
189 strReferenceDataOutputFile = None
190 strDataOutputKey = _strDataOutputKey
191 if (strDataOutputKey is None):
192 strDataOutputKey = self._strDefaultOutputDataKey
193 if (strDataOutputKey in self._dictStrReferenceDataOutputFiles.keys()):
194 strReferenceDataOutputFile = self._dictStrReferenceDataOutputFiles[ strDataOutputKey ]
195 else:
196 strErrorMessage = "ERROR: " + str(self.__class__) + ".getReferenceDataOutputFile, no data output file defined for key: " + strDataOutputKey
197 EDVerbose.error(strErrorMessage)
198 raise RuntimeError, strErrorMessage
199 return strReferenceDataOutputFile
200
201
207
208
210 """
211 Executes the plugin and checks that the data output is not None
212 """
213 EDVerbose.DEBUG("EDTestCasePluginExecute: Executing " + self.getPluginName())
214 self._edPlugin.executeSynchronous()
215
216 EDAssert.equal(self._bAcceptPluginFailure , self._edPlugin.isFailure(), \
217 "Plugin failure assert: should be %r, was %r" % (self._bAcceptPluginFailure , self._edPlugin.isFailure()))
218
219 EDAssert.equal(self._iNoExpectedErrorMessages, len(self._edPlugin.getListOfErrorMessages()), \
220 "Number of error messages: expected %d, got %d" % (self._iNoExpectedErrorMessages, len(self._edPlugin.getListOfErrorMessages())))
221
222 EDAssert.equal(self._iNoExpectedWarningMessages, len(self._edPlugin.getListOfWarningMessages()), \
223 "Number of warning messages: expected %d, got %d" % (self._iNoExpectedWarningMessages, len(self._edPlugin.getListOfWarningMessages())))
224
225 listOfDataOutputKeys = self._edPlugin.getListOfDataOutputKeys()
226 for strReferenceOutputDataKey in self._dictStrReferenceDataOutputFiles.keys():
227
228 if (strReferenceOutputDataKey in listOfDataOutputKeys):
229 EDVerbose.unitTest("Testing data output for %s" % strReferenceOutputDataKey)
230 listReferenceFile = self._dictStrReferenceDataOutputFiles[ strReferenceOutputDataKey ]
231 if (type(listReferenceFile) != types.ListType):
232 listReferenceFile = [ listReferenceFile ]
233 listReferenceOutput = []
234 for strReferenceFile in listReferenceFile:
235 listReferenceOutput.append(self.readAndParseFile(strReferenceFile))
236
237 listObtainedOutputXML = []
238 pyObjectObtainedDataOutput = self._edPlugin.getDataOutput(strReferenceOutputDataKey)
239 listObtainedOutput = None
240 if (type(pyObjectObtainedDataOutput) == types.ListType):
241 listObtainedOutput = pyObjectObtainedDataOutput
242 else:
243 listObtainedOutput = [ pyObjectObtainedDataOutput ]
244 for xsDataOutput in listObtainedOutput:
245 listObtainedOutputXML.append(xsDataOutput.marshal())
246
247 listReferenceOutput.sort()
248 listObtainedOutputXML.sort()
249 for iIndex in range(len(listReferenceOutput)):
250
251 if (strReferenceOutputDataKey == self._strDefaultOutputDataKey):
252 if (listReferenceOutput[ iIndex ] != listObtainedOutputXML[ iIndex ]):
253 EDVerbose.unitTest("WARNING! Expected output is not corresponding to obtained output.")
254 else:
255 EDAssert.equal(listReferenceOutput[ iIndex ], listObtainedOutputXML[ iIndex ])
256
257 if (strReferenceOutputDataKey == self._strDefaultOutputDataKey):
258 if (self.m_edObtainedOutputDataFile is None):
259 self.m_edObtainedOutputDataFile = self.getPluginName() + "_output.xml"
260 EDUtilsFile.writeFile(self.m_edObtainedOutputDataFile, self._edPlugin.getDataOutput().marshal())
261
262
264 self._iNoExpectedWarningMessages = _iNoExpectedWarningMessages
265
266
268 self._iNoExpectedErrorMessages = _iNoExpectedErrorMessages
269
270
272 self._bAcceptPluginFailure = _bValue
273