Skip to content

Commit 14b6e8c

Browse files
authored
feat: sdk source readRemaining (#1454)
1 parent 8db23bd commit 14b6e8c

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

runtime/runtime-core/api/runtime-core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,7 @@ public abstract interface class aws/smithy/kotlin/runtime/io/SdkSource : java/io
11011101

11021102
public final class aws/smithy/kotlin/runtime/io/SdkSourceKt {
11031103
public static final fun readFully (Laws/smithy/kotlin/runtime/io/SdkSource;Laws/smithy/kotlin/runtime/io/SdkBuffer;J)V
1104+
public static final fun readRemaining (Laws/smithy/kotlin/runtime/io/SdkSource;Laws/smithy/kotlin/runtime/io/SdkBuffer;)J
11041105
public static final fun readToByteArray (Laws/smithy/kotlin/runtime/io/SdkSource;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
11051106
public static final fun toSdkByteReadChannel (Laws/smithy/kotlin/runtime/io/SdkSource;Lkotlinx/coroutines/CoroutineScope;)Laws/smithy/kotlin/runtime/io/SdkByteReadChannel;
11061107
public static synthetic fun toSdkByteReadChannel$default (Laws/smithy/kotlin/runtime/io/SdkSource;Lkotlinx/coroutines/CoroutineScope;ILjava/lang/Object;)Laws/smithy/kotlin/runtime/io/SdkByteReadChannel;

runtime/runtime-core/common/src/aws/smithy/kotlin/runtime/io/SdkSource.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,22 @@ public fun SdkSource.readFully(sink: SdkBuffer, byteCount: Long) {
110110
totalBytesRead += rc
111111
}
112112
}
113+
114+
/**
115+
* **Caution** Reads the entire contents of the source into [sink].
116+
* This function will read until the source is exhausted and no bytes remain
117+
*
118+
* @param sink the buffer that data read from the source will be appended to
119+
*/
120+
@InternalApi
121+
public fun SdkSource.readRemaining(sink: SdkBuffer): Long {
122+
var totalBytesRead: Long = 0
123+
var bytesRead = read(sink, Long.MAX_VALUE)
124+
125+
while (bytesRead != -1L) {
126+
totalBytesRead += bytesRead
127+
bytesRead = read(sink, Long.MAX_VALUE)
128+
}
129+
130+
return totalBytesRead
131+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package aws.smithy.kotlin.runtime.io
7+
8+
import kotlin.test.Test
9+
import kotlin.test.assertEquals
10+
11+
class SdkSourceTest {
12+
@Test
13+
fun readRemaining() {
14+
val data = "Hello world"
15+
val dataLength = data.length.toLong()
16+
val readCycles = 100
17+
val totalDataLength = dataLength * readCycles
18+
19+
// Manual and readRemaining
20+
val source = createTestSource(data, dataLength, readCycles)
21+
val buffer = SdkBuffer()
22+
val manualReads = 10
23+
repeat(manualReads) {
24+
source.read(buffer, dataLength)
25+
}
26+
var readByReadRemaining = source.readRemaining(buffer)
27+
assertEquals(readByReadRemaining, totalDataLength - manualReads * dataLength)
28+
assertEquals(buffer.size, totalDataLength)
29+
30+
// Only readRemaining
31+
buffer.skip(totalDataLength)
32+
readByReadRemaining = createTestSource(data, dataLength, readCycles).readRemaining(buffer)
33+
assertEquals(readByReadRemaining, totalDataLength)
34+
assertEquals(buffer.size, totalDataLength)
35+
}
36+
}
37+
38+
private fun createTestSource(
39+
data: String,
40+
dataLength: Long,
41+
readCycles: Int,
42+
) =
43+
object : SdkSource {
44+
var remainingReadCycles = readCycles
45+
46+
override fun read(sink: SdkBuffer, limit: Long): Long {
47+
if (remainingReadCycles == 0) {
48+
return -1L
49+
}
50+
51+
sink.writeUtf8(data)
52+
remainingReadCycles--
53+
return dataLength
54+
}
55+
56+
override fun close() {}
57+
}

0 commit comments

Comments
 (0)