blob: b98c68bae589db4dd3c1d8dad386d30cdc4a220a [file] [log] [blame]
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +00001#/usr/bin/env python
2'''
adminbae64d82013-08-01 10:50:15 -07003Created on 20-Dec-2012
Jeremy Songsterae01bba2016-07-11 15:39:17 -07004Modified 2015 by ON.Lab
Jon Hall4ba53f02015-07-29 13:07:41 -07005
Jeremy Songsterae01bba2016-07-11 15:39:17 -07006Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
7the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
8or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
adminbae64d82013-08-01 10:50:15 -07009
10 TestON is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 2 of the License, or
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000013 (at your option) any later version.
adminbae64d82013-08-01 10:50:15 -070014
15 TestON is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
Jon Hall4ba53f02015-07-29 13:07:41 -070021 along with TestON. If not, see <http://www.gnu.org/licenses/>.
adminbae64d82013-08-01 10:50:15 -070022
23
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000024'''
adminbae64d82013-08-01 10:50:15 -070025import re
26import inspect
27
28
29class OpenSpeak:
30
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000031 def __init__(self):
adminbae64d82013-08-01 10:50:15 -070032 self.default = ''
Jon Hall4ba53f02015-07-29 13:07:41 -070033 self.flag = 0
adminbae64d82013-08-01 10:50:15 -070034 self.CurrentStep = 0
35 self.grtrOrLssr = 0
36
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000037 def compiler(self,**compileParameters):
38 '''
Jon Hall4ba53f02015-07-29 13:07:41 -070039 This method will parse the openspeak file and will write to a python module with the equivalent translations.
40 It can accept OpenSpeak syntax in string or an OpenSpeak file as an input parameter.
adminbae64d82013-08-01 10:50:15 -070041 Translated form can be written into python module if attribute "WRITETOFILE" is set to 1.
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000042 '''
43
44 args = self.parse_args(["OPENSPEAKFILE","TEXT","WRITETOFILE","FILEHANDLE"],**compileParameters)
adminbae64d82013-08-01 10:50:15 -070045 resultString = ''
46 Test = "Mininet"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000047 args["WRITETOFILE"] = args["WRITETOFILE"] if args["WRITETOFILE"] != None else 1
adminbae64d82013-08-01 10:50:15 -070048 self.CurrentStep = 0
49 self.CurrentCase = ''
Jon Hall4ba53f02015-07-29 13:07:41 -070050
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000051 ## here Open Speak file will be parsed by each line and translated.
52 if args["OPENSPEAKFILE"] !=None and args["TEXT"] ==None and args["FILEHANDLE"] == None:
53 self.openspeakfile = args["OPENSPEAKFILE"]
54 openSpeakFile = open(args["OPENSPEAKFILE"],"r").readlines()
Jon Hall4ba53f02015-07-29 13:07:41 -070055
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000056 elif args["OPENSPEAKFILE"] ==None and args["TEXT"] and args["FILEHANDLE"] == None:
57 openSpeakFile = args["TEXT"].split("\n")
58 elif args["FILEHANDLE"] and args["OPENSPEAKFILE"] ==None and args["TEXT"] ==None:
59 openSpeakFile = args["FILEHANDLE"].readlines()
Jon Hall4ba53f02015-07-29 13:07:41 -070060
adminbae64d82013-08-01 10:50:15 -070061 index = 0
62 outputFile = []
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000063 testName = re.search("\/(.*)\.ospk$",self.openspeakfile,0)
64 testName = testName.group(1)
65 testName = testName.split("/")
66 testName = testName[len(testName)-1]
67 outputFile.append("\nclass " + testName + " :" + "\n")
68 outputFile.append("\n" + " " * 4 + "def __init__(self) :")
69 outputFile.append("\n" + " " * 8 + "self.default = \'\'" + "\n")
Jon Hall4ba53f02015-07-29 13:07:41 -070070
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000071 while index < len(openSpeakFile):
72 ifelseMatch = re.match("\s+IF|\s+ELSE|\s+ELIF",openSpeakFile[index],flags=0)
73 line = openSpeakFile[index]
74 repeatMatch = re.match("\s*REPEAT", openSpeakFile[index], flags=0)
75 if ifelseMatch :
76 result = self.verify_and_translate(line)
77 initialSpaces = len(line) -len(line.lstrip())
Jon Hall4ba53f02015-07-29 13:07:41 -070078 self.outLoopSpace = initialSpaces
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000079 nextLine = openSpeakFile[index+1]
80 nextinitialSpaces = len(nextLine) -len(nextLine.lstrip())
Jon Hall4ba53f02015-07-29 13:07:41 -070081
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000082
83 while nextinitialSpaces > initialSpaces :
84 try :
85 elseMatch = re.match("\s*ELSE|\s*ELIF",nextLine,flags=0)
86 if elseMatch :
87 self.flag = self.flag -1
88 result = result + self.verify_and_translate(nextLine)
89 nextLine = openSpeakFile[index + 1]
90 nextinitialSpaces = len(nextLine) -len(nextLine.lstrip())
adminbae64d82013-08-01 10:50:15 -070091 except IndexError:
Jon Hall4ba53f02015-07-29 13:07:41 -070092 pass
adminbae64d82013-08-01 10:50:15 -070093 index = index + 1
Jon Hall4ba53f02015-07-29 13:07:41 -070094 self.flag = 0
adminbae64d82013-08-01 10:50:15 -070095 elif repeatMatch:
96 self.flag = 0
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000097 result = self.verify_and_translate(line)
adminbae64d82013-08-01 10:50:15 -070098 index = index + 1
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +000099 endMatch = re.match("\s*END",openSpeakFile[index],flags=0)
100 while not endMatch :
101 try :
Jon Hall4ba53f02015-07-29 13:07:41 -0700102
adminbae64d82013-08-01 10:50:15 -0700103 self.flag = self.flag + 1
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000104 result = result + self.verify_and_translate(openSpeakFile[index])
adminbae64d82013-08-01 10:50:15 -0700105 index = index + 1
Jon Hall4ba53f02015-07-29 13:07:41 -0700106
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000107 except IndexError :
adminbae64d82013-08-01 10:50:15 -0700108 pass
Jon Hall4ba53f02015-07-29 13:07:41 -0700109
adminbae64d82013-08-01 10:50:15 -0700110
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000111 else :
112 self.flag = 0
113 result = self.verify_and_translate(line)
114 index = index + 1
115 outputFile.append(result)
116
117 if args["WRITETOFILE"] == 1 :
118 testscript = re.sub("ospk","py",self.openspeakfile,0)
119 testScript = open(testscript,"w")
120 for lines in outputFile :
121 testScript.write(lines)
adminbae64d82013-08-01 10:50:15 -0700122 testScript.close()
123 return resultString
Jon Hall4ba53f02015-07-29 13:07:41 -0700124
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000125 def verify_and_translate(self,line):
126 '''
adminbae64d82013-08-01 10:50:15 -0700127 It will accept the each line and calls the suitable API to conver into pyton equivalent syntax .
Jon Hall4ba53f02015-07-29 13:07:41 -0700128 It will return the translated python syntax .
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000129 '''
130 lineSpace = re.match("^\s+",line,flags=0)
131 initialSpaces = len(line) -len(line.lstrip())
132 line = re.sub("^\s+","",line) if lineSpace else line
133
Jon Hall4ba53f02015-07-29 13:07:41 -0700134
adminbae64d82013-08-01 10:50:15 -0700135 resultString = None
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000136 resultString = "\n" + " " * 4 if str(inspect.stack()[1][3]) == "compiler" else "\n"
137 indent = " " *(4 + 4 * self.flag) if self.flag > 0 else " " * 4
138 caseMatch = re.search("^CASE\s+(\d+)",line,flags=0)
139 nameMatch = re.match("^NAME\s+\"(.*)\"",line,flags=0)
140 commentMatch = re.match("^COMMENT\s+\"(.*)\"",line,flags=0)
141 stepMatch = re.match("^STEP\s+\"(.*)\"",line,flags=0)
142 connectMatch = re.match("^CONNECT\s+(\w+)\s+USING\s+(.*)",line,flags=0)
143 disconnectMatch = re.match("^DISCONNECT\s+(.*)",line,flags=0)
144 ondoMatch = re.match("^ON\s+(.*)\s+DO\s+(.*)",line,flags=0)
Jon Hall4ba53f02015-07-29 13:07:41 -0700145
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000146 storeMatch = re.match("^STORE\s+(.*)\s+IN\s+(.*)",line,flags=0)
147 variableMatch = re.match("^(.*)\s+=\s+(.*)",line,flags=0)
148 assertMatch = re.match("^ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)",line,flags=0)
149 logMatch = re.match("^(ERROR|INFO|DEBUG|CRITICAL|REPORT|EXACT|WARN)\s+(.*)",line,flags=0)
150 ifloop = re.match("IF\s+(\w+)\s*(..|\w+)\s*(.*)",line,flags=0)
151 elseloopMatch = re.match("ELSE\s*$",line,flags=0)
152 elifloop = re.match("ELSE\sIF\s+(\w+)\s*(..|\w+)\s*(.*)",line,flags=0)
153 forloopMatch = re.match("\s*REPEAT\s+(/d+)\s+TIMES",line,flags=0)
154 experimentalMatch = re.match("EXPERIMENTAL\s+MODE\s+(\w+)",line,flags=0)
155 repeatMatch = re.match("\s*REPEAT\s+(\d+)\s+TIMES", line, flags=0)
Jon Hall4ba53f02015-07-29 13:07:41 -0700156
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000157 response_pasrse = re.match("\s*PARSE\s+(\w+)\s+AS\s+(\w+)\s+INTO\s+(\w+)", line, flags=0)
Jon Hall4ba53f02015-07-29 13:07:41 -0700158
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000159 if caseMatch :
adminbae64d82013-08-01 10:50:15 -0700160 self.CurrentStep = 0
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000161 self.CurrentCase = "CASE" + caseMatch.group(1)
162 resultString = resultString + self.translate_case_block(casenumber=caseMatch.group(1))
adminbae64d82013-08-01 10:50:15 -0700163 elif repeatMatch:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000164 resultString = resultString + indent + self.translate_repeat(repeat=repeatMatch.group(1))
165 elif nameMatch :
166 resultString = resultString + indent + self.translate_testcase_name(testname=nameMatch.group(1))
167 elif commentMatch :
168 resultString = resultString + indent + self.translate_comment(comment=commentMatch.group(1))
169 elif stepMatch :
adminbae64d82013-08-01 10:50:15 -0700170 self.CurrentStep = self.CurrentStep + 1
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000171 resultString = resultString + indent + self.translate_step(step=stepMatch.group(1))
172 elif connectMatch :
173 resultString = resultString + indent + self.translate_connect(component=connectMatch.group(1),
174 arguments=connectMatch.group(2) )
175 elif disconnectMatch :
176 resultString = resultString + indent + self.translate_disconnect(component=disconnectMatch.group(1))
177 elif ondoMatch :
178 resultString = resultString + indent + self.translate_onDOAs(component=ondoMatch.group(1),action=ondoMatch.group(2))
179 elif storeMatch :
180 resultString = resultString + indent + self.translate_store(variable=storeMatch.group(2),
181 value=storeMatch.group(1))
182 elif variableMatch :
183 resultString = resultString + indent + self.translate_store(variable=variableMatch.group(1),
184 value=variableMatch.group(2))
185 elif assertMatch :
186 resultString = resultString + indent + self.translate_assertion(leftvalue=assertMatch.group(1),
187 operator=assertMatch.group(2),
188 rightvalue=assertMatch.group(3),
189 onpass=assertMatch.group(4),
190 onfail=assertMatch.group(5))
191 elif logMatch :
192 resultString = resultString + indent + self.translate_logs(loglevel=logMatch.group(1),
193 message=logMatch.group(2))
194 elif ifloop :
Jon Hall4ba53f02015-07-29 13:07:41 -0700195
196 self.initSpace = initialSpaces
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000197 operand = ifloop.group(1)
198 operator = ifloop.group(2)
199 value = ifloop.group(3)
200 resultString = resultString + indent + "if " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":"
Jon Hall4ba53f02015-07-29 13:07:41 -0700201 self.flag = self.flag + 1
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000202 elif experimentalMatch :
203 resultString = resultString + indent + self.translate_experimental_mode(mode=experimentalMatch.group(1))
Jon Hall4ba53f02015-07-29 13:07:41 -0700204
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000205 elif elseloopMatch :
adminbae64d82013-08-01 10:50:15 -0700206 if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace:
207 resultString = resultString + indent + "else :"
208 self.flag = self.flag + 1
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000209 else :
210 indent = " " *(4 + 4 * (self.flag-1))
adminbae64d82013-08-01 10:50:15 -0700211 resultString = resultString + indent + "else :"
212 self.flag = self.flag + 1
Jon Hall4ba53f02015-07-29 13:07:41 -0700213
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000214 elif elifloop :
Jon Hall4ba53f02015-07-29 13:07:41 -0700215
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000216 operand = elifloop.group(1)
217 operator = elifloop.group(2)
218 value = elifloop.group(3)
adminbae64d82013-08-01 10:50:15 -0700219 if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000220 resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":"
Jon Hall4ba53f02015-07-29 13:07:41 -0700221 self.flag = self.flag + 1
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000222 else :
223 indent = " " *(4 + 4 * (self.flag-1))
224 resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":"
adminbae64d82013-08-01 10:50:15 -0700225 self.flag = self.flag + 1
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000226 elif response_pasrse :
227 output_string = response_pasrse.group(1)
228 req_format = response_pasrse.group(2)
229 store_in = response_pasrse.group(3)
230 resultString = resultString + indent + store_in +'= main.response_parser('+output_string+",\""+req_format+"\")"
Jon Hall4ba53f02015-07-29 13:07:41 -0700231 self.flag = self.flag + 1
adminbae64d82013-08-01 10:50:15 -0700232
233 return resultString
234
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000235 def translate_repeat(self,**repeatStatement):
236 '''
adminbae64d82013-08-01 10:50:15 -0700237 this will transalte the repeat statement into a python equivalen while loop
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000238 '''
239
240 args = self.parse_args(["REPEAT"],**repeatStatement)
adminbae64d82013-08-01 10:50:15 -0700241 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700242
adminbae64d82013-08-01 10:50:15 -0700243 resultString = "i = 0"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000244 resultString = resultString + "\n" + " " * 8 +"while i<" + args["REPEAT"] + " :"
adminbae64d82013-08-01 10:50:15 -0700245 return resultString
Jon Hall4ba53f02015-07-29 13:07:41 -0700246
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000247 def translate_if_else_operator(self,**loopBlock):
248 '''
adminbae64d82013-08-01 10:50:15 -0700249 This method will translate if-else loop block into its equivalent python code.
Jon Hall4ba53f02015-07-29 13:07:41 -0700250 Whole loop block will be passed into loopBlock List.
adminbae64d82013-08-01 10:50:15 -0700251 It returns the transalted reuslt as a string.
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000252 '''
253 args = self.parse_args(["CONDITIONOPERATOR"],**loopBlock)
adminbae64d82013-08-01 10:50:15 -0700254 resultString = ''
255 # process the loopBlock List translate all statements underlying the given loop block
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000256 equalsMatch = re.match("EQUALS$|==\s*$",args["CONDITIONOPERATOR"],flags=0)
257 greaterMatch = re.match("GREATER\s+THAN$|>\s*$",args["CONDITIONOPERATOR"],flags=0)
258 lesserMatch = re.match("LESSER\s+THAN$|<\s*$",args["CONDITIONOPERATOR"],flags=0)
259 greaterEqualMatch = re.match("GREATER\s+THAN\s+OR\s+EQUALS$|>=\s*$",args["CONDITIONOPERATOR"],flags=0)
260 lesserEqualMatch = re.match("LESSER\s+THAN\s+OR\s+EQUALS$|<=\s*$",args["CONDITIONOPERATOR"],flags=0)
261 if equalsMatch :
adminbae64d82013-08-01 10:50:15 -0700262 resultString = resultString + " == "
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000263 elif greaterMatch :
adminbae64d82013-08-01 10:50:15 -0700264 resultString = resultString + " > "
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000265 elif lesserMatch :
Jon Hall4ba53f02015-07-29 13:07:41 -0700266 resultString = resultString + " < "
adminbae64d82013-08-01 10:50:15 -0700267 elif greaterEqualMatch:
268 resultString = resultString + " >= "
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000269 elif lesserEqualMatch :
adminbae64d82013-08-01 10:50:15 -0700270 resultString = resultString + " <= "
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000271 else :
Jon Hall4ba53f02015-07-29 13:07:41 -0700272 print "\n Error: Given Operator is not listed "
273
274 return resultString
275
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000276 def translate_experimental_mode(self,**modeType):
277 '''
adminbae64d82013-08-01 10:50:15 -0700278 This API will translate statment EXPERIMENTAL MODE ON/OFF into python equivalent.
279 It will return the transalted value.
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000280 '''
281 args = self.parse_args(["MODE"],**modeType)
adminbae64d82013-08-01 10:50:15 -0700282 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000283 ONmatch = re.match("\s*ON",args["MODE"],flags=0)
284 OFFmatch = re.match("\sOFF",args["MODE"],flags=0)
adminbae64d82013-08-01 10:50:15 -0700285
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000286 if ONmatch :
adminbae64d82013-08-01 10:50:15 -0700287 resultString = "main.EXPERIMENTAL_MODE = main.TRUE"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000288 elif OFFmatch :
Jon Hall4ba53f02015-07-29 13:07:41 -0700289 resultString = "main.EXPERIMENTAL_MODE = main.FALSE"
adminbae64d82013-08-01 10:50:15 -0700290
291 return resultString
292
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000293 def interpret(self,**interpetParameters):
294 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700295 This method will accept the OpenSpeak syntax into a string and will return
adminbae64d82013-08-01 10:50:15 -0700296 a python equivalent translations statement
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000297 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700298
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000299 args = self.parse_args(["TEXT","WRITETOFILE"],**interpetParameters)
300 resultString = ''
301 ## here Open Speak syntax will be translated into python equivalent.
302 resultString = self.verify_and_translate(args["TEXT"])
303 lineSpace = re.match("^\s+",resultString,flags=0)
304
305 resultString = re.sub("^\s+","",resultString) if lineSpace else resultString
adminbae64d82013-08-01 10:50:15 -0700306 return resultString
307
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000308 def translate_logs(self,**logStatement):
309 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700310 This will translate the OpenSpeak log message statements into python equivalent
adminbae64d82013-08-01 10:50:15 -0700311 to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000312 '''
313 args = self.parse_args(["LOGLEVEL","MESSAGE"],**logStatement)
adminbae64d82013-08-01 10:50:15 -0700314 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700315 # convert the statement here
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000316 message = self.translate_log_message(message=args["MESSAGE"])
317 if args["LOGLEVEL"] == "INFO" :
adminbae64d82013-08-01 10:50:15 -0700318 resultString = resultString + "main.log.info(" + message + ")"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000319 elif args["LOGLEVEL"] == "ERROR" :
320 resultString = resultString + "main.log.error(" + message + ")"
321 elif args["LOGLEVEL"] == "DEBUG" :
adminbae64d82013-08-01 10:50:15 -0700322 resultString = resultString + "main.log.debug(" + message + ")"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000323 elif args["LOGLEVEL"] == "REPORT" :
Jon Hall4ba53f02015-07-29 13:07:41 -0700324 resultString = resultString + "main.log.report(" + message + ")"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000325 elif args["LOGLEVEL"] == "CRITICAL" :
adminbae64d82013-08-01 10:50:15 -0700326 resultString = resultString + "main.log.critical(" + message + ")"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000327 elif args["LOGLEVEL"] == "WARN" :
328 resultString = resultString + "main.log.warn(" + args["MESSAGE"] + ")"
329 elif args["LOGLEVEL"] == "EXACT" :
330 resultString = resultString + "main.log.exact(" + args["MESSAGE"] + ")"
331
Jon Hall4ba53f02015-07-29 13:07:41 -0700332
adminbae64d82013-08-01 10:50:15 -0700333 return resultString
334
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000335 def translate_log_message(self,**messageStatement) :
336 '''
adminbae64d82013-08-01 10:50:15 -0700337 This API will translate log messages if it is a string or Variable or combination
Jon Hall4ba53f02015-07-29 13:07:41 -0700338 of string and variable.
adminbae64d82013-08-01 10:50:15 -0700339 It will return the analysed and translate message.
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000340 '''
341 args = self.parse_args(["MESSAGE"],**messageStatement)
adminbae64d82013-08-01 10:50:15 -0700342 resultString = ''
343
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000344 paramsMatch = re.match("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE",args["MESSAGE"],flags=0)
345 stringMatch = re.match("\s*\"(.*)\"\s*$",args["MESSAGE"],flags=0)
346 stringWidVariableMatch = re.match("\"(.*)\"\s+\+\s+(.*)",args["MESSAGE"],flags=0)
347 varRefMatch = re.search("\<(\w+)\>",args["MESSAGE"],flags=0)
348 if paramsMatch :
349 resultString = resultString + self.translate_parameters(parameters=args["MESSAGE"])
350 elif stringMatch :
351 resultString = resultString + args["MESSAGE"]
adminbae64d82013-08-01 10:50:15 -0700352 elif stringWidVariableMatch:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000353 quoteWord = stringWidVariableMatch.group(1)
354 variableRef = stringWidVariableMatch.group(2)
355 varMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]",variableRef,flags=0)
356 varRefMatch = re.search("\<(\w+)\>",variableRef,flags=0)
357 if varMatch :
358 resultString = resultString + "\"" + quoteWord + "\"" + " + " + self.translate_parameters(parameters=variableRef)
359 elif varRefMatch :
360 resultString = resultString + "\"" + quoteWord + "\"" + " + " + varRefMatch.group(1)
adminbae64d82013-08-01 10:50:15 -0700361 elif varRefMatch:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000362 resultString = resultString + varRefMatch.group(1)
363 else :
364 print "\nError : Syntax error , Not defined way to give log message" + args["MESSAGE"]
adminbae64d82013-08-01 10:50:15 -0700365
Jon Hall4ba53f02015-07-29 13:07:41 -0700366 return resultString
367
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000368 def translate_assertion(self,**assertStatement):
369 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700370 This will translate the ASSERT <value1> <COMPARISON OPERATOR> <value2> into python
adminbae64d82013-08-01 10:50:15 -0700371 equivalent to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000372 '''
373 args = self.parse_args(["LEFTVALUE","OPERATOR","RIGHTVALUE","ONPASS","ONFAIL"],**assertStatement)
adminbae64d82013-08-01 10:50:15 -0700374 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700375 # convert the statement here
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000376 notOperatorMatch = re.search("NOT\s+(.*)",args["OPERATOR"],flags=0)
377 notOperatorSymbMatch = re.search("\!(.*)",args["OPERATOR"],flags=0)
adminbae64d82013-08-01 10:50:15 -0700378 operator = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000379 lastresultMatch = re.match("LAST_RESULT",args["RIGHTVALUE"],flags=0)
380 lastresponseMatch = re.match("LAST_RESPONSE",args["RIGHTVALUE"],flags=0)
381 if lastresultMatch :
adminbae64d82013-08-01 10:50:15 -0700382 operator = "main.last_result"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000383 elif lastresponseMatch :
adminbae64d82013-08-01 10:50:15 -0700384 operator = "main.last_response"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000385 else :
386 operator = args["RIGHTVALUE"]
Jon Hall4ba53f02015-07-29 13:07:41 -0700387
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000388 if args["OPERATOR"] == None or args["OPERATOR"] == "" :
adminbae64d82013-08-01 10:50:15 -0700389 print "\n Error : Operator has not been specified !!!"
390 elif notOperatorMatch or notOperatorSymbMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700391
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000392 operators = notOperatorMatch.group(1) if notOperatorMatch else notOperatorSymbMatch.group(1)
393 operators = self.translate_operator(operator=operators)
394 if self.grtrOrLssr == 0 :
adminbae64d82013-08-01 10:50:15 -0700395 resultString = resultString + "utilities.assert_not_" + operators + "(expect=" +\
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000396 self.translate_response_result(operator=args["RIGHTVALUE"]) + ",actual=" + self.translate_response_result(operator=args["LEFTVALUE"]) +\
397 ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
398 ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
399 else :
adminbae64d82013-08-01 10:50:15 -0700400 resultString = resultString + "utilities.assert_not_" + operators + "(expect=" +\
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000401 self.translate_response_result(operator=args["LEFTVALUE"]) + ",actual=" + self.translate_response_result(operator=args["RIGHTVALUE"]) +\
402 ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
403 ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
adminbae64d82013-08-01 10:50:15 -0700404
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000405 else :
406 operators = self.translate_operator(operator=args["OPERATOR"])
407 if self.grtrOrLssr == 0 :
adminbae64d82013-08-01 10:50:15 -0700408 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000409 self.translate_response_result(operator=args["RIGHTVALUE"]) +\
410 ",actual=" + self.translate_response_result(operator=args["LEFTVALUE"]) +\
411 ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
412 ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
413 else :
adminbae64d82013-08-01 10:50:15 -0700414 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000415 self.translate_response_result(operator=args["LEFTVALUE"]) +\
416 ",actual=" + self.translate_response_result(operator=args["RIGHTVALUE"]) +\
417 ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\
418 ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")"
419
Jon Hall4ba53f02015-07-29 13:07:41 -0700420
adminbae64d82013-08-01 10:50:15 -0700421 return resultString
422
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000423 def translate_response_result(self,**operatorStatement):
424 '''
adminbae64d82013-08-01 10:50:15 -0700425 It will translate the LAST_RESPONSE or LAST_RESULT statement into its equivalent.
426 It returns the translate form in resulString.
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000427 '''
428 args = self.parse_args(["OPERATOR"],**operatorStatement)
adminbae64d82013-08-01 10:50:15 -0700429 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000430 lastResultMatch = re.match("LAST_RESULT",args["OPERATOR"],flags=0)
431 lastResponseMatch = re.match("LAST_RESPONSE",args["OPERATOR"],flags=0)
432 if lastResultMatch :
adminbae64d82013-08-01 10:50:15 -0700433 resultString = resultString + "main.last_result"
434 elif lastResponseMatch:
435 resultString = resultString + "main.last_response"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000436 else :
437 resultString = resultString + args["OPERATOR"]
adminbae64d82013-08-01 10:50:15 -0700438 return resultString
439
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000440
441 def translate_assertMessage(self,**messageStatement) :
442 '''
adminbae64d82013-08-01 10:50:15 -0700443 This API will facilitate the translation of assert ONPASS or ONFAIL messages . The message can be
444 a string or calling another API in OpenSpeak syntax.
445 It will return the translated message
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000446 '''
447 args = self.parse_args(["MESSAGE"],**messageStatement)
Jon Hall4ba53f02015-07-29 13:07:41 -0700448
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000449 connectMatch = re.search("CONNECT\s+(\w+)\s+USING\s+(.*)",args["MESSAGE"],flags=0)
450 disconnectMatch = re.search("DISCONNECT\s+(.*)",args["MESSAGE"],flags=0)
451 ondoMatch = re.search("ON\s+(.*)\s+DO\s+(.*)",args["MESSAGE"],flags=0)
452 paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]",args["MESSAGE"],flags=0)
453 stringMatch = re.search("\"(.*)\"|\'(.*)\'",args["MESSAGE"],flags=0)
454 variableMatch = re.search("\<(.*)\>",args["MESSAGE"],flags=0)
adminbae64d82013-08-01 10:50:15 -0700455
456 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000457 if connectMatch :
458 resultString = resultString + self.translate_connect(component=connectMatch.group(1),
459 arguments=connectMatch.group(2) )
460 elif disconnectMatch :
461 resultString = resultString + self.translate_disconnect(component=disconnectMatch.group(1))
462 elif ondoMatch :
463 resultString = resultString + self.translate_onDOAs(component=ondoMatch.group(1),
464 action=ondoMatch.group(2))
465 elif paramsMatch :
466 resultString = resultString + self.translate_parameters(parameters=args["MESSAGE"])
467 elif stringMatch :
adminbae64d82013-08-01 10:50:15 -0700468 resultString = resultString + "\"" + stringMatch.group(1) + "\""
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000469 elif variableMatch :
470 resultString = resultString + variableMatch.group(1)
471 elif args["MESSAGE"] == None :
Jon Hall4ba53f02015-07-29 13:07:41 -0700472 print "\n Error : Please pass a message or action for assertion "
473
474 return resultString
475
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000476 def translate_operator(self,**operatorStatement) :
477 '''
adminbae64d82013-08-01 10:50:15 -0700478 It will translate the operator for assertion , by ensuring against given arguments.
479 It will return the translated assertion operator.
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000480 '''
481 args = self.parse_args(["OPERATOR"],**operatorStatement)
Jon Hall4ba53f02015-07-29 13:07:41 -0700482
adminbae64d82013-08-01 10:50:15 -0700483 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000484 equalsMatch = re.match("EQUALS$|==$",args["OPERATOR"],flags=0)
485 greaterMatch = re.match("GREATER\s+THAN$|>$",args["OPERATOR"],flags=0)
486 lesserMatch = re.match("LESSER\s+THAN$|<$",args["OPERATOR"],flags=0)
487 stringMatch = re.match("MATCHES|~$",args["OPERATOR"],flags=0)
488 greaterEqualMatch = re.match("GREATER\s+THAN\s+OR\s+EQUALS$|>=$",args["OPERATOR"],flags=0)
489 lesserEqualMatch = re.match("LESSER\s+THAN\s+OR\s+EQUALS$|<=$",args["OPERATOR"],flags=0)
490 if equalsMatch :
Jon Hall4ba53f02015-07-29 13:07:41 -0700491
adminbae64d82013-08-01 10:50:15 -0700492 resultString = resultString + "equals"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000493 elif greaterMatch :
adminbae64d82013-08-01 10:50:15 -0700494 self.grtrOrLssr = self.grtrOrLssr + 1
495 resultString = resultString + "greater"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000496 elif lesserMatch :
adminbae64d82013-08-01 10:50:15 -0700497 self.grtrOrLssr = self.grtrOrLssr + 1
498 resultString = resultString + "lesser"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000499 elif stringMatch :
Jon Hall4ba53f02015-07-29 13:07:41 -0700500
adminbae64d82013-08-01 10:50:15 -0700501 resultString = resultString + "matches"
502 elif greaterEqualMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700503
adminbae64d82013-08-01 10:50:15 -0700504 resultString = resultString + "greater_equals"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000505 elif lesserEqualMatch :
Jon Hall4ba53f02015-07-29 13:07:41 -0700506
adminbae64d82013-08-01 10:50:15 -0700507 resultString = resultString + "lesser_equals"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000508 else :
Jon Hall4ba53f02015-07-29 13:07:41 -0700509 print "\n Error: Given Operator is not listed for assertion"
510 return resultString
adminbae64d82013-08-01 10:50:15 -0700511
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000512 def translate_store(self,**storeStatement):
513 '''
adminbae64d82013-08-01 10:50:15 -0700514 This will translate the STORE <variable> IN <value> or <variable> = <value>
515 into python equivalent to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000516 '''
517 args = self.parse_args(["VARIABLE","VALUE"],**storeStatement)
adminbae64d82013-08-01 10:50:15 -0700518 resultString = ''
519 # convert the statement here
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000520 ondoMatch = re.match("^\s*ON\s+(.*)\s+DO\s+(.*)",args["VALUE"],flags=0)
521 paramsMatch = re.match("^\s*PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE",args["VALUE"],flags=0)
522 if paramsMatch :
523 argString = self.translate_parameters(parameters=args["VALUE"])
524 resultString = args["VARIABLE"] + " = " + argString
525 elif ondoMatch :
526 resultString = args["VARIABLE"] + " = " + self.translate_onDOAs(component=ondoMatch.group(1),action=ondoMatch.group(2))
527 else :
528 resultString = args["VARIABLE"] + " = " + args["VALUE"]
529
adminbae64d82013-08-01 10:50:15 -0700530
531 return resultString
Jon Hall4ba53f02015-07-29 13:07:41 -0700532
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000533 def translate_disconnect(self,**disconnectStatement):
534 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700535 This will translate the DISCONNECT <component_name> into python
adminbae64d82013-08-01 10:50:15 -0700536 equivalent to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000537 '''
538 args = self.parse_args(["COMPONENT"],**disconnectStatement)
adminbae64d82013-08-01 10:50:15 -0700539 resultString = ''
540 # convert the statement here
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000541 resultString = "main." + args["COMPONENT"] + ".disconnect()"
adminbae64d82013-08-01 10:50:15 -0700542 return resultString
Jon Hall4ba53f02015-07-29 13:07:41 -0700543
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000544 def translate_onDOAs(self,**onDoStatement):
545 '''
adminbae64d82013-08-01 10:50:15 -0700546 This will translate the ON <component> DO <action> USING <arg1> AS <value1>,<arg2> AS <value2>
547 into python equivalent to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000548 '''
549 args = self.parse_args(["COMPONENT","ACTION","ARGUMENTS"],**onDoStatement)
adminbae64d82013-08-01 10:50:15 -0700550 subString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700551
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000552 usingMatch = re.match("\s*(.*)\s+USING\s+(.*)",args["ACTION"],flags=0)
adminbae64d82013-08-01 10:50:15 -0700553 action = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000554 if usingMatch :
555 action = usingMatch.group(1)
556 arguments = usingMatch.group(2)
557 subString = self.translate_usingas(arguments=arguments)
Jon Hall4ba53f02015-07-29 13:07:41 -0700558
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000559 else :
560 andCheck = re.search ("(.*)\s+AND\s+(.*)",args["ACTION"],flags=0)
Jon Hall4ba53f02015-07-29 13:07:41 -0700561
adminbae64d82013-08-01 10:50:15 -0700562 action = action + "()"
563 if andCheck:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000564 action = andCheck.group(1) + "()"
565 subString = subString + self.handle_conjuction(statement=andCheck.group(2))
566 else :
567 action = args["ACTION"]
adminbae64d82013-08-01 10:50:15 -0700568 action = action + "()"
Jon Hall4ba53f02015-07-29 13:07:41 -0700569 # convert the statement here
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000570 resultString = "main." + args["COMPONENT"] + "." + action + subString
adminbae64d82013-08-01 10:50:15 -0700571 return resultString
572
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000573
574 def handle_conjuction(self,**conjuctStatement):
575 '''
adminbae64d82013-08-01 10:50:15 -0700576 This will handle the conjuctions
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000577 '''
578
579 args = self.parse_args(["STATEMENT"],**conjuctStatement)
adminbae64d82013-08-01 10:50:15 -0700580 subSentence = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700581
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000582 storeMatch = re.match("\s*STORE\s+(.*)\s+IN\s+(.*)",args["STATEMENT"],flags=0)
583 assertMatch = re.match("\s*ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)",args["STATEMENT"],flags=0)
584 if storeMatch :
585 subSentence = "\n" + " " * 8 + self.translate_store(variable=storeMatch.group(2),
586 value=storeMatch.group(1))
587 elif assertMatch :
588 subSentence = "\n" + " " * 8 + self.translate_assertion(leftvalue=assertMatch.group(1),
589 operator=assertMatch.group(2),
590 rightvalue=assertMatch.group(3),
591 onpass=assertMatch.group(4),
592 onfail=assertMatch.group(5))
adminbae64d82013-08-01 10:50:15 -0700593 return subSentence
594
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000595 def translate_usingas(self,**argumentAS) :
596 '''
adminbae64d82013-08-01 10:50:15 -0700597 This will tranlate USING argument AS value Statement into equivalent argument passing.
598 It will return translated form into resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000599 '''
600 args = self.parse_args(["ARGUMENTS"],**argumentAS)
adminbae64d82013-08-01 10:50:15 -0700601 resultString = ''
602 argsList = []
603 subString = ''
604 subSentence = ''
605 line = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000606 andCheck = re.search ("(.*)\s+AND\s+(.*)",args["ARGUMENTS"],flags=0)
adminbae64d82013-08-01 10:50:15 -0700607 if andCheck:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000608 line = andCheck.group(1)
609 subSentence = self.handle_conjuction(statement=andCheck.group(2))
610 else :
611 line = args["ARGUMENTS"]
Jon Hall4ba53f02015-07-29 13:07:41 -0700612
613
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000614
615 argsMatch = re.search("(.*),(.*)",line,flags=0)
616
617
618 if args["ARGUMENTS"] == None or args["ARGUMENTS"] == '' :
adminbae64d82013-08-01 10:50:15 -0700619 subString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000620 elif argsMatch :
Jon Hall4ba53f02015-07-29 13:07:41 -0700621
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000622 argsList = line.split(",")
623 for index, arguments in enumerate(argsList):
624 argMatch = re.search("(.*)\s+AS\s+(.*)",arguments,flags=0)
adminbae64d82013-08-01 10:50:15 -0700625 if argMatch:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000626 argsKey = argMatch.group(1)
627 argsValue = argMatch.group(2)
628 paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",argsValue,flags=0)
629 if not paramsMatch :
630 if index == len(argsList) - 1 :
631 subString = subString + argsKey + "=" + argsValue
632 else :
633 subString = subString + argsKey + "=" + argsValue + ","
634 else :
635 argString = self.translate_parameters(parameters=argsValue)
636 if index == len(argsList) - 1 :
637 subString = subString + argsKey + "=" + argString
638 else :
639 subString = subString + argsKey + "=" + argString + ","
640 else :
641 if index == len(argsList) - 1 :
642 subString = subString + arguments
643 else :
Jon Hall4ba53f02015-07-29 13:07:41 -0700644 subString = subString + arguments + ","
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000645 else :
646 argMatch = re.search("(.*)\s+AS\s+(.*)",args["ARGUMENTS"],flags=0)
adminbae64d82013-08-01 10:50:15 -0700647 if argMatch:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000648 argsKey = argMatch.group(1)
649 argsValue = argMatch.group(2)
650 paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",argsValue,flags=0)
651 if not paramsMatch :
652 subString = subString + argsKey + "=" + argsValue
653 else :
654 argString = self.translate_parameters(parameters=argsValue)
655 subString = subString + argsKey + "=" + argString
656 else :
657 paramsMatch = re.match("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",line,flags=0)
658 if paramsMatch :
659 subString = subString + self.translate_parameters(parameters=line)
660 else :
661 subString = subString + line
662 resultString = "(" + subString + ")"+ subSentence
adminbae64d82013-08-01 10:50:15 -0700663 return resultString
664
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000665
666 def translate_connect(self,**connectStatement):
667 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700668 This will translate the CONNECT <component_name> USING1 <arg1> AS <value1>, <arg2> AS <value2>
adminbae64d82013-08-01 10:50:15 -0700669 into python equivalent to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000670 '''
671 args = self.parse_args(["COMPONENT","ARGUMENTS"],**connectStatement)
adminbae64d82013-08-01 10:50:15 -0700672 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000673 subString = self.translate_usingas(arguments=args["ARGUMENTS"])
Jon Hall4ba53f02015-07-29 13:07:41 -0700674 # convert the statement here
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000675 resultString = "main." + args["COMPONENT"] + ".connect(" + subString + ")"
adminbae64d82013-08-01 10:50:15 -0700676 return resultString
677
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000678
679 def translate_parameters(self,**parameterStatement):
680 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700681 This will translate the OpenSpeak Case and Params parameters into python equivalent
adminbae64d82013-08-01 10:50:15 -0700682 to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000683 '''
684 args = self.parse_args(["PARAMETERS"],**parameterStatement)
685 argument = args["PARAMETERS"]
adminbae64d82013-08-01 10:50:15 -0700686 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000687 ### match arguments
688 paramsMatch = re.search("PARAMS((\[(.*)\])*)",argument,flags=0)
689 stepsMatch = re.search("STEP((\[(.*)\])*)",argument,flags=0)
690 casesMatch = re.search("CASE((\[(.*)\])*)",argument,flags=0)
691 topoMatch = re.search("TOPO((\[(.*)\])*)",argument,flags=0)
692 lastResultMatch = re.match("LAST_RESULT",argument,flags=0)
693 lastResponseMatch = re.match("LAST_RESPONSE",argument,flags=0)
adminbae64d82013-08-01 10:50:15 -0700694 # convert the statement here
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000695 if paramsMatch :
696 params = paramsMatch.group(1)
697 resultString = resultString + "main.params" + self._argsCheck(checkvar=params)
698 elif stepsMatch :
699 resultString = resultString +"main.params[\'" + self.CurrentCase +\
700 "\'][\'STEP" + str(self.CurrentStep) + "\']" +\
701 self._argsCheck(checkvar=stepsMatch.group(1))
702 elif casesMatch :
adminbae64d82013-08-01 10:50:15 -0700703 resultString = resultString + "main.params[\'" + self.CurrentCase + "\']" +\
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000704 self._argsCheck(checkvar=casesMatch.group(1))
705 elif topoMatch :
adminbae64d82013-08-01 10:50:15 -0700706 resultString = resultString + "main.componentDictionary" +\
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000707 self._argsCheck(checkvar=topoMatch.group(1))
708 elif lastResultMatch :
adminbae64d82013-08-01 10:50:15 -0700709 resultString = resultString + "main.last_result"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000710 elif lastResponseMatch :
Jon Hall4ba53f02015-07-29 13:07:41 -0700711 resultString = resultString + "main.last_response"
adminbae64d82013-08-01 10:50:15 -0700712 return resultString
713
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000714 def _argsCheck(self,**args):
715 ''' This API will check if given argument is varibale reference or String and will translate accordingly.
adminbae64d82013-08-01 10:50:15 -0700716 It will return the tanslate form in resultString.
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000717 '''
718 args = self.parse_args(["CHECKVAR"],**args)
719 params = args["CHECKVAR"]
720 argsList = params.split("]")
adminbae64d82013-08-01 10:50:15 -0700721 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000722 del argsList[len(argsList) - 1]
723 for index,paramArgs in enumerate(argsList) :
724 argsWidVariable = re.search("(\"|\')\s*(\w+)\s*(\'|\")",paramArgs,flags=0)
725 if argsWidVariable :
adminbae64d82013-08-01 10:50:15 -0700726 resultString = resultString + "[\'" + argsWidVariable.group(2) + "\']"
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000727 else :
adminbae64d82013-08-01 10:50:15 -0700728 resultString = resultString + paramArgs + "]"
729 return resultString
730
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000731 def translate_step(self,**stepStatement):
732 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700733 This will translate the STEP "DO SOMETHING HERE" into python equivalent
adminbae64d82013-08-01 10:50:15 -0700734 to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000735 '''
736 args = self.parse_args(["STEP"],**stepStatement)
adminbae64d82013-08-01 10:50:15 -0700737 resultString = ''
738 resultString = "main.step(\"" + args["STEP"] + "\")"
Jon Hall4ba53f02015-07-29 13:07:41 -0700739 # convert the statement here
adminbae64d82013-08-01 10:50:15 -0700740 return resultString
741
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000742
743 def translate_comment(self,**commentStatement):
744 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700745 This will translate the COMMENT "DO SOMETHING HERE" into python equivalent
adminbae64d82013-08-01 10:50:15 -0700746 to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000747 '''
748 args = self.parse_args(["COMMENT"],**commentStatement)
adminbae64d82013-08-01 10:50:15 -0700749 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000750 resultString = "#" + args["COMMENT"]
Jon Hall4ba53f02015-07-29 13:07:41 -0700751 # convert the statement here
752 return resultString
753
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000754 def translate_testcase_name(self,**nameStatement):
755 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700756 This method will convert NAME "<Testcase_name>" into python equivalent statement
757 to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000758 '''
759 args = self.parse_args(["TESTNAME"],**nameStatement)
Jon Hall4ba53f02015-07-29 13:07:41 -0700760
adminbae64d82013-08-01 10:50:15 -0700761 resultString = ''
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000762 resultString = "main.case(\"" + args["TESTNAME"] + "\")"
Jon Hall4ba53f02015-07-29 13:07:41 -0700763 # convert the statement here
764 return resultString
765
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000766
767 def translate_case_block(self,**caseBlock):
768 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700769 This method will translate the case block in test script .
adminbae64d82013-08-01 10:50:15 -0700770 It returns the translated equivalent python code for test script
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000771 '''
772 args = self.parse_args(["CASENUMBER"],**caseBlock)
adminbae64d82013-08-01 10:50:15 -0700773 resultString = ""
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000774 resultString = "def CASE" + str(args["CASENUMBER"]) + "(self,main) :\n"
Jon Hall4ba53f02015-07-29 13:07:41 -0700775 # process the caseBlock List translate all statements underlying the given case
adminbae64d82013-08-01 10:50:15 -0700776 return resultString
777
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000778
779
780 def translate_loop_block(self,*loopBlock):
781 '''
adminbae64d82013-08-01 10:50:15 -0700782 This method will translate for loop block into its equivalent python code.
Jon Hall4ba53f02015-07-29 13:07:41 -0700783 Whole loop block will be passed into loopBlock List.
adminbae64d82013-08-01 10:50:15 -0700784 It returns the transalted reuslt as a string.
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000785 '''
adminbae64d82013-08-01 10:50:15 -0700786 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700787 # process the loopBlock List translate all statements underlying the given loop block
788 return resultString
789
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000790
791 def translate_conjuction(self,conjuctionStatement):
792 '''
Jon Hall4ba53f02015-07-29 13:07:41 -0700793 This will translate the AND conjuction statements into python equivalent
adminbae64d82013-08-01 10:50:15 -0700794 to resultString and returns resultString
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000795 '''
adminbae64d82013-08-01 10:50:15 -0700796 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700797 # convert the statement here
adminbae64d82013-08-01 10:50:15 -0700798 return resultString
799
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000800
801 def parse_args(self,args, **kwargs):
802 '''
803 It will accept the (key,value) pair and will return the (key,value) pairs with keys in uppercase.
804 '''
adminbae64d82013-08-01 10:50:15 -0700805 newArgs = {}
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000806 for key,value in kwargs.iteritems():
807 #currentKey = str.upper(key)
808 if isinstance(args,list) and str.upper(key) in args:
Jon Hall4ba53f02015-07-29 13:07:41 -0700809 for each in args:
Jeremy Ronquillo4d5f1d02017-10-13 20:23:57 +0000810 if each==str.upper(key):
811 newArgs [str(each)] = value
812 elif each != str.upper(key) and (newArgs.has_key(str(each)) == False ):
813 newArgs[str(each)] = None
814
815
Jon Hall4ba53f02015-07-29 13:07:41 -0700816
adminbae64d82013-08-01 10:50:15 -0700817 return newArgs