blob: dfcfe429b8d8ed5fa77ca018d3c81ad1f889d5bc [file] [log] [blame]
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -07001# /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 Ronquillo23fb2162017-09-15 14:59:57 -070013 ( 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 Ronquillo23fb2162017-09-15 14:59:57 -070024"""
adminbae64d82013-08-01 10:50:15 -070025import re
26import inspect
27
28
29class OpenSpeak:
30
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070031 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 Ronquillo23fb2162017-09-15 14:59:57 -070037 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 Ronquillo23fb2162017-09-15 14:59:57 -070042 """
43 args = self.parse_args( [ "OPENSPEAKFILE", "TEXT", "WRITETOFILE", "FILEHANDLE" ], **compileParameters )
adminbae64d82013-08-01 10:50:15 -070044 resultString = ''
45 Test = "Mininet"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070046 args[ "WRITETOFILE" ] = args[ "WRITETOFILE" ] if args[ "WRITETOFILE" ] is not None else 1
adminbae64d82013-08-01 10:50:15 -070047 self.CurrentStep = 0
48 self.CurrentCase = ''
Jon Hall4ba53f02015-07-29 13:07:41 -070049
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070050 # here Open Speak file will be parsed by each line and translated.
51 if args[ "OPENSPEAKFILE" ] is not None and args[ "TEXT" ] is None and args[ "FILEHANDLE" ] is None:
52 self.openspeakfile = args[ "OPENSPEAKFILE" ]
53 openSpeakFile = open( args[ "OPENSPEAKFILE" ], "r" ).readlines()
Jon Hall4ba53f02015-07-29 13:07:41 -070054
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070055 elif args[ "OPENSPEAKFILE" ] is None and args[ "TEXT" ] and args[ "FILEHANDLE" ] is None:
56 openSpeakFile = args[ "TEXT" ].split( "\n" )
57 elif args[ "FILEHANDLE" ] and args[ "OPENSPEAKFILE" ] is None and args[ "TEXT" ] is None:
58 openSpeakFile = args[ "FILEHANDLE" ].readlines()
Jon Hall4ba53f02015-07-29 13:07:41 -070059
adminbae64d82013-08-01 10:50:15 -070060 index = 0
61 outputFile = []
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070062 testName = re.search( "\/(.*)\.ospk$", self.openspeakfile, 0 )
63 testName = testName.group( 1 )
64 testName = testName.split( "/" )
65 testName = testName[ len( testName ) - 1 ]
66 outputFile.append( "\nclass " + testName + " :" + "\n" )
67 outputFile.append( "\n" + " " * 4 + "def __init__(self) :" )
68 outputFile.append( "\n" + " " * 8 + "self.default = \'\'" + "\n" )
Jon Hall4ba53f02015-07-29 13:07:41 -070069
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070070 while index < len( openSpeakFile ):
71 ifelseMatch = re.match( "\s+IF|\s+ELSE|\s+ELIF", openSpeakFile[ index ], flags=0 )
72 line = openSpeakFile[ index ]
73 repeatMatch = re.match( "\s*REPEAT", openSpeakFile[ index ], flags=0 )
74 if ifelseMatch:
75 result = self.verify_and_translate( line )
76 initialSpaces = len( line ) - len( line.lstrip() )
Jon Hall4ba53f02015-07-29 13:07:41 -070077 self.outLoopSpace = initialSpaces
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070078 nextLine = openSpeakFile[ index + 1 ]
79 nextinitialSpaces = len( nextLine ) - len( nextLine.lstrip() )
Jon Hall4ba53f02015-07-29 13:07:41 -070080
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070081 while nextinitialSpaces > initialSpaces:
82 try:
83 elseMatch = re.match( "\s*ELSE|\s*ELIF", nextLine, flags=0 )
84 if elseMatch:
85 self.flag = self.flag - 1
86 result = result + self.verify_and_translate( nextLine )
87 nextLine = openSpeakFile[ index + 1 ]
88 nextinitialSpaces = len( nextLine ) - len( nextLine.lstrip() )
adminbae64d82013-08-01 10:50:15 -070089 except IndexError:
Jon Hall4ba53f02015-07-29 13:07:41 -070090 pass
adminbae64d82013-08-01 10:50:15 -070091 index = index + 1
Jon Hall4ba53f02015-07-29 13:07:41 -070092 self.flag = 0
adminbae64d82013-08-01 10:50:15 -070093 elif repeatMatch:
94 self.flag = 0
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070095 result = self.verify_and_translate( line )
adminbae64d82013-08-01 10:50:15 -070096 index = index + 1
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -070097 endMatch = re.match( "\s*END", openSpeakFile[ index ], flags=0 )
98 while not endMatch:
99 try:
Jon Hall4ba53f02015-07-29 13:07:41 -0700100
adminbae64d82013-08-01 10:50:15 -0700101 self.flag = self.flag + 1
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700102 result = result + self.verify_and_translate( openSpeakFile[ index ] )
adminbae64d82013-08-01 10:50:15 -0700103 index = index + 1
Jon Hall4ba53f02015-07-29 13:07:41 -0700104
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700105 except IndexError:
adminbae64d82013-08-01 10:50:15 -0700106 pass
Jon Hall4ba53f02015-07-29 13:07:41 -0700107
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700108 else:
adminbae64d82013-08-01 10:50:15 -0700109 self.flag = 0
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700110 result = self.verify_and_translate( line )
adminbae64d82013-08-01 10:50:15 -0700111 index = index + 1
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700112 outputFile.append( result )
adminbae64d82013-08-01 10:50:15 -0700113
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700114 if args[ "WRITETOFILE" ] == 1:
115 testscript = re.sub( "ospk", "py", self.openspeakfile, 0 )
116 testScript = open( testscript, "w" )
117 for lines in outputFile:
118 testScript.write( lines )
adminbae64d82013-08-01 10:50:15 -0700119 testScript.close()
120 return resultString
Jon Hall4ba53f02015-07-29 13:07:41 -0700121
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700122 def verify_and_translate( self, line ):
123 """
adminbae64d82013-08-01 10:50:15 -0700124 It will accept the each line and calls the suitable API to conver into pyton equivalent syntax .
Jon Hall4ba53f02015-07-29 13:07:41 -0700125 It will return the translated python syntax .
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700126 """
127 lineSpace = re.match( "^\s+", line, flags=0 )
128 initialSpaces = len( line ) - len( line.lstrip() )
129 line = re.sub( "^\s+", "", line ) if lineSpace else line
Jon Hall4ba53f02015-07-29 13:07:41 -0700130
adminbae64d82013-08-01 10:50:15 -0700131 resultString = None
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700132 resultString = "\n" + " " * 4 if str( inspect.stack()[ 1 ][ 3 ] ) == "compiler" else "\n"
133 indent = " " * ( 4 + 4 * self.flag ) if self.flag > 0 else " " * 4
134 caseMatch = re.search( "^CASE\s+(\d+)", line, flags=0 )
135 nameMatch = re.match( "^NAME\s+\"( .* )\"", line, flags=0 )
136 commentMatch = re.match( "^COMMENT\s+\"( .* )\"", line, flags=0 )
137 stepMatch = re.match( "^STEP\s+\"( .* )\"", line, flags=0 )
138 connectMatch = re.match( "^CONNECT\s+(\w+)\s+USING\s+(.*)", line, flags=0 )
139 disconnectMatch = re.match( "^DISCONNECT\s+(.*)", line, flags=0 )
140 ondoMatch = re.match( "^ON\s+(.*)\s+DO\s+(.*)", line, flags=0 )
Jon Hall4ba53f02015-07-29 13:07:41 -0700141
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700142 storeMatch = re.match( "^STORE\s+(.*)\s+IN\s+(.*)", line, flags=0 )
143 variableMatch = re.match( "^(.*)\s+=\s+(.*)", line, flags=0 )
144 assertMatch = re.match( "^ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)", line, flags=0 )
145 logMatch = re.match( "^(ERROR|INFO|DEBUG|CRITICAL|REPORT|EXACT|WARN)\s+(.*)", line, flags=0 )
146 ifloop = re.match( "IF\s+(\w+)\s*(..|\w+)\s*(.*)", line, flags=0 )
147 elseloopMatch = re.match( "ELSE\s*$", line, flags=0 )
148 elifloop = re.match( "ELSE\sIF\s+(\w+)\s*(..|\w+)\s*(.*)", line, flags=0 )
149 forloopMatch = re.match( "\s*REPEAT\s+(/d+)\s+TIMES", line, flags=0 )
150 experimentalMatch = re.match( "EXPERIMENTAL\s+MODE\s+(\w+)", line, flags=0 )
151 repeatMatch = re.match( "\s*REPEAT\s+(\d+)\s+TIMES", line, flags=0 )
Jon Hall4ba53f02015-07-29 13:07:41 -0700152
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700153 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 -0700154
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700155 if caseMatch:
adminbae64d82013-08-01 10:50:15 -0700156 self.CurrentStep = 0
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700157 self.CurrentCase = "CASE" + caseMatch.group( 1 )
158 resultString = resultString + self.translate_case_block( casenumber=caseMatch.group( 1 ) )
adminbae64d82013-08-01 10:50:15 -0700159 elif repeatMatch:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700160 resultString = resultString + indent + self.translate_repeat( repeat=repeatMatch.group( 1 ) )
161 elif nameMatch:
162 resultString = resultString + indent + self.translate_testcase_name( testname=nameMatch.group( 1 ) )
163 elif commentMatch:
164 resultString = resultString + indent + self.translate_comment( comment=commentMatch.group( 1 ) )
165 elif stepMatch:
adminbae64d82013-08-01 10:50:15 -0700166 self.CurrentStep = self.CurrentStep + 1
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700167 resultString = resultString + indent + self.translate_step( step=stepMatch.group( 1 ) )
168 elif connectMatch:
169 resultString = resultString + indent + self.translate_connect( component=connectMatch.group( 1 ),
170 arguments=connectMatch.group( 2 ) )
171 elif disconnectMatch:
172 resultString = resultString + indent + self.translate_disconnect( component=disconnectMatch.group( 1 ) )
173 elif ondoMatch:
174 resultString = resultString + indent + self.translate_onDOAs( component=ondoMatch.group( 1 ), action=ondoMatch.group( 2 ) )
175 elif storeMatch:
176 resultString = resultString + indent + self.translate_store( variable=storeMatch.group( 2 ),
177 value=storeMatch.group( 1 ) )
178 elif variableMatch:
179 resultString = resultString + indent + self.translate_store( variable=variableMatch.group( 1 ),
180 value=variableMatch.group( 2 ) )
181 elif assertMatch:
182 resultString = resultString + indent + self.translate_assertion( leftvalue=assertMatch.group( 1 ),
183 operator=assertMatch.group( 2 ),
184 rightvalue=assertMatch.group( 3 ),
185 onpass=assertMatch.group( 4 ),
186 onfail=assertMatch.group( 5 ) )
187 elif logMatch:
188 resultString = resultString + indent + self.translate_logs( loglevel=logMatch.group( 1 ),
189 message=logMatch.group( 2 ) )
190 elif ifloop:
Jon Hall4ba53f02015-07-29 13:07:41 -0700191
192 self.initSpace = initialSpaces
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700193 operand = ifloop.group( 1 )
194 operator = ifloop.group( 2 )
195 value = ifloop.group( 3 )
196 resultString = resultString + indent + "if " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
Jon Hall4ba53f02015-07-29 13:07:41 -0700197 self.flag = self.flag + 1
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700198 elif experimentalMatch:
199 resultString = resultString + indent + self.translate_experimental_mode( mode=experimentalMatch.group( 1 ) )
Jon Hall4ba53f02015-07-29 13:07:41 -0700200
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700201 elif elseloopMatch:
adminbae64d82013-08-01 10:50:15 -0700202 if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace:
203 resultString = resultString + indent + "else :"
204 self.flag = self.flag + 1
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700205 else:
206 indent = " " * ( 4 + 4 * ( self.flag - 1 ) )
adminbae64d82013-08-01 10:50:15 -0700207 resultString = resultString + indent + "else :"
208 self.flag = self.flag + 1
Jon Hall4ba53f02015-07-29 13:07:41 -0700209
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700210 elif elifloop:
Jon Hall4ba53f02015-07-29 13:07:41 -0700211
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700212 operand = elifloop.group( 1 )
213 operator = elifloop.group( 2 )
214 value = elifloop.group( 3 )
adminbae64d82013-08-01 10:50:15 -0700215 if initialSpaces == self.initSpace or initialSpaces == self.outLoopSpace:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700216 resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
Jon Hall4ba53f02015-07-29 13:07:41 -0700217 self.flag = self.flag + 1
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700218 else:
219 indent = " " * ( 4 + 4 * ( self.flag - 1 ) )
220 resultString = resultString + indent + "elif " + operand + self.translate_if_else_operator( conditionoperator=operator ) + value + ":"
adminbae64d82013-08-01 10:50:15 -0700221 self.flag = self.flag + 1
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700222 elif response_pasrse:
223 output_string = response_pasrse.group( 1 )
224 req_format = response_pasrse.group( 2 )
225 store_in = response_pasrse.group( 3 )
226 resultString = resultString + indent + store_in + '= main.response_parser(' + output_string + ",\"" + req_format + "\")"
Jon Hall4ba53f02015-07-29 13:07:41 -0700227 self.flag = self.flag + 1
adminbae64d82013-08-01 10:50:15 -0700228
229 return resultString
230
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700231 def translate_repeat( self, **repeatStatement ):
232 """
adminbae64d82013-08-01 10:50:15 -0700233 this will transalte the repeat statement into a python equivalen while loop
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700234 """
235 args = self.parse_args( [ "REPEAT" ], **repeatStatement )
adminbae64d82013-08-01 10:50:15 -0700236 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700237
adminbae64d82013-08-01 10:50:15 -0700238 resultString = "i = 0"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700239 resultString = resultString + "\n" + " " * 8 + "while i<" + args[ "REPEAT" ] + " :"
adminbae64d82013-08-01 10:50:15 -0700240 return resultString
Jon Hall4ba53f02015-07-29 13:07:41 -0700241
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700242 def translate_if_else_operator( self, **loopBlock ):
243 """
adminbae64d82013-08-01 10:50:15 -0700244 This method will translate if-else loop block into its equivalent python code.
Jon Hall4ba53f02015-07-29 13:07:41 -0700245 Whole loop block will be passed into loopBlock List.
adminbae64d82013-08-01 10:50:15 -0700246 It returns the transalted reuslt as a string.
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700247 """
248 args = self.parse_args( [ "CONDITIONOPERATOR" ], **loopBlock )
adminbae64d82013-08-01 10:50:15 -0700249 resultString = ''
250 # process the loopBlock List translate all statements underlying the given loop block
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700251 equalsMatch = re.match( "EQUALS$|==\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
252 greaterMatch = re.match( "GREATER\s+THAN$|>\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
253 lesserMatch = re.match( "LESSER\s+THAN$|<\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
254 greaterEqualMatch = re.match( "GREATER\s+THAN\s+OR\s+EQUALS$|>=\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
255 lesserEqualMatch = re.match( "LESSER\s+THAN\s+OR\s+EQUALS$|<=\s*$", args[ "CONDITIONOPERATOR" ], flags=0 )
256 if equalsMatch:
adminbae64d82013-08-01 10:50:15 -0700257 resultString = resultString + " == "
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700258 elif greaterMatch:
adminbae64d82013-08-01 10:50:15 -0700259 resultString = resultString + " > "
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700260 elif lesserMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700261 resultString = resultString + " < "
adminbae64d82013-08-01 10:50:15 -0700262 elif greaterEqualMatch:
263 resultString = resultString + " >= "
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700264 elif lesserEqualMatch:
adminbae64d82013-08-01 10:50:15 -0700265 resultString = resultString + " <= "
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700266 else:
Jon Hall4ba53f02015-07-29 13:07:41 -0700267 print "\n Error: Given Operator is not listed "
268
269 return resultString
270
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700271 def translate_experimental_mode( self, **modeType ):
272 """
adminbae64d82013-08-01 10:50:15 -0700273 This API will translate statment EXPERIMENTAL MODE ON/OFF into python equivalent.
274 It will return the transalted value.
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700275 """
276 args = self.parse_args( [ "MODE" ], **modeType )
adminbae64d82013-08-01 10:50:15 -0700277 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700278 ONmatch = re.match( "\s*ON", args[ "MODE" ], flags=0 )
279 OFFmatch = re.match( "\sOFF", args[ "MODE" ], flags=0 )
adminbae64d82013-08-01 10:50:15 -0700280
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700281 if ONmatch:
adminbae64d82013-08-01 10:50:15 -0700282 resultString = "main.EXPERIMENTAL_MODE = main.TRUE"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700283 elif OFFmatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700284 resultString = "main.EXPERIMENTAL_MODE = main.FALSE"
adminbae64d82013-08-01 10:50:15 -0700285
286 return resultString
287
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700288 def interpret( self, **interpetParameters ):
289 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700290 This method will accept the OpenSpeak syntax into a string and will return
adminbae64d82013-08-01 10:50:15 -0700291 a python equivalent translations statement
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700292 """
293 args = self.parse_args( [ "TEXT", "WRITETOFILE" ], **interpetParameters )
adminbae64d82013-08-01 10:50:15 -0700294 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700295 # here Open Speak syntax will be translated into python equivalent.
296 resultString = self.verify_and_translate( args[ "TEXT" ] )
297 lineSpace = re.match( "^\s+", resultString, flags=0 )
Jon Hall4ba53f02015-07-29 13:07:41 -0700298
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700299 resultString = re.sub( "^\s+", "", resultString ) if lineSpace else resultString
adminbae64d82013-08-01 10:50:15 -0700300 return resultString
301
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700302 def translate_logs( self, **logStatement ):
303 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700304 This will translate the OpenSpeak log message statements into python equivalent
adminbae64d82013-08-01 10:50:15 -0700305 to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700306 """
307 args = self.parse_args( [ "LOGLEVEL", "MESSAGE" ], **logStatement )
adminbae64d82013-08-01 10:50:15 -0700308 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700309 # convert the statement here
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700310 message = self.translate_log_message( message=args[ "MESSAGE" ] )
311 if args[ "LOGLEVEL" ] == "INFO":
adminbae64d82013-08-01 10:50:15 -0700312 resultString = resultString + "main.log.info(" + message + ")"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700313 elif args[ "LOGLEVEL" ] == "ERROR":
314 resultString = resultString + "main.log.error(" + message + ")"
315 elif args[ "LOGLEVEL" ] == "DEBUG":
adminbae64d82013-08-01 10:50:15 -0700316 resultString = resultString + "main.log.debug(" + message + ")"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700317 elif args[ "LOGLEVEL" ] == "REPORT":
Jon Hall4ba53f02015-07-29 13:07:41 -0700318 resultString = resultString + "main.log.report(" + message + ")"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700319 elif args[ "LOGLEVEL" ] == "CRITICAL":
adminbae64d82013-08-01 10:50:15 -0700320 resultString = resultString + "main.log.critical(" + message + ")"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700321 elif args[ "LOGLEVEL" ] == "WARN":
322 resultString = resultString + "main.log.warn(" + args[ "MESSAGE" ] + ")"
323 elif args[ "LOGLEVEL" ] == "EXACT":
324 resultString = resultString + "main.log.exact(" + args[ "MESSAGE" ] + ")"
Jon Hall4ba53f02015-07-29 13:07:41 -0700325
adminbae64d82013-08-01 10:50:15 -0700326 return resultString
327
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700328 def translate_log_message( self, **messageStatement ):
329 """
adminbae64d82013-08-01 10:50:15 -0700330 This API will translate log messages if it is a string or Variable or combination
Jon Hall4ba53f02015-07-29 13:07:41 -0700331 of string and variable.
adminbae64d82013-08-01 10:50:15 -0700332 It will return the analysed and translate message.
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700333 """
334 args = self.parse_args( [ "MESSAGE" ], **messageStatement )
adminbae64d82013-08-01 10:50:15 -0700335 resultString = ''
336
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700337 paramsMatch = re.match( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE", args[ "MESSAGE" ], flags=0 )
338 stringMatch = re.match( "\s*\"( .* )\"\s*$", args[ "MESSAGE" ], flags=0 )
339 stringWidVariableMatch = re.match( "\"( .* )\"\s+\+\s+(.*)", args[ "MESSAGE" ], flags=0 )
340 varRefMatch = re.search( "\<(\w+)\>", args[ "MESSAGE" ], flags=0 )
341 if paramsMatch:
342 resultString = resultString + self.translate_parameters( parameters=args[ "MESSAGE" ] )
343 elif stringMatch:
344 resultString = resultString + args[ "MESSAGE" ]
adminbae64d82013-08-01 10:50:15 -0700345 elif stringWidVariableMatch:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700346 quoteWord = stringWidVariableMatch.group( 1 )
347 variableRef = stringWidVariableMatch.group( 2 )
348 varMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]", variableRef, flags=0 )
349 varRefMatch = re.search( "\<(\w+)\>", variableRef, flags=0 )
350 if varMatch:
351 resultString = resultString + "\"" + quoteWord + "\"" + " + " + self.translate_parameters( parameters=variableRef )
352 elif varRefMatch:
353 resultString = resultString + "\"" + quoteWord + "\"" + " + " + varRefMatch.group( 1 )
adminbae64d82013-08-01 10:50:15 -0700354 elif varRefMatch:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700355 resultString = resultString + varRefMatch.group( 1 )
356 else:
357 print "\nError : Syntax error , Not defined way to give log message" + args[ "MESSAGE" ]
adminbae64d82013-08-01 10:50:15 -0700358
Jon Hall4ba53f02015-07-29 13:07:41 -0700359 return resultString
360
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700361 def translate_assertion( self, **assertStatement ):
362 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700363 This will translate the ASSERT <value1> <COMPARISON OPERATOR> <value2> into python
adminbae64d82013-08-01 10:50:15 -0700364 equivalent to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700365 """
366 args = self.parse_args( [ "LEFTVALUE", "OPERATOR", "RIGHTVALUE", "ONPASS", "ONFAIL" ], **assertStatement )
adminbae64d82013-08-01 10:50:15 -0700367 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700368 # convert the statement here
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700369 notOperatorMatch = re.search( "NOT\s+(.*)", args[ "OPERATOR" ], flags=0 )
370 notOperatorSymbMatch = re.search( "\!(.*)", args[ "OPERATOR" ], flags=0 )
adminbae64d82013-08-01 10:50:15 -0700371 operator = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700372 lastresultMatch = re.match( "LAST_RESULT", args[ "RIGHTVALUE" ], flags=0 )
373 lastresponseMatch = re.match( "LAST_RESPONSE", args[ "RIGHTVALUE" ], flags=0 )
374 if lastresultMatch:
adminbae64d82013-08-01 10:50:15 -0700375 operator = "main.last_result"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700376 elif lastresponseMatch:
adminbae64d82013-08-01 10:50:15 -0700377 operator = "main.last_response"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700378 else:
379 operator = args[ "RIGHTVALUE" ]
Jon Hall4ba53f02015-07-29 13:07:41 -0700380
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700381 if args[ "OPERATOR" ] is None or args[ "OPERATOR" ] == "":
adminbae64d82013-08-01 10:50:15 -0700382 print "\n Error : Operator has not been specified !!!"
383 elif notOperatorMatch or notOperatorSymbMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700384
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700385 operators = notOperatorMatch.group( 1 ) if notOperatorMatch else notOperatorSymbMatch.group( 1 )
386 operators = self.translate_operator( operator=operators )
387 if self.grtrOrLssr == 0:
adminbae64d82013-08-01 10:50:15 -0700388 resultString = resultString + "utilities.assert_not_" + operators + "(expect=" +\
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700389 self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) + ",actual=" + self.translate_response_result( operator=args[ "LEFTVALUE" ] ) +\
390 ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) +\
391 ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
392 else:
adminbae64d82013-08-01 10:50:15 -0700393 resultString = resultString + "utilities.assert_not_" + operators + "(expect=" +\
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700394 self.translate_response_result( operator=args[ "LEFTVALUE" ] ) + ",actual=" + self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) +\
395 ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) +\
396 ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
adminbae64d82013-08-01 10:50:15 -0700397
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700398 else:
399 operators = self.translate_operator( operator=args[ "OPERATOR" ] )
400 if self.grtrOrLssr == 0:
adminbae64d82013-08-01 10:50:15 -0700401 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700402 self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) +\
403 ",actual=" + self.translate_response_result( operator=args[ "LEFTVALUE" ] ) +\
404 ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) +\
405 ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
406 else:
adminbae64d82013-08-01 10:50:15 -0700407 resultString = resultString + "utilities.assert_" + operators + "(expect=" +\
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700408 self.translate_response_result( operator=args[ "LEFTVALUE" ] ) +\
409 ",actual=" + self.translate_response_result( operator=args[ "RIGHTVALUE" ] ) +\
410 ",onpass=" + self.translate_assertMessage( message=args[ "ONPASS" ] ) +\
411 ",onfail=" + self.translate_assertMessage( message=args[ "ONFAIL" ] ) + ")"
Jon Hall4ba53f02015-07-29 13:07:41 -0700412
adminbae64d82013-08-01 10:50:15 -0700413 return resultString
414
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700415 def translate_response_result( self, **operatorStatement ):
416 """
adminbae64d82013-08-01 10:50:15 -0700417 It will translate the LAST_RESPONSE or LAST_RESULT statement into its equivalent.
418 It returns the translate form in resulString.
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700419 """
420 args = self.parse_args( [ "OPERATOR" ], **operatorStatement )
adminbae64d82013-08-01 10:50:15 -0700421 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700422 lastResultMatch = re.match( "LAST_RESULT", args[ "OPERATOR" ], flags=0 )
423 lastResponseMatch = re.match( "LAST_RESPONSE", args[ "OPERATOR" ], flags=0 )
424 if lastResultMatch:
adminbae64d82013-08-01 10:50:15 -0700425 resultString = resultString + "main.last_result"
426 elif lastResponseMatch:
427 resultString = resultString + "main.last_response"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700428 else:
429 resultString = resultString + args[ "OPERATOR" ]
adminbae64d82013-08-01 10:50:15 -0700430 return resultString
431
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700432 def translate_assertMessage( self, **messageStatement ):
433 """
adminbae64d82013-08-01 10:50:15 -0700434 This API will facilitate the translation of assert ONPASS or ONFAIL messages . The message can be
435 a string or calling another API in OpenSpeak syntax.
436 It will return the translated message
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700437 """
438 args = self.parse_args( [ "MESSAGE" ], **messageStatement )
Jon Hall4ba53f02015-07-29 13:07:41 -0700439
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700440 connectMatch = re.search( "CONNECT\s+(\w+)\s+USING\s+(.*)", args[ "MESSAGE" ], flags=0 )
441 disconnectMatch = re.search( "DISCONNECT\s+(.*)", args[ "MESSAGE" ], flags=0 )
442 ondoMatch = re.search( "ON\s+(.*)\s+DO\s+(.*)", args[ "MESSAGE" ], flags=0 )
443 paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]", args[ "MESSAGE" ], flags=0 )
444 stringMatch = re.search( "\"( .* )\"|\'(.*)\'", args[ "MESSAGE" ], flags=0 )
445 variableMatch = re.search( "\<(.*)\>", args[ "MESSAGE" ], flags=0 )
adminbae64d82013-08-01 10:50:15 -0700446
447 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700448 if connectMatch:
449 resultString = resultString + self.translate_connect( component=connectMatch.group( 1 ),
450 arguments=connectMatch.group( 2 ) )
451 elif disconnectMatch:
452 resultString = resultString + self.translate_disconnect( component=disconnectMatch.group( 1 ) )
453 elif ondoMatch:
454 resultString = resultString + self.translate_onDOAs( component=ondoMatch.group( 1 ),
455 action=ondoMatch.group( 2 ) )
456 elif paramsMatch:
457 resultString = resultString + self.translate_parameters( parameters=args[ "MESSAGE" ] )
458 elif stringMatch:
adminbae64d82013-08-01 10:50:15 -0700459 resultString = resultString + "\"" + stringMatch.group(1) + "\""
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700460 elif variableMatch:
461 resultString = resultString + variableMatch.group( 1 )
462 elif args[ "MESSAGE" ] is None:
Jon Hall4ba53f02015-07-29 13:07:41 -0700463 print "\n Error : Please pass a message or action for assertion "
464
465 return resultString
466
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700467 def translate_operator( self, **operatorStatement ):
468 """
adminbae64d82013-08-01 10:50:15 -0700469 It will translate the operator for assertion , by ensuring against given arguments.
470 It will return the translated assertion operator.
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700471 """
472 args = self.parse_args( [ "OPERATOR" ], **operatorStatement )
Jon Hall4ba53f02015-07-29 13:07:41 -0700473
adminbae64d82013-08-01 10:50:15 -0700474 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700475 equalsMatch = re.match( "EQUALS$|==$", args[ "OPERATOR" ], flags=0 )
476 greaterMatch = re.match( "GREATER\s+THAN$|>$", args[ "OPERATOR" ], flags=0 )
477 lesserMatch = re.match( "LESSER\s+THAN$|<$", args[ "OPERATOR" ], flags=0 )
478 stringMatch = re.match( "MATCHES|~$", args[ "OPERATOR" ], flags=0 )
479 greaterEqualMatch = re.match( "GREATER\s+THAN\s+OR\s+EQUALS$|>=$", args[ "OPERATOR" ], flags=0 )
480 lesserEqualMatch = re.match( "LESSER\s+THAN\s+OR\s+EQUALS$|<=$", args[ "OPERATOR" ], flags=0 )
481 if equalsMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700482
adminbae64d82013-08-01 10:50:15 -0700483 resultString = resultString + "equals"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700484 elif greaterMatch:
adminbae64d82013-08-01 10:50:15 -0700485 self.grtrOrLssr = self.grtrOrLssr + 1
486 resultString = resultString + "greater"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700487 elif lesserMatch:
adminbae64d82013-08-01 10:50:15 -0700488 self.grtrOrLssr = self.grtrOrLssr + 1
489 resultString = resultString + "lesser"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700490 elif stringMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700491
adminbae64d82013-08-01 10:50:15 -0700492 resultString = resultString + "matches"
493 elif greaterEqualMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700494
adminbae64d82013-08-01 10:50:15 -0700495 resultString = resultString + "greater_equals"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700496 elif lesserEqualMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700497
adminbae64d82013-08-01 10:50:15 -0700498 resultString = resultString + "lesser_equals"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700499 else:
Jon Hall4ba53f02015-07-29 13:07:41 -0700500 print "\n Error: Given Operator is not listed for assertion"
501 return resultString
adminbae64d82013-08-01 10:50:15 -0700502
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700503 def translate_store( self, **storeStatement ):
504 """
adminbae64d82013-08-01 10:50:15 -0700505 This will translate the STORE <variable> IN <value> or <variable> = <value>
506 into python equivalent to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700507 """
508 args = self.parse_args( [ "VARIABLE", "VALUE" ], **storeStatement )
adminbae64d82013-08-01 10:50:15 -0700509 resultString = ''
510 # convert the statement here
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700511 ondoMatch = re.match( "^\s*ON\s+(.*)\s+DO\s+(.*)", args[ "VALUE" ], flags=0 )
512 paramsMatch = re.match( "^\s*PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESULT|LAST_RESPONSE", args[ "VALUE" ], flags=0 )
513 if paramsMatch:
514 argString = self.translate_parameters( parameters=args[ "VALUE" ] )
515 resultString = args[ "VARIABLE" ] + " = " + argString
516 elif ondoMatch:
517 resultString = args[ "VARIABLE" ] + " = " + self.translate_onDOAs( component=ondoMatch.group( 1 ), action=ondoMatch.group( 2 ) )
518 else:
519 resultString = args[ "VARIABLE" ] + " = " + args[ "VALUE" ]
adminbae64d82013-08-01 10:50:15 -0700520
521 return resultString
Jon Hall4ba53f02015-07-29 13:07:41 -0700522
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700523 def translate_disconnect( self, **disconnectStatement ):
524 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700525 This will translate the DISCONNECT <component_name> into python
adminbae64d82013-08-01 10:50:15 -0700526 equivalent to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700527 """
528 args = self.parse_args( [ "COMPONENT" ], **disconnectStatement )
adminbae64d82013-08-01 10:50:15 -0700529 resultString = ''
530 # convert the statement here
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700531 resultString = "main." + args[ "COMPONENT" ] + ".disconnect()"
adminbae64d82013-08-01 10:50:15 -0700532 return resultString
Jon Hall4ba53f02015-07-29 13:07:41 -0700533
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700534 def translate_onDOAs( self, **onDoStatement ):
535 """
adminbae64d82013-08-01 10:50:15 -0700536 This will translate the ON <component> DO <action> USING <arg1> AS <value1>,<arg2> AS <value2>
537 into python equivalent to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700538 """
539 args = self.parse_args( [ "COMPONENT", "ACTION", "ARGUMENTS" ], **onDoStatement )
adminbae64d82013-08-01 10:50:15 -0700540 subString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700541
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700542 usingMatch = re.match( "\s*(.*)\s+USING\s+(.*)", args[ "ACTION" ], flags=0 )
adminbae64d82013-08-01 10:50:15 -0700543 action = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700544 if usingMatch:
545 action = usingMatch.group( 1 )
546 arguments = usingMatch.group( 2 )
547 subString = self.translate_usingas( arguments=arguments )
Jon Hall4ba53f02015-07-29 13:07:41 -0700548
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700549 else:
550 andCheck = re.search( "(.*)\s+AND\s+(.*)", args[ "ACTION" ], flags=0 )
Jon Hall4ba53f02015-07-29 13:07:41 -0700551
adminbae64d82013-08-01 10:50:15 -0700552 action = action + "()"
553 if andCheck:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700554 action = andCheck.group( 1 ) + "()"
555 subString = subString + self.handle_conjuction( statement=andCheck.group( 2 ) )
556 else:
557 action = args[ "ACTION" ]
adminbae64d82013-08-01 10:50:15 -0700558 action = action + "()"
Jon Hall4ba53f02015-07-29 13:07:41 -0700559 # convert the statement here
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700560 resultString = "main." + args[ "COMPONENT" ] + "." + action + subString
adminbae64d82013-08-01 10:50:15 -0700561 return resultString
562
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700563 def handle_conjuction( self, **conjuctStatement ):
564 """
adminbae64d82013-08-01 10:50:15 -0700565 This will handle the conjuctions
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700566 """
567 args = self.parse_args( [ "STATEMENT" ], **conjuctStatement )
adminbae64d82013-08-01 10:50:15 -0700568 subSentence = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700569
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700570 storeMatch = re.match( "\s*STORE\s+(.*)\s+IN\s+(.*)", args[ "STATEMENT" ], flags=0 )
571 assertMatch = re.match( "\s*ASSERT\s+(\w+)\s+(.*)\s+(.*)\s+ONPASS\s+(.*)\s+ONFAIL\s+(.*)", args[ "STATEMENT" ], flags=0 )
572 if storeMatch:
573 subSentence = "\n" + " " * 8 + self.translate_store( variable=storeMatch.group( 2 ),
574 value=storeMatch.group( 1 ) )
575 elif assertMatch:
576 subSentence = "\n" + " " * 8 + self.translate_assertion( leftvalue=assertMatch.group( 1 ),
577 operator=assertMatch.group( 2 ),
578 rightvalue=assertMatch.group( 3 ),
579 onpass=assertMatch.group( 4 ),
580 onfail=assertMatch.group( 5 ) )
adminbae64d82013-08-01 10:50:15 -0700581 return subSentence
582
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700583 def translate_usingas( self, **argumentAS ):
584 """
adminbae64d82013-08-01 10:50:15 -0700585 This will tranlate USING argument AS value Statement into equivalent argument passing.
586 It will return translated form into resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700587 """
588 args = self.parse_args( [ "ARGUMENTS" ], **argumentAS )
adminbae64d82013-08-01 10:50:15 -0700589 resultString = ''
590 argsList = []
591 subString = ''
592 subSentence = ''
593 line = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700594 andCheck = re.search( "(.*)\s+AND\s+(.*)", args[ "ARGUMENTS" ], flags=0 )
adminbae64d82013-08-01 10:50:15 -0700595 if andCheck:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700596 line = andCheck.group( 1 )
597 subSentence = self.handle_conjuction( statement=andCheck.group( 2 ) )
598 else:
599 line = args[ "ARGUMENTS" ]
Jon Hall4ba53f02015-07-29 13:07:41 -0700600
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700601 argsMatch = re.search( "(.*),(.*)", line, flags=0 )
Jon Hall4ba53f02015-07-29 13:07:41 -0700602
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700603 if args[ "ARGUMENTS" ] is None or args[ "ARGUMENTS" ] == '':
adminbae64d82013-08-01 10:50:15 -0700604 subString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700605 elif argsMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700606
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700607 argsList = line.split( "," )
608 for index, arguments in enumerate( argsList ):
609 argMatch = re.search( "(.*)\s+AS\s+(.*)", arguments, flags=0 )
adminbae64d82013-08-01 10:50:15 -0700610 if argMatch:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700611 argsKey = argMatch.group( 1 )
612 argsValue = argMatch.group( 2 )
613 paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", argsValue, flags=0 )
614 if not paramsMatch:
615 if index == len( argsList ) - 1:
616 subString = subString + argsKey + "=" + argsValue
617 else:
618 subString = subString + argsKey + "=" + argsValue + ","
619 else:
620 argString = self.translate_parameters( parameters=argsValue )
621 if index == len( argsList ) - 1:
622 subString = subString + argsKey + "=" + argString
623 else:
624 subString = subString + argsKey + "=" + argString + ","
625 else:
626 if index == len( argsList ) - 1:
627 subString = subString + arguments
628 else:
Jon Hall4ba53f02015-07-29 13:07:41 -0700629 subString = subString + arguments + ","
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700630 else:
631 argMatch = re.search( "(.*)\s+AS\s+(.*)", args[ "ARGUMENTS" ], flags=0 )
adminbae64d82013-08-01 10:50:15 -0700632 if argMatch:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700633 argsKey = argMatch.group( 1 )
634 argsValue = argMatch.group( 2 )
635 paramsMatch = re.search( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", argsValue, flags=0 )
636 if not paramsMatch:
637 subString = subString + argsKey + "=" + argsValue
638 else:
639 argString = self.translate_parameters( parameters=argsValue )
640 subString = subString + argsKey + "=" + argString
641 else:
642 paramsMatch = re.match( "PARAMS\[(.*)\]|STEP\[(.*)\]|TOPO\[(.*)\]|CASE\[(.*)\]|LAST_RESPONSE|LAST_RESULT", line, flags=0 )
643 if paramsMatch:
644 subString = subString + self.translate_parameters( parameters=line )
645 else:
646 subString = subString + line
647 resultString = "(" + subString + ")" + subSentence
adminbae64d82013-08-01 10:50:15 -0700648 return resultString
649
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700650 def translate_connect( self, **connectStatement ):
651 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700652 This will translate the CONNECT <component_name> USING1 <arg1> AS <value1>, <arg2> AS <value2>
adminbae64d82013-08-01 10:50:15 -0700653 into python equivalent to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700654 """
655 args = self.parse_args( [ "COMPONENT", "ARGUMENTS" ], **connectStatement )
adminbae64d82013-08-01 10:50:15 -0700656 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700657 subString = self.translate_usingas( arguments=args[ "ARGUMENTS" ] )
Jon Hall4ba53f02015-07-29 13:07:41 -0700658 # convert the statement here
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700659 resultString = "main." + args[ "COMPONENT" ] + ".connect(" + subString + ")"
adminbae64d82013-08-01 10:50:15 -0700660 return resultString
661
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700662 def translate_parameters( self, **parameterStatement ):
663 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700664 This will translate the OpenSpeak Case and Params parameters into python equivalent
adminbae64d82013-08-01 10:50:15 -0700665 to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700666 """
667 args = self.parse_args( [ "PARAMETERS" ], **parameterStatement )
668 argument = args[ "PARAMETERS" ]
adminbae64d82013-08-01 10:50:15 -0700669 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700670 # match arguments
671 paramsMatch = re.search( "PARAMS((\[(.*)\])*)", argument, flags=0 )
672 stepsMatch = re.search( "STEP((\[(.*)\])*)", argument, flags=0 )
673 casesMatch = re.search( "CASE((\[(.*)\])*)", argument, flags=0 )
674 topoMatch = re.search( "TOPO((\[(.*)\])*)", argument, flags=0 )
675 lastResultMatch = re.match( "LAST_RESULT", argument, flags=0 )
676 lastResponseMatch = re.match( "LAST_RESPONSE", argument, flags=0 )
adminbae64d82013-08-01 10:50:15 -0700677 # convert the statement here
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700678 if paramsMatch:
679 params = paramsMatch.group( 1 )
680 resultString = resultString + "main.params" + self._argsCheck( checkvar=params )
681 elif stepsMatch:
682 resultString = resultString + "main.params[\'" + self.CurrentCase +\
683 "\'][\'STEP" + str( self.CurrentStep ) + "\']" +\
684 self._argsCheck( checkvar=stepsMatch.group( 1 ) )
685 elif casesMatch:
adminbae64d82013-08-01 10:50:15 -0700686 resultString = resultString + "main.params[\'" + self.CurrentCase + "\']" +\
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700687 self._argsCheck( checkvar=casesMatch.group( 1 ) )
688 elif topoMatch:
adminbae64d82013-08-01 10:50:15 -0700689 resultString = resultString + "main.componentDictionary" +\
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700690 self._argsCheck( checkvar=topoMatch.group( 1 ) )
691 elif lastResultMatch:
adminbae64d82013-08-01 10:50:15 -0700692 resultString = resultString + "main.last_result"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700693 elif lastResponseMatch:
Jon Hall4ba53f02015-07-29 13:07:41 -0700694 resultString = resultString + "main.last_response"
adminbae64d82013-08-01 10:50:15 -0700695 return resultString
696
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700697 def _argsCheck( self, **args ):
698 """ This API will check if given argument is varibale reference or String and will translate accordingly.
adminbae64d82013-08-01 10:50:15 -0700699 It will return the tanslate form in resultString.
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700700 """
701 args = self.parse_args( [ "CHECKVAR" ], **args )
702 params = args[ "CHECKVAR" ]
703 argsList = params.split( "]" )
adminbae64d82013-08-01 10:50:15 -0700704 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700705 del argsList[ len( argsList ) - 1 ]
706 for index, paramArgs in enumerate( argsList ):
707 argsWidVariable = re.search( "(\"|\')\s*(\w+)\s*(\'|\")", paramArgs, flags=0 )
708 if argsWidVariable:
adminbae64d82013-08-01 10:50:15 -0700709 resultString = resultString + "[\'" + argsWidVariable.group(2) + "\']"
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700710 else:
adminbae64d82013-08-01 10:50:15 -0700711 resultString = resultString + paramArgs + "]"
712 return resultString
713
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700714 def translate_step( self, **stepStatement ):
715 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700716 This will translate the STEP "DO SOMETHING HERE" into python equivalent
adminbae64d82013-08-01 10:50:15 -0700717 to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700718 """
719 args = self.parse_args( [ "STEP" ], **stepStatement )
adminbae64d82013-08-01 10:50:15 -0700720 resultString = ''
721 resultString = "main.step(\"" + args["STEP"] + "\")"
Jon Hall4ba53f02015-07-29 13:07:41 -0700722 # convert the statement here
adminbae64d82013-08-01 10:50:15 -0700723 return resultString
724
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700725 def translate_comment( self, **commentStatement ):
726 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700727 This will translate the COMMENT "DO SOMETHING HERE" into python equivalent
adminbae64d82013-08-01 10:50:15 -0700728 to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700729 """
730 args = self.parse_args( [ "COMMENT" ], **commentStatement )
adminbae64d82013-08-01 10:50:15 -0700731 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700732 resultString = "#" + args[ "COMMENT" ]
Jon Hall4ba53f02015-07-29 13:07:41 -0700733 # convert the statement here
734 return resultString
735
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700736 def translate_testcase_name( self, **nameStatement ):
737 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700738 This method will convert NAME "<Testcase_name>" into python equivalent statement
739 to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700740 """
741 args = self.parse_args( [ "TESTNAME" ], **nameStatement )
Jon Hall4ba53f02015-07-29 13:07:41 -0700742
adminbae64d82013-08-01 10:50:15 -0700743 resultString = ''
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700744 resultString = "main.case(\"" + args["TESTNAME"] + "\")"
Jon Hall4ba53f02015-07-29 13:07:41 -0700745 # convert the statement here
746 return resultString
747
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700748 def translate_case_block( self, **caseBlock ):
749 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700750 This method will translate the case block in test script .
adminbae64d82013-08-01 10:50:15 -0700751 It returns the translated equivalent python code for test script
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700752 """
753 args = self.parse_args( [ "CASENUMBER" ], **caseBlock )
adminbae64d82013-08-01 10:50:15 -0700754 resultString = ""
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700755 resultString = "def CASE" + str( args[ "CASENUMBER" ] ) + "(self,main) :\n"
Jon Hall4ba53f02015-07-29 13:07:41 -0700756 # process the caseBlock List translate all statements underlying the given case
adminbae64d82013-08-01 10:50:15 -0700757 return resultString
758
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700759 def translate_loop_block( self, *loopBlock ):
760 """
adminbae64d82013-08-01 10:50:15 -0700761 This method will translate for loop block into its equivalent python code.
Jon Hall4ba53f02015-07-29 13:07:41 -0700762 Whole loop block will be passed into loopBlock List.
adminbae64d82013-08-01 10:50:15 -0700763 It returns the transalted reuslt as a string.
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700764 """
adminbae64d82013-08-01 10:50:15 -0700765 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700766 # process the loopBlock List translate all statements underlying the given loop block
767 return resultString
768
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700769 def translate_conjuction( self, conjuctionStatement ):
770 """
Jon Hall4ba53f02015-07-29 13:07:41 -0700771 This will translate the AND conjuction statements into python equivalent
adminbae64d82013-08-01 10:50:15 -0700772 to resultString and returns resultString
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700773 """
adminbae64d82013-08-01 10:50:15 -0700774 resultString = ''
Jon Hall4ba53f02015-07-29 13:07:41 -0700775 # convert the statement here
adminbae64d82013-08-01 10:50:15 -0700776 return resultString
777
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700778 def parse_args( self, args, **kwargs ):
779 """
780 It will accept the ( key,value ) pair and will return the ( key,value ) pairs with keys in uppercase.
781 """
adminbae64d82013-08-01 10:50:15 -0700782 newArgs = {}
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700783 for key, value in kwargs.iteritems():
784 # currentKey = str.upper( key )
785 if isinstance( args, list ) and str.upper( key ) in args:
Jon Hall4ba53f02015-07-29 13:07:41 -0700786 for each in args:
Jeremy Ronquillo23fb2162017-09-15 14:59:57 -0700787 if each == str.upper( key ):
788 newArgs[ str( each ) ] = value
789 elif each != str.upper( key ) and not ( ( str( each ) in newArgs ) ):
790 newArgs[ str( each ) ] = None
Jon Hall4ba53f02015-07-29 13:07:41 -0700791
adminbae64d82013-08-01 10:50:15 -0700792 return newArgs