• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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