mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
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:
committed by
Facebook GitHub Bot
parent
5cc8ceeae2
commit
0aa330801b
-151
@@ -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();
|
||||
}
|
||||
}
|
||||
+140
@@ -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))
|
||||
}
|
||||
Reference in New Issue
Block a user