You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-08-07 23:02:56 +03:00
Add tests for call answering / candidate sending (#2666)
* Add tests for call answering / candidate sending * Remopve unused stuff * Capitalise Co-authored-by: Šimon Brandner <simon.bra.ag@gmail.com> * Capitalisation * Capitalise * Fix typescript strict error * Actually fix TS strict error(?) * TS strict mode try 3 Co-authored-by: Šimon Brandner <simon.bra.ag@gmail.com>
This commit is contained in:
@@ -99,6 +99,7 @@ export class MockRTCPeerConnection {
|
|||||||
private static instances: MockRTCPeerConnection[] = [];
|
private static instances: MockRTCPeerConnection[] = [];
|
||||||
|
|
||||||
private negotiationNeededListener: () => void;
|
private negotiationNeededListener: () => void;
|
||||||
|
public iceCandidateListener?: (e: RTCPeerConnectionIceEvent) => void;
|
||||||
private needsNegotiation = false;
|
private needsNegotiation = false;
|
||||||
public readyToNegotiate: Promise<void>;
|
public readyToNegotiate: Promise<void>;
|
||||||
private onReadyToNegotiate: () => void;
|
private onReadyToNegotiate: () => void;
|
||||||
@@ -135,7 +136,11 @@ export class MockRTCPeerConnection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addEventListener(type: string, listener: () => void) {
|
addEventListener(type: string, listener: () => void) {
|
||||||
if (type === 'negotiationneeded') this.negotiationNeededListener = listener;
|
if (type === 'negotiationneeded') {
|
||||||
|
this.negotiationNeededListener = listener;
|
||||||
|
} else if (type == 'icecandidate') {
|
||||||
|
this.iceCandidateListener = listener;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
createDataChannel(label: string, opts: RTCDataChannelInit) { return { label, ...opts }; }
|
createDataChannel(label: string, opts: RTCDataChannelInit) { return { label, ...opts }; }
|
||||||
createOffer() {
|
createOffer() {
|
||||||
|
@@ -887,6 +887,77 @@ describe('Call', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("answering calls", () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await fakeIncomingCall(client, call, "1");
|
||||||
|
});
|
||||||
|
|
||||||
|
const untilEventSent = async (...args) => {
|
||||||
|
const maxTries = 20;
|
||||||
|
|
||||||
|
for (let tries = 0; tries < maxTries; ++tries) {
|
||||||
|
if (tries) {
|
||||||
|
await new Promise(resolve => {
|
||||||
|
setTimeout(resolve, 100);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
expect(client.client.sendEvent).toHaveBeenCalledWith(...args);
|
||||||
|
return;
|
||||||
|
} catch (e) {
|
||||||
|
if (tries == maxTries - 1) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
it("sends an answer event", async () => {
|
||||||
|
await call.answer();
|
||||||
|
await untilEventSent(
|
||||||
|
FAKE_ROOM_ID,
|
||||||
|
EventType.CallAnswer,
|
||||||
|
expect.objectContaining({
|
||||||
|
call_id: call.callId,
|
||||||
|
answer: expect.objectContaining({
|
||||||
|
type: 'offer',
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("sends ICE candidates as separate events if they arrive after the answer", async () => {
|
||||||
|
const fakeCandidateString = "here is a fake candidate!";
|
||||||
|
|
||||||
|
await call.answer();
|
||||||
|
await untilEventSent(
|
||||||
|
FAKE_ROOM_ID,
|
||||||
|
EventType.CallAnswer,
|
||||||
|
expect.objectContaining({}),
|
||||||
|
);
|
||||||
|
|
||||||
|
const mockPeerConn = call.peerConn as unknown as MockRTCPeerConnection;
|
||||||
|
mockPeerConn.iceCandidateListener!({
|
||||||
|
candidate: {
|
||||||
|
candidate: fakeCandidateString,
|
||||||
|
sdpMLineIndex: 0,
|
||||||
|
sdpMid: '0',
|
||||||
|
toJSON: jest.fn().mockReturnValue(fakeCandidateString),
|
||||||
|
},
|
||||||
|
} as unknown as RTCPeerConnectionIceEvent);
|
||||||
|
|
||||||
|
await untilEventSent(
|
||||||
|
FAKE_ROOM_ID,
|
||||||
|
EventType.CallCandidates,
|
||||||
|
expect.objectContaining({
|
||||||
|
candidates: [
|
||||||
|
fakeCandidateString,
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it("times out an incoming call", async () => {
|
it("times out an incoming call", async () => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
await fakeIncomingCall(client, call, "1");
|
await fakeIncomingCall(client, call, "1");
|
||||||
|
Reference in New Issue
Block a user