Merge pull request #2015 from jozic/dilated

=tes,act,doc Make dilated an extension method and deprecate TestKit.dila...
This commit is contained in:
Patrik Nordwall 2014-02-19 15:00:54 +01:00
commit 90133e20c0
7 changed files with 21 additions and 31 deletions

View file

@ -8,7 +8,6 @@ import language.postfixOps
import java.util.concurrent.{ TimeUnit, CountDownLatch }
import scala.concurrent.Await
import scala.concurrent.duration._
import scala.math.BigInt.int2bigInt
import scala.util.Random
import scala.util.control.NoStackTrace
import com.typesafe.config.{ ConfigFactory, Config }
@ -17,7 +16,7 @@ import akka.actor.SupervisorStrategy.seqThrowable2Decider
import akka.dispatch.{ MessageDispatcher, DispatcherPrerequisites, DispatcherConfigurator, Dispatcher }
import akka.pattern.ask
import akka.testkit.{ ImplicitSender, EventFilter, DefaultTimeout, AkkaSpec }
import akka.testkit.{ filterException, filterEvents, duration2TestDuration, TestLatch }
import akka.testkit.{ filterException, filterEvents, TestDuration, TestLatch }
import akka.testkit.TestEvent.Mute
import java.util.concurrent.ConcurrentHashMap
import java.lang.ref.WeakReference

View file

@ -364,8 +364,8 @@ invariably lead to spurious test failures on the heavily loaded Jenkins server
internally scaled by a factor taken from the :ref:`configuration`,
``akka.test.timefactor``, which defaults to 1.
You can scale other durations with the same factor by using the implicit conversion
in ``akka.testkit`` package object to add dilated function to :class:`Duration`.
You can scale other durations with the same factor by using ``dilated`` method
in :class:`JavaTestKit`.
.. includecode:: code/docs/testkit/TestKitDocTest.java#duration-dilation

View file

@ -100,7 +100,7 @@ public class JavaTestKit {
}
public Duration dilated(Duration d) {
return d.mul(TestKitExtension.get(p.system()).TestTimeFactor());
return d.mul(TestKitExtension.get(getSystem()).TestTimeFactor());
}
/**
@ -671,8 +671,7 @@ public class JavaTestKit {
public void shutdown(ActorSystem actorSystem, Duration duration, Boolean verifySystemShutdown) {
boolean vss = verifySystemShutdown != null ? verifySystemShutdown : false;
Duration dur = duration != null ? duration :
TestKit.dilated(FiniteDuration.create(5, TimeUnit.SECONDS),
getSystem()).min(FiniteDuration.create(10, TimeUnit.SECONDS));
dilated(FiniteDuration.create(5, TimeUnit.SECONDS)).min(FiniteDuration.create(10, TimeUnit.SECONDS));
JavaTestKit.shutdownActorSystem(actorSystem, dur, vss);
}

View file

@ -742,6 +742,7 @@ object TestKit {
* Java API: Scale timeouts (durations) during tests with the configured
* 'akka.test.timefactor'.
*/
@deprecated("Use JavaTestKit.dilated", "2.3")
def dilated(duration: Duration, system: ActorSystem): Duration =
duration * TestKitExtension(system).TestTimeFactor
@ -834,14 +835,4 @@ private[testkit] abstract class CachingPartialFunction[A, B <: AnyRef] extends s
var cache: B = _
final def isDefinedAt(x: A): Boolean = try { cache = `match`(x); true } catch { case NoMatch cache = null.asInstanceOf[B]; false }
final override def apply(x: A): B = cache
}
/**
* Wrapper for implicit conversion to add dilated function to Duration.
*/
class TestDuration(duration: FiniteDuration) {
def dilated(implicit system: ActorSystem): FiniteDuration = {
// this cast will succeed unless TestTimeFactor is non-finite (which would be a misconfiguration)
(duration * TestKitExtension(system).TestTimeFactor).asInstanceOf[FiniteDuration]
}
}
}

View file

@ -4,9 +4,7 @@
package akka.testkit
import com.typesafe.config.Config
import scala.concurrent.duration.Duration
import akka.util.Timeout
import java.util.concurrent.TimeUnit.MILLISECONDS
import akka.actor.{ ExtensionId, ActorSystem, Extension, ExtendedActorSystem }
import scala.concurrent.duration.FiniteDuration
@ -17,9 +15,10 @@ object TestKitExtension extends ExtensionId[TestKitSettings] {
class TestKitSettings(val config: Config) extends Extension {
import akka.util.Helpers.ConfigOps
import akka.util.Helpers._
val TestTimeFactor = config.getDouble("akka.test.timefactor")
val TestTimeFactor = config.getDouble("akka.test.timefactor").
requiring(tf !tf.isInfinite && tf > 0, "akka.test.timefactor must be positive finite double")
val SingleExpectDefaultTimeout: FiniteDuration = config.getMillisDuration("akka.test.single-expect-default")
val TestEventFilterLeeway: FiniteDuration = config.getMillisDuration("akka.test.filter-leeway")
val DefaultTimeout: Timeout = Timeout(config.getMillisDuration("akka.test.default-timeout"))

View file

@ -39,12 +39,17 @@ package object testkit {
/**
* Scala API. Scale timeouts (durations) during tests with the configured
* 'akka.test.timefactor'.
* Implicit conversion to add dilated function to Duration.
* Implicit class providing `dilated` method.
* {{{
* import scala.concurrent.duration._
* import akka.testkit._
* 10.milliseconds.dilated
*
* Corresponding Java API is available in TestKit.dilated
* }}}
* Corresponding Java API is available in JavaTestKit.dilated()
*/
implicit def duration2TestDuration(duration: FiniteDuration) = new TestDuration(duration)
}
implicit class TestDuration(val duration: FiniteDuration) extends AnyVal {
def dilated(implicit system: ActorSystem): FiniteDuration =
(duration * TestKitExtension(system).TestTimeFactor).asInstanceOf[FiniteDuration]
}
}

View file

@ -1,13 +1,10 @@
package akka.testkit
import org.scalatest.Matchers
import org.scalatest.{ BeforeAndAfterEach, WordSpec }
import scala.concurrent.duration._
import com.typesafe.config.Config
import org.scalatest.exceptions.TestFailedException
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class TestTimeSpec extends AkkaSpec(Map("akka.test.timefactor" -> 2.0)) with BeforeAndAfterEach {
class TestTimeSpec extends AkkaSpec(Map("akka.test.timefactor" -> 2.0)) {
"A TestKit" must {