From ad12603bc09022e14edbf7c7054817e7eb6515de Mon Sep 17 00:00:00 2001 From: Adam Fraser Date: Fri, 10 Sep 2021 15:33:13 -0700 Subject: [PATCH 1/4] don't wait to interrupt fibers due to supervision --- .../src/main/scala/zio/test/TestAspect.scala | 2 +- .../main/scala/zio/test/TestConstructor.scala | 4 ++-- .../src/main/scala/zio/test/package.scala | 19 ++++++++++++++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/test/shared/src/main/scala/zio/test/TestAspect.scala b/test/shared/src/main/scala/zio/test/TestAspect.scala index 66196cbfde18..46ee4d26da2c 100644 --- a/test/shared/src/main/scala/zio/test/TestAspect.scala +++ b/test/shared/src/main/scala/zio/test/TestAspect.scala @@ -881,7 +881,7 @@ object TestAspect extends TimeoutVariants { def verify[R0, E0](condition: => ZIO[R0, E0, TestResult]): TestAspect[Nothing, R0, E0, Any] = new TestAspect.PerTest[Nothing, R0, E0, Any] { def perTest[R <: R0, E >: E0](test: ZIO[R, TestFailure[E], TestSuccess]): ZIO[R, TestFailure[E], TestSuccess] = - test <* ZTest(condition) + test <* ZTest("verify", condition) } /** diff --git a/test/shared/src/main/scala/zio/test/TestConstructor.scala b/test/shared/src/main/scala/zio/test/TestConstructor.scala index 8246bca29851..06781dbe8fa8 100644 --- a/test/shared/src/main/scala/zio/test/TestConstructor.scala +++ b/test/shared/src/main/scala/zio/test/TestConstructor.scala @@ -27,7 +27,7 @@ trait TestConstructorLowPriority1 extends TestConstructorLowPriority2 { Spec.labeled( label, Spec - .test(ZTest(assertion), TestAnnotationMap.empty) + .test(ZTest(label, assertion), TestAnnotationMap.empty) .annotate(TestAnnotation.location, location :: Nil) ) } @@ -52,7 +52,7 @@ trait TestConstructorLowPriority3 { Spec.labeled( label, Spec - .test(ZTest(assertion), TestAnnotationMap.empty) + .test(ZTest(label, assertion), TestAnnotationMap.empty) .annotate(TestAnnotation.location, location :: Nil) ) } diff --git a/test/shared/src/main/scala/zio/test/package.scala b/test/shared/src/main/scala/zio/test/package.scala index 6769987248f6..20034c6344a8 100644 --- a/test/shared/src/main/scala/zio/test/package.scala +++ b/test/shared/src/main/scala/zio/test/package.scala @@ -103,9 +103,26 @@ package object test extends CompileVariants { /** * Builds a test with an effectual assertion. */ - def apply[R, E](assertion: => ZIO[R, E, TestResult]): ZIO[R, TestFailure[E], TestSuccess] = + def apply[R, E](label: String, assertion: => ZIO[R, E, TestResult]): ZIO[R, TestFailure[E], TestSuccess] = ZIO .suspendSucceed(assertion) + .overrideForkScope(ZScope.global) + .ensuringChildren { children => + ZIO.foreach(children) { child => + quoted() + val warning = + s"Warning: ZIO Test is attempting to interrupt fiber " + + s"${child.id} forked in test $label due to automatic, " + + "supervision, but interruption has taken more than 10 " + + "seconds to complete. This may indicate a resource leak. " + + "Make sure you are not forking a fiber in an " + + "uninterruptible region." + for { + fiber <- ZIO.logWarning(warning).delay(10.seconds).provide(Has(Clock.ClockLive)).interruptible.forkDaemon + _ <- (child.interrupt *> fiber.interrupt).forkDaemon + } yield () + } + } .foldCauseZIO( cause => ZIO.fail(TestFailure.Runtime(cause)), _.failures match { From b98c395d00f22fa858f3fca676097f27df889677 Mon Sep 17 00:00:00 2001 From: Adam Fraser Date: Fri, 10 Sep 2021 15:57:00 -0700 Subject: [PATCH 2/4] fix compilation error --- test/shared/src/main/scala/zio/test/package.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/test/shared/src/main/scala/zio/test/package.scala b/test/shared/src/main/scala/zio/test/package.scala index 20034c6344a8..87be0d09ab36 100644 --- a/test/shared/src/main/scala/zio/test/package.scala +++ b/test/shared/src/main/scala/zio/test/package.scala @@ -109,7 +109,6 @@ package object test extends CompileVariants { .overrideForkScope(ZScope.global) .ensuringChildren { children => ZIO.foreach(children) { child => - quoted() val warning = s"Warning: ZIO Test is attempting to interrupt fiber " + s"${child.id} forked in test $label due to automatic, " + From 01f74cbd9073704fbd59adac12cbdd9289326a25 Mon Sep 17 00:00:00 2001 From: Adam Fraser Date: Fri, 10 Sep 2021 16:04:49 -0700 Subject: [PATCH 3/4] add test --- .../src/test/scala/zio/test/TestSpec.scala | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/test-tests/shared/src/test/scala/zio/test/TestSpec.scala b/test-tests/shared/src/test/scala/zio/test/TestSpec.scala index e45fb59eb78e..579395ecf2cf 100644 --- a/test-tests/shared/src/test/scala/zio/test/TestSpec.scala +++ b/test-tests/shared/src/test/scala/zio/test/TestSpec.scala @@ -1,14 +1,20 @@ package zio.test +import zio._ import zio.Clock._ +import zio.test.environment._ import zio.test.Assertion._ -import zio.test.TestAspect.failing +import zio.test.TestAspect.{failing, timeout} import zio.test.TestUtils.execute -import zio.{Clock, Has, ZIO} object TestSpec extends ZIOBaseSpec { - def spec: Spec[Has[Clock], TestFailure[Any], TestSuccess] = suite("TestSpec")( + override val runner = + defaultTestRunner.withRuntimeConfig { runtimeConfig => + runtimeConfig.copy(logger = runtimeConfig.logger.filterLogLevel(_ >= LogLevel.Error)) + } + + def spec: Spec[Environment, TestFailure[Any], TestSuccess] = suite("TestSpec")( test("assertM works correctly") { assertM(nanoTime)(equalTo(0L)) }, @@ -39,6 +45,13 @@ object TestSpec extends ZIOBaseSpec { for { _ <- execute(spec) } yield assert(n)(equalTo(1)) - } + }, + test("test does not wait to interrupt children") { + for { + promise <- Promise.make[Nothing, Unit] + _ <- (promise.succeed(()) *> Live.live(ZIO.sleep(20.seconds))).uninterruptible.fork + _ <- promise.await + } yield assertCompletes + } @@ timeout(10.seconds) ) } From db604d78e0d2d9dbff2f1c5e224380a4b4569739 Mon Sep 17 00:00:00 2001 From: Adam Fraser Date: Fri, 10 Sep 2021 16:29:45 -0700 Subject: [PATCH 4/4] add type annotation --- test-tests/shared/src/test/scala/zio/test/TestSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-tests/shared/src/test/scala/zio/test/TestSpec.scala b/test-tests/shared/src/test/scala/zio/test/TestSpec.scala index 579395ecf2cf..6cddb2fbffa9 100644 --- a/test-tests/shared/src/test/scala/zio/test/TestSpec.scala +++ b/test-tests/shared/src/test/scala/zio/test/TestSpec.scala @@ -9,7 +9,7 @@ import zio.test.TestUtils.execute object TestSpec extends ZIOBaseSpec { - override val runner = + override val runner: TestRunner[TestEnvironment, Any] = defaultTestRunner.withRuntimeConfig { runtimeConfig => runtimeConfig.copy(logger = runtimeConfig.logger.filterLogLevel(_ >= LogLevel.Error)) }