Skip to content

Commit c5c20ee

Browse files
committed
add async span test
1 parent fea2480 commit c5c20ee

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
5+
Sentry.init({
6+
dsn: 'https://[email protected]/1337',
7+
integrations: [Sentry.browserTracingIntegration()],
8+
tracesSampleRate: 1,
9+
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { getActiveSpan, startSpan } from '@sentry/browser';
2+
3+
const waitForSeconds = seconds => new Promise(res => setTimeout(res, seconds * 1000));
4+
5+
startSpan({ name: 'span 1' }, async () => {
6+
await waitForSeconds(1);
7+
window.firstWaitingSpan = getActiveSpan();
8+
});
9+
10+
startSpan({ name: 'span 2' }, async () => {
11+
await waitForSeconds(2);
12+
window.secondWaitingSpan = getActiveSpan();
13+
});
14+
15+
startSpan({ name: 'span 3' }, async () => {
16+
await waitForSeconds(0.5);
17+
window.thirdWaitingSpan = getActiveSpan();
18+
});
19+
20+
/**
21+
* This is what happens here:
22+
* 1. span 1 starts
23+
* 2. span 2 starts
24+
* 3. span 3 starts (span 3 is active now)
25+
* 4. waiting time in span 3 is over and 'span 3' is stored in variable
26+
* 5. span 3 ends (2 is active now)
27+
* 6. waiting time in span 1 is over and 'span 2' is stored in variable
28+
* 7. span 2 ends (1 is active now)
29+
* 8. waiting time in span 2 is over and 'span 1' is stored in variable
30+
*/
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { expect } from '@playwright/test';
2+
import { sentryTest } from '../../../../utils/fixtures';
3+
4+
type WindowWithSpan = Window & {
5+
firstWaitingSpan: any;
6+
secondWaitingSpan: any;
7+
thirdWaitingSpan: any;
8+
};
9+
10+
sentryTest(
11+
'async spans with different durations lead to unexpected behavior in browser (no "asynchronous context tracking")',
12+
async ({ getLocalTestPath, page }) => {
13+
const url = await getLocalTestPath({ testDir: __dirname });
14+
page.goto(url);
15+
16+
await page.waitForFunction(
17+
() =>
18+
(window as unknown as WindowWithSpan).firstWaitingSpan &&
19+
(window as unknown as WindowWithSpan).secondWaitingSpan &&
20+
(window as unknown as WindowWithSpan).thirdWaitingSpan,
21+
);
22+
23+
const firstWaitingSpanValue = await page.evaluate(
24+
() => (window as unknown as WindowWithSpan).firstWaitingSpan._name,
25+
);
26+
const secondWaitingSpanName = await page.evaluate(
27+
() => (window as unknown as WindowWithSpan).secondWaitingSpan._name,
28+
);
29+
const thirdWaitingSpanName = await page.evaluate(
30+
() => (window as unknown as WindowWithSpan).thirdWaitingSpan._name,
31+
);
32+
33+
expect(firstWaitingSpanValue).toBe('span 2');
34+
expect(secondWaitingSpanName).toBe('span 1');
35+
expect(thirdWaitingSpanName).toBe('span 3');
36+
},
37+
);

0 commit comments

Comments
 (0)