Migrate MultipartStreamReaderTest to Kotlin (#37743)

Summary:
Migrate [MultipartStreamReaderTest.java](https://github.com/facebook/react-native/blob/main/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/devsupport/MultipartStreamReaderTest.java) to Kotlin.  See https://github.com/facebook/react-native/issues/37708

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[INTERNAL] [CHANGED] - Migrate MultipartStreamReaderTest to Kotlin

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->
[INTERNAL] [CHANGED] - Migrate MultipartStreamReaderTest to Kotlin

Pull Request resolved: https://github.com/facebook/react-native/pull/37743

Test Plan:
Tests pass: ./gradlew :packages:react-native:ReactAndroid:test
Formatted with [KtFmt](https://facebook.github.io/ktfmt/)

Reviewed By: mdvacca

Differential Revision: D46559844

Pulled By: cortinico

fbshipit-source-id: 4cc7b0cb9819930567c4021dace0c48e93be333c
This commit is contained in:
brunohensel
2023-06-09 06:18:18 -07:00
committed by Facebook GitHub Bot
parent 5cc8ceeae2
commit 0aa330801b
2 changed files with 140 additions and 151 deletions
@@ -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<String, String> headers, Buffer body, boolean done)
throws IOException {
mCount++;
}
@Override
public void onChunkProgress(Map<String, String> 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<String, String> 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<String, String> 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();
}
}
@@ -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<String, String>?, 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<String, String>?, 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<String, String>?, body: Buffer, done: Boolean) {
callCount++
}
override fun onChunkProgress(headers: Map<String, String>, loaded: Long, total: Long) {}
}
private fun encodeUtf8(input: String): ByteString =
ByteString.of(*input.toByteArray(Charsets.UTF_8))
}