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

akka.testkit.WithLogCapturing.scala Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2009-2019 Lightbend Inc. 
 */

package akka.testkit

import java.io.{ OutputStream, PrintStream }

import akka.actor.ActorSystem
import akka.event.Logging
import akka.event.Logging._
import org.scalatest.{ Outcome, SuiteMixin, TestSuite }

/**
 * Mixin this trait to a test to make log lines appear only when the test failed.
 */
trait WithLogCapturing
// trait WithLogCapturing extends SuiteMixin { this: TestSuite =>
//   implicit def system: ActorSystem

//   abstract override def withFixture(test: NoArgTest): Outcome = {
//     // When filtering just collects events into this var (yeah, it's a hack to do that in a filter).
//     // We assume that the filter will always ever be used from a single actor, so a regular var should be fine.
//     var events: List[LogEvent] = Nil

//     object LogEventCollector extends EventFilter(Int.MaxValue) {
//       override protected def matches(event: Logging.LogEvent): Boolean = {
//         events ::= event
//         true
//       }
//     }

//     val myLogger = Logging(system, classOf[WithLogCapturing])
//     val res = LogEventCollector.intercept {
//       myLogger.debug(s"Logging started for test [${test.name}]")
//       val r = test()
//       myLogger.debug(s"Logging finished for test [${test.name}]")
//       r
//     }

//     if (!(res.isSucceeded || res.isPending)) {
//       println(s"--> [${Console.BLUE}${test.name}${Console.RESET}] Start of log messages of test that [$res]")
//       val logger = new StdOutLogger {}
//       withPrefixedOut("| ") { events.reverse.foreach(logger.print) }
//       println(s"<-- [${Console.BLUE}${test.name}${Console.RESET}] End of log messages of test that [$res]")
//     }

//     res
//   }

//   /** Adds a prefix to every line printed out during execution of the thunk. */
//   private def withPrefixedOut[T](prefix: String)(thunk: => T): T = {
//     val oldOut = Console.out
//     val prefixingOut =
//       new PrintStream(new OutputStream {
//         override def write(b: Int): Unit = oldOut.write(b)
//       }) {
//         override def println(x: Any): Unit =
//           oldOut.println(prefix + String.valueOf(x).replaceAllLiterally("\n", s"\n$prefix"))
//       }

//     Console.withOut(prefixingOut) {
//       thunk
//     }
//   }
// }

/**
 * An adaption of TestEventListener that never prints debug logs itself. Use together with [[akka.testkit.WithLogCapturing]].
 * It allows to enable noisy DEBUG logging for tests and silence pre/post test DEBUG output completely while still showing
 * test-specific DEBUG output selectively
 */
class DebugLogSilencingTestEventListener extends TestEventListener {
  override def print(event: Any): Unit = event match {
    case _: Debug => // ignore
    case _        => super.print(event)
  }
}

/**
 * An adaption of TestEventListener that does not print out any logs. Use together with [[akka.testkit.WithLogCapturing]].
 * It allows to enable noisy logging for tests and silence pre/post test log output completely while still showing
 * test-specific log output selectively on failures.
 */
@scala.scalajs.reflect.annotation.EnableReflectiveInstantiation
class SilenceAllTestEventListener extends TestEventListener {
  override def print(event: Any): Unit = ()
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy