Skip to content

Commit 90e56e7

Browse files
fix(envelope): Remove duplicate sdk package record from envelope (#2570)
1 parent 28d98c2 commit 90e56e7

File tree

4 files changed

+68
-62
lines changed

4 files changed

+68
-62
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## 4.7.0
44

5+
### Fixes
6+
7+
- Remove duplicate sdk package record from envelope ([#2570](https://github.com/getsentry/sentry-react-native/pull/2570))
8+
59
### Dependencies
610

711
- Bump Android SDK from v6.4.3 to v6.5.0 ([#2535](https://github.com/getsentry/sentry-react-native/pull/2535))

src/js/integrations/sdkinfo.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ export class SdkInfo implements Integration {
5757
packages: [
5858
...((event.sdk && event.sdk.packages) || []),
5959
...((this._nativeSdkInfo && [this._nativeSdkInfo]) || []),
60-
...defaultSdkInfo.packages,
6160
],
6261
};
6362

test/client.test.ts

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { Envelope, Outcome, Transport } from '@sentry/types';
1+
import { Envelope, Event,Outcome, Transport } from '@sentry/types';
22
import { rejectedSyncPromise, SentryError } from '@sentry/utils';
33
import * as RN from 'react-native';
44

55
import { ReactNativeClient } from '../src/js/client';
66
import { ReactNativeClientOptions, ReactNativeOptions } from '../src/js/options';
77
import { NativeTransport } from '../src/js/transports/native';
8-
import { SDK_NAME, SDK_VERSION } from '../src/js/version';
8+
import { SDK_NAME, SDK_PACKAGE_NAME, SDK_VERSION } from '../src/js/version';
99
import { NATIVE } from '../src/js/wrapper';
1010
import {
1111
envelopeHeader,
@@ -134,8 +134,7 @@ describe('Tests ReactNativeClient', () => {
134134
});
135135

136136
test('use custom transport function', async () => {
137-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
138-
const mySend = (request: Envelope) => Promise.resolve();
137+
const mySend = (_request: Envelope) => Promise.resolve();
139138
const myFlush = (timeout?: number) => Promise.resolve(Boolean(timeout));
140139
const myCustomTransportFn = (): Transport => ({
141140
send: mySend,
@@ -298,6 +297,32 @@ describe('Tests ReactNativeClient', () => {
298297
});
299298
});
300299

300+
describe('event data enhancement', () => {
301+
test('event contains sdk default information', async () => {
302+
const mockedSend = jest.fn<PromiseLike<void>, [Envelope]>();
303+
const mockedTransport = (): Transport => ({
304+
send: mockedSend,
305+
flush: jest.fn().mockResolvedValue(true),
306+
});
307+
const client = new ReactNativeClient(<ReactNativeClientOptions> {
308+
...DEFAULT_OPTIONS,
309+
dsn: EXAMPLE_DSN,
310+
transport: mockedTransport,
311+
});
312+
313+
client.captureEvent({ message: 'test event' });
314+
315+
expect(mockedSend).toBeCalled();
316+
const actualEvent: Event | undefined = <Event>mockedSend.mock.calls[0][firstArg][envelopeItems][0][envelopeItemPayload];
317+
expect(actualEvent?.sdk?.packages).toEqual([
318+
{
319+
name: SDK_PACKAGE_NAME,
320+
version: SDK_VERSION,
321+
},
322+
]);
323+
});
324+
});
325+
301326
describe('clientReports', () => {
302327
test('does not send client reports if disabled', () => {
303328
const mockTransportSend = jest.fn((_envelope: Envelope) => Promise.resolve());

test/integrations/sdkinfo.test.ts

Lines changed: 35 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { Event } from '@sentry/types';
1+
import { Event, EventHint, Package } from '@sentry/types';
22

33
import { SdkInfo } from '../../src/js/integrations';
44
import { NATIVE } from '../../src/js/wrapper';
55

6+
let mockedFetchNativeSdkInfo: jest.Mock<PromiseLike<Package | null>, []>;
7+
68
const mockPackage = {
79
name: 'sentry-cocoa',
810
version: '0.0.1',
@@ -15,7 +17,7 @@ jest.mock('../../src/js/wrapper', () => {
1517
NATIVE: {
1618
...actual.NATIVE,
1719
platform: 'ios',
18-
fetchNativeSdkInfo: jest.fn(() => Promise.resolve(mockPackage)),
20+
fetchNativeSdkInfo: () => mockedFetchNativeSdkInfo(),
1921
},
2022
};
2123
});
@@ -25,72 +27,48 @@ afterEach(() => {
2527
});
2628

2729
describe('Sdk Info', () => {
28-
it('Adds native package and javascript platform to event on iOS', (done) => {
29-
const integration = new SdkInfo();
30-
30+
it('Adds native package and javascript platform to event on iOS', async () => {
31+
mockedFetchNativeSdkInfo = jest.fn().mockResolvedValue(mockPackage);
3132
const mockEvent: Event = {};
33+
const processedEvent = await executeIntegrationFor(mockEvent);
3234

33-
integration.setupOnce(async (eventProcessor) => {
34-
try {
35-
const processedEvent = await eventProcessor(mockEvent);
36-
37-
expect(processedEvent).toBeDefined();
38-
if (processedEvent) {
39-
expect(processedEvent.sdk).toBeDefined();
40-
if (processedEvent.sdk) {
41-
expect(processedEvent.sdk.packages).toBeDefined();
42-
if (processedEvent.sdk.packages) {
43-
expect(
44-
processedEvent.sdk.packages.some(
45-
(pkg) =>
46-
pkg.name === mockPackage.name &&
47-
pkg.version === mockPackage.version
48-
)
49-
).toBe(true);
50-
}
51-
}
52-
expect(processedEvent.platform === 'javascript');
53-
}
54-
55-
done();
56-
} catch (e) {
57-
done(e);
58-
}
59-
});
35+
expect(processedEvent?.sdk?.packages).toEqual(expect.arrayContaining([mockPackage]));
36+
expect(processedEvent?.platform === 'javascript');
37+
expect(mockedFetchNativeSdkInfo).toBeCalledTimes(1);
6038
});
6139

62-
it('Adds javascript platform but not native package on Android', (done) => {
40+
it('Adds javascript platform but not native package on Android', async () => {
6341
NATIVE.platform = 'android';
64-
const integration = new SdkInfo();
42+
mockedFetchNativeSdkInfo = jest.fn().mockResolvedValue(mockPackage);
43+
const mockEvent: Event = {};
44+
const processedEvent = await executeIntegrationFor(mockEvent);
45+
46+
expect(processedEvent?.sdk?.packages).toEqual(expect.not.arrayContaining([mockPackage]));
47+
expect(processedEvent?.platform === 'javascript');
48+
expect(mockedFetchNativeSdkInfo).not.toBeCalled();
49+
});
6550

51+
it('Does not add any default non native packages', async () => {
52+
mockedFetchNativeSdkInfo = jest.fn().mockResolvedValue(null);
6653
const mockEvent: Event = {};
54+
const processedEvent = await executeIntegrationFor(mockEvent);
6755

56+
expect(processedEvent?.sdk?.packages).toEqual([]);
57+
expect(processedEvent?.platform === 'javascript');
58+
expect(mockedFetchNativeSdkInfo).toBeCalledTimes(1);
59+
});
60+
});
61+
62+
function executeIntegrationFor(mockedEvent: Event, mockedHint: EventHint = {}): Promise<Event | null> {
63+
const integration = new SdkInfo();
64+
return new Promise((resolve, reject) => {
6865
integration.setupOnce(async (eventProcessor) => {
6966
try {
70-
const processedEvent = await eventProcessor(mockEvent);
71-
72-
expect(processedEvent).toBeDefined();
73-
if (processedEvent) {
74-
expect(processedEvent.sdk).toBeDefined();
75-
if (processedEvent.sdk) {
76-
expect(processedEvent.sdk.packages).toBeDefined();
77-
if (processedEvent.sdk.packages) {
78-
expect(
79-
processedEvent.sdk.packages.some(
80-
(pkg) =>
81-
pkg.name === mockPackage.name &&
82-
pkg.version === mockPackage.version
83-
)
84-
).toBe(false);
85-
}
86-
}
87-
expect(processedEvent.platform === 'javascript');
88-
}
89-
90-
done();
67+
const processedEvent = await eventProcessor(mockedEvent, mockedHint);
68+
resolve(processedEvent);
9169
} catch (e) {
92-
done(e);
70+
reject(e);
9371
}
9472
});
9573
});
96-
});
74+
}

0 commit comments

Comments
 (0)