All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eaming.weaver-framework_2.13.0.8.4.source-code.SbtTask.scala Maven / Gradle / Ivy

package weaver
package framework

import java.util.concurrent.atomic.{ AtomicBoolean, AtomicInteger }

import cats.data.Chain

import sbt.testing.{ Event, EventHandler, Logger, Task, TaskDef }

private[framework] class SbtTask(
    val taskDef: TaskDef,
    isDone: AtomicBoolean,
    stillRunning: AtomicInteger,
    waitForResourcesShutdown: java.util.concurrent.Semaphore,
    start: scala.concurrent.Promise[Unit],
    queue: java.util.concurrent.ConcurrentLinkedQueue[SuiteEvent],
    loggerPermit: java.util.concurrent.Semaphore,
    readFailed: () => Chain[(SuiteName, TestOutcome)]
) extends Task {

  def execute(
      eventHandler: EventHandler,
      loggers: Array[Logger]): Array[Task] = {
    val log = Reporter.log(loggers)(_)

    start.trySuccess(())

    var finished: Boolean = false

    loggerPermit.acquire()
    try {
      while (!finished && !isDone.get()) {
        val nextEvent = Option(queue.poll())

        nextEvent.foreach {
          case s @ SuiteStarted(_) => log(s)
          case SuiteFinished(_) =>
            finished = true
            if (stillRunning.decrementAndGet == 0) {
              waitForResourcesShutdown.acquire()
              log(RunFinished(readFailed()))
            }
          case t @ TestFinished(outcome) =>
            eventHandler.handle(sbtEvent(outcome))
            log(t)
        }
      }
    } finally {
      loggerPermit.release()
    }

    Array()
  }

  def execute(
      eventHandler: EventHandler,
      loggers: Array[Logger],
      continuation: Array[Task] => Unit): Unit = {
    continuation(execute(eventHandler, loggers))
  }

  def tags(): Array[String] = Array()

  private def sbtEvent(outcome: TestOutcome): Event = SbtEvent(taskDef, outcome)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy