blob: 1dea300a9af492c1808954c4ce33b7d8789d28c2 [file] [log] [blame]
#!/usr/bin/env python
'''
Created on 26-Dec-2012
Modified 2015 by ON.Lab
Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
TestON is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
TestON is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with TestON. If not, see <http://www.gnu.org/licenses/>.
'''
import re
import sys
class TestParser:
def __init__( self, testFile ):
try:
testFileHandler = open( testFile, 'r' )
except IOError:
print "No such file " + testFile
sys.exit( 0 )
testFileList = testFileHandler.readlines()
self.testscript = testFileList
self.caseCode = {}
self.caseBlock = ''
self.statementsList = []
index = 0
self.statementsList = []
# initialSpaces = len(line) -len(line.lstrip())
while index < len( testFileList ):
testFileList[ index ] = re.sub( "^\s{8}|^\s{4}", "", testFileList[ index ] )
# Skip multiline comments
if re.match( '^(\'\'\')|^(\"\"\")', testFileList[ index ], 0 ):
index = index + 1
try:
while not re.match( '^\s*(\'\'\')|^\s*(\"\"\")', testFileList[ index ], 0 ):
index = index + 1
except IndexError:
print ''
# skip empty lines and single line comments
elif not re.match( '#|^\s*$', testFileList[ index ], 0 ):
self.statementsList.append( testFileList[ index ] )
index = index + 1
def case_code( self ):
index = 0
statementsList = self.statementsList
while index < len( statementsList ):
m = re.match( 'def\s+CASE(\d+)', statementsList[ index ], 0 )
self.caseBlock = []
if m:
index = index + 1
try:
while not re.match( '\s*def\s+CASE(\d+)', statementsList[ index ], 0 ):
self.caseBlock.append( statementsList[ index ] )
if index < len( statementsList )-1:
index = index + 1
else:
break
index = index - 1
except IndexError:
print ''
self.caseCode[ str( m.group( 1 ) ) ] = self.caseBlock
index = index + 1
return self.caseCode
def step_code( self, caseStatements ):
index = 0
step = 0
stepCode = {}
step_flag = False
while index < len( caseStatements ):
m = re.match( 'main\.step', caseStatements[ index ], 0 )
stepBlock = ''
if m:
step_flag = True
if step == 0:
i = 0
block = ''
while i < index:
block += caseStatements[ i ]
i = i + 1
stepCode[ step ] = block
step = step + 1
stepBlock = stepBlock + caseStatements[ index ]
index = index + 1
try:
while not re.match( 'main\.step', caseStatements[ index ], 0 ):
stepBlock = stepBlock + caseStatements[ index ]
if index < len( caseStatements )-1:
index = index + 1
else:
break
index = index - 1
except IndexError:
print ''
stepCode[ step ] = stepBlock
step = step + 1
index = index + 1
# If there is no step defined !!
if not step_flag:
stepCode[ step ] = "".join( caseStatements )
return stepCode
def getStepCode( self ):
case_step_code = {}
case_block = self.case_code()
for case in case_block:
case_step_code[ case ] = {}
step_block = self.step_code( case_block[ case ] )
for step in step_block:
case_step_code[ case ][ step ] = step_block[ step ]
return case_step_code