From c66a23ca3b304cedbf50b91214dcc02ce84b776a Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Wed, 3 May 2023 12:57:35 +0200 Subject: [PATCH 1/2] fix(sdk): Do not overwrite `_metadata` option by default `sdkInfo` --- CHANGELOG.md | 1 + src/js/integrations/sdkinfo.ts | 22 +++++++++++----------- test/integrations/sdkinfo.test.ts | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7f94904fd..3fdfc5c885 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixes - Store envelopes immediately during a fatal crash on iOS ([#3031](https://github.com/getsentry/sentry-react-native/pull/3031)) +- Do not overwrite `_metadata` option by default `sdkInfo` ([#3036](https://github.com/getsentry/sentry-react-native/pull/3036)) ## 5.4.0 diff --git a/src/js/integrations/sdkinfo.ts b/src/js/integrations/sdkinfo.ts index 1efef0125f..7a55dd6c19 100644 --- a/src/js/integrations/sdkinfo.ts +++ b/src/js/integrations/sdkinfo.ts @@ -29,7 +29,7 @@ export class SdkInfo implements Integration { */ public name: string = SdkInfo.id; - private _nativeSdkInfo: Package | null = null; + private _nativeSdkPackage: Package | null = null; /** * @inheritDoc @@ -38,9 +38,9 @@ export class SdkInfo implements Integration { addGlobalEventProcessor(async event => { // The native SDK info package here is only used on iOS as `beforeSend` is not called on `captureEnvelope`. // this._nativeSdkInfo should be defined a following time so this call won't always be awaited. - if (NATIVE.platform === 'ios' && this._nativeSdkInfo === null) { + if (NATIVE.platform === 'ios' && this._nativeSdkPackage === null) { try { - this._nativeSdkInfo = await NATIVE.fetchNativeSdkInfo(); + this._nativeSdkPackage = await NATIVE.fetchNativeSdkInfo(); } catch (e) { // If this fails, go ahead as usual as we would rather have the event be sent with a package missing. logger.warn( @@ -51,14 +51,14 @@ export class SdkInfo implements Integration { } event.platform = event.platform || 'javascript'; - event.sdk = { - ...(event.sdk ?? {}), - ...defaultSdkInfo, - packages: [ - ...((event.sdk && event.sdk.packages) || []), - ...((this._nativeSdkInfo && [this._nativeSdkInfo]) || []), - ], - }; + event.sdk = event.sdk || {}; + event.sdk.name = event.sdk.name || defaultSdkInfo.name; + event.sdk.version = event.sdk.version || defaultSdkInfo.version; + event.sdk.packages = [ + // default packages are added by baseclient and should not be added here + ...(event.sdk.packages || []), + ...((this._nativeSdkPackage && [this._nativeSdkPackage]) || []), + ]; return event; }); diff --git a/test/integrations/sdkinfo.test.ts b/test/integrations/sdkinfo.test.ts index 2eff68529e..409722389f 100644 --- a/test/integrations/sdkinfo.test.ts +++ b/test/integrations/sdkinfo.test.ts @@ -2,6 +2,7 @@ import type { Event, EventHint, Package } from '@sentry/types'; import { SdkInfo } from '../../src/js/integrations'; import { NATIVE } from '../../src/js/wrapper'; +import { SDK_NAME, SDK_VERSION } from '../../src/js'; let mockedFetchNativeSdkInfo: jest.Mock, []>; @@ -57,6 +58,29 @@ describe('Sdk Info', () => { expect(processedEvent?.platform === 'javascript'); expect(mockedFetchNativeSdkInfo).toBeCalledTimes(1); }); + + it('Does not overwrite existing sdk name and version', async () => { + mockedFetchNativeSdkInfo = jest.fn().mockResolvedValue(null); + const mockEvent: Event = { + sdk: { + name: 'test-sdk', + version: '1.0.0', + }, + }; + const processedEvent = await executeIntegrationFor(mockEvent); + + expect(processedEvent?.sdk?.name).toEqual('test-sdk'); + expect(processedEvent?.sdk?.version).toEqual('1.0.0'); + }); + + it('Does use default sdk name and version', async () => { + mockedFetchNativeSdkInfo = jest.fn().mockResolvedValue(null); + const mockEvent: Event = {}; + const processedEvent = await executeIntegrationFor(mockEvent); + + expect(processedEvent?.sdk?.name).toEqual(SDK_NAME); + expect(processedEvent?.sdk?.version).toEqual(SDK_VERSION); + }); }); function executeIntegrationFor(mockedEvent: Event, mockedHint: EventHint = {}): Promise { From 8b68a9228519f85d94e0b97ce0a5511f419e599a Mon Sep 17 00:00:00 2001 From: Krystof Woldrich Date: Wed, 3 May 2023 13:06:22 +0200 Subject: [PATCH 2/2] fix lint --- test/integrations/sdkinfo.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integrations/sdkinfo.test.ts b/test/integrations/sdkinfo.test.ts index 409722389f..940aa767c4 100644 --- a/test/integrations/sdkinfo.test.ts +++ b/test/integrations/sdkinfo.test.ts @@ -1,8 +1,8 @@ import type { Event, EventHint, Package } from '@sentry/types'; +import { SDK_NAME, SDK_VERSION } from '../../src/js'; import { SdkInfo } from '../../src/js/integrations'; import { NATIVE } from '../../src/js/wrapper'; -import { SDK_NAME, SDK_VERSION } from '../../src/js'; let mockedFetchNativeSdkInfo: jest.Mock, []>;