blob: 3f492339d28c567585e72a28e4586bfb79923980 [file] [log] [blame]
Sergey Mashkov86f70612017-07-25 10:59:44 +03001package kotlinx.coroutines.experimental.io
2
Roman Elizarov9fe5f462018-02-21 19:05:52 +03003import kotlinx.coroutines.experimental.*
4import org.junit.*
Roman Elizarov96d7a882017-08-30 15:17:05 +03005import org.junit.Test
Roman Elizarov9fe5f462018-02-21 19:05:52 +03006import org.junit.rules.*
7import java.util.concurrent.*
8import kotlin.coroutines.experimental.*
9import kotlin.test.*
Sergey Mashkov86f70612017-07-25 10:59:44 +030010
11class StringScenarioTest : TestBase() {
Sergey Mashkova9a936d2017-08-23 14:39:41 +030012 @get:Rule
13 val timeout = Timeout(10L, TimeUnit.SECONDS)
14
Sergey Mashkov86f70612017-07-25 10:59:44 +030015 private val ch = ByteBufferChannel(autoFlush = true)
16
17 @Test
18 fun testWriteCharByChar() {
19 runBlocking {
20 expect(1)
21
22 launch(coroutineContext) {
23 ch.writeStringUtf8("A")
24 expect(3)
25 yield()
26
27 expect(5)
28 ch.writeStringUtf8("B")
29 expect(6)
30 yield()
31
32 expect(7)
33 ch.writeStringUtf8("\n")
34 expect(8)
35 yield()
36 }
37
38 expect(2)
39 yield()
40
41 expect(4)
42 val line = ch.readUTF8Line()
43
44 assertEquals("AB", line)
45 expect(9)
46
47 yield()
48 expect(10)
49 finish(11)
50 }
51 }
52
53 @Test
54 fun testSplitUtf8() {
55 runBlocking {
56 val sb = StringBuilder()
57
58 expect(1)
59
60 launch(coroutineContext) {
61 expect(2)
62 val b = byteArrayOf(0xd0.toByte(), 0x9a.toByte(), 0x0a)
63 ch.writeFully(b, 0, 1)
64 yield()
65
66 expect(3)
67 assertTrue { sb.isEmpty() }
68
69 ch.writeFully(b, 1, 1)
70 yield()
71
72 expect(4)
73 assertEquals("\u041a", sb.toString())
74
75 ch.writeFully(b, 2, 1)
76 yield()
77 }
78
79 ch.readUTF8LineTo(sb)
80 expect(5)
81
82 assertEquals("\u041a", sb.toString())
83
84 finish(6)
85 }
86 }
87
88 @Test
89 fun testSplitLineDelimiter() = runBlocking {
90 expect(1)
91
92 launch(coroutineContext) {
93 expect(2)
94 ch.writeFully("ABC\r".toByteArray())
95 expect(3)
96 yield()
97
98 expect(5)
99 ch.writeFully("\n".toByteArray())
100 yield()
101 }
102
103 yield()
104
105 expect(4)
106 val line = ch.readASCIILine()
107 expect(6)
108
109 assertEquals("ABC", line)
110
111 finish(7)
112 }
113
114 @Test
115 fun testReadTailWriteFirst() = runBlocking {
116 expect(1)
117
118 launch(coroutineContext) {
119 expect(2)
120
121 ch.writeFully("ABC".toByteArray())
122
123 yield()
124
125 expect(4)
126 ch.close()
127 yield()
128 }
129
130 yield()
131
132 expect(3)
133
134 val line = ch.readUTF8Line()
135 expect(5)
136 assertEquals("ABC", line)
137
138 finish(6)
139 }
140
141 @Test
142 fun testReadTailReadFirst() = runBlocking {
143 expect(1)
144
145 launch(coroutineContext) {
146 expect(3)
147
148 ch.writeFully("ABC".toByteArray())
149
150 yield()
151
152 expect(4)
153 ch.close()
154 yield()
155 }
156
157 expect(2)
158
159 val line = ch.readUTF8Line()
160 expect(5)
161 assertEquals("ABC", line)
162
163 finish(6)
164 }
165
166 @Test
167 fun testReadThroughWrap() = runBlocking {
168 val L = ".".repeat(128)
169
170 expect(1)
171
172 launch(coroutineContext) {
173 expect(2)
174
175 ch.writeFully(ByteArray(4000))
176
177 expect(3)
178 ch.readFully(ByteArray(3999)) // keep one byte remaining to keep buffer unreleased
179
180 expect(4)
181
182 ch.writeFully(L.toByteArray())
183
184 expect(5)
185 ch.close()
186 }
187
188 yield()
189
190 expect(6)
191
192 ch.readByte()
193 expect(7)
194
195 val line = ch.readUTF8Line()
196
197 finish(8)
198
199 assertEquals(L, line)
200 }
201
202 @Test
203 fun testReadShifted() = runBlocking {
204 val L = ".".repeat(127) + "\n"
205 var base = 0
206
207 for (shift in 1..4096 - 8) {
208 expect(base + 1)
209
210 launch(coroutineContext) {
211 expect(base + 2)
212
213 ch.writeFully(ByteArray(shift))
214
215 expect(base + 3)
216 ch.readFully(ByteArray(shift - 1)) // keep one byte remaining to keep buffer unreleased
217
218 expect(base + 4)
219
220 ch.writeFully(L.toByteArray())
221
222 expect(base + 5)
223 }
224
225 yield()
226
227 expect(base + 6)
228
229 ch.readByte()
230 expect(base + 7)
231
232 val line = ch.readUTF8Line()
233
234 expect(base + 8)
235
236 assertEquals(L.dropLast(1), line)
237
238 base += 8
239 }
240
241 finish(base + 1)
242 }
243
244 @Test
245 fun writeLongLine() = runBlocking {
246 val L = ".".repeat(16384)
247
248 expect(1)
249
250 launch(coroutineContext) {
251 expect(2)
252
253 ch.writeFully(L.toByteArray())
254
255 expect(4)
256 ch.close()
257 }
258
259 yield()
260
261 expect(3)
262 val line = ch.readUTF8Line()
263
264 expect(5)
265
266 assertEquals(L, line)
267
268 finish(6)
269 }
270}