Fix SegmentedByteString substring write (#778)
* Write unit tests to expose bug
* Fix SegmentedByteString substring write
diff --git a/okio/src/commonMain/kotlin/okio/internal/SegmentedByteString.kt b/okio/src/commonMain/kotlin/okio/internal/SegmentedByteString.kt
index a1b2d81..c2e39ba 100644
--- a/okio/src/commonMain/kotlin/okio/internal/SegmentedByteString.kt
+++ b/okio/src/commonMain/kotlin/okio/internal/SegmentedByteString.kt
@@ -158,7 +158,7 @@
buffer.head!!.prev!!.push(segment)
}
}
- buffer.size += size
+ buffer.size += byteCount
}
internal inline fun SegmentedByteString.commonRangeEquals(
diff --git a/okio/src/commonTest/kotlin/okio/BufferedSinkTest.kt b/okio/src/commonTest/kotlin/okio/BufferedSinkTest.kt
index 8563edc..7095bf2 100644
--- a/okio/src/commonTest/kotlin/okio/BufferedSinkTest.kt
+++ b/okio/src/commonTest/kotlin/okio/BufferedSinkTest.kt
@@ -129,6 +129,18 @@
assertEquals("72616ec999".decodeHex(), data.readByteString())
}
+ @Test fun writeSegmentedByteString() {
+ sink.write(Buffer().write("təˈranəˌsôr".encodeUtf8()).snapshot())
+ sink.flush()
+ assertEquals("74c999cb8872616ec999cb8c73c3b472".decodeHex(), data.readByteString())
+ }
+
+ @Test fun writeSegmentedByteStringOffset() {
+ sink.write(Buffer().write("təˈranəˌsôr".encodeUtf8()).snapshot(), 5, 5)
+ sink.flush()
+ assertEquals("72616ec999".decodeHex(), data.readByteString())
+ }
+
@Test fun writeStringUtf8() {
sink.writeUtf8("təˈranəˌsôr")
sink.flush()
diff --git a/okio/src/jvmTest/java/okio/BufferedSinkTest.java b/okio/src/jvmTest/java/okio/BufferedSinkTest.java
index 0e3bd6e..e013284 100644
--- a/okio/src/jvmTest/java/okio/BufferedSinkTest.java
+++ b/okio/src/jvmTest/java/okio/BufferedSinkTest.java
@@ -177,6 +177,18 @@
assertEquals(ByteString.decodeHex("72616ec999"), data.readByteString());
}
+ @Test public void writeSegmentedByteString() throws IOException {
+ sink.write(new Buffer().write(ByteString.encodeUtf8("təˈranəˌsôr")).snapshot());
+ sink.flush();
+ assertEquals(ByteString.decodeHex("74c999cb8872616ec999cb8c73c3b472"), data.readByteString());
+ }
+
+ @Test public void writeSegmentedByteStringOffset() throws IOException {
+ sink.write(new Buffer().write(ByteString.encodeUtf8("təˈranəˌsôr")).snapshot(), 5, 5);
+ sink.flush();
+ assertEquals(ByteString.decodeHex("72616ec999"), data.readByteString());
+ }
+
@Test public void writeStringUtf8() throws IOException {
sink.writeUtf8("təˈranəˌsôr");
sink.flush();