blob: 81e289d04c4caba3a984109ff536ca74c563dd80 [file] [log] [blame]
#!/usr/bin/python
# Copyright 2012 Google Inc. All Rights Reserved.
"""This class defines the base class for automated Bruno test cases.
This file also defines some basic functions that is required for
most test cases. Users can define their own functions in the extended
class, the Run() method should be use as the start point of test case.
"""
__author__ = 'Lehan Meng (lmeng@google.com)'
import datetime
import logging
import re
class TestCase(object):
"""Base class for all test cases.
This base class provides basic functions for the test case:
- configure file parsing
- logging
- test information creation
- etc.
Test case starts in the Run() method, test case specific code can be
placed in here.
"""
def __init__(self, **kwargs):
"""Initiate a test class instance.
Args:
kwargs['testID']: The assigned test ID on TCM
kwargs['title']: Title (section number) of the test case
kwargs['start_time']: Start time of the test case (for statistic purpose)
kwargs['key_word']: the label of the test case
kwargs['description']: description if required
"""
self.test_info = {
'testID': '0',
'title': 'None',
'start_time': str(datetime.datetime.now()
.strftime('%Y-%m-%d %H:%M')),
'key_word': 'None',
'description': 'None',
'configFile': 'config.cfg'}
self.params = {}
for s in ('testID', 'title', 'start_time', 'key_word',
'description', 'configFile'):
if s in kwargs:
self.test_info[s] = kwargs[s]
self.log = logging.Logging()
self.ParseConfig()
self.Run()
def ParseConfig(self):
"""Parse the configuration file for test case.
The structure of the configuration file:
Each test case configuration begins with its testID in a sigle line,
the following lines have the format:
############# configuration for Test 11362 ########################
testID: 11362
parameter_1 = value_1
parameter_2 = value_2
parameter_3 = value_3
...
############# configuration for Test 11363 ########################
testID: 11363
parameter_1 = value_1
parameter_2 = value_2
parameter_3 = value_3
...
############# comment line start with '#' #########################
Returns:
reuturn 1 if succeed
"""
# dictionary for params
self.cfg_file = open(self.test_info['configFile'], 'r')
cfg_list = self.cfg_file.readlines()
test_id_matched = False
for line in cfg_list:
s = line.lstrip().strip().strip('\n')
m = re.match('testID: ' + str(self.test_info['testID']), s)
if (m is not None) and not s.startswith('#'):
# test case matching succeed
test_id_matched = True
# get next line index:
index = cfg_list.index(line)+1
if index >= len(cfg_list):
# end of file reached
info = self.log.createErrorInfo(
'Low',
'Warning: No configuration found for this test case in file: '
+ self.test_info['configFile'])
self.log.sendLine(self.test_info, info)
s = cfg_list[index]
s = s.lstrip().rstrip()
s = s.split('#', 2)[0]
m = re.match('testID: ', s)
while m is None:
# not reaching configuration for next test case,
# read and create current test case configuration data as dictionary
# format: parameter = value
if s is not '' and not s.startswith('#'):
name = s.split('=')[0].strip().lstrip()
value = s.split('=')[1].strip().lstrip()
if not value or value == 'None':
self.params[name] = None
else:
self.params[name] = value
index += 1
if index == len(cfg_list): break
s = cfg_list[index]
s = s.lstrip().rstrip()
m = re.match('testID: ', s)
# all configuration parsed
self.cfg_file.close()
if not test_id_matched:
# end of file reached
info = self.log.createErrorInfo(
'Low', 'Warning: No configuration found for this test case in file: '
+ self.test_info['configFile'])
self.log.sendLine(self.test_info, info)
return True
def AddConfigParams(self, par='par', value='value'):
"""Add new parameter to the params list.
Args:
par: parameter name
value: parameter value
"""
self.params.setdefault(par.strip().lstrip(), value.strip().lstrip())
def __del__(self):
pass
#################### define your own functions here #######################
def Run(self):
"""Starts to Run the test case."""
##### Add your code here -- BEGIN #######
print 'Test Started...'
print 'Test Completed...'
##### Add your code here -- END #######
def Destructor(self):
pass