#!/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
import device


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.device = device.Device()

    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.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.strip()
        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()
            value = s.split('=')[1].strip()
            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.strip()
          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
    """
    if par and value:
      self.params[par.strip()] = value.strip()

  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
