From f51d644252d6575641053b87ec59b646b6484dd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sikora?= Date: Fri, 29 Jan 2021 21:30:18 +0100 Subject: [PATCH 1/3] Add limiting source --- .../internal/support/LimitingSource.kt | 19 ++++++ .../internal/support/LimitingSourceTest.kt | 65 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 library/src/main/java/com/chuckerteam/chucker/internal/support/LimitingSource.kt create mode 100644 library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/LimitingSource.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/LimitingSource.kt new file mode 100644 index 000000000..e9162de74 --- /dev/null +++ b/library/src/main/java/com/chuckerteam/chucker/internal/support/LimitingSource.kt @@ -0,0 +1,19 @@ +package com.chuckerteam.chucker.internal.support + +import okio.Buffer +import okio.ForwardingSource +import okio.Source + +internal class LimitingSource( + delegate: Source, + private val bytesCountThreshold: Long, +) : ForwardingSource(delegate) { + private var bytesRead = 0L + val isThresholdReached get() = bytesRead >= bytesCountThreshold + + override fun read(sink: Buffer, byteCount: Long) = if (!isThresholdReached) { + super.read(sink, byteCount).also { bytesRead += it } + } else { + -1L + } +} diff --git a/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt b/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt new file mode 100644 index 000000000..779ee3729 --- /dev/null +++ b/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt @@ -0,0 +1,65 @@ +package com.chuckerteam.chucker.internal.support + +import com.chuckerteam.chucker.SEGMENT_SIZE +import com.google.common.truth.Truth.assertThat +import okio.Buffer +import okio.buffer +import org.junit.jupiter.api.Test + +internal class LimitingSourceTest { + @Test + fun limitedBytes_doNotExceedLimit_whenAboveThreshold() { + val content = "!".repeat(10 * SEGMENT_SIZE.toInt()) + val originalSource = Buffer().writeUtf8(content) + val limitingSource = LimitingSource(originalSource, 2 * SEGMENT_SIZE) + + val limitedContent = limitingSource.buffer().readByteString().utf8() + + assertThat(limitedContent).isEqualTo("!".repeat(2 * SEGMENT_SIZE.toInt())) + } + + @Test + fun originalBytes_areNotDepleted() { + val content = "!".repeat(10 * SEGMENT_SIZE.toInt()) + val originalSource = Buffer().writeUtf8(content) + val limitingSource = LimitingSource(originalSource, 2 * SEGMENT_SIZE) + + limitingSource.buffer().readByteString() + val originalContent = originalSource.buffer.readByteString().utf8() + + assertThat(originalContent).isEqualTo("!".repeat(8 * SEGMENT_SIZE.toInt())) + } + + @Test + fun bytesLimitIsNotReached_whenBelowThreshold() { + val content = "!".repeat(3 * SEGMENT_SIZE.toInt()) + val originalSource = Buffer().writeUtf8(content) + val limitingSource = LimitingSource(originalSource, 4 * SEGMENT_SIZE) + + limitingSource.buffer().readByteString() + + assertThat(limitingSource.isThresholdReached).isFalse() + } + + @Test + fun bytesLimitIsReached_whenEqualToThreshold() { + val content = "!".repeat(3 * SEGMENT_SIZE.toInt()) + val originalSource = Buffer().writeUtf8(content) + val limitingSource = LimitingSource(originalSource, 3 * SEGMENT_SIZE) + + limitingSource.buffer().readByteString() + + assertThat(limitingSource.isThresholdReached).isTrue() + } + + @Test + fun bytesLimitIsReached_whenAboveThreshold() { + val content = "!".repeat(3 * SEGMENT_SIZE.toInt()) + val originalSource = Buffer().writeUtf8(content) + val limitingSource = LimitingSource(originalSource, 2 * SEGMENT_SIZE) + + limitingSource.buffer().readByteString() + + assertThat(limitingSource.isThresholdReached).isTrue() + } +} From fb5224272593b634bb914852587a4b41a7b62e4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sikora?= Date: Fri, 29 Jan 2021 21:49:54 +0100 Subject: [PATCH 2/3] Move request processing to a separate class - Limit content length with limiting source. - Do not assume that request has plain text body. --- .../chucker/api/ChuckerInterceptor.kt | 44 +---------- .../internal/data/entity/HttpTransaction.kt | 2 +- .../chucker/internal/support/IOUtils.kt | 37 --------- .../chucker/internal/support/OkHttpUtils.kt | 13 ---- .../internal/support/RequestProcessor.kt | 66 ++++++++++++++++ library/src/main/res/values/strings.xml | 1 - .../chucker/ChuckerInterceptorDelegate.kt | 2 +- .../chucker/api/ChuckerInterceptorTest.kt | 75 +++++++++++++++++++ .../chucker/internal/support/IOUtilsTest.kt | 71 ------------------ .../internal/support/OkHttpUtilsTest.kt | 33 -------- 10 files changed, 146 insertions(+), 198 deletions(-) delete mode 100644 library/src/main/java/com/chuckerteam/chucker/internal/support/IOUtils.kt create mode 100644 library/src/main/java/com/chuckerteam/chucker/internal/support/RequestProcessor.kt delete mode 100644 library/src/test/java/com/chuckerteam/chucker/internal/support/IOUtilsTest.kt diff --git a/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt b/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt index 9d603e743..bb5b7f19b 100755 --- a/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt +++ b/library/src/main/java/com/chuckerteam/chucker/api/ChuckerInterceptor.kt @@ -6,19 +6,17 @@ import com.chuckerteam.chucker.internal.data.entity.HttpTransaction import com.chuckerteam.chucker.internal.support.CacheDirectoryProvider import com.chuckerteam.chucker.internal.support.DepletingSource import com.chuckerteam.chucker.internal.support.FileFactory -import com.chuckerteam.chucker.internal.support.IOUtils import com.chuckerteam.chucker.internal.support.Logger import com.chuckerteam.chucker.internal.support.ReportingSink +import com.chuckerteam.chucker.internal.support.RequestProcessor import com.chuckerteam.chucker.internal.support.TeeSource import com.chuckerteam.chucker.internal.support.contentType import com.chuckerteam.chucker.internal.support.hasBody import com.chuckerteam.chucker.internal.support.hasSupportedContentEncoding -import com.chuckerteam.chucker.internal.support.isGzipped import com.chuckerteam.chucker.internal.support.isProbablyPlainText import com.chuckerteam.chucker.internal.support.uncompress import okhttp3.Headers import okhttp3.Interceptor -import okhttp3.Request import okhttp3.Response import okhttp3.ResponseBody.Companion.asResponseBody import okio.Buffer @@ -53,8 +51,8 @@ public class ChuckerInterceptor private constructor( private val maxContentLength = builder.maxContentLength private val cacheDirectoryProvider = builder.cacheDirectoryProvider ?: CacheDirectoryProvider { context.filesDir } private val alwaysReadResponseBody = builder.alwaysReadResponseBody - private val io = IOUtils(builder.context) private val headersToRedact = builder.headersToRedact.toMutableSet() + private val requestProcessor = RequestProcessor(context, collector, maxContentLength) /** Adds [headerName] into [headersToRedact] */ public fun redactHeader(vararg headerName: String) { @@ -63,11 +61,8 @@ public class ChuckerInterceptor private constructor( @Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request() val transaction = HttpTransaction() - - processRequest(request, transaction) - collector.onRequestSent(transaction) + val request = requestProcessor.process(chain.request(), transaction) val response = try { chain.proceed(request) @@ -81,39 +76,6 @@ public class ChuckerInterceptor private constructor( return multiCastResponseBody(response, transaction) } - /** - * Processes a [Request] and populates corresponding fields of a [HttpTransaction]. - */ - private fun processRequest(request: Request, transaction: HttpTransaction) { - val requestBody = request.body - - val encodingIsSupported = request.headers.hasSupportedContentEncoding - - transaction.apply { - setRequestHeaders(request.headers) - populateUrl(request.url) - - isRequestBodyPlainText = encodingIsSupported - requestDate = System.currentTimeMillis() - method = request.method - requestContentType = requestBody?.contentType()?.toString() - requestPayloadSize = requestBody?.contentLength() ?: 0L - } - - if (requestBody != null && encodingIsSupported) { - val source = io.getNativeSource(Buffer(), request.isGzipped) - val buffer = source.buffer - requestBody.writeTo(buffer) - val charset = requestBody.contentType()?.charset() ?: UTF_8 - if (buffer.isProbablyPlainText) { - val content = io.readFromBuffer(buffer, charset, maxContentLength) - transaction.requestBody = content - } else { - transaction.isRequestBodyPlainText = false - } - } - } - /** * Processes [Response] metadata and populates corresponding fields of a [HttpTransaction]. */ diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt b/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt index 3c6d403e1..ca7e49ce9 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/data/entity/HttpTransaction.kt @@ -41,7 +41,7 @@ internal class HttpTransaction( @ColumnInfo(name = "requestContentType") var requestContentType: String?, @ColumnInfo(name = "requestHeaders") var requestHeaders: String?, @ColumnInfo(name = "requestBody") var requestBody: String?, - @ColumnInfo(name = "isRequestBodyPlainText") var isRequestBodyPlainText: Boolean = true, + @ColumnInfo(name = "isRequestBodyPlainText") var isRequestBodyPlainText: Boolean = false, @ColumnInfo(name = "responseCode") var responseCode: Int?, @ColumnInfo(name = "responseMessage") var responseMessage: String?, @ColumnInfo(name = "error") var error: String?, diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/IOUtils.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/IOUtils.kt deleted file mode 100644 index a059d7546..000000000 --- a/library/src/main/java/com/chuckerteam/chucker/internal/support/IOUtils.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.chuckerteam.chucker.internal.support - -import android.content.Context -import com.chuckerteam.chucker.R -import okio.Buffer -import okio.BufferedSource -import okio.GzipSource -import okio.buffer -import java.io.EOFException -import java.nio.charset.Charset -import kotlin.math.min - -internal class IOUtils(private val context: Context) { - - fun readFromBuffer(buffer: Buffer, charset: Charset, maxContentLength: Long): String { - val bufferSize = buffer.size - val maxBytes = min(bufferSize, maxContentLength) - var body = "" - try { - body = buffer.readString(maxBytes, charset) - } catch (e: EOFException) { - body += context.getString(R.string.chucker_body_unexpected_eof) - } - - if (bufferSize > maxContentLength) { - body += context.getString(R.string.chucker_body_content_truncated) - } - return body - } - - fun getNativeSource(input: BufferedSource, isGzipped: Boolean): BufferedSource = if (isGzipped) { - val source = GzipSource(input) - source.use { it.buffer() } - } else { - input - } -} diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/OkHttpUtils.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/OkHttpUtils.kt index be46a80fb..023bcbceb 100644 --- a/library/src/main/java/com/chuckerteam/chucker/internal/support/OkHttpUtils.kt +++ b/library/src/main/java/com/chuckerteam/chucker/internal/support/OkHttpUtils.kt @@ -1,7 +1,6 @@ package com.chuckerteam.chucker.internal.support import okhttp3.Headers -import okhttp3.Request import okhttp3.Response import okio.Source import okio.gzip @@ -47,18 +46,6 @@ internal val Response.contentType: String? return this.header("Content-Type") } -/** Checks if the OkHttp response uses gzip encoding. */ -internal val Response.isGzipped: Boolean - get() { - return this.headers.containsGzip - } - -/** Checks if the OkHttp request uses gzip encoding. */ -internal val Request.isGzipped: Boolean - get() { - return this.headers.containsGzip - } - private val Headers.containsGzip: Boolean get() { return this["Content-Encoding"].equals("gzip", ignoreCase = true) diff --git a/library/src/main/java/com/chuckerteam/chucker/internal/support/RequestProcessor.kt b/library/src/main/java/com/chuckerteam/chucker/internal/support/RequestProcessor.kt new file mode 100644 index 000000000..e5904d473 --- /dev/null +++ b/library/src/main/java/com/chuckerteam/chucker/internal/support/RequestProcessor.kt @@ -0,0 +1,66 @@ +package com.chuckerteam.chucker.internal.support + +import android.content.Context +import com.chuckerteam.chucker.R +import com.chuckerteam.chucker.api.ChuckerCollector +import com.chuckerteam.chucker.internal.data.entity.HttpTransaction +import okhttp3.Request +import okio.Buffer +import okio.IOException +import kotlin.text.Charsets.UTF_8 + +internal class RequestProcessor( + private val context: Context, + private val collector: ChuckerCollector, + private val maxContentLength: Long, +) { + fun process(request: Request, transaction: HttpTransaction): Request { + processMetadata(request, transaction) + processBody(request, transaction) + collector.onRequestSent(transaction) + return request + } + + private fun processMetadata(request: Request, transaction: HttpTransaction) { + transaction.apply { + setRequestHeaders(request.headers) + populateUrl(request.url) + + requestDate = System.currentTimeMillis() + method = request.method + requestContentType = request.body?.contentType()?.toString() + requestPayloadSize = request.body?.contentLength() + } + } + + private fun processBody(request: Request, transaction: HttpTransaction) { + val body = request.body ?: return + + val isEncodingSupported = request.headers.hasSupportedContentEncoding + if (!isEncodingSupported) { + return + } + + val limitingSource = try { + Buffer().apply { body.writeTo(this) } + } catch (e: IOException) { + Logger.error("Failed to read request payload", e) + return + }.uncompress(request.headers).let { LimitingSource(it, maxContentLength) } + + val contentBuffer = Buffer().apply { limitingSource.use { writeAll(it) } } + if (!contentBuffer.isProbablyPlainText) { + return + } + + transaction.isRequestBodyPlainText = true + try { + transaction.requestBody = contentBuffer.readString(body.contentType()?.charset() ?: UTF_8) + } catch (e: IOException) { + Logger.error("Failed to process request payload", e) + } + if (limitingSource.isThresholdReached) { + transaction.requestBody += context.getString(R.string.chucker_body_content_truncated) + } + } +} diff --git a/library/src/main/res/values/strings.xml b/library/src/main/res/values/strings.xml index 542795e7d..b73f051e0 100644 --- a/library/src/main/res/values/strings.xml +++ b/library/src/main/res/values/strings.xml @@ -37,7 +37,6 @@ (body is empty) (encoded or binary body omitted) Search - \n\n--- Unexpected end of content --- \n\n--- Content truncated --- Network Errors diff --git a/library/src/test/java/com/chuckerteam/chucker/ChuckerInterceptorDelegate.kt b/library/src/test/java/com/chuckerteam/chucker/ChuckerInterceptorDelegate.kt index 726f55327..e2129ec6c 100644 --- a/library/src/test/java/com/chuckerteam/chucker/ChuckerInterceptorDelegate.kt +++ b/library/src/test/java/com/chuckerteam/chucker/ChuckerInterceptorDelegate.kt @@ -22,7 +22,7 @@ internal class ChuckerInterceptorDelegate( private val transactions = CopyOnWriteArrayList() private val mockContext = mockk { - every { getString(any()) } returns "" + every { getString(R.string.chucker_body_content_truncated) } returns "\n\n--- Content truncated ---" } private val mockCollector = mockk { every { onRequestSent(any()) } returns Unit diff --git a/library/src/test/java/com/chuckerteam/chucker/api/ChuckerInterceptorTest.kt b/library/src/test/java/com/chuckerteam/chucker/api/ChuckerInterceptorTest.kt index d4e1d7a14..1176301df 100644 --- a/library/src/test/java/com/chuckerteam/chucker/api/ChuckerInterceptorTest.kt +++ b/library/src/test/java/com/chuckerteam/chucker/api/ChuckerInterceptorTest.kt @@ -21,6 +21,7 @@ import okio.Buffer import okio.ByteString import okio.ByteString.Companion.encodeUtf8 import okio.GzipSink +import okio.buffer import org.junit.Rule import org.junit.jupiter.api.assertThrows import org.junit.jupiter.api.extension.ExtendWith @@ -421,5 +422,79 @@ internal class ChuckerInterceptorTest { assertThat(transaction.isRequestBodyPlainText).isFalse() } + @ParameterizedTest + @EnumSource(value = ClientFactory::class) + fun requestBody_isAvailableToServer(factory: ClientFactory) { + server.enqueue(MockResponse()) + val client = factory.create(chuckerInterceptor) + + val request = "Hello, world!".toRequestBody().toServerRequest() + client.newCall(request).execute().readByteStringBody() + val serverRequestContent = server.takeRequest().body.readByteString() + + assertThat(serverRequestContent.utf8()).isEqualTo("Hello, world!") + } + + @ParameterizedTest + @EnumSource(value = ClientFactory::class) + fun plainTextRequestBody_isAvailableToChucker(factory: ClientFactory) { + server.enqueue(MockResponse()) + val client = factory.create(chuckerInterceptor) + + val request = "Hello, world!".toRequestBody().toServerRequest() + client.newCall(request).execute().readByteStringBody() + + val transaction = chuckerInterceptor.expectTransaction() + assertThat(transaction.isRequestBodyPlainText).isTrue() + assertThat(transaction.requestBody).isEqualTo("Hello, world!") + assertThat(transaction.requestPayloadSize).isEqualTo(request.body!!.contentLength()) + } + + @ParameterizedTest + @EnumSource(value = ClientFactory::class) + fun gzippedRequestBody_isGunzippedForChucker(factory: ClientFactory) { + server.enqueue(MockResponse()) + val client = factory.create(chuckerInterceptor) + + val gzippedBytes = Buffer().apply { + GzipSink(this).buffer().use { sink -> sink.writeUtf8("Hello, world!") } + }.readByteString() + val request = gzippedBytes.toRequestBody().toServerRequest() + .newBuilder() + .header("Content-Encoding", "gzip") + .build() + client.newCall(request).execute().readByteStringBody() + + val transaction = chuckerInterceptor.expectTransaction() + assertThat(transaction.isRequestBodyPlainText).isTrue() + assertThat(transaction.requestBody).isEqualTo("Hello, world!") + assertThat(transaction.requestPayloadSize).isEqualTo(request.body!!.contentLength()) + } + + @ParameterizedTest + @EnumSource(value = ClientFactory::class) + fun requestBody_isTruncatedToMaxContentLength(factory: ClientFactory) { + server.enqueue(MockResponse()) + val chuckerInterceptor = ChuckerInterceptorDelegate( + maxContentLength = SEGMENT_SIZE, + cacheDirectoryProvider = { tempDir }, + ) + val client = factory.create(chuckerInterceptor) + + val request = "!".repeat(SEGMENT_SIZE.toInt() * 10).toRequestBody().toServerRequest() + client.newCall(request).execute().readByteStringBody() + + val transaction = chuckerInterceptor.expectTransaction() + assertThat(transaction.isRequestBodyPlainText).isTrue() + assertThat(transaction.requestBody).isEqualTo( + """ + ${"!".repeat(SEGMENT_SIZE.toInt())} + + --- Content truncated --- + """.trimIndent() + ) + assertThat(transaction.requestPayloadSize).isEqualTo(request.body!!.contentLength()) + } + private fun RequestBody.toServerRequest() = Request.Builder().url(serverUrl).post(this).build() } diff --git a/library/src/test/java/com/chuckerteam/chucker/internal/support/IOUtilsTest.kt b/library/src/test/java/com/chuckerteam/chucker/internal/support/IOUtilsTest.kt deleted file mode 100644 index 64cb2a365..000000000 --- a/library/src/test/java/com/chuckerteam/chucker/internal/support/IOUtilsTest.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.chuckerteam.chucker.internal.support - -import android.content.Context -import com.chuckerteam.chucker.R -import com.google.common.truth.Truth.assertThat -import io.mockk.every -import io.mockk.mockk -import io.mockk.verify -import okio.Buffer -import org.junit.jupiter.api.Test -import java.io.EOFException -import java.nio.charset.Charset - -internal class IOUtilsTest { - - private val mockContext = mockk() - private val ioUtils = IOUtils(mockContext) - - @Test - fun readFromBuffer_contentNotTruncated() { - val mockBuffer = mockk() - every { mockBuffer.size } returns 100L - every { mockBuffer.readString(any(), any()) } returns "{ \"message\": \"just a mock body\"}" - - val result = ioUtils.readFromBuffer(mockBuffer, Charset.defaultCharset(), 200L) - - assertThat(result).isEqualTo("{ \"message\": \"just a mock body\"}") - verify { mockBuffer.readString(100L, Charset.defaultCharset()) } - } - - @Test - fun readFromBuffer_contentTruncated() { - val mockBuffer = mockk() - every { mockBuffer.size } returns 100L - every { mockBuffer.readString(any(), any()) } returns "{ \"message\": \"just a mock body\"}" - every { mockContext.getString(R.string.chucker_body_content_truncated) } returns "\\n\\n--- Content truncated ---" - - val result = ioUtils.readFromBuffer(mockBuffer, Charset.defaultCharset(), 50L) - - assertThat(result).isEqualTo("{ \"message\": \"just a mock body\"}\\n\\n--- Content truncated ---") - verify { mockBuffer.readString(50L, Charset.defaultCharset()) } - } - - @Test - fun readFromBuffer_unexpectedEOF() { - val mockBuffer = mockk() - every { mockBuffer.size } returns 100L - every { mockBuffer.readString(any(), any()) } throws EOFException() - every { mockContext.getString(R.string.chucker_body_unexpected_eof) } returns "\\n\\n--- Unexpected end of content ---" - - val result = ioUtils.readFromBuffer(mockBuffer, Charset.defaultCharset(), 200L) - - assertThat(result).isEqualTo("\\n\\n--- Unexpected end of content ---") - } - - @Test - fun getNativeSource_withNotGzipped() { - val buffer = Buffer() - - val nativeSource = ioUtils.getNativeSource(buffer, false) - assertThat(nativeSource).isEqualTo(buffer) - } - - @Test - fun getNativeSource_withGzipped() { - val buffer = Buffer() - - val nativeSource = ioUtils.getNativeSource(buffer, true) - assertThat(nativeSource).isNotEqualTo(buffer) - } -} diff --git a/library/src/test/java/com/chuckerteam/chucker/internal/support/OkHttpUtilsTest.kt b/library/src/test/java/com/chuckerteam/chucker/internal/support/OkHttpUtilsTest.kt index fc4831490..9c0329342 100644 --- a/library/src/test/java/com/chuckerteam/chucker/internal/support/OkHttpUtilsTest.kt +++ b/library/src/test/java/com/chuckerteam/chucker/internal/support/OkHttpUtilsTest.kt @@ -5,7 +5,6 @@ import io.mockk.every import io.mockk.mockk import okhttp3.Headers import okhttp3.Headers.Companion.headersOf -import okhttp3.Request import okhttp3.Response import okio.Buffer import okio.BufferedSource @@ -45,38 +44,6 @@ internal class OkHttpUtilsTest { assertThat(mockResponse.isChunked).isTrue() } - @Test - fun responseIsGzipped_withOtherEncoding_returnsTrue() { - val mockResponse = mockk() - every { mockResponse.headers } returns headersOf("Content-Encoding", "gzip") - - assertThat(mockResponse.isGzipped).isTrue() - } - - @Test - fun responseIsGzipped_withOtherEncoding_returnsFalse() { - val mockResponse = mockk() - every { mockResponse.headers } returns headersOf("Content-Encoding", "identity") - - assertThat(mockResponse.isGzipped).isFalse() - } - - @Test - fun requestIsGzipped_withOtherEncoding_returnsTrue() { - val mockRequest = mockk() - every { mockRequest.headers } returns headersOf("Content-Encoding", "gzip") - - assertThat(mockRequest.isGzipped).isTrue() - } - - @Test - fun requestIsGzipped_withOtherEncoding_returnsFalse() { - val mockRequest = mockk() - every { mockRequest.headers } returns headersOf("Content-Encoding", "identity") - - assertThat(mockRequest.isGzipped).isFalse() - } - @Test fun uncompressSource_withGzippedContent() { val content = "Hello there!" From 12f8cef89e3bfc3198abba9637813be69fdec830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sikora?= Date: Fri, 29 Jan 2021 22:04:41 +0100 Subject: [PATCH 3/3] Simplify test name --- .../chuckerteam/chucker/internal/support/LimitingSourceTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt b/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt index 779ee3729..f54d719d4 100644 --- a/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt +++ b/library/src/test/java/com/chuckerteam/chucker/internal/support/LimitingSourceTest.kt @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test internal class LimitingSourceTest { @Test - fun limitedBytes_doNotExceedLimit_whenAboveThreshold() { + fun limitedBytes_doNotExceedLimit() { val content = "!".repeat(10 * SEGMENT_SIZE.toInt()) val originalSource = Buffer().writeUtf8(content) val limitingSource = LimitingSource(originalSource, 2 * SEGMENT_SIZE)