#!/usr/bin/python
#
# Copyright (c) 2007,2008,2009 MBARI
# MBARI Proprietary Information.  All Rights Reserved
#

import sys, os, commands
import math, re

import utils
import config

from Slate import Slate
from Location import Location

class MissionTester:
  
  def __init__(self, lrauvBin, unserializeBin, slatePath, skipRun):
    self.lrauvBin = lrauvBin
    self.unserializeBin = unserializeBin
    self.slatePath = slatePath
    self.codeReg = re.compile("TEST_CODE_START(.*)TEST_CODE_END", \
        re.DOTALL | re.I)
    self.xmlre = re.compile(".*\.+xml", re.I)
    self.skipRun = skipRun
  
  def testMission(self, missionFilename):
    if not os.path.isfile(missionFilename):
      return False
    # make sure the xml file has the testing script in it
    missionData = utils.readFile(missionFilename)
    if missionData == None:
      return False
    m = self.codeReg.search(missionData)
    if m == None:
      return False
    filename = os.path.basename(missionFilename)
    sys.stdout.write("Testing " + filename + "...\n")
    sys.stdout.flush()
    passed = False
    code = m.group(1)
    if self.__runMission(missionFilename) == False:
      print "** FAILED **"
      return False
    missionName = os.path.splitext( os.path.basename(missionFilename) )[0]
    slate = Slate(self.unserializeBin, self.slatePath + "/" + missionName + "/slate")
    exec code
    #passed = self.__devFunction(slate) # used for dev
    if passed:
      print "passed"
    else:
      print "** FAILED **"
    return passed

  def testMissionsInDir(self, missionDirectory):
    if not os.path.isdir(missionDirectory):
      return False
    dir = os.path.normcase(missionDirectory)
    results = []
    fileList = utils.getFilesInDir(dir)
    fileList.sort()
    fileList = [f for f in fileList if self.xmlre.search(f) != None]
    for f in fileList:
      missionFilename = os.path.join(dir, f)
      # make sure the xml file has the testing script in it
      missionData = utils.readFile(missionFilename)
      if missionData == None:
        continue
      m = self.codeReg.search(missionData)
      if m == None:
        continue
      # test the mission
      passed = self.testMission(missionFilename)
      results.append([f, passed])
    return results

  def __runMission(self, missionFilename):
    if self.skipRun:
      return True
    passed = False
    if not os.path.isfile(self.lrauvBin) or \
       not os.path.isfile(missionFilename):
      return passed
    try:
      cwd = os.getcwd()
      missionName = os.path.splitext( os.path.basename(missionFilename) )[0]
      cmd = "%s -l %s -x \"run %s quitAtEnd\"" % (self.lrauvBin, missionName, missionFilename)
      
      path = os.path.split(os.path.dirname(self.lrauvBin))[0]
      os.chdir(path)
      #print cmd
      output = commands.getoutput(cmd)
      critical = output.find("CRITICAL")
      if( critical > -1 ):
        print "Got critical error:"
        print output[critical:]
      else:
        passed = True
      os.chdir(cwd)
    except:
      pass
    return passed

  def __devFunction(self, slate):
    passed = False
    return passed

