1 /* <lambda>null2 * Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 package kotlinx.coroutines 6 7 import kotlin.test.* 8 9 class CompletableJobTest : TestBase() { 10 @Test 11 fun testComplete() { 12 val job = Job() 13 assertTrue(job.isActive) 14 assertFalse(job.isCompleted) 15 assertTrue(job.complete()) 16 assertTrue(job.isCompleted) 17 assertFalse(job.isActive) 18 assertFalse(job.isCancelled) 19 assertFalse(job.complete()) 20 } 21 22 @Test 23 fun testCompleteWithException() { 24 val job = Job() 25 assertTrue(job.isActive) 26 assertFalse(job.isCompleted) 27 assertTrue(job.completeExceptionally(TestException())) 28 assertTrue(job.isCompleted) 29 assertFalse(job.isActive) 30 assertTrue(job.isCancelled) 31 assertFalse(job.completeExceptionally(TestException())) 32 assertFalse(job.complete()) 33 } 34 35 @Test 36 fun testCompleteWithChildren() { 37 val parent = Job() 38 val child = Job(parent) 39 assertTrue(parent.complete()) 40 assertFalse(parent.complete()) 41 assertTrue(parent.isActive) 42 assertFalse(parent.isCompleted) 43 assertTrue(child.complete()) 44 assertTrue(child.isCompleted) 45 assertTrue(parent.isCompleted) 46 assertFalse(child.isActive) 47 assertFalse(parent.isActive) 48 } 49 50 @Test 51 fun testExceptionIsNotReportedToChildren() = parametrized { job -> 52 expect(1) 53 val child = launch(job) { 54 expect(2) 55 try { 56 // KT-33840 57 hang {} 58 } catch (e: Throwable) { 59 assertTrue(e is CancellationException) 60 assertTrue((if (RECOVER_STACK_TRACES) e.cause?.cause else e.cause) is TestException) 61 expect(4) 62 throw e 63 } 64 } 65 yield() 66 expect(3) 67 job.completeExceptionally(TestException()) 68 child.join() 69 finish(5) 70 } 71 72 @Test 73 fun testCompleteExceptionallyDoesntAffectDeferred() = parametrized { job -> 74 expect(1) 75 val child = async(job) { 76 expect(2) 77 try { 78 // KT-33840 79 hang {} 80 } catch (e: Throwable) { 81 assertTrue(e is CancellationException) 82 assertTrue((if (RECOVER_STACK_TRACES) e.cause?.cause else e.cause) is TestException) 83 expect(4) 84 throw e 85 } 86 } 87 yield() 88 expect(3) 89 job.completeExceptionally(TestException()) 90 child.join() 91 assertTrue { child.getCompletionExceptionOrNull() is CancellationException } 92 finish(5) 93 } 94 95 private fun parametrized(block: suspend CoroutineScope.(CompletableJob) -> Unit) { 96 runTest { 97 block(Job()) 98 reset() 99 block(SupervisorJob()) 100 } 101 } 102 } 103