blob: a00f00e9c03d83c266fcb23e48c201cfcae26c39 [file] [log] [blame]
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03001/*
2 * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3 */
4
Sergey Mashkov86f70612017-07-25 10:59:44 +03005package kotlinx.coroutines.experimental.io
6
Roman Elizarovc45f5fa2018-01-11 13:48:19 +03007import kotlinx.coroutines.experimental.*
Roman Elizarov83762032017-08-08 19:58:40 +03008import kotlinx.coroutines.experimental.io.internal.ReadWriteBufferState
Sergey Mashkov6d059932017-10-06 18:46:23 +03009import kotlinx.io.pool.*
Roman Elizarov83762032017-08-08 19:58:40 +030010import org.junit.After
11import org.junit.Test
Roman Elizarov96d7a882017-08-30 15:17:05 +030012import java.io.IOException
Roman Elizarov83762032017-08-08 19:58:40 +030013import java.nio.ByteBuffer
14import java.util.concurrent.CopyOnWriteArrayList
15import kotlin.test.assertEquals
16import kotlin.test.assertTrue
17import kotlin.test.fail
Sergey Mashkov86f70612017-07-25 10:59:44 +030018
Roman Elizarovc45f5fa2018-01-11 13:48:19 +030019class PooledBufferTest : TestBase() {
Sergey Mashkov86f70612017-07-25 10:59:44 +030020 private val allocated = CopyOnWriteArrayList<ByteBuffer>()
21
22 private inner class TestPool : ObjectPool<ReadWriteBufferState.Initial> {
23 override val capacity: Int get() = 0
24
25 override fun borrow(): ReadWriteBufferState.Initial {
Roman Elizarov83762032017-08-08 19:58:40 +030026 val buffer = ReadWriteBufferState.Initial(ByteBuffer.allocate(4096))
Sergey Mashkov86f70612017-07-25 10:59:44 +030027 allocated.add(buffer.backingBuffer)
28 return buffer
29 }
30
31 override fun recycle(instance: ReadWriteBufferState.Initial) {
32 if (!allocated.remove(instance.backingBuffer)) {
33 fail("Couldn't release buffer from pool")
34 }
35 }
36
37 override fun dispose() {
38 }
39 }
40
41 private val channel = ByteBufferChannel(autoFlush = true, pool = TestPool())
42
43 @After
44 fun tearDown() {
45 assertTrue { allocated.isEmpty() }
46 }
47
48 @Test
49 fun testWriteReadClose() {
50 runBlocking {
51 channel.writeInt(1)
52 assertEquals(1, allocated.size)
53 channel.readInt()
54 channel.close()
55 assertEquals(0, allocated.size)
56 }
57 }
58
59 @Test
60 fun testWriteCloseRead() {
61 runBlocking {
62 channel.writeInt(1)
63 assertEquals(1, allocated.size)
64 channel.close()
65 channel.readInt()
66 assertEquals(0, allocated.size)
67 }
68 }
69
70 @Test
71 fun testWriteCloseReadRead() {
72 runBlocking {
73 channel.writeInt(1)
74 assertEquals(1, allocated.size)
75 channel.close()
76 channel.readShort()
77 assertEquals(1, allocated.size)
78 channel.readShort()
79 assertEquals(0, allocated.size)
80 }
81 }
82
83 @Test
84 fun testCloseOnly() {
85 runBlocking {
86 channel.close()
87 assertEquals(0, allocated.size)
88 }
89 }
Sergey Mashkov24b040f2017-08-25 11:06:59 +030090
91 @Test
Sergey Mashkov9a6ca1a2017-11-20 11:43:26 +030092 fun testCloseWithError() {
Sergey Mashkov24b040f2017-08-25 11:06:59 +030093 runBlocking {
94 channel.writeFully("OK".toByteArray())
95 assertEquals(1, allocated.size)
96 channel.close(IOException())
97 assertEquals(0, allocated.size)
98 }
99 }
Sergey Mashkov86f70612017-07-25 10:59:44 +0300100}