From cebf740931b65034e34e7dd2b8f3939201bd15f7 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Tue, 23 Jun 2020 20:21:16 -0700 Subject: [PATCH] Make TestServer recursive functions tail recursive --- .../src/test/scala/testpkg/TestServer.scala | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/server-test/src/test/scala/testpkg/TestServer.scala b/server-test/src/test/scala/testpkg/TestServer.scala index 5d743c15d..bbaa74071 100644 --- a/server-test/src/test/scala/testpkg/TestServer.scala +++ b/server-test/src/test/scala/testpkg/TestServer.scala @@ -16,6 +16,7 @@ import sbt.io.IO import sbt.io.syntax._ import sbt.protocol.ClientSocket +import scala.annotation.tailrec import scala.concurrent._ import scala.concurrent.duration._ import scala.util.{ Success, Try } @@ -267,28 +268,31 @@ case class TestServer( final def waitForString(duration: FiniteDuration)(f: String => Boolean): Boolean = { val deadline = duration.fromNow - def impl(): Boolean = { - try { - Await.result(readFrame, deadline.timeLeft).fold(false)(f) || impl + @tailrec def impl(): Boolean = { + val res = try { + Await.result(readFrame, deadline.timeLeft).fold(false)(f) } catch { case _: TimeoutException => resetConnection() // create a new connection to invalidate the running readFrame future false } + if (!res) impl() else !deadline.isOverdue() } impl() } final def neverReceive(duration: FiniteDuration)(f: String => Boolean): Boolean = { val deadline = duration.fromNow + @tailrec def impl(): Boolean = { - try { - Await.result(readFrame, deadline.timeLeft).fold(true)(s => !f(s)) && impl + val res = try { + Await.result(readFrame, deadline.timeLeft).fold(true)(s => !f(s)) } catch { case _: TimeoutException => resetConnection() // create a new connection to invalidate the running readFrame future true } + if (res && !deadline.isOverdue) impl else res || !deadline.isOverdue } impl() }