PageRenderTime 93ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/testing.py

https://github.com/danielwagner/QxTest2
Python | 689 lines | 686 code | 2 blank | 1 comment | 11 complexity | 9633f63e1bb5c248a91f1c404ca26112 MD5 | raw file
  1. #!/usr/bin/env python
  2. import sys, os, re, random, codecs, urllib
  3. import util
  4. import reporting
  5. from log import Logger
  6. from logFormatter import QxLogFormat
  7. from simulationLogParser import SimulationLogParser
  8. from seleniumserver import SeleniumServer
  9. from build import Builder
  10. from lint import Lint
  11. class TestRun:
  12. def __init__(self, config, simulate=False, logger=None):
  13. self.configuration = config
  14. if self.getConfigSetting("type", "") == "standalone-generator":
  15. self.configuration = self.getConfigFromGenerator()
  16. if not logger:
  17. self.log = self.getLogger()
  18. else:
  19. self.log = logger
  20. self.simulate = simulate
  21. self.startDate = util.getTimestamp()
  22. self.configuration["base"]["testHostName"] = util.getHostName()
  23. self.log.info("New test run started on %s" %self.startDate)
  24. def getConfigSetting(self, path="", default=False, config=False):
  25. if not config:
  26. config = self.configuration
  27. pathParts = path.split("/")
  28. dict = config
  29. while dict:
  30. for keyName in pathParts:
  31. # invalid node name
  32. if not keyName in dict:
  33. return default
  34. # final search path node, so we've found the right setting
  35. if keyName == pathParts[len(pathParts) - 1]:
  36. return dict[keyName]
  37. # haven't reached the final step yet, but the current value is no dict so
  38. # we've nowhere else to look
  39. if type(dict[keyName]).__name__ != "dict":
  40. return default
  41. # keep looking
  42. dict = dict[keyName]
  43. return default
  44. def getLogger(self):
  45. return Logger(directory=self.getConfigSetting("base/logDirectory", None), level="debug")
  46. def getConfigFromGenerator(self):
  47. jobConfig = self.configuration
  48. seleniumPath = os.path.abspath(jobConfig["selenium-java-client"])
  49. testConfig = {
  50. "base" : {
  51. "type" : "standalone",
  52. },
  53. "selenium" : {
  54. "seleniumHost" : jobConfig["selenium-host"],
  55. "seleniumPort" : jobConfig["selenium-port"],
  56. "rhinoJar" : jobConfig["rhino"],
  57. "seleniumDir" : os.path.dirname(seleniumPath),
  58. "seleniumClientDriverJar" : os.path.basename(seleniumPath),
  59. },
  60. "browsers" : {
  61. "Browser" : jobConfig["browser"]
  62. },
  63. "testRun" : {
  64. "runType" : "",
  65. "simulatorDirectory" : jobConfig["simulator"],
  66. "host" : jobConfig["aut-host"],
  67. "applications" : {}
  68. }
  69. }
  70. autName = jobConfig["aut-name"]
  71. testConfig["testRun"]["applications"][autName] = {
  72. "path" : jobConfig["aut-path"],
  73. "simulationScript" : jobConfig["simulator"] + "/simpleTest.js",
  74. "processLog" : True,
  75. "browsers" : [
  76. {
  77. "browserId" : "Browser"
  78. }
  79. ]
  80. }
  81. simulationOptions = ["logger=console"]
  82. simulationOptions.append("testClasspath=" + jobConfig["test-classpath"])
  83. testClasses = ",".join(jobConfig["test-include"])
  84. simulationOptions.append("testClasses=" + testClasses)
  85. if "simulation-options" in jobConfig:
  86. simulationOptions.extend(jobConfig["simulation-options"])
  87. testConfig["testRun"]["applications"][autName]["simulationOptions"] = simulationOptions
  88. if "java-classpath-separator" in jobConfig:
  89. testConfig["base"]["classPathSeparator"] = jobConfig["java-classpath-separator"]
  90. return testConfig
  91. def runPackage(self):
  92. testType = self.getConfigSetting("base/type", "standalone")
  93. self.buildStatus = {}
  94. if testType == "remote" and "testRun" in self.configuration:
  95. jUrl = self.getConfigSetting("testRun/host", "")
  96. jUrl += self.getConfigSetting("testRun/qxPath", "")
  97. jUrl += "buildStatus.json"
  98. self.buildStatus = util.getJsonFromUrl(jUrl)
  99. if testType == "local":
  100. try:
  101. buildStatusFile = os.path.join(self.config["build"]["stageDir"], "trunk", "qooxdoo", "buildStatus.json")
  102. self.buildStatus = Builder.getBuildStatusFromFile(buildStatusFile)
  103. except Exception, e:
  104. pass
  105. if "lint" in self.configuration:
  106. self.runLint(self.configuration["lint"])
  107. if "build" in self.configuration:
  108. buildConfig = self.configuration["build"]
  109. #buildConfig["buildLogDir"] = self.getConfigSetting("base/logDirectory", "") + "/" + buildConfig["buildLogDir"]
  110. builder = Builder(buildConfig)
  111. builder.buildAll()
  112. self.buildStatus = builder.buildStatus
  113. if "generator" in self.configuration:
  114. self.log.info("Starting Generator test run")
  115. generatorResults = Builder.testGenerator(self.configuration["generator"])
  116. reportServer = self.getConfigSetting("reporting/reportServer", False)
  117. if reportServer:
  118. self.log.info("Sending Generator test results to report server")
  119. response = reporting.sendResultToReportServer(reportServer, generatorResults, "generatorRun")
  120. self.log.info("Report Server response: %s" %response)
  121. if not "testRun" in self.configuration:
  122. return
  123. if self.getConfigSetting("testRun/updateSimulator", False):
  124. util.svnUpdate(self.getConfigSetting("testRun/simulatorDirectory"))
  125. if "applications" in self.configuration["testRun"]:
  126. for app in self.getConfigSetting("testRun/applications", {}):
  127. #appConf = self.configuration["testRun"]["applications"][app]
  128. appConf = self.getConfigSetting("testRun/applications/" + app)
  129. self.runSimsForApp(app, appConf)
  130. if "collections" in self.configuration["testRun"]:
  131. for coll in self.getConfigSetting("testRun/collections", {}):
  132. collConf = self.getConfigSetting("testRun/collections/" + coll)
  133. self.runSimsForCollection(coll, collConf, self.getConfigSetting("testRun/simulatorDirectory"))
  134. def runSimsForCollection(self, collection, collConf, simulatorBaseDir):
  135. seleniumConfig = self.getConfigSetting("selenium")
  136. simulatorDirectory = os.path.join(simulatorBaseDir, "trunk", "tool", "selenium", "simulation", "demobrowser", "demo")
  137. print "running simulations for demos: " + repr(collConf)
  138. #testReportFile = self.prepareTestReport(self.getConfigSetting("base/reportDirectory", ""), collection)
  139. scanDir = collConf["scanDir"]
  140. appList = util.locate(scanDir, "*.html")
  141. for appDir in appList:
  142. dir, file = os.path.split(appDir)
  143. category = os.path.basename(dir)
  144. appName, ext = os.path.splitext(file)
  145. #print category + " - " + appName
  146. scriptFile = os.path.join(simulatorDirectory, category, appName + ".js")
  147. if os.path.isfile(scriptFile):
  148. print "got a test script for " + category + "-" + appName
  149. self.log.info("Running simulations for %s" %category + "." + appName)
  150. for browser in collConf["browsers"]:
  151. seleniumServer = SeleniumServer(seleniumConfig)
  152. seleniumServer.start()
  153. simConf = self.getSimulationConfig(collection, "collections", browser)
  154. simConf["autPath"] = appDir
  155. simConf["simulationScript"] = scriptFile
  156. print repr(simConf)
  157. sim = Simulation(simConf)
  158. sim.run()
  159. seleniumServer.stop()
  160. def runSimsForApp(self, app, appConf):
  161. testReportFile = self.prepareTestReport(self.getConfigSetting("base/reportDirectory", ""), app)
  162. logDirectory = self.getConfigSetting("base/logDirectory", False)
  163. if logDirectory:
  164. testLogFile = "%s/%s/%s.log" %(logDirectory,app,util.getTimestamp())
  165. seleniumConfig = self.getConfigSetting("selenium")
  166. manageSeleniumServer = self.getConfigSetting("selenium/seleniumServerJar", False)
  167. individualServer = self.getConfigSetting("individualServer", True, appConf)
  168. if manageSeleniumServer and not individualServer:
  169. self.log.info("Using one Selenium server instance for all %s simulations." %app)
  170. seleniumOptions = self.getConfigSetting("seleniumServerOptions", None, appConf)
  171. if seleniumOptions:
  172. seleniumConfig["options"] = seleniumOptions
  173. seleniumServer = SeleniumServer(seleniumConfig)
  174. seleniumServer.start()
  175. if app in self.buildStatus:
  176. if self.buildStatus[app]["BuildError"]:
  177. self.sendDummyReport(app, appConf, testReportFile)
  178. return
  179. self.log.info("Running simulations for %s" %app)
  180. for browser in appConf["browsers"]:
  181. if manageSeleniumServer and individualServer:
  182. seleniumServer = SeleniumServer(seleniumConfig)
  183. seleniumServer.start()
  184. simConf = self.getSimulationConfig(app, "applications", browser)
  185. simConf["testLogFile"] = testLogFile
  186. sim = Simulation(simConf, logger=self.log)
  187. sim.run()
  188. if manageSeleniumServer and individualServer:
  189. seleniumServer.stop()
  190. if manageSeleniumServer and not individualServer:
  191. seleniumServer = SeleniumServer(seleniumConfig)
  192. seleniumServer.stop()
  193. if self.getConfigSetting("reporting/mailTo", False):
  194. self.formatLog(simConf["testLogFile"], testReportFile, None)
  195. self.sendReport(app, testReportFile, self.getConfigSetting("reporting"))
  196. reportServer = self.getConfigSetting("reporting/reportServer", False)
  197. if reportServer:
  198. reportConf = {
  199. "runType" : self.getConfigSetting("testRun/runType", ""),
  200. "autName" : app,
  201. "autHost" : self.getConfigSetting("testRun/host", ""),
  202. "autQxPath" : self.getConfigSetting("testRun/qxPath", ""),
  203. "autPath" : appConf["path"],
  204. "startDate" : util.getTimestamp(),
  205. "testHostName" : self.getConfigSetting("base/testHostName", ""),
  206. "testHostId" : self.getConfigSetting("base/testHostId", ""),
  207. }
  208. try:
  209. self.reportResults(reportServer, simConf["testLogFile"], reportConf, simConf["ignoreLogEntries"])
  210. except Exception, e:
  211. self.log.error("Error sending dummy report: " + repr(e))
  212. def getSimulationConfig(self, autName, configKey, browserConf):
  213. self.log.info("Getting configuration for %s on %s" %(autName,browserConf["browserId"]))
  214. #currentAppConf = self.configuration["testRun"][configKey][autName]
  215. currentAppConf = self.getConfigSetting("testRun/%s/%s" %(configKey,autName))
  216. simConf = {
  217. "javaBin" : self.getConfigSetting("base/javaBin", "java"),
  218. "classPathSeparator" : self.getConfigSetting("base/classPathSeparator", ";"),
  219. "rhinoJar" : self.getConfigSetting("selenium/rhinoJar", None),
  220. "simulatorSvn" : self.getConfigSetting("testRun/simulatorDirectory", None),
  221. "autName" : autName,
  222. "autHost" : self.getConfigSetting("testRun/host", "http://localhost"),
  223. "browserId" : browserConf["browserId"],
  224. "browserLauncher" : self.configuration["browsers"][browserConf["browserId"]],
  225. "processLog" : self.getConfigSetting("processLog", None, currentAppConf)
  226. }
  227. seleniumDir = self.getConfigSetting("selenium/seleniumDir", "")
  228. seleniumClientDriverJar = self.getConfigSetting("selenium/seleniumClientDriverJar", "")
  229. seleniumVersion = self.getConfigSetting("seleniumVersion", None, browserConf)
  230. if not seleniumVersion:
  231. seleniumVersion = self.getConfigSetting("seleniumVersion", None, currentAppConf)
  232. if not seleniumVersion:
  233. seleniumVersion = self.getConfigSetting("testRun/seleniumVersion", "current")
  234. simConf["seleniumClientDriverJar"] = seleniumDir + "/" + seleniumVersion + "/" + seleniumClientDriverJar
  235. autPath = self.getConfigSetting("path", "", currentAppConf)
  236. autQxPath = self.getConfigSetting("testRun/qxPath", "")
  237. simConf["autPath"] = autQxPath + autPath
  238. simulationOptions = self.getConfigSetting("simulationOptions", None, browserConf)
  239. if not simulationOptions:
  240. simulationOptions = self.getConfigSetting("simulationOptions", None, currentAppConf)
  241. if not simulationOptions:
  242. simulationOptions = self.getConfigSetting("testRun/simulationOptions", None)
  243. simConf["simulationOptions"] = simulationOptions
  244. simulationScript = self.getConfigSetting("simulationScript", None, browserConf)
  245. if not simulationScript:
  246. simulationScript = self.getConfigSetting("simulationScript", None, currentAppConf)
  247. if not simulationScript:
  248. simulationScript = self.getConfigSetting("testRun/simulationScript", None)
  249. simConf["simulationScript"] = simulationScript
  250. ignoreLogEntries = self.getConfigSetting("ignoreLogEntries", None, browserConf)
  251. if not ignoreLogEntries:
  252. ignoreLogEntries = self.getConfigSetting("ignoreLogEntries", None, currentAppConf)
  253. if not ignoreLogEntries:
  254. ignoreLogEntries = self.getConfigSetting("testRun/ignoreLogEntries", None)
  255. simConf["ignoreLogEntries"] = ignoreLogEntries
  256. return simConf
  257. def sendDummyReport(self, app, appConf, testReportFile):
  258. self.log.debug("%s built with errors" %app)
  259. browserList = []
  260. for browser in appConf["browsers"]:
  261. browserList.append(browser["browserId"])
  262. startDate = util.getTimestamp()
  263. dummyLogFile = self.getDummyLog(self.getConfigSetting("base/logDirectory", None), app, browserList, self.buildStatus[app]["BuildError"])
  264. #TODO: ignore
  265. ignore = None
  266. if self.getConfigSetting("reporting/mailTo", False):
  267. logFormatted = self.formatLog(dummyLogFile, testReportFile, ignore)
  268. if logFormatted:
  269. self.sendReport(app, testReportFile, self.configuration["reporting"])
  270. else:
  271. self.log.warn("No report HTML to send.")
  272. reportServer = self.getConfigSetting("reporting/reportServer", False)
  273. if reportServer:
  274. reportConf = {
  275. "runType" : self.getConfigSetting("testRun/runType", ""),
  276. "autName" : app,
  277. "autHost" : self.getConfigSetting("testRun/host"),
  278. "autQxPath" : self.getConfigSetting("testRun/qxPath", ""),
  279. "autPath" : appConf["path"],
  280. "startDate" : startDate,
  281. "testHostName" : self.getConfigSetting("base/testHostName", ""),
  282. "testHostId" : self.getConfigSetting("base/testHostId", ""),
  283. }
  284. try:
  285. self.reportResults(reportServer, dummyLogFile, reportConf)
  286. except Exception, e:
  287. self.log.error("Error sending dummy report: " + repr(e))
  288. def prepareTestLog(self, logDir=os.getcwd(), appName="Unknown"):
  289. logPath = os.path.join(logDir, appName)
  290. if not os.path.isdir(logPath):
  291. os.mkdir(logPath)
  292. return os.path.join(logPath, self.startDate + ".log")
  293. def prepareTestReport(self, reportDir=os.getcwd(), appName="Unknown"):
  294. reportPath = os.path.join(reportDir, appName)
  295. if not os.path.isdir(reportPath):
  296. os.mkdir(reportPath)
  297. return os.path.join( reportPath, self.startDate + '.html')
  298. def getDummyLog(self, testLogDir, autName, browserList, buildError):
  299. self.log.info("Generating dummy log file for %s" %autName)
  300. dummyLogFile = os.path.join(testLogDir, autName, "DUMMY_%s.log" %(autName + self.startDate))
  301. dummyLog = codecs.open(dummyLogFile, "w", "utf-8")
  302. for browser in browserList:
  303. prefix = "qxSimulator_%s: " %str(random.randint(100000, 999999))
  304. dummyLog.write(prefix + "<h1>%s results from %s</h1>\n" %(autName, self.startDate))
  305. platform = util.getOperatingSystemName()
  306. if platform == "Windows":
  307. platform = "Win32"
  308. dummyLog.write(prefix + "<p>Platform: %s</p>\n" %platform)
  309. dummyLog.write(prefix + "<p>User agent: %s</p>\n" %browser)
  310. dummyLog.write(prefix + "<div class=\"qxappender\"><div class=\"level-error\">BUILD ERROR: %s</div></div>\n" %buildError)
  311. dummyLog.close()
  312. self.log.info("Created dummy log file %s" %dummyLogFile)
  313. return dummyLogFile
  314. def formatLog(self, inputfile=None, reportfile=None, ignore=None):
  315. class FormatterOpts:
  316. def __init__(self,logfile,htmlfile,ignore=None):
  317. self.logfile = logfile
  318. self.htmlfile = htmlfile
  319. self.ignore = ignore
  320. if not inputfile:
  321. raise RuntimeError, "No input file specified!"
  322. if not os.path.isfile(inputfile):
  323. raise RuntimeError, "%s is not a file!" %inputfile
  324. if os.path.getsize(inputfile) == "0L":
  325. self.log.warn("log file is empty!")
  326. options = FormatterOpts(inputfile, reportfile, ignore)
  327. if (self.simulate):
  328. self.log.info("SIMULATION: Formatting log file %s" %inputfile)
  329. else:
  330. self.log.info("Formatting log file %s" %inputfile)
  331. logformat = QxLogFormat(options)
  332. logformat.writeHtmlReport()
  333. def sendReport(self, autName, file, mailConf):
  334. self.log.info("Preparing to send %s report: %s" %(autName, file))
  335. if ( not(os.path.exists(file)) ):
  336. self.log.error("Report file %s not found!" %file)
  337. return
  338. mailConf["subject"] = "[qooxdoo-test] " + autName
  339. reportFile = open(file, 'rb')
  340. mailConf['html'] = reportFile.read()
  341. reportFile.seek(0)
  342. osRe = re.compile('<p>Platform: (.*)</p>')
  343. failedTestsRe = re.compile('<p class="failedtests">([\d]*)')
  344. totalErrorsRe = re.compile('<p class="totalerrors">Total errors in report: ([\d]*)</p>')
  345. osystem = ""
  346. failed = False
  347. totalE = ""
  348. for line in reportFile:
  349. osys = osRe.search(line)
  350. if (osys):
  351. osystem = osys.group(1)
  352. # Some browsers return "Linux i686" as the platform
  353. if "Linux" in osystem:
  354. osystem = "Linux"
  355. else:
  356. if "Win" in osystem:
  357. osystem = "Win32"
  358. failedTests = failedTestsRe.search(line)
  359. if (failedTests):
  360. failed = failedTests.group(1)
  361. totalErrors = totalErrorsRe.search(line)
  362. if (totalErrors):
  363. totalE = totalErrors.group(1)
  364. mailConf['subject'] += " " + osystem
  365. if ('hostId' in mailConf):
  366. mailConf['subject'] += " " + mailConf['hostId']
  367. if autName in self.buildStatus:
  368. branch = "unknown"
  369. if "branch" in self.buildStatus[autName]:
  370. branch = self.buildStatus[autName]["branch"]
  371. if "SVNRevision" in self.buildStatus[autName]:
  372. revision = self.buildStatus[autName]["SVNRevision"]
  373. mailConf['subject'] += " (%s r%s)" %(branch,revision)
  374. if (self.buildStatus[autName]["BuildError"]):
  375. self.mailConf['subject'] += " BUILD ERROR"
  376. if (failed):
  377. mailConf['subject'] += ": %s test run(s) failed!" %failed
  378. else:
  379. mailConf['subject'] += ": %s issues" %totalE
  380. # Send mail
  381. if (self.simulate):
  382. self.log.info("SIMULATION; Prepared report email: Subject: %s Recipient: %s" %(mailConf['subject'], mailConf['mailTo']))
  383. if (osystem !=""):
  384. try:
  385. util.sendMultipartMail(mailConf)
  386. except Exception, e:
  387. self.log.error("Failed to send report email")
  388. self.log.logError(e)
  389. else:
  390. self.log.info("Report email sent successfully")
  391. else:
  392. self.log.error("Report file seems incomplete, report not sent.")
  393. def reportResults(self, reportServerUrl, logFile, config, ignore=None):
  394. if (self.simulate):
  395. self.log.info("SIMULATION: Getting report data for %s" %config["autName"])
  396. return
  397. else:
  398. self.log.info("Getting report data for %s" %config["autName"])
  399. testRunDict = self.getTestRunDict(config)
  400. slp = SimulationLogParser(logFile, ignore)
  401. simulationData = slp.getSimulationData()
  402. testRunDict["simulations"] = simulationData
  403. try:
  404. if simulationData[0]["platform"] != "Unknown":
  405. testRunDict["test_hostos"] = simulationData[0]["platform"]
  406. except Exception:
  407. pass
  408. self.log.info("Report data aggregated, sending request")
  409. try:
  410. response = reporting.sendResultToReportServer(reportServerUrl, testRunDict, "testRun")
  411. self.log.info("Report server response: %s" %response)
  412. except Exception, e:
  413. self.log.error("Error sending test report to server")
  414. self.log.logError(e)
  415. def getTestRunDict(self, config):
  416. autName = config["autName"]
  417. if "Source" in config["autName"]:
  418. autName = config["autName"][0:config["autName"].find("Source")]
  419. testRunDict = {
  420. "test_type" : config["runType"],
  421. "revision" : "",
  422. "aut_name" : autName,
  423. "aut_host" : config["autHost"],
  424. "aut_qxpath" : "",
  425. "aut_path" : config["autPath"],
  426. "test_host" : config["testHostName"],
  427. "test_hostos" : util.getOperatingSystemName(),
  428. "test_hostid" : "",
  429. "start_date" : config["startDate"],
  430. "end_date" : util.getTimestamp(),
  431. "simulations": [],
  432. "dev_run" : False
  433. }
  434. if config["autName"] in self.buildStatus:
  435. if "SVNRevision" in self.buildStatus[config["autName"]]:
  436. revision = self.buildStatus[config["autName"]]["SVNRevision"]
  437. testRunDict["revision"] = revision
  438. if "autQxPath" in config:
  439. testRunDict["aut_qxpath"] = config["autQxPath"]
  440. if "testHostId" in config:
  441. testRunDict["test_hostid"] = config["testHostId"]
  442. if "devRun" in config:
  443. testRunDict["dev_run"] = config["devRun"]
  444. return testRunDict
  445. def runLint(self, config):
  446. class LintOptions:
  447. def __init__(self, workdir = None):
  448. self.workdir = workdir
  449. for target in config["targets"]:
  450. options = LintOptions(target["path"])
  451. if "ignoreClasses" in target:
  452. setattr(options, "ignoreclasses", target["ignoreClasses"])
  453. elif "ignoreClasses" in config:
  454. setattr(options, "ignoreclasses", config["ignoreClasses"])
  455. if "ignoreMessages" in target:
  456. setattr(options, "ignoremessages", target["ignoreMessages"])
  457. elif "ignoreMessages" in config:
  458. setattr(options, "ignoremessages", config["ignoreMessages"])
  459. lint = Lint(options)
  460. reportServer = self.getConfigSetting("reporting/reportServer", False)
  461. if reportServer:
  462. lintResult = lint.getFlatResult()
  463. lintResult = self.getEnhancedLintResult(lintResult, target)
  464. self.log.info("Sending Lint results to report server")
  465. response = reporting.sendResultToReportServer(reportServer, lintResult, "lintRun")
  466. self.log.info("Report Server response: %s" %response)
  467. def getEnhancedLintResult(self, lintResult, target):
  468. for message in lintResult:
  469. message["target"] = target["name"]
  470. message["branch"] = "unknown"
  471. message["revision"] = "unknown"
  472. if target["name"] in self.buildStatus:
  473. if "branch" in self.buildStatus[target["name"]]:
  474. message["branch"] = self.buildStatus[target["name"]]["branch"]
  475. if "revision" in self.buildStatus[target["name"]]:
  476. message["revision"] = self.buildStatus[target["name"]]["revision"]
  477. elif "Testrunner" in self.buildStatus:
  478. if "branch" in self.buildStatus["Testrunner"]:
  479. message["branch"] = self.buildStatus["Testrunner"]["branch"]
  480. if "revision" in self.buildStatus["Testrunner"]:
  481. message["revision"] = self.buildStatus["Testrunner"]["revision"]
  482. return lintResult
  483. class Simulation:
  484. def __init__(self, config, simulate=False, logger=None):
  485. self.configuration = config
  486. self.simulate = simulate
  487. if not logger:
  488. self.log = Logger()
  489. else:
  490. self.log = logger
  491. self.startCmd = self.getStartCmd()
  492. def getStartCmd(self):
  493. conf = self.configuration
  494. cmd = conf["javaBin"]
  495. if "rhinoJar" in conf:
  496. cmd += " -cp %s%s%s" %(conf["seleniumClientDriverJar"], conf["classPathSeparator"], conf["rhinoJar"])
  497. if "rhinoMainClass" in conf:
  498. cmd += " %s" %conf["rhinoMainClass"]
  499. else:
  500. cmd += " org.mozilla.javascript.tools.shell.Main"
  501. cmd += " %s" %conf["simulationScript"]
  502. cmd += " autHost=%s" %conf["autHost"]
  503. cmd += " autPath="
  504. # Encode any URL parameters
  505. autPathList = conf['autPath'].split("?")
  506. if len(autPathList) == 1:
  507. cmd += autPathList[0]
  508. else:
  509. cmd += autPathList[0] + "%3F" + urllib.quote(autPathList[1])
  510. cmd += " simulatorSvn=%s" %conf['simulatorSvn']
  511. if (util.getOperatingSystemName() == "Windows"):
  512. cmd += " testBrowser=%s" %conf["browserLauncher"]
  513. else:
  514. cmd += " testBrowser='%s'" %conf["browserLauncher"]
  515. cmd += " browserId=\"%s\"" %conf["browserId"]
  516. if conf["simulationOptions"]:
  517. for opt in conf["simulationOptions"]:
  518. cmd += ' "%s"' %opt
  519. if "testLogFile" in conf:
  520. cmd += " logFile=%s" %conf["testLogFile"]
  521. return cmd
  522. def run(self):
  523. conf = self.configuration
  524. infoMsg = "Testing %s in %s" %(conf['autName'], conf["browserId"])
  525. debugMsg = "Selenium command line: %s" %self.startCmd
  526. if (self.simulate):
  527. self.log.info("SIMULATION: %s" %infoMsg)
  528. self.log.debug(debugMsg)
  529. else:
  530. self.log.info(infoMsg)
  531. self.log.debug(debugMsg)
  532. #TODO: out.split("\n")
  533. if self.configuration["processLog"]:
  534. util.invokeLog(self.startCmd, self.log, True)
  535. else:
  536. util.invokeExternal(self.startCmd)
  537. if __name__ == "__main__":
  538. try:
  539. rc = 0
  540. import demjson
  541. configFile = codecs.open(sys.argv[1], "r", "UTF-8")
  542. config = configFile.read()
  543. config = demjson.decode(config, allow_comments=True)
  544. testRun = TestRun(config)
  545. testRun.runPackage()
  546. except KeyboardInterrupt:
  547. print
  548. print " * Keyboard Interrupt"
  549. rc = 1
  550. sys.exit(rc)