/* * 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) } } }