blob: 3057d4c20271c965f09d099787a90f3303a4eafd [file] [log] [blame]
Sergey Mashkov86f70612017-07-25 10:59:44 +03001package kotlinx.coroutines.experimental.io
2
Roman Elizarovc45f5fa2018-01-11 13:48:19 +03003import kotlinx.coroutines.experimental.*
Roman Elizarov83762032017-08-08 19:58:40 +03004import kotlinx.coroutines.experimental.io.internal.ReadWriteBufferState
Sergey Mashkov6d059932017-10-06 18:46:23 +03005import kotlinx.io.pool.*
Roman Elizarov83762032017-08-08 19:58:40 +03006import org.junit.After
7import org.junit.Test
Roman Elizarov96d7a882017-08-30 15:17:05 +03008import java.io.IOException
Roman Elizarov83762032017-08-08 19:58:40 +03009import java.nio.ByteBuffer
10import java.util.concurrent.CopyOnWriteArrayList
11import kotlin.test.assertEquals
12import kotlin.test.assertTrue
13import kotlin.test.fail
Sergey Mashkov86f70612017-07-25 10:59:44 +030014
Roman Elizarovc45f5fa2018-01-11 13:48:19 +030015class PooledBufferTest : TestBase() {
Sergey Mashkov86f70612017-07-25 10:59:44 +030016 private val allocated = CopyOnWriteArrayList<ByteBuffer>()
17
18 private inner class TestPool : ObjectPool<ReadWriteBufferState.Initial> {
19 override val capacity: Int get() = 0
20
21 override fun borrow(): ReadWriteBufferState.Initial {
Roman Elizarov83762032017-08-08 19:58:40 +030022 val buffer = ReadWriteBufferState.Initial(ByteBuffer.allocate(4096))
Sergey Mashkov86f70612017-07-25 10:59:44 +030023 allocated.add(buffer.backingBuffer)
24 return buffer
25 }
26
27 override fun recycle(instance: ReadWriteBufferState.Initial) {
28 if (!allocated.remove(instance.backingBuffer)) {
29 fail("Couldn't release buffer from pool")
30 }
31 }
32
33 override fun dispose() {
34 }
35 }
36
37 private val channel = ByteBufferChannel(autoFlush = true, pool = TestPool())
38
39 @After
40 fun tearDown() {
41 assertTrue { allocated.isEmpty() }
42 }
43
44 @Test
45 fun testWriteReadClose() {
46 runBlocking {
47 channel.writeInt(1)
48 assertEquals(1, allocated.size)
49 channel.readInt()
50 channel.close()
51 assertEquals(0, allocated.size)
52 }
53 }
54
55 @Test
56 fun testWriteCloseRead() {
57 runBlocking {
58 channel.writeInt(1)
59 assertEquals(1, allocated.size)
60 channel.close()
61 channel.readInt()
62 assertEquals(0, allocated.size)
63 }
64 }
65
66 @Test
67 fun testWriteCloseReadRead() {
68 runBlocking {
69 channel.writeInt(1)
70 assertEquals(1, allocated.size)
71 channel.close()
72 channel.readShort()
73 assertEquals(1, allocated.size)
74 channel.readShort()
75 assertEquals(0, allocated.size)
76 }
77 }
78
79 @Test
80 fun testCloseOnly() {
81 runBlocking {
82 channel.close()
83 assertEquals(0, allocated.size)
84 }
85 }
Sergey Mashkov24b040f2017-08-25 11:06:59 +030086
87 @Test
Sergey Mashkov9a6ca1a2017-11-20 11:43:26 +030088 fun testCloseWithError() {
Sergey Mashkov24b040f2017-08-25 11:06:59 +030089 runBlocking {
90 channel.writeFully("OK".toByteArray())
91 assertEquals(1, allocated.size)
92 channel.close(IOException())
93 assertEquals(0, allocated.size)
94 }
95 }
Sergey Mashkov86f70612017-07-25 10:59:44 +030096}