Package TestON :: Package core :: Module openspeak
[hide private]
[frames] | no frames]

Source Code for Module TestON.core.openspeak

  1  #/usr/bin/env python 
  2  ''' 
  3  Created on 20-Dec-2012 
  4          
  5  @author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com) 
  6  ''' 
  7  import re 
  8  import inspect 
  9   
 10   
11 -class OpenSpeak:
12
13 - def __init__(self):
14 self.default = '' 15 self.flag = 0 16 self.CurrentStep = 0 17 self.grtrOrLssr = 0
18
19 - def compiler(self,**compileParameters):
20 ''' 21 This method will parse the openspeak file and will write to a python module with the equivalent translations. 22 It can accept OpenSpeak syntax in string or an OpenSpeak file as an input parameter. 23 Translated form can be written into python module if attribute "WRITETOFILE" is set to 1. 24 ''' 25 26 args = self.parse_args(["OPENSPEAKFILE","TEXT","WRITETOFILE","FILEHANDLE"],**compileParameters) 27 resultString = '' 28 Test = "Mininet" 29 args["WRITETOFILE"] = args["WRITETOFILE"] if args["WRITETOFILE"] != None else 1 30 self.CurrentStep = 0 31 self.CurrentCase = '' 32 33 ## here Open Speak file will be parsed by each line and translated. 34 if args["OPENSPEAKFILE"] !=None and args["TEXT"] ==None and args["FILEHANDLE"] == None: 35 self.openspeakfile = args["OPENSPEAKFILE"] 36 openSpeakFile = open(args["OPENSPEAKFILE"],"r").readlines() 37 38 elif args["OPENSPEAKFILE"] ==None and args["TEXT"] and args["FILEHANDLE"] == None: 39 openSpeakFile = args["TEXT"].split("\n") 40 elif args["FILEHANDLE"] and args["OPENSPEAKFILE"] ==None and args["TEXT"] ==None: 41 openSpeakFile = args["FILEHANDLE"].readlines() 42 43 index = 0 44 outputFile = [] 45 testName = re.search("\/(.*)\.ospk$",self.openspeakfile,0) 46 testName = testName.group(1) 47 testName = testName.split("/") 48 testName = testName[len(testName)-1] 49 outputFile.append("\nclass " + testName + " :" + "\n") 50 outputFile.append("\n" + " " * 4 + "def __init__(self) :") 51 outputFile.append("\n" + " " * 8 + "self.default = \'\'" + "\n") 52 53 while index < len(openSpeakFile): 54 ifelseMatch = re.match("\s+IF|\s+ELSE|\s+ELIF",openSpeakFile[index],flags=0) 55 line = openSpeakFile[index] 56 repeatMatch = re.match("\s*REPEAT", openSpeakFile[index], flags=0) 57 if ifelseMatch : 58 result = self.verify_and_translate(line) 59 initialSpaces = len(line) -len(line.lstrip()) 60 self.outLoopSpace = initialSpaces 61 nextLine = openSpeakFile[index+1] 62 nextinitialSpaces = len(nextLine) -len(nextLine.lstrip()) 63 64 65 while nextinitialSpaces > initialSpaces : 66 try : 67 elseMatch = re.match("\s*ELSE|\s*ELIF",nextLine,flags=0) 68 if elseMatch : 69 self.flag = self.flag -1 70 result = result + self.verify_and_translate(nextLine) 71 nextLine = openSpeakFile[index + 1] 72 nextinitialSpaces = len(nextLine) -len(nextLine.lstrip()) 73 except IndexError: 74 pass 75 index = index + 1 76 self.flag = 0 77 elif repeatMatch: 78 self.flag = 0 79 result = self.verify_and_translate(line) 80 index = index + 1 81 endMatch = re.match("\s*END",openSpeakFile[index],flags=0) 82 while not endMatch : 83 try : 84 85 self.flag = self.flag + 1 86 result = result + self.verify_and_translate(openSpeakFile[index]) 87 index = index + 1 88 89 except IndexError : 90 pass 91 92 93 else : 94 self.flag = 0 95 result = self.verify_and_translate(line) 96 index = index + 1 97 outputFile.append(result) 98 99 if args["WRITETOFILE"] == 1 : 100 testscript = re.sub("ospk","py",self.openspeakfile,0) 101 testScript = open(testscript,"w") 102 for lines in outputFile : 103 testScript.write(lines) 104 testScript.close() 105 return resultString
106
107 - def verify_and_translate(self,line):
108 ''' 109 It will accept the each line and calls the suitable API to conver into pyton equivalent syntax . 110 It will return the translated python syntax . 111 ''' 112 lineSpace = re.match("^\s+",line,flags=0) 113 initialSpaces = len(line) -len(line.lstrip()) 114 line = re.sub("^\s+","",line) if lineSpace else line 115 116 117 resultString = None 118 resultString = "\n" + " " * 4 if str(inspect.stack()[1][3]) == "compiler" else "\n" 119 indent = " " *(4 + 4 * self.flag) if self.flag > 0 else " " * 4 120 caseMatch = re.search("^CASE\s+(\d+)",line,flags=0) 121 nameMatch = re.match("^NAME\s+\"(.*)\"",line,flags=0) 122 commentMatch = re.match("^COMMENT\s+\"(.*)\"",line,flags=0) 123 stepMatch = re.match("^STEP\s+\"(.*)\"",line,flags=0) 124 connectMatch = re.match("^CONNECT\s+(\w+)\s+USING\s+(.*)",line,flags=0) 125 disconnectMatch = re.match("^DISCONNECT\s+(.*)",line,flags=0) 126 ondoMatch = re.match("^ON\s+(.*)\s+DO\s+(.*)",line,flags=0) 127 128 storeMatch = re.match("^STORE\s+(.*)\s+IN\s+(.*)",line,flags=0) 129 variableMatch = re.match("^(.*)\s+=\s+(.*)",line,flags=0) 130 assertMatch = re.match("^ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)",line,flags=0) 131 logMatch = re.match("^(ERROR|INFO|DEBUG|CRITICAL|REPORT|EXACT|WARN)\s+(.*)",line,flags=0) 132 ifloop = re.match("IF\s+(\w+)\s*(..|\w+)\s*(.*)",line,flags=0) 133 elseloopMatch = re.match("ELSE\s*$",line,flags=0) 134 elifloop = re.match("ELSE\sIF\s+(\w+)\s*(..|\w+)\s*(.*)",line,flags=0) 135 forloopMatch = re.match("\s*REPEAT\s+(/d+)\s+TIMES",line,flags=0) 136 experimentalMatch = re.match("EXPERIMENTAL\s+MODE\s+(\w+)",line,flags=0) 137 repeatMatch = re.match("\s*REPEAT\s+(\d+)\s+TIMES", line, flags=0) 138 139 140 if caseMatch : 141 self.CurrentStep = 0 142 self.CurrentCase = "CASE" + caseMatch.group(1) 143 resultString = resultString + self.translate_case_block(casenumber=caseMatch.group(1)) 144 elif repeatMatch: 145 resultString = resultString + indent + self.translate_repeat(repeat=repeatMatch.group(1)) 146 elif nameMatch : 147 resultString = resultString + indent + self.translate_testcase_name(testname=nameMatch.group(1)) 148 elif commentMatch : 149 resultString = resultString + indent + self.translate_comment(comment=commentMatch.group(1)) 150 elif stepMatch : 151 self.CurrentStep = self.CurrentStep + 1 152 resultString = resultString + indent + self.translate_step(step=stepMatch.group(1)) 153 elif connectMatch : 154 resultString = resultString + indent + self.translate_connect(component=connectMatch.group(1), 155 arguments=connectMatch.group(2) ) 156 elif disconnectMatch : 157 resultString = resultString + indent + self.translate_disconnect(component=disconnectMatch.group(1)) 158 elif ondoMatch : 159 resultString = resultString + indent + self.translate_onDOAs(component=ondoMatch.group(1),action=ondoMatch.group(2)) 160 elif storeMatch : 161 resultString = resultString + indent + self.translate_store(variable=storeMatch.group(2), 162 value=storeMatch.group(1)) 163 elif variableMatch : 164 resultString = resultString + indent + self.translate_store(variable=variableMatch.group(1), 165 value=variableMatch.group(2)) 166 elif assertMatch : 167 resultString = resultString + indent + self.translate_assertion(leftvalue=assertMatch.group(1), 168 operator=assertMatch.group(2), 169 rightvalue=assertMatch.group(3), 170 onpass=assertMatch.group(4), 171 onfail=assertMatch.group(5)) 172 elif logMatch : 173 resultString = resultString + indent + self.translate_logs(loglevel=logMatch.group(1), 174 message=logMatch.group(2)) 175 elif ifloop : 176 177 self.initSpace = initialSpaces 178 operand = ifloop.group(1) 179 operator = ifloop.group(2) 180 value = ifloop.group(3) 181 resultString = resultString + indent + "if " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":" 182 self.flag = self.flag + 1 183 elif experimentalMatch : 184 resultString = resultString + indent + self.translate_experimental_mode(mode=experimentalMatch.group(1)) 185 186 elif elseloopMatch : 187 if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace: 188 resultString = resultString + indent + "else :" 189 self.flag = self.flag + 1 190 else : 191 indent = " " *(4 + 4 * (self.flag-1)) 192 resultString = resultString + indent + "else :" 193 self.flag = self.flag + 1 194 195 elif elifloop : 196 197 operand = elifloop.group(1) 198 operator = elifloop.group(2) 199 value = elifloop.group(3) 200 if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace: 201 resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":" 202 self.flag = self.flag + 1 203 else : 204 indent = " " *(4 + 4 * (self.flag-1)) 205 resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator(conditionoperator=operator) + value + ":" 206 self.flag = self.flag + 1 207 208 209 210 return resultString
211
212 - def translate_repeat(self,**repeatStatement):
213 ''' 214 this will transalte the repeat statement into a python equivalen while loop 215 ''' 216 217 args = self.parse_args(["REPEAT"],**repeatStatement) 218 resultString = '' 219 220 resultString = "i = 0" 221 resultString = resultString + "\n" + " " * 8 +"while i<" + args["REPEAT"] + " :" 222 return resultString
223
224 - def translate_if_else_operator(self,**loopBlock):
225 ''' 226 This method will translate if-else loop block into its equivalent python code. 227 Whole loop block will be passed into loopBlock List. 228 It returns the transalted reuslt as a string. 229 ''' 230 args = self.parse_args(["CONDITIONOPERATOR"],**loopBlock) 231 resultString = '' 232 # process the loopBlock List translate all statements underlying the given loop block 233 equalsMatch = re.match("EQUALS$|==\s*$",args["CONDITIONOPERATOR"],flags=0) 234 greaterMatch = re.match("GREATER\s+THAN$|>\s*$",args["CONDITIONOPERATOR"],flags=0) 235 lesserMatch = re.match("LESSER\s+THAN$|<\s*$",args["CONDITIONOPERATOR"],flags=0) 236 greaterEqualMatch = re.match("GREATER\s+THAN\s+OR\s+EQUALS$|>=\s*$",args["CONDITIONOPERATOR"],flags=0) 237 lesserEqualMatch = re.match("LESSER\s+THAN\s+OR\s+EQUALS$|<=\s*$",args["CONDITIONOPERATOR"],flags=0) 238 if equalsMatch : 239 resultString = resultString + " == " 240 elif greaterMatch : 241 resultString = resultString + " > " 242 elif lesserMatch : 243 resultString = resultString + " < " 244 elif greaterEqualMatch: 245 resultString = resultString + " >= " 246 elif lesserEqualMatch : 247 resultString = resultString + " <= " 248 else : 249 print "\n Error: Given Operator is not listed " 250 251 return resultString
252
253 - def translate_experimental_mode(self,**modeType):
254 ''' 255 This API will translate statment EXPERIMENTAL MODE ON/OFF into python equivalent. 256 It will return the transalted value. 257 ''' 258 args = self.parse_args(["MODE"],**modeType) 259 resultString = '' 260 ONmatch = re.match("\s*ON",args["MODE"],flags=0) 261 OFFmatch = re.match("\sOFF",args["MODE"],flags=0) 262 263 if ONmatch : 264 resultString = "main.EXPERIMENTAL_MODE = main.TRUE" 265 elif OFFmatch : 266 resultString = "main.EXPERIMENTAL_MODE = main.FALSE" 267 268 return resultString
269
270 - def interpret(self,**interpetParameters):
271 ''' 272 This method will accept the OpenSpeak syntax into a string and will return 273 a python equivalent translations statement 274 ''' 275 276 args = self.parse_args(["TEXT","WRITETOFILE"],**interpetParameters) 277 resultString = '' 278 ## here Open Speak syntax will be translated into python equivalent. 279 resultString = self.verify_and_translate(args["TEXT"]) 280 lineSpace = re.match("^\s+",resultString,flags=0) 281 282 resultString = re.sub("^\s+","",resultString) if lineSpace else resultString 283 return resultString
284
285 - def translate_logs(self,**logStatement):
286 ''' 287 This will translate the OpenSpeak log message statements into python equivalent 288 to resultString and returns resultString 289 ''' 290 args = self.parse_args(["LOGLEVEL","MESSAGE"],**logStatement) 291 resultString = '' 292 # convert the statement here 293 message = self.translate_log_message(message=args["MESSAGE"]) 294 if args["LOGLEVEL"] == "INFO" : 295 resultString = resultString + "main.log.info(" + message + ")" 296 elif args["LOGLEVEL"] == "ERROR" : 297 resultString = resultString + "main.log.error(" + message + ")" 298 elif args["LOGLEVEL"] == "DEBUG" : 299 resultString = resultString + "main.log.debug(" + message + ")" 300 elif args["LOGLEVEL"] == "REPORT" : 301 resultString = resultString + "main.log.report(" + message + ")" 302 elif args["LOGLEVEL"] == "CRITICAL" : 303 resultString = resultString + "main.log.critical(" + message + ")" 304 elif args["LOGLEVEL"] == "WARN" : 305 resultString = resultString + "main.log.warn(" + args["MESSAGE"] + ")" 306 elif args["LOGLEVEL"] == "EXACT" : 307 resultString = resultString + "main.log.exact(" + args["MESSAGE"] + ")" 308 309 310 return resultString
311
312 - def translate_log_message(self,**messageStatement) :
313 ''' 314 This API will translate log messages if it is a string or Variable or combination 315 of string and variable. 316 It will return the analysed and translate message. 317 ''' 318 args = self.parse_args(["MESSAGE"],**messageStatement) 319 resultString = '' 320 321 paramsMatch = re.match("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE",args["MESSAGE"],flags=0) 322 stringMatch = re.match("\s*\"(.*)\"\s*$",args["MESSAGE"],flags=0) 323 stringWidVariableMatch = re.match("\"(.*)\"\s+\+\s+(.*)",args["MESSAGE"],flags=0) 324 if paramsMatch : 325 resultString = resultString + self.translate_parameters(parameters=args["MESSAGE"]) 326 elif stringMatch : 327 resultString = resultString + args["MESSAGE"] 328 elif stringWidVariableMatch: 329 quoteWord = stringWidVariableMatch.group(1) 330 variableRef = stringWidVariableMatch.group(2) 331 varMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]",variableRef,flags=0) 332 varRefMatch = re.search("<(\w+)>",variableRef,flags=0) 333 if varMatch : 334 resultString = resultString + "\"" + quoteWord + "\"" + " + " + self.translate_parameters(parameters=variableRef) 335 elif varRefMatch : 336 resultString = resultString + "\"" + quoteWord + "\"" + " + " + varRefMatch.group(1) 337 else : 338 print "\nError : Syntax error , Not defined way to give log message" + args["MESSAGE"] 339 340 return resultString
341
342 - def translate_assertion(self,**assertStatement):
343 ''' 344 This will translate the ASSERT <value1> <COMPARISON OPERATOR> <value2> into python 345 equivalent to resultString and returns resultString 346 ''' 347 args = self.parse_args(["LEFTVALUE","OPERATOR","RIGHTVALUE","ONPASS","ONFAIL"],**assertStatement) 348 resultString = '' 349 # convert the statement here 350 notOperatorMatch = re.search("NOT\s+(.*)",args["OPERATOR"],flags=0) 351 notOperatorSymbMatch = re.search("\!(.*)",args["OPERATOR"],flags=0) 352 operator = '' 353 lastresultMatch = re.match("LAST_RESULT",args["RIGHTVALUE"],flags=0) 354 lastresponseMatch = re.match("LAST_RESPONSE",args["RIGHTVALUE"],flags=0) 355 if lastresultMatch : 356 operator = "main.last_result" 357 elif lastresponseMatch : 358 operator = "main.last_response" 359 else : 360 operator = args["RIGHTVALUE"] 361 362 if args["OPERATOR"] == None or args["OPERATOR"] == "" : 363 print "\n Error : Operator has not been specified !!!" 364 elif notOperatorMatch or notOperatorSymbMatch: 365 366 operators = notOperatorMatch.group(1) if notOperatorMatch else notOperatorSymbMatch.group(1) 367 operators = self.translate_operator(operator=operators) 368 if self.grtrOrLssr == 0 : 369 resultString = resultString + "utilities.assert_not_" + operators + "(expect=" +\ 370 self.translate_response_result(operator=args["RIGHTVALUE"]) + ",actual=" + self.translate_response_result(operator=args["LEFTVALUE"]) +\ 371 ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\ 372 ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")" 373 else : 374 resultString = resultString + "utilities.assert_not_" + operators + "(expect=" +\ 375 self.translate_response_result(operator=args["LEFTVALUE"]) + ",actual=" + self.translate_response_result(operator=args["RIGHTVALUE"]) +\ 376 ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\ 377 ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")" 378 379 else : 380 operators = self.translate_operator(operator=args["OPERATOR"]) 381 if self.grtrOrLssr == 0 : 382 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\ 383 self.translate_response_result(operator=args["RIGHTVALUE"]) +\ 384 ",actual=" + self.translate_response_result(operator=args["LEFTVALUE"]) +\ 385 ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\ 386 ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")" 387 else : 388 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\ 389 self.translate_response_result(operator=args["LEFTVALUE"]) +\ 390 ",actual=" + self.translate_response_result(operator=args["RIGHTVALUE"]) +\ 391 ",onpass=" + self.translate_assertMessage(message=args["ONPASS"]) +\ 392 ",onfail=" + self.translate_assertMessage(message=args["ONFAIL"]) + ")" 393 394 395 return resultString
396
397 - def translate_response_result(self,**operatorStatement):
398 ''' 399 It will translate the LAST_RESPONSE or LAST_RESULT statement into its equivalent. 400 It returns the translate form in resulString. 401 ''' 402 args = self.parse_args(["OPERATOR"],**operatorStatement) 403 resultString = '' 404 lastResultMatch = re.match("LAST_RESULT",args["OPERATOR"],flags=0) 405 lastResponseMatch = re.match("LAST_RESPONSE",args["OPERATOR"],flags=0) 406 if lastResultMatch : 407 resultString = resultString + "main.last_result" 408 elif lastResponseMatch: 409 resultString = resultString + "main.last_response" 410 else : 411 resultString = resultString + args["OPERATOR"] 412 return resultString
413 414
415 - def translate_assertMessage(self,**messageStatement) :
416 ''' 417 This API will facilitate the translation of assert ONPASS or ONFAIL messages . The message can be 418 a string or calling another API in OpenSpeak syntax. 419 It will return the translated message 420 ''' 421 args = self.parse_args(["MESSAGE"],**messageStatement) 422 423 connectMatch = re.search("CONNECT\s+(\w+)\s+USING\s+(.*)",args["MESSAGE"],flags=0) 424 disconnectMatch = re.search("DISCONNECT\s+(.*)",args["MESSAGE"],flags=0) 425 ondoMatch = re.search("ON\s+(.*)\s+DO\s+(.*)",args["MESSAGE"],flags=0) 426 paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]",args["MESSAGE"],flags=0) 427 stringMatch = re.search("\"(.*)\"|\'(.*)\'",args["MESSAGE"],flags=0) 428 variableMatch = re.search("\<(.*)\>",args["MESSAGE"],flags=0) 429 430 resultString = '' 431 if connectMatch : 432 resultString = resultString + self.translate_connect(component=connectMatch.group(1), 433 arguments=connectMatch.group(2) ) 434 elif disconnectMatch : 435 resultString = resultString + self.translate_disconnect(component=disconnectMatch.group(1)) 436 elif ondoMatch : 437 resultString = resultString + self.translate_onDOAs(component=ondoMatch.group(1), 438 action=ondoMatch.group(2)) 439 elif paramsMatch : 440 resultString = resultString + self.translate_parameters(parameters=args["MESSAGE"]) 441 elif stringMatch : 442 resultString = resultString + "\"" + stringMatch.group(1) + "\"" 443 elif variableMatch : 444 resultString = resultString + variableMatch.group(1) 445 elif args["MESSAGE"] == None : 446 print "\n Error : Please pass a message or action for assertion " 447 448 return resultString
449
450 - def translate_operator(self,**operatorStatement) :
451 ''' 452 It will translate the operator for assertion , by ensuring against given arguments. 453 It will return the translated assertion operator. 454 ''' 455 args = self.parse_args(["OPERATOR"],**operatorStatement) 456 457 resultString = '' 458 equalsMatch = re.match("EQUALS$|==$",args["OPERATOR"],flags=0) 459 greaterMatch = re.match("GREATER\s+THAN$|>$",args["OPERATOR"],flags=0) 460 lesserMatch = re.match("LESSER\s+THAN$|<$",args["OPERATOR"],flags=0) 461 stringMatch = re.match("MATCHES|~$",args["OPERATOR"],flags=0) 462 greaterEqualMatch = re.match("GREATER\s+THAN\s+OR\s+EQUALS$|>=$",args["OPERATOR"],flags=0) 463 lesserEqualMatch = re.match("LESSER\s+THAN\s+OR\s+EQUALS$|<=$",args["OPERATOR"],flags=0) 464 if equalsMatch : 465 466 resultString = resultString + "equals" 467 elif greaterMatch : 468 self.grtrOrLssr = self.grtrOrLssr + 1 469 resultString = resultString + "greater" 470 elif lesserMatch : 471 self.grtrOrLssr = self.grtrOrLssr + 1 472 resultString = resultString + "lesser" 473 elif stringMatch : 474 475 resultString = resultString + "matches" 476 elif greaterEqualMatch: 477 478 resultString = resultString + "greater_equals" 479 elif lesserEqualMatch : 480 481 resultString = resultString + "lesser_equals" 482 else : 483 print "\n Error: Given Operator is not listed for assertion" 484 return resultString
485
486 - def translate_store(self,**storeStatement):
487 ''' 488 This will translate the STORE <variable> IN <value> or <variable> = <value> 489 into python equivalent to resultString and returns resultString 490 ''' 491 args = self.parse_args(["VARIABLE","VALUE"],**storeStatement) 492 resultString = '' 493 # convert the statement here 494 ondoMatch = re.match("^\s*ON\s+(.*)\s+DO\s+(.*)",args["VALUE"],flags=0) 495 paramsMatch = re.match("^\s*PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE",args["VALUE"],flags=0) 496 if paramsMatch : 497 argString = self.translate_parameters(parameters=args["VALUE"]) 498 resultString = args["VARIABLE"] + " = " + argString 499 elif ondoMatch : 500 resultString = args["VARIABLE"] + " = " + self.translate_onDOAs(component=ondoMatch.group(1),action=ondoMatch.group(2)) 501 else : 502 resultString = args["VARIABLE"] + " = " + args["VALUE"] 503 504 505 return resultString
506
507 - def translate_disconnect(self,**disconnectStatement):
508 ''' 509 This will translate the DISCONNECT <component_name> into python 510 equivalent to resultString and returns resultString 511 ''' 512 args = self.parse_args(["COMPONENT"],**disconnectStatement) 513 resultString = '' 514 # convert the statement here 515 resultString = "main." + args["COMPONENT"] + ".disconnect()" 516 return resultString
517
518 - def translate_onDOAs(self,**onDoStatement):
519 ''' 520 This will translate the ON <component> DO <action> USING <arg1> AS <value1>,<arg2> AS <value2> 521 into python equivalent to resultString and returns resultString 522 ''' 523 args = self.parse_args(["COMPONENT","ACTION","ARGUMENTS"],**onDoStatement) 524 subString = '' 525 526 usingMatch = re.match("\s*(.*)\s+USING\s+(.*)",args["ACTION"],flags=0) 527 action = '' 528 if usingMatch : 529 action = usingMatch.group(1) 530 arguments = usingMatch.group(2) 531 subString = self.translate_usingas(arguments=arguments) 532 533 else : 534 andCheck = re.search ("(.*)\s+AND\s+(.*)",args["ACTION"],flags=0) 535 536 action = action + "()" 537 if andCheck: 538 action = andCheck.group(1) + "()" 539 subString = subString + self.handle_conjuction(statement=andCheck.group(2)) 540 else : 541 action = args["ACTION"] 542 action = action + "()" 543 # convert the statement here 544 resultString = "main." + args["COMPONENT"] + "." + action + subString 545 return resultString
546 547
548 - def handle_conjuction(self,**conjuctStatement):
549 ''' 550 This will handle the conjuctions 551 ''' 552 553 args = self.parse_args(["STATEMENT"],**conjuctStatement) 554 subSentence = '' 555 556 storeMatch = re.match("\s*STORE\s+(.*)\s+IN\s+(.*)",args["STATEMENT"],flags=0) 557 assertMatch = re.match("\s*ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)",args["STATEMENT"],flags=0) 558 if storeMatch : 559 subSentence = "\n" + " " * 8 + self.translate_store(variable=storeMatch.group(2), 560 value=storeMatch.group(1)) 561 elif assertMatch : 562 subSentence = "\n" + " " * 8 + self.translate_assertion(leftvalue=assertMatch.group(1), 563 operator=assertMatch.group(2), 564 rightvalue=assertMatch.group(3), 565 onpass=assertMatch.group(4), 566 onfail=assertMatch.group(5)) 567 return subSentence
568
569 - def translate_usingas(self,**argumentAS) :
570 ''' 571 This will tranlate USING argument AS value Statement into equivalent argument passing. 572 It will return translated form into resultString 573 ''' 574 args = self.parse_args(["ARGUMENTS"],**argumentAS) 575 resultString = '' 576 argsList = [] 577 subString = '' 578 subSentence = '' 579 line = '' 580 andCheck = re.search ("(.*)\s+AND\s+(.*)",args["ARGUMENTS"],flags=0) 581 if andCheck: 582 line = andCheck.group(1) 583 subSentence = self.handle_conjuction(statement=andCheck.group(2)) 584 else : 585 line = args["ARGUMENTS"] 586 587 588 589 argsMatch = re.search("(.*),(.*)",line,flags=0) 590 591 592 if args["ARGUMENTS"] == None or args["ARGUMENTS"] == '' : 593 subString = '' 594 elif argsMatch : 595 596 argsList = line.split(",") 597 for index, arguments in enumerate(argsList): 598 argMatch = re.search("(.*)\s+AS\s+(.*)",arguments,flags=0) 599 if argMatch: 600 argsKey = argMatch.group(1) 601 argsValue = argMatch.group(2) 602 paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",argsValue,flags=0) 603 if not paramsMatch : 604 if index == len(argsList) - 1 : 605 subString = subString + argsKey + "=" + argsValue 606 else : 607 subString = subString + argsKey + "=" + argsValue + "," 608 else : 609 argString = self.translate_parameters(parameters=argsValue) 610 if index == len(argsList) - 1 : 611 subString = subString + argsKey + "=" + argString 612 else : 613 subString = subString + argsKey + "=" + argString + "," 614 else : 615 if index == len(argsList) - 1 : 616 subString = subString + arguments 617 else : 618 subString = subString + arguments + "," 619 else : 620 argMatch = re.search("(.*)\s+AS\s+(.*)",args["ARGUMENTS"],flags=0) 621 if argMatch: 622 argsKey = argMatch.group(1) 623 argsValue = argMatch.group(2) 624 paramsMatch = re.search("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",argsValue,flags=0) 625 if not paramsMatch : 626 subString = subString + argsKey + "=" + argsValue 627 else : 628 argString = self.translate_parameters(parameters=argsValue) 629 subString = subString + argsKey + "=" + argString 630 else : 631 paramsMatch = re.match("PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT",line,flags=0) 632 if paramsMatch : 633 subString = subString + self.translate_parameters(parameters=line) 634 else : 635 subString = subString + line 636 resultString = "(" + subString + ")"+ subSentence 637 return resultString
638 639
640 - def translate_connect(self,**connectStatement):
641 ''' 642 This will translate the CONNECT <component_name> USING1 <arg1> AS <value1>, <arg2> AS <value2> 643 into python equivalent to resultString and returns resultString 644 ''' 645 args = self.parse_args(["COMPONENT","ARGUMENTS"],**connectStatement) 646 resultString = '' 647 subString = self.translate_usingas(arguments=args["ARGUMENTS"]) 648 # convert the statement here 649 resultString = "main." + args["COMPONENT"] + ".connect(" + subString + ")" 650 return resultString
651 652
653 - def translate_parameters(self,**parameterStatement):
654 ''' 655 This will translate the OpenSpeak Case and Params parameters into python equivalent 656 to resultString and returns resultString 657 ''' 658 args = self.parse_args(["PARAMETERS"],**parameterStatement) 659 argument = args["PARAMETERS"] 660 resultString = '' 661 ### match arguments 662 paramsMatch = re.search("PARAMS((\[(.*)\])*)",argument,flags=0) 663 stepsMatch = re.search("STEP((\[(.*)\])*)",argument,flags=0) 664 casesMatch = re.search("CASE((\[(.*)\])*)",argument,flags=0) 665 topoMatch = re.search("TOPO((\[(.*)\])*)",argument,flags=0) 666 lastResultMatch = re.match("LAST_RESULT",argument,flags=0) 667 lastResponseMatch = re.match("LAST_RESPONSE",argument,flags=0) 668 # convert the statement here 669 if paramsMatch : 670 params = paramsMatch.group(1) 671 resultString = resultString + "main.params" + self._argsCheck(checkvar=params) 672 elif stepsMatch : 673 resultString = resultString +"main.params[\'" + self.CurrentCase +\ 674 "\'][\'STEP" + str(self.CurrentStep) + "\']" +\ 675 self._argsCheck(checkvar=stepsMatch.group(1)) 676 elif casesMatch : 677 resultString = resultString + "main.params[\'" + self.CurrentCase + "\']" +\ 678 self._argsCheck(checkvar=casesMatch.group(1)) 679 elif topoMatch : 680 resultString = resultString + "main.componentDictionary" +\ 681 self._argsCheck(checkvar=topoMatch.group(1)) 682 elif lastResultMatch : 683 resultString = resultString + "main.last_result" 684 elif lastResponseMatch : 685 resultString = resultString + "main.last_response" 686 return resultString
687
688 - def _argsCheck(self,**args):
689 ''' This API will check if given argument is varibale reference or String and will translate accordingly. 690 It will return the tanslate form in resultString. 691 ''' 692 args = self.parse_args(["CHECKVAR"],**args) 693 params = args["CHECKVAR"] 694 argsList = params.split("]") 695 resultString = '' 696 del argsList[len(argsList) - 1] 697 for index,paramArgs in enumerate(argsList) : 698 argsWidVariable = re.search("(\"|\')\s*(\w+)\s*(\'|\")",paramArgs,flags=0) 699 if argsWidVariable : 700 resultString = resultString + "[\'" + argsWidVariable.group(2) + "\']" 701 else : 702 resultString = resultString + paramArgs + "]" 703 return resultString
704
705 - def translate_step(self,**stepStatement):
706 ''' 707 This will translate the STEP "DO SOMETHING HERE" into python equivalent 708 to resultString and returns resultString 709 ''' 710 args = self.parse_args(["STEP"],**stepStatement) 711 resultString = '' 712 resultString = "main.step(\"" + args["STEP"] + "\")" 713 # convert the statement here 714 return resultString
715 716
717 - def translate_comment(self,**commentStatement):
718 ''' 719 This will translate the COMMENT "DO SOMETHING HERE" into python equivalent 720 to resultString and returns resultString 721 ''' 722 args = self.parse_args(["COMMENT"],**commentStatement) 723 resultString = '' 724 resultString = "#" + args["COMMENT"] 725 # convert the statement here 726 return resultString
727
728 - def translate_testcase_name(self,**nameStatement):
729 ''' 730 This method will convert NAME "<Testcase_name>" into python equivalent statement 731 to resultString and returns resultString 732 ''' 733 args = self.parse_args(["TESTNAME"],**nameStatement) 734 735 resultString = '' 736 resultString = "main.case(\"" + args["TESTNAME"] + "\")" 737 # convert the statement here 738 return resultString
739 740
741 - def translate_case_block(self,**caseBlock):
742 ''' 743 This method will translate the case block in test script . 744 It returns the translated equivalent python code for test script 745 ''' 746 args = self.parse_args(["CASENUMBER"],**caseBlock) 747 resultString = "" 748 resultString = "def CASE" + str(args["CASENUMBER"]) + "(self,main) :\n" 749 # process the caseBlock List translate all statements underlying the given case 750 return resultString
751 752 753
754 - def translate_loop_block(self,*loopBlock):
755 ''' 756 This method will translate for loop block into its equivalent python code. 757 Whole loop block will be passed into loopBlock List. 758 It returns the transalted reuslt as a string. 759 ''' 760 resultString = '' 761 # process the loopBlock List translate all statements underlying the given loop block 762 return resultString
763 764
765 - def translate_conjuction(self,conjuctionStatement):
766 ''' 767 This will translate the AND conjuction statements into python equivalent 768 to resultString and returns resultString 769 ''' 770 resultString = '' 771 # convert the statement here 772 return resultString
773 774
775 - def parse_args(self,args, **kwargs):
776 ''' 777 It will accept the (key,value) pair and will return the (key,value) pairs with keys in uppercase. 778 ''' 779 newArgs = {} 780 for key,value in kwargs.iteritems(): 781 #currentKey = str.upper(key) 782 if isinstance(args,list) and str.upper(key) in args: 783 for each in args: 784 if each==str.upper(key): 785 newArgs [str(each)] = value 786 elif each != str.upper(key) and (newArgs.has_key(str(each)) == False ): 787 newArgs[str(each)] = None 788 789 790 791 return newArgs
792