Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/browser-js-production.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ jobs:
callfabric,
renegotiation,
videoElement,
performance,
v2WebRTC,
]
steps:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/browser-js-staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ jobs:
callfabric,
renegotiation,
videoElement,
performance,
v2WebRTC,
]
steps:
Expand Down
16 changes: 13 additions & 3 deletions internal/e2e-js/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,11 @@ const videoElementTests = [
'buildVideoWithVideoSDK.spec.ts',
'buildVideoWithFabricSDK.spec.ts',
]
const v2WebRTC = ['v2WebrtcFromRest.spec.ts', 'webrtcCalling.spec.ts']
const performanceTests = [
'callStartTime.spec.ts',
'roomSessionStartTime.spec.ts',
]
const v2WebRTCTests = ['v2WebrtcFromRest.spec.ts', 'webrtcCalling.spec.ts']

const useDesktopChrome: PlaywrightTestConfig['use'] = {
...devices['Desktop Chrome'],
Expand Down Expand Up @@ -104,7 +108,8 @@ const config: PlaywrightTestConfig = {
...callfabricTests,
...renegotiationTests,
...videoElementTests,
...v2WebRTC,
...performanceTests,
...v2WebRTCTests,
],
},
{
Expand Down Expand Up @@ -152,10 +157,15 @@ const config: PlaywrightTestConfig = {
use: useDesktopChrome,
testMatch: videoElementTests,
},
{
name: 'performance',
use: useDesktopChrome,
testMatch: performanceTests,
},
{
name: 'v2WebRTC',
use: useDesktopChrome,
testMatch: v2WebRTC,
testMatch: v2WebRTCTests,
},
],
}
Expand Down
95 changes: 95 additions & 0 deletions internal/e2e-js/tests/callfabric/callStartTime.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import { uuid } from '@signalwire/core'
import { test, expect } from '../../fixtures'
import { SERVER_URL, createCFClient } from '../../utils'
import { SignalWireContract } from '@signalwire/js'

export const MAX_CALL_SETUP_TIME_MS = 5000

export const logCallStartTime = (ms: number) => {
if (ms < MAX_CALL_SETUP_TIME_MS) {
console.log(`\x1b[1;32m✅ call.start(): ${ms.toFixed(0)} ms\x1b[0m`)
} else {
console.log(`\x1b[1;31m❌ call.start(): ${ms.toFixed(0)} ms\x1b[0m`)
}
}

test.describe('CallFabric Start Time', () => {
test('should join a video room within 5 seconds', async ({
createCustomPage,
resource,
}) => {
const page = await createCustomPage({ name: '[page]' })
await page.goto(SERVER_URL)

const roomName = `e2e_${uuid()}`
await resource.createVideoRoomResource(roomName)

await createCFClient(page)

// Dial an address and join a video room
const ms = await page.evaluate(
async ({ address }) => {
// @ts-expect-error
const client: SignalWireContract = window._client

const call = await client.dial({
to: address,
rootElement: document.getElementById('rootElement'),
})
Comment on lines +35 to +38
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do you want to measure the dial() as well?

Copy link
Collaborator Author

@iAmmar7 iAmmar7 Aug 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure, dial() is a sync method, which just initiates the JS class and some Saga workers. Maybe we can write a different test for that? Or maybe one more test including both dial and start? 👀

// @ts-expect-error
window._roomObj = call

const t0 = performance.now()
await call.start()

return performance.now() - t0
},
{
address: `/public/${roomName}?channel=video`,
}
)

logCallStartTime(ms)

expect(ms).toBeLessThan(MAX_CALL_SETUP_TIME_MS)

Check failure on line 54 in internal/e2e-js/tests/callfabric/callStartTime.spec.ts

View workflow job for this annotation

GitHub Actions / Browser SDK staging / Run E2E tests (20.x, performance)

[performance] › tests/callfabric/callStartTime.spec.ts:17:7 › CallFabric Start Time › should join a video room within 5 seconds

1) [performance] › tests/callfabric/callStartTime.spec.ts:17:7 › CallFabric Start Time › should join a video room within 5 seconds Error: expect(received).toBeLessThan(expected) Expected: < 5000 Received: 8640.599999999999 52 | logCallStartTime(ms) 53 | > 54 | expect(ms).toBeLessThan(MAX_CALL_SETUP_TIME_MS) | ^ 55 | ***) 56 | 57 | test('should join an audio-only room within 5 seconds', async (*** at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/callfabric/callStartTime.spec.ts:54:16
})

test('should join an audio-only room within 5 seconds', async ({
createCustomPage,
resource,
}) => {
const page = await createCustomPage({ name: '[page]' })
await page.goto(SERVER_URL)

const roomName = `e2e_${uuid()}`
await resource.createVideoRoomResource(roomName)

await createCFClient(page)

// Dial an address and join a video room
const ms = await page.evaluate(
async ({ address }) => {
// @ts-expect-error
const client: SignalWireContract = window._client

const call = await client.dial({
to: address,
})
Comment on lines +75 to +77
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above comment: just wondering if we also want to have seperate measurements that include dial()?

// @ts-expect-error
window._roomObj = call

const t0 = performance.now()
await call.start()

return performance.now() - t0
},
{
address: `/public/${roomName}?channel=audio`,
}
)

logCallStartTime(ms)

expect(ms).toBeLessThan(MAX_CALL_SETUP_TIME_MS)

Check failure on line 93 in internal/e2e-js/tests/callfabric/callStartTime.spec.ts

View workflow job for this annotation

GitHub Actions / Browser SDK staging / Run E2E tests (20.x, performance)

[performance] › tests/callfabric/callStartTime.spec.ts:57:7 › CallFabric Start Time › should join an audio-only room within 5 seconds

2) [performance] › tests/callfabric/callStartTime.spec.ts:57:7 › CallFabric Start Time › should join an audio-only room within 5 seconds Error: expect(received).toBeLessThan(expected) Expected: < 5000 Received: 9142.100000000006 91 | logCallStartTime(ms) 92 | > 93 | expect(ms).toBeLessThan(MAX_CALL_SETUP_TIME_MS) | ^ 94 | ***) 95 | ***) 96 | at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/callfabric/callStartTime.spec.ts:93:16
})
})
55 changes: 55 additions & 0 deletions internal/e2e-js/tests/roomSessionStartTime.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import type { Video } from '@signalwire/js'
import { test, expect } from '../fixtures'
import { SERVER_URL, createTestRoomSession, randomizeRoomName } from '../utils'

export const MAX_CALL_SETUP_TIME_MS = 5000

export const logCallStartTime = (ms: number) => {
if (ms < MAX_CALL_SETUP_TIME_MS) {
console.log(`\x1b[1;32m✅ call.start(): ${ms.toFixed(0)} ms\x1b[0m`)
} else {
console.log(`\x1b[1;31m❌ call.start(): ${ms.toFixed(0)} ms\x1b[0m`)
}
}

test.describe('RoomSession Start Time', () => {
test('should join a room room within 5 seconds', async ({
createCustomPage,
}) => {
const page = await createCustomPage({ name: 'raise-lower' })
await page.goto(SERVER_URL)

const roomName = randomizeRoomName('raise-lower-e2e')
const memberSettings = {
vrt: {
room_name: roomName,
user_name: 'e2e_participant_meta',
auto_create_room: true,
permissions: ['room.prioritize_handraise'],
},
initialEvents: ['room.updated'],
}

await createTestRoomSession(page, memberSettings)

// --------------- Joining the room ---------------
const ms = await page.evaluate(() => {
return new Promise<number>(async (resolve, reject) => {
// @ts-expect-error
const roomObj: Video.RoomSession = window._roomObj

roomObj.once('room.joined', () => {
console.log('Room joined!')
resolve(performance.now() - t0)
})

const t0 = performance.now()
await roomObj.join().catch(reject)
})
})

logCallStartTime(ms)

expect(ms).toBeLessThan(MAX_CALL_SETUP_TIME_MS)

Check failure on line 53 in internal/e2e-js/tests/roomSessionStartTime.spec.ts

View workflow job for this annotation

GitHub Actions / Browser SDK staging / Run E2E tests (20.x, performance)

[performance] › tests/roomSessionStartTime.spec.ts:16:7 › RoomSession Start Time › should join a room room within 5 seconds

3) [performance] › tests/roomSessionStartTime.spec.ts:16:7 › RoomSession Start Time › should join a room room within 5 seconds Error: expect(received).toBeLessThan(expected) Expected: < 5000 Received: 8315.099999999991 51 | logCallStartTime(ms) 52 | > 53 | expect(ms).toBeLessThan(MAX_CALL_SETUP_TIME_MS) | ^ 54 | ***) 55 | ***) 56 | at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionStartTime.spec.ts:53:16
})
})
19 changes: 10 additions & 9 deletions internal/e2e-js/utils.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
import express, { Express, Request, Response } from 'express'
import { spawn, ChildProcessWithoutNullStreams } from 'child_process'
import path from 'path'
import { EventEmitter } from 'events'
import { v4 as uuid } from 'uuid'
import { clearInterval } from 'timers'
import { Server } from 'http'
import { createServer } from 'vite'
import { Page } from '@playwright/test'
import type {
DialParams,
FabricRoomSession,
Expand All @@ -7,16 +16,8 @@
Video,
} from '@signalwire/js'
import type { MediaEventNames } from '@signalwire/webrtc'
import { createServer } from 'vite'
import path from 'path'
import { expect } from './fixtures'
import { Page } from '@playwright/test'
import { v4 as uuid } from 'uuid'
import { clearInterval } from 'timers'
import express, { Express, Request, Response } from 'express'
import { Server } from 'http'
import { spawn, ChildProcessWithoutNullStreams } from 'child_process'
import { EventEmitter } from 'events'

declare global {
interface Window {
_SWJS: {
Expand Down Expand Up @@ -668,7 +669,7 @@
// #region Utilities for the MCU

export const expectMCUVisible = async (page: Page) => {
await page.waitForSelector('div[id^="sw-sdk-"] > video')

Check failure on line 672 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK production / Run E2E tests (20.x, audience)

[audience] › tests/roomSessionFollowLeader.spec.ts:14:7 › RoomSession end_room_session_on_leave feature › should remove all members from a room once the leader leave

2) [audience] › tests/roomSessionFollowLeader.spec.ts:14:7 › RoomSession end_room_session_on_leave feature › should remove all members from a room once the leader leave Error: page.waitForSelector: Test timeout of 120000ms exceeded. Call log: - waiting for locator('div[id^="sw-sdk-"] > video') to be visible at ../utils.ts:672 670 | 671 | export const expectMCUVisible = async (page: Page) => *** > 672 | await page.waitForSelector('div[id^="sw-sdk-"] > video') | ^ 673 | *** 674 | 675 | export const expectMCUNotVisible = async (page: Page) => *** at expectMCUVisible (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:672:14) at map (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionFollowLeader.spec.ts:59:29) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionFollowLeader.spec.ts:56:16
}

export const expectMCUNotVisible = async (page: Page) => {
Expand Down Expand Up @@ -1680,7 +1681,7 @@
// #region Utilities for Events assertion

export const expectMemberTalkingEvent = (page: Page) => {
return page.evaluate(async () => {

Check failure on line 1684 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK staging / Run E2E tests (20.x, default)

[default] › tests/roomSessionTalkingEventsParticipant.spec.ts:11:7 › RoomSession talking events to participant › participant should receive talking events

4) [default] › tests/roomSessionTalkingEventsParticipant.spec.ts:11:7 › RoomSession talking events to participant › participant should receive talking events Error: page.evaluate: Test ended. at ../utils.ts:1684 1682 | 1683 | export const expectMemberTalkingEvent = (page: Page) => *** > 1684 | return page.evaluate(async () => *** | ^ 1685 | return new Promise((resolve) => *** 1686 | // @ts-expect-error 1687 | const roomObj: Video.RoomSession = window._roomObj at expectMemberTalkingEvent (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1684:15) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionTalkingEventsParticipant.spec.ts:50:63
return new Promise((resolve) => {
// @ts-expect-error
const roomObj: Video.RoomSession = window._roomObj
Expand Down Expand Up @@ -1775,7 +1776,7 @@
page: Page,
options: { invokeJoin: boolean } = { invokeJoin: true }
) => {
return page.evaluate(({ invokeJoin }) => {

Check failure on line 1779 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK production / Run E2E tests (20.x, promote)

[promote] › tests/roomSessionPromoteReattachDemote.spec.ts:19:7 › RoomSession promote/demote methods › should promote/demote audience

3) [promote] › tests/roomSessionPromoteReattachDemote.spec.ts:19:7 › RoomSession promote/demote methods › should promote/demote audience Error: page.evaluate: Object at ../utils.ts:1779 1777 | options: *** invokeJoin: boolean *** = *** invokeJoin: true *** 1778 | ) => *** > 1779 | return page.evaluate((*** invokeJoin ***) => *** | ^ 1780 | return new Promise<any>(async (resolve, reject) => *** 1781 | // @ts-expect-error 1782 | const roomObj: Video.RoomSession = window._roomObj at expectRoomJoined (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1779:15) at expectRoomJoinWithDefaults (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1804:24) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionPromoteReattachDemote.spec.ts:70:63

Check failure on line 1779 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK production / Run E2E tests (20.x, promote)

[promote] › tests/roomSessionPromoteMeta.spec.ts:14:7 › RoomSession promote updating member meta › should promote audience setting the meta field

2) [promote] › tests/roomSessionPromoteMeta.spec.ts:14:7 › RoomSession promote updating member meta › should promote audience setting the meta field Error: page.evaluate: Object at ../utils.ts:1779 1777 | options: *** invokeJoin: boolean *** = *** invokeJoin: true *** 1778 | ) => *** > 1779 | return page.evaluate((*** invokeJoin ***) => *** | ^ 1780 | return new Promise<any>(async (resolve, reject) => *** 1781 | // @ts-expect-error 1782 | const roomObj: Video.RoomSession = window._roomObj at expectRoomJoined (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1779:15) at expectRoomJoinWithDefaults (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1804:24) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionPromoteMeta.spec.ts:55:63

Check failure on line 1779 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK production / Run E2E tests (20.x, promote)

[promote] › tests/roomSessionPromoteDemote.spec.ts:19:7 › RoomSession promote/demote methods › should promote/demote audience

1) [promote] › tests/roomSessionPromoteDemote.spec.ts:19:7 › RoomSession promote/demote methods › should promote/demote audience Error: page.evaluate: Object at ../utils.ts:1779 1777 | options: *** invokeJoin: boolean *** = *** invokeJoin: true *** 1778 | ) => *** > 1779 | return page.evaluate((*** invokeJoin ***) => *** | ^ 1780 | return new Promise<any>(async (resolve, reject) => *** 1781 | // @ts-expect-error 1782 | const roomObj: Video.RoomSession = window._roomObj at expectRoomJoined (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1779:15) at expectRoomJoinWithDefaults (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1804:24) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionPromoteDemote.spec.ts:70:63

Check failure on line 1779 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK production / Run E2E tests (20.x, audience)

[audience] › tests/roomSessionAudienceCount.spec.ts:12:7 › RoomSession Audience Count › should receive correct audience_count in events

1) [audience] › tests/roomSessionAudienceCount.spec.ts:12:7 › RoomSession Audience Count › should receive correct audience_count in events Error: page.evaluate: Object at ../utils.ts:1779 1777 | options: *** invokeJoin: boolean *** = *** invokeJoin: true *** 1778 | ) => *** > 1779 | return page.evaluate((*** invokeJoin ***) => *** | ^ 1780 | return new Promise<any>(async (resolve, reject) => *** 1781 | // @ts-expect-error 1782 | const roomObj: Video.RoomSession = window._roomObj at expectRoomJoined (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1779:15) at expectRoomJoinWithDefaults (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1804:24) at map (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionAudienceCount.spec.ts:115:35) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionAudienceCount.spec.ts:114:23

Check failure on line 1779 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK staging / Run E2E tests (20.x, videoElement)

[videoElement] › tests/buildVideoWithVideoSDK.spec.ts:355:7 › buildVideoElement with Video SDK › should handle the element for multiple users

1) [videoElement] › tests/buildVideoWithVideoSDK.spec.ts:355:7 › buildVideoElement with Video SDK › should handle the element for multiple users Error: page.evaluate: Execution context was destroyed, most likely because of a navigation. at ../utils.ts:1779 1777 | options: *** invokeJoin: boolean *** = *** invokeJoin: true *** 1778 | ) => *** > 1779 | return page.evaluate((*** invokeJoin ***) => *** | ^ 1780 | return new Promise<any>(async (resolve, reject) => *** 1781 | // @ts-expect-error 1782 | const roomObj: Video.RoomSession = window._roomObj at expectRoomJoined (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1779:15) at expectRoomJoinWithDefaults (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1804:24) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/buildVideoWithVideoSDK.spec.ts:382:37

Check failure on line 1779 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK staging / Run E2E tests (20.x, default)

[default] › tests/roomSessionTalkingEventsParticipant.spec.ts:11:7 › RoomSession talking events to participant › participant should receive talking events

4) [default] › tests/roomSessionTalkingEventsParticipant.spec.ts:11:7 › RoomSession talking events to participant › participant should receive talking events Error: page.evaluate: Object at ../utils.ts:1779 1777 | options: *** invokeJoin: boolean *** = *** invokeJoin: true *** 1778 | ) => *** > 1779 | return page.evaluate((*** invokeJoin ***) => *** | ^ 1780 | return new Promise<any>(async (resolve, reject) => *** 1781 | // @ts-expect-error 1782 | const roomObj: Video.RoomSession = window._roomObj at expectRoomJoined (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1779:15) at expectRoomJoinWithDefaults (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1804:24) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionTalkingEventsParticipant.spec.ts:52:61

Check failure on line 1779 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK staging / Run E2E tests (20.x, default)

[default] › tests/roomSessionJoinFrom.spec.ts:41:9 › RoomSession join_from › should not be possible to join a room before the join_from [random room name from room config]

2) [default] › tests/roomSessionJoinFrom.spec.ts:41:9 › RoomSession join_from › should not be possible to join a room before the join_from [random room name from room config] Error: page.evaluate: Object at ../utils.ts:1779 1777 | options: *** invokeJoin: boolean *** = *** invokeJoin: true *** 1778 | ) => *** > 1779 | return page.evaluate((*** invokeJoin ***) => *** | ^ 1780 | return new Promise<any>(async (resolve, reject) => *** 1781 | // @ts-expect-error 1782 | const roomObj: Video.RoomSession = window._roomObj at expectRoomJoined (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1779:15) at expectRoomJoinWithDefaults (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1804:24) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSessionJoinFrom.spec.ts:90:63

Check failure on line 1779 in internal/e2e-js/utils.ts

View workflow job for this annotation

GitHub Actions / Browser SDK staging / Run E2E tests (20.x, default)

[default] › tests/roomSession.spec.ts:598:7 › RoomSession › should allow retrieving the room session recordings and playbacks

1) [default] › tests/roomSession.spec.ts:598:7 › RoomSession › should allow retrieving the room session recordings and playbacks Error: page.evaluate: Object at ../utils.ts:1779 1777 | options: *** invokeJoin: boolean *** = *** invokeJoin: true *** 1778 | ) => *** > 1779 | return page.evaluate((*** invokeJoin ***) => *** | ^ 1780 | return new Promise<any>(async (resolve, reject) => *** 1781 | // @ts-expect-error 1782 | const roomObj: Video.RoomSession = window._roomObj at expectRoomJoined (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1779:15) at expectRoomJoinWithDefaults (/home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/utils.ts:1804:24) at /home/runner/work/signalwire-js/signalwire-js/internal/e2e-js/tests/roomSession.spec.ts:671:37
return new Promise<any>(async (resolve, reject) => {
// @ts-expect-error
const roomObj: Video.RoomSession = window._roomObj
Expand Down
Loading