blob: 789eeb957836a628c0bc5e1559365e481bfda58f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package unittest.util
// taken from https://github.com/freechipsproject/chisel-testers
import scala.collection.mutable.ArrayBuffer
import chisel3.iotesters._
object TestRunner {
def apply(testMap: Map[String, TesterOptionsManager => Boolean], args: Array[String]): Unit = {
var successful = 0
val errors = new ArrayBuffer[String]
val optionsManager = new TesterOptionsManager()
optionsManager.doNotExitOnHelp()
optionsManager.parse(args)
val programArgs = optionsManager.commonOptions.programArgs
if(programArgs.isEmpty) {
println("Available tests")
for(x <- testMap.keys) {
println(x)
}
println("all")
System.exit(0)
}
val testsToRun = if(programArgs.exists(x => x.toLowerCase() == "all")) {
testMap.keys
}
else {
programArgs
}
for(testName <- testsToRun) {
testMap.get(testName) match {
case Some(test) =>
println(s"Starting $testName")
try {
optionsManager.setTopName(testName)
optionsManager.setTargetDirName(s"test_run_dir/$testName")
if(test(optionsManager)) {
successful += 1
}
else {
errors += s"$testName: test error occurred"
}
}
catch {
case exception: Exception =>
exception.printStackTrace()
errors += s"$testName: exception ${exception.getMessage}"
case t : Throwable =>
errors += s"$testName: throwable ${t.getMessage}"
}
case _ =>
errors += s"Bad Test name: $testName"
}
}
if(successful > 0) {
println(s"Tests passing: $successful")
}
if(errors.nonEmpty) {
println("=" * 80)
println(s"Errors: ${errors.length}: in the following tests")
println(errors.mkString("\n"))
println("=" * 80)
}
}
}