diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/devsupport/MultipartStreamReaderTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/devsupport/MultipartStreamReaderTest.java deleted file mode 100644 index 63612bc66d5..00000000000 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/devsupport/MultipartStreamReaderTest.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -package com.facebook.react.devsupport; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.IOException; -import java.util.Map; -import okio.Buffer; -import okio.ByteString; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -@RunWith(RobolectricTestRunner.class) -public class MultipartStreamReaderTest { - - class CallCountTrackingChunkCallback implements MultipartStreamReader.ChunkListener { - private int mCount = 0; - - @Override - public void onChunkComplete(Map headers, Buffer body, boolean done) - throws IOException { - mCount++; - } - - @Override - public void onChunkProgress(Map headers, long loaded, long total) - throws IOException {} - - public int getCallCount() { - return mCount; - } - } - - @Test - public void testSimpleCase() throws IOException { - ByteString response = - ByteString.encodeUtf8( - "preable, should be ignored\r\n" - + "--sample_boundary\r\n" - + "Content-Type: application/json; charset=utf-8\r\n" - + "Content-Length: 2\r\n\r\n" - + "{}\r\n" - + "--sample_boundary--\r\n" - + "epilogue, should be ignored"); - - Buffer source = new Buffer(); - source.write(response); - - MultipartStreamReader reader = new MultipartStreamReader(source, "sample_boundary"); - - CallCountTrackingChunkCallback callback = - new CallCountTrackingChunkCallback() { - @Override - public void onChunkComplete(Map headers, Buffer body, boolean done) - throws IOException { - super.onChunkComplete(headers, body, done); - - assertThat(done).isTrue(); - assertThat(headers.get("Content-Type")).isEqualTo("application/json; charset=utf-8"); - assertThat(body.readUtf8()).isEqualTo("{}"); - } - }; - boolean success = reader.readAllParts(callback); - - assertThat(callback.getCallCount()).isEqualTo(1); - assertThat(success).isTrue(); - } - - @Test - public void testMultipleParts() throws IOException { - ByteString response = - ByteString.encodeUtf8( - "preable, should be ignored\r\n" - + "--sample_boundary\r\n" - + "1\r\n" - + "--sample_boundary\r\n" - + "2\r\n" - + "--sample_boundary\r\n" - + "3\r\n" - + "--sample_boundary--\r\n" - + "epilogue, should be ignored"); - - Buffer source = new Buffer(); - source.write(response); - - MultipartStreamReader reader = new MultipartStreamReader(source, "sample_boundary"); - - CallCountTrackingChunkCallback callback = - new CallCountTrackingChunkCallback() { - @Override - public void onChunkComplete(Map headers, Buffer body, boolean done) - throws IOException { - super.onChunkComplete(headers, body, done); - - assertThat(done).isEqualTo(getCallCount() == 3); - assertThat(body.readUtf8()).isEqualTo(String.valueOf(getCallCount())); - } - }; - boolean success = reader.readAllParts(callback); - - assertThat(callback.getCallCount()).isEqualTo(3); - assertThat(success).isTrue(); - } - - @Test - public void testNoDelimiter() throws IOException { - ByteString response = ByteString.encodeUtf8("Yolo"); - - Buffer source = new Buffer(); - source.write(response); - - MultipartStreamReader reader = new MultipartStreamReader(source, "sample_boundary"); - - CallCountTrackingChunkCallback callback = new CallCountTrackingChunkCallback(); - boolean success = reader.readAllParts(callback); - - assertThat(callback.getCallCount()).isEqualTo(0); - assertThat(success).isFalse(); - } - - @Test - public void testNoCloseDelimiter() throws IOException { - ByteString response = - ByteString.encodeUtf8( - "preable, should be ignored\r\n" - + "--sample_boundary\r\n" - + "Content-Type: application/json; charset=utf-8\r\n" - + "Content-Length: 2\r\n\r\n" - + "{}\r\n" - + "--sample_boundary\r\n" - + "incomplete message..."); - - Buffer source = new Buffer(); - source.write(response); - - MultipartStreamReader reader = new MultipartStreamReader(source, "sample_boundary"); - - CallCountTrackingChunkCallback callback = new CallCountTrackingChunkCallback(); - boolean success = reader.readAllParts(callback); - - assertThat(callback.getCallCount()).isEqualTo(1); - assertThat(success).isFalse(); - } -} diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/devsupport/MultipartStreamReaderTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/devsupport/MultipartStreamReaderTest.kt new file mode 100644 index 00000000000..87e37867cf7 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/devsupport/MultipartStreamReaderTest.kt @@ -0,0 +1,140 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.devsupport + +import okio.Buffer +import okio.ByteString +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class MultipartStreamReaderTest { + + @Test + fun testSimpleCase() { + val response: ByteString = + encodeUtf8( + "preamble, should be ignored\r\n" + + "--sample_boundary\r\n" + + "Content-Type: application/json; charset=utf-8\r\n" + + "Content-Length: 2\r\n\r\n" + + "{}\r\n" + + "--sample_boundary--\r\n" + + "epilogue, should be ignored") + + val source = Buffer() + source.write(response) + + val reader = MultipartStreamReader(source, "sample_boundary") + + val callback: CallCountTrackingChunkCallback = + object : CallCountTrackingChunkCallback() { + override fun onChunkComplete(headers: Map?, body: Buffer, done: Boolean) { + super.onChunkComplete(headers, body, done) + + assertThat(done).isTrue + assertThat(headers!!["Content-Type"]).isEqualTo("application/json; charset=utf-8") + assertThat(body.readUtf8()).isEqualTo("{}") + } + } + val success = reader.readAllParts(callback) + + assertThat(callback.callCount).isEqualTo(1) + assertThat(success).isTrue + } + + @Test + fun testMultipleParts() { + val response: ByteString = + encodeUtf8( + "preamble, should be ignored\r\n" + + "--sample_boundary\r\n" + + "1\r\n" + + "--sample_boundary\r\n" + + "2\r\n" + + "--sample_boundary\r\n" + + "3\r\n" + + "--sample_boundary--\r\n" + + "epilogue, should be ignored") + + val source = Buffer() + source.write(response) + + val reader = MultipartStreamReader(source, "sample_boundary") + + val callback: CallCountTrackingChunkCallback = + object : CallCountTrackingChunkCallback() { + override fun onChunkComplete(headers: Map?, body: Buffer, done: Boolean) { + super.onChunkComplete(headers, body, done) + + assertThat(done).isEqualTo(callCount == 3) + assertThat(body.readUtf8()).isEqualTo("$callCount") + } + } + val success = reader.readAllParts(callback) + + assertThat(callback.callCount).isEqualTo(3) + assertThat(success).isTrue + } + + @Test + fun testNoDelimiter() { + val response: ByteString = encodeUtf8("Yolo") + + val source = Buffer() + source.write(response) + + val reader = MultipartStreamReader(source, "sample_boundary") + + val callback = CallCountTrackingChunkCallback() + val success = reader.readAllParts(callback) + + assertThat(callback.callCount).isEqualTo(0) + assertThat(success).isFalse + } + + @Test + fun testNoCloseDelimiter() { + val response: ByteString = + encodeUtf8( + "preamble, should be ignored\r\n" + + "--sample_boundary\r\n" + + "Content-Type: application/json; charset=utf-8\r\n" + + "Content-Length: 2\r\n\r\n" + + "{}\r\n" + + "--sample_boundary\r\n" + + "incomplete message...") + + val source = Buffer() + source.write(response) + + val reader = MultipartStreamReader(source, "sample_boundary") + + val callback = CallCountTrackingChunkCallback() + val success = reader.readAllParts(callback) + + assertThat(callback.callCount).isEqualTo(1) + assertThat(success).isFalse + } + + internal open class CallCountTrackingChunkCallback : MultipartStreamReader.ChunkListener { + var callCount = 0 + private set + + override fun onChunkComplete(headers: Map?, body: Buffer, done: Boolean) { + callCount++ + } + + override fun onChunkProgress(headers: Map, loaded: Long, total: Long) {} + } + + private fun encodeUtf8(input: String): ByteString = + ByteString.of(*input.toByteArray(Charsets.UTF_8)) +}