From 1e7f10efa0da4c849ff4694524610e6aa2660b7d Mon Sep 17 00:00:00 2001 From: Francisco Veiga Date: Tue, 21 Apr 2026 10:56:00 +0100 Subject: [PATCH 1/2] Add request to HttpResponseInfo.kt --- dd-sdk-android-core/api/apiSurface | 1 + .../api/dd-sdk-android-core.api | 1 + .../network/HttpResponseInfo.kt | 5 +++ .../cronet/internal/CronetHttpResponseInfo.kt | 6 ++- .../cronet/internal/CronetRequestCallback.kt | 8 +++- .../CronetRequestFinishedInfoListener.kt | 2 +- .../internal/CronetRequestCallbackTest.kt | 2 + .../CronetRequestFinishedInfoListenerTest.kt | 2 +- .../cronet/internal/CronetResponseInfoTest.kt | 38 ++++++++++++------- .../okhttp/internal/OkHttpResponseInfo.kt | 3 ++ .../okhttp/internal/OkHttpResponseInfoTest.kt | 14 +++++++ 11 files changed, 64 insertions(+), 18 deletions(-) diff --git a/dd-sdk-android-core/api/apiSurface b/dd-sdk-android-core/api/apiSurface index c6b806b96a..a0a346fe5f 100644 --- a/dd-sdk-android-core/api/apiSurface +++ b/dd-sdk-android-core/api/apiSurface @@ -177,6 +177,7 @@ interface com.datadog.android.api.instrumentation.network.HttpResponseInfo val headers: Map> val contentType: String? val contentLength: Long? + val request: HttpRequestInfo interface com.datadog.android.api.instrumentation.network.MutableHttpRequestInfo fun newBuilder(): HttpRequestInfoBuilder data class com.datadog.android.api.net.Request diff --git a/dd-sdk-android-core/api/dd-sdk-android-core.api b/dd-sdk-android-core/api/dd-sdk-android-core.api index b206425a2f..370496fc0d 100644 --- a/dd-sdk-android-core/api/dd-sdk-android-core.api +++ b/dd-sdk-android-core/api/dd-sdk-android-core.api @@ -499,6 +499,7 @@ public abstract interface class com/datadog/android/api/instrumentation/network/ public abstract fun getContentLength ()Ljava/lang/Long; public abstract fun getContentType ()Ljava/lang/String; public abstract fun getHeaders ()Ljava/util/Map; + public abstract fun getRequest ()Lcom/datadog/android/api/instrumentation/network/HttpRequestInfo; public abstract fun getStatusCode ()I public abstract fun getUrl ()Ljava/lang/String; } diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt index 22d3ab71d6..a20690c9dd 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt @@ -38,4 +38,9 @@ interface HttpResponseInfo { */ @get:WorkerThread val contentLength: Long? + + /** + * Represents the HTTP request associated with the response. + */ + val request: HttpRequestInfo } diff --git a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt index 7cd4613514..b97fc7883f 100644 --- a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt +++ b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt @@ -5,12 +5,14 @@ */ package com.datadog.android.cronet.internal +import com.datadog.android.api.instrumentation.network.HttpRequestInfo import com.datadog.android.api.instrumentation.network.HttpResponseInfo import com.datadog.android.internal.network.HttpSpec import org.chromium.net.UrlResponseInfo internal data class CronetHttpResponseInfo( - private val response: UrlResponseInfo + private val response: UrlResponseInfo, + override val request: HttpRequestInfo ) : HttpResponseInfo { override val url: String get() = response.url @@ -35,7 +37,7 @@ internal data class CronetHttpResponseInfo( get() { /* * Content-Length is expected to be declared once or in case of multiple repetitions should have same value. - * Otherwise it's assumed that Content-Length is invalid + * Otherwise, it's assumed that Content-Length is invalid * according to https://www.rfc-editor.org/rfc/rfc9110.pdf, page 63: * * Likewise, a sender forward a message with a Content-Length header field value that does not match the ABNF diff --git a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt index be0e21d615..fcdabc4305 100644 --- a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt +++ b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt @@ -102,7 +102,13 @@ internal class CronetRequestCallback( ) = delegate.onReadCompleted(request, info, byteBuffer) private fun finishSuccessRequestTracing(response: UrlResponseInfo?) { - val responseInfo = response?.let { CronetHttpResponseInfo(it) } + val requestInfo = apmTracingStateHolder.get()?.createRequestInfo() + ?: distributedTracingStateHolder.get()?.createRequestInfo() + val responseInfo = if (response != null && requestInfo != null) { + CronetHttpResponseInfo(response, requestInfo) + } else { + null + } apmTracingStateHolder.getAndSet(null)?.let { apmTracingState -> if (responseInfo != null) { diff --git a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt index 584091d7d8..4725130ebe 100644 --- a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt +++ b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt @@ -53,7 +53,7 @@ internal class CronetRequestFinishedInfoListener( } RequestFinishedInfo.SUCCEEDED -> { - val responseInfo = finishedInfo.responseInfo?.let { CronetHttpResponseInfo(it) } + val responseInfo = finishedInfo.responseInfo?.let { CronetHttpResponseInfo(it, requestInfo) } if (responseInfo == null) { rumNetworkInstrumentation.stopResourceWithError( diff --git a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt index 2b570c6de6..3d3e3060df 100644 --- a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt +++ b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt @@ -388,6 +388,7 @@ internal class CronetRequestCallbackTest { // Given val mockDistributedTracingState: RequestTracingState = mock() whenever(mockDistributedTracingInstrumentation.onRequest(fakeRequestInfo)) doReturn mockDistributedTracingState + whenever(mockDistributedTracingState.createRequestInfo()) doReturn mockMutableRequestInfo testedCallback.onRequestStarted(fakeRequestInfo) // When @@ -476,6 +477,7 @@ internal class CronetRequestCallbackTest { // Given val mockDistributedTracingState: RequestTracingState = mock() whenever(mockDistributedTracingInstrumentation.onRequest(fakeRequestInfo)) doReturn mockDistributedTracingState + whenever(mockDistributedTracingState.createRequestInfo()) doReturn mockMutableRequestInfo testedCallback.onRequestStarted(fakeRequestInfo) // When diff --git a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt index 0e39811591..b88f45fc25 100644 --- a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt +++ b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt @@ -136,7 +136,7 @@ internal class CronetRequestFinishedInfoListenerTest { // Then verify(mockRumNetworkInstrumentation).stopResource( requestInfo = fakeRequestInfo, - responseInfo = CronetHttpResponseInfo(mockResponseInfo) + responseInfo = CronetHttpResponseInfo(mockResponseInfo, fakeRequestInfo) ) } diff --git a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt index 74e98200da..ecf8088f5c 100644 --- a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt +++ b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt @@ -6,7 +6,7 @@ package com.datadog.android.cronet.internal -import com.datadog.android.api.InternalLogger +import com.datadog.android.api.instrumentation.network.HttpRequestInfo import com.datadog.android.internal.network.HttpSpec import com.datadog.android.utils.forge.Configurator import com.datadog.tools.unit.forge.exhaustiveAttributes @@ -40,7 +40,7 @@ internal class CronetResponseInfoTest { lateinit var mockUrlResponseInfo: UrlResponseInfo @Mock - lateinit var mockInternalLogger: InternalLogger + lateinit var mockRequestInfo: HttpRequestInfo lateinit var fakeHeaders: Map> @@ -55,7 +55,7 @@ internal class CronetResponseInfoTest { ) { // Given whenever(mockUrlResponseInfo.url).thenReturn(fakeUrl) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.url @@ -70,7 +70,7 @@ internal class CronetResponseInfoTest { ) { // Given whenever(mockUrlResponseInfo.httpStatusCode).thenReturn(fakeStatusCode) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.statusCode @@ -84,7 +84,7 @@ internal class CronetResponseInfoTest { // Given whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.headers @@ -100,7 +100,7 @@ internal class CronetResponseInfoTest { // Given val fakeHeaders = fakeHeaders + mapOf(HttpSpec.Header.CONTENT_TYPE to listOf(fakeContentType)) whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.contentType @@ -113,7 +113,7 @@ internal class CronetResponseInfoTest { fun `M return null W contentType property { no content type header }`() { // Given whenever(mockUrlResponseInfo.allHeaders).thenReturn(emptyMap()) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.contentType @@ -122,6 +122,18 @@ internal class CronetResponseInfoTest { assertThat(result).isNull() } + @Test + fun `M return request W request property`() { + // Given + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) + + // When + val result = responseInfo.request + + // Then + assertThat(result).isSameAs(mockRequestInfo) + } + @Test fun `M return content length from header W computeContentLength() { header present }`( @LongForgery(min = 1) fakeContentLength: Long @@ -129,7 +141,7 @@ internal class CronetResponseInfoTest { // Given val fakeHeaders = fakeHeaders + mapOf(HttpSpec.Header.CONTENT_LENGTH to listOf(fakeContentLength.toString())) whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.contentLength @@ -145,7 +157,7 @@ internal class CronetResponseInfoTest { // Given whenever(mockUrlResponseInfo.allHeaders).thenReturn(emptyMap()) whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(fakeByteCount) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.contentLength @@ -159,7 +171,7 @@ internal class CronetResponseInfoTest { // Given whenever(mockUrlResponseInfo.allHeaders).thenReturn(emptyMap()) whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(0L) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.contentLength @@ -173,7 +185,7 @@ internal class CronetResponseInfoTest { // Given whenever(mockUrlResponseInfo.allHeaders).thenReturn(emptyMap()) whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(-1L) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.contentLength @@ -192,7 +204,7 @@ internal class CronetResponseInfoTest { ) whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders) whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(100L) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.contentLength @@ -210,7 +222,7 @@ internal class CronetResponseInfoTest { val fakeHeaders = fakeHeaders + mapOf(HttpSpec.Header.CONTENT_LENGTH to listOf(fakeHeaderLength.toString())) whenever(mockUrlResponseInfo.allHeaders).thenReturn(fakeHeaders) whenever(mockUrlResponseInfo.receivedByteCount).thenReturn(fakeByteCount) - val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo) + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, mockRequestInfo) // When val result = responseInfo.contentLength diff --git a/integrations/dd-sdk-android-okhttp/src/main/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfo.kt b/integrations/dd-sdk-android-okhttp/src/main/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfo.kt index 1f57b78402..b6bbf7eb47 100644 --- a/integrations/dd-sdk-android-okhttp/src/main/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfo.kt +++ b/integrations/dd-sdk-android-okhttp/src/main/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfo.kt @@ -7,6 +7,7 @@ package com.datadog.android.okhttp.internal import androidx.annotation.WorkerThread import com.datadog.android.api.InternalLogger +import com.datadog.android.api.instrumentation.network.HttpRequestInfo import com.datadog.android.api.instrumentation.network.HttpResponseInfo import okhttp3.Response import okhttp3.ResponseBody @@ -65,6 +66,8 @@ internal class OkHttpResponseInfo( null } + override val request: HttpRequestInfo get() = OkHttpRequestInfo(originalResponse.request) + internal companion object { // We need to limit this value as the body will be loaded in memory diff --git a/integrations/dd-sdk-android-okhttp/src/test/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfoTest.kt b/integrations/dd-sdk-android-okhttp/src/test/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfoTest.kt index a8d62d2a1a..2c3b33b449 100644 --- a/integrations/dd-sdk-android-okhttp/src/test/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfoTest.kt +++ b/integrations/dd-sdk-android-okhttp/src/test/kotlin/com/datadog/android/okhttp/internal/OkHttpResponseInfoTest.kt @@ -90,6 +90,20 @@ internal class OkHttpResponseInfoTest { assertThat(result).isEqualTo(fakeHeaders) } + @Test + fun `M delegate W request property`() { + // Given + val mockRequest = mock() + val mockResponse = mock { on { request } doReturn mockRequest } + + // When + val result = OkHttpResponseInfo(mockResponse, mockInternalLogger).request + + // Then + assertThat(result).isInstanceOf(OkHttpRequestInfo::class.java) + assertThat(result.toOkHttpRequest()).isSameAs(mockRequest) + } + @Test fun `M delegate W contentType property { content type header present }`( @StringForgery fakeContentType: String, From d167cb0b1a9ccba966ff17db12910d7405238949 Mon Sep 17 00:00:00 2001 From: Francisco Veiga Date: Fri, 24 Apr 2026 11:00:38 +0100 Subject: [PATCH 2/2] Apply review suggestions --- dd-sdk-android-core/api/apiSurface | 2 +- .../network/HttpResponseInfo.kt | 4 ++-- .../cronet/internal/CronetHttpResponseInfo.kt | 3 +-- .../cronet/internal/CronetRequestCallback.kt | 24 +++++++++---------- .../CronetRequestFinishedInfoListener.kt | 3 +-- .../internal/CronetRequestCallbackTest.kt | 2 -- .../CronetRequestFinishedInfoListenerTest.kt | 5 ++-- .../cronet/internal/CronetResponseInfoTest.kt | 15 ++++++++++-- 8 files changed, 32 insertions(+), 26 deletions(-) diff --git a/dd-sdk-android-core/api/apiSurface b/dd-sdk-android-core/api/apiSurface index a0a346fe5f..f1547227c9 100644 --- a/dd-sdk-android-core/api/apiSurface +++ b/dd-sdk-android-core/api/apiSurface @@ -177,7 +177,7 @@ interface com.datadog.android.api.instrumentation.network.HttpResponseInfo val headers: Map> val contentType: String? val contentLength: Long? - val request: HttpRequestInfo + val request: HttpRequestInfo? interface com.datadog.android.api.instrumentation.network.MutableHttpRequestInfo fun newBuilder(): HttpRequestInfoBuilder data class com.datadog.android.api.net.Request diff --git a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt index a20690c9dd..fa3209d344 100644 --- a/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt +++ b/dd-sdk-android-core/src/main/kotlin/com/datadog/android/api/instrumentation/network/HttpResponseInfo.kt @@ -40,7 +40,7 @@ interface HttpResponseInfo { val contentLength: Long? /** - * Represents the HTTP request associated with the response. + * Represents the HTTP request associated with the response, or null when not available. */ - val request: HttpRequestInfo + val request: HttpRequestInfo? } diff --git a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt index b97fc7883f..52b308c22a 100644 --- a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt +++ b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetHttpResponseInfo.kt @@ -5,14 +5,13 @@ */ package com.datadog.android.cronet.internal -import com.datadog.android.api.instrumentation.network.HttpRequestInfo import com.datadog.android.api.instrumentation.network.HttpResponseInfo import com.datadog.android.internal.network.HttpSpec import org.chromium.net.UrlResponseInfo internal data class CronetHttpResponseInfo( private val response: UrlResponseInfo, - override val request: HttpRequestInfo + override val request: CronetHttpRequestInfo? ) : HttpResponseInfo { override val url: String get() = response.url diff --git a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt index fcdabc4305..cd25c39ac5 100644 --- a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt +++ b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestCallback.kt @@ -102,25 +102,25 @@ internal class CronetRequestCallback( ) = delegate.onReadCompleted(request, info, byteBuffer) private fun finishSuccessRequestTracing(response: UrlResponseInfo?) { - val requestInfo = apmTracingStateHolder.get()?.createRequestInfo() - ?: distributedTracingStateHolder.get()?.createRequestInfo() - val responseInfo = if (response != null && requestInfo != null) { - CronetHttpResponseInfo(response, requestInfo) - } else { - null - } - apmTracingStateHolder.getAndSet(null)?.let { apmTracingState -> - if (responseInfo != null) { - apmNetworkInstrumentation?.onResponseSucceeded(apmTracingState, responseInfo) + if (response != null) { + val requestInfo = apmTracingState.createRequestInfo() as? CronetHttpRequestInfo + apmNetworkInstrumentation?.onResponseSucceeded( + apmTracingState, + CronetHttpResponseInfo(response, requestInfo) + ) } } ?: apmNetworkInstrumentation?.reportInstrumentationError { "Request tracing state not found for ${response?.url}. Instrumentation may be broken." } distributedTracingStateHolder.getAndSet(null)?.let { distributedTracingState -> - if (responseInfo != null) { - distributedTracingInstrumentation?.onResponseSucceeded(distributedTracingState, responseInfo) + if (response != null) { + val requestInfo = distributedTracingState.createRequestInfo() as? CronetHttpRequestInfo + distributedTracingInstrumentation?.onResponseSucceeded( + distributedTracingState, + CronetHttpResponseInfo(response, requestInfo) + ) } } } diff --git a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt index 4725130ebe..fc78b41768 100644 --- a/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt +++ b/integrations/dd-sdk-android-cronet/src/main/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListener.kt @@ -6,7 +6,6 @@ package com.datadog.android.cronet.internal import androidx.annotation.WorkerThread -import com.datadog.android.api.instrumentation.network.HttpRequestInfo import com.datadog.android.rum.RumAttributes import com.datadog.android.rum.internal.domain.event.ResourceTiming import com.datadog.android.rum.internal.net.RumNetworkInstrumentation @@ -25,7 +24,7 @@ internal class CronetRequestFinishedInfoListener( @WorkerThread override fun onRequestFinished(finishedInfo: RequestFinishedInfo) { - val requestInfo = finishedInfo.annotations?.filterIsInstance()?.firstOrNull() + val requestInfo = finishedInfo.annotations?.filterIsInstance()?.firstOrNull() val distributingTracingState = finishedInfo.annotations?.filterIsInstance()?.firstOrNull() if (requestInfo == null) { rumNetworkInstrumentation.reportInstrumentationError { diff --git a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt index 3d3e3060df..2b570c6de6 100644 --- a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt +++ b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestCallbackTest.kt @@ -388,7 +388,6 @@ internal class CronetRequestCallbackTest { // Given val mockDistributedTracingState: RequestTracingState = mock() whenever(mockDistributedTracingInstrumentation.onRequest(fakeRequestInfo)) doReturn mockDistributedTracingState - whenever(mockDistributedTracingState.createRequestInfo()) doReturn mockMutableRequestInfo testedCallback.onRequestStarted(fakeRequestInfo) // When @@ -477,7 +476,6 @@ internal class CronetRequestCallbackTest { // Given val mockDistributedTracingState: RequestTracingState = mock() whenever(mockDistributedTracingInstrumentation.onRequest(fakeRequestInfo)) doReturn mockDistributedTracingState - whenever(mockDistributedTracingState.createRequestInfo()) doReturn mockMutableRequestInfo testedCallback.onRequestStarted(fakeRequestInfo) // When diff --git a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt index b88f45fc25..a66f7d6cf2 100644 --- a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt +++ b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetRequestFinishedInfoListenerTest.kt @@ -5,7 +5,6 @@ */ package com.datadog.android.cronet.internal -import com.datadog.android.api.instrumentation.network.HttpRequestInfo import com.datadog.android.cronet.internal.CronetRequestFinishedInfoListener.Companion.minus import com.datadog.android.rum.internal.domain.event.ResourceTiming import com.datadog.android.rum.internal.net.RumNetworkInstrumentation @@ -54,8 +53,8 @@ internal class CronetRequestFinishedInfoListenerTest { @Mock private lateinit var mockResponseInfo: UrlResponseInfo - @Forgery - private lateinit var fakeRequestInfo: HttpRequestInfo + @Mock + private lateinit var fakeRequestInfo: CronetHttpRequestInfo private lateinit var testedListener: CronetRequestFinishedInfoListener diff --git a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt index ecf8088f5c..d4ed5fb425 100644 --- a/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt +++ b/integrations/dd-sdk-android-cronet/src/test/kotlin/com/datadog/android/cronet/internal/CronetResponseInfoTest.kt @@ -6,7 +6,6 @@ package com.datadog.android.cronet.internal -import com.datadog.android.api.instrumentation.network.HttpRequestInfo import com.datadog.android.internal.network.HttpSpec import com.datadog.android.utils.forge.Configurator import com.datadog.tools.unit.forge.exhaustiveAttributes @@ -40,7 +39,7 @@ internal class CronetResponseInfoTest { lateinit var mockUrlResponseInfo: UrlResponseInfo @Mock - lateinit var mockRequestInfo: HttpRequestInfo + lateinit var mockRequestInfo: CronetHttpRequestInfo lateinit var fakeHeaders: Map> @@ -134,6 +133,18 @@ internal class CronetResponseInfoTest { assertThat(result).isSameAs(mockRequestInfo) } + @Test + fun `M return null W request property { null request }`() { + // Given + val responseInfo = CronetHttpResponseInfo(mockUrlResponseInfo, null) + + // When + val result = responseInfo.request + + // Then + assertThat(result).isNull() + } + @Test fun `M return content length from header W computeContentLength() { header present }`( @LongForgery(min = 1) fakeContentLength: Long