You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-08-05 00:42:10 +03:00
Organise MatrixRTCSession tests (#4453)
None of the tests themselves should have changed
This commit is contained in:
@@ -55,7 +55,8 @@ describe("MatrixRTCSession", () => {
|
|||||||
sess = undefined;
|
sess = undefined;
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Creates a room-scoped session from room state", () => {
|
describe("roomSessionForRoom", () => {
|
||||||
|
it("creates a room-scoped session from room state", () => {
|
||||||
const mockRoom = makeMockRoom([membershipTemplate]);
|
const mockRoom = makeMockRoom([membershipTemplate]);
|
||||||
|
|
||||||
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
||||||
@@ -217,6 +218,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
||||||
expect(sess.memberships).toHaveLength(0);
|
expect(sess.memberships).toHaveLength(0);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("updateCallMembershipEvent", () => {
|
describe("updateCallMembershipEvent", () => {
|
||||||
const mockFocus = { type: "livekit", livekit_service_url: "https://test.org" };
|
const mockFocus = { type: "livekit", livekit_service_url: "https://test.org" };
|
||||||
@@ -588,6 +590,78 @@ describe("MatrixRTCSession", () => {
|
|||||||
jest.useRealTimers();
|
jest.useRealTimers();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("onMembershipsChanged", () => {
|
||||||
|
it("does not emit if no membership changes", () => {
|
||||||
|
const mockRoom = makeMockRoom([membershipTemplate]);
|
||||||
|
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
||||||
|
|
||||||
|
const onMembershipsChanged = jest.fn();
|
||||||
|
sess.on(MatrixRTCSessionEvent.MembershipsChanged, onMembershipsChanged);
|
||||||
|
sess.onMembershipUpdate();
|
||||||
|
|
||||||
|
expect(onMembershipsChanged).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("emits on membership changes", () => {
|
||||||
|
const mockRoom = makeMockRoom([membershipTemplate]);
|
||||||
|
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
||||||
|
|
||||||
|
const onMembershipsChanged = jest.fn();
|
||||||
|
sess.on(MatrixRTCSessionEvent.MembershipsChanged, onMembershipsChanged);
|
||||||
|
|
||||||
|
mockRoom.getLiveTimeline().getState = jest.fn().mockReturnValue(makeMockRoomState([], mockRoom.roomId));
|
||||||
|
sess.onMembershipUpdate();
|
||||||
|
|
||||||
|
expect(onMembershipsChanged).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("emits an event at the time a membership event expires", () => {
|
||||||
|
jest.useFakeTimers();
|
||||||
|
try {
|
||||||
|
const membership = Object.assign({}, membershipTemplate);
|
||||||
|
const mockRoom = makeMockRoom([membership]);
|
||||||
|
|
||||||
|
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
||||||
|
const membershipObject = sess.memberships[0];
|
||||||
|
|
||||||
|
const onMembershipsChanged = jest.fn();
|
||||||
|
sess.on(MatrixRTCSessionEvent.MembershipsChanged, onMembershipsChanged);
|
||||||
|
|
||||||
|
jest.advanceTimersByTime(61 * 1000 * 1000);
|
||||||
|
|
||||||
|
expect(onMembershipsChanged).toHaveBeenCalledWith([membershipObject], []);
|
||||||
|
expect(sess?.memberships.length).toEqual(0);
|
||||||
|
} finally {
|
||||||
|
jest.useRealTimers();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("key management", () => {
|
||||||
|
describe("sending", () => {
|
||||||
|
let mockRoom: Room;
|
||||||
|
let sendStateEventMock: jest.Mock;
|
||||||
|
let sendDelayedStateMock: jest.Mock;
|
||||||
|
let sendEventMock: jest.Mock;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
sendStateEventMock = jest.fn();
|
||||||
|
sendDelayedStateMock = jest.fn();
|
||||||
|
sendEventMock = jest.fn();
|
||||||
|
client.sendStateEvent = sendStateEventMock;
|
||||||
|
client._unstable_sendDelayedStateEvent = sendDelayedStateMock;
|
||||||
|
client.sendEvent = sendEventMock;
|
||||||
|
|
||||||
|
mockRoom = makeMockRoom([]);
|
||||||
|
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
// stop the timers
|
||||||
|
sess!.leaveRoomSession();
|
||||||
|
});
|
||||||
|
|
||||||
it("creates a key when joining", () => {
|
it("creates a key when joining", () => {
|
||||||
sess!.joinRoomSession([mockFocus], mockFocus, { manageMediaKeys: true });
|
sess!.joinRoomSession([mockFocus], mockFocus, { manageMediaKeys: true });
|
||||||
@@ -695,7 +769,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
expect(client.cancelPendingEvent).toHaveBeenCalledWith(eventSentinel);
|
expect(client.cancelPendingEvent).toHaveBeenCalledWith(eventSentinel);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Rotates key if a new member joins", async () => {
|
it("rotates key if a new member joins", async () => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
try {
|
try {
|
||||||
const mockRoom = makeMockRoom([membershipTemplate]);
|
const mockRoom = makeMockRoom([membershipTemplate]);
|
||||||
@@ -744,7 +818,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Does not re-send key if memberships stays same", async () => {
|
it("does not re-send key if memberships stays same", async () => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
try {
|
try {
|
||||||
const keysSentPromise1 = new Promise((resolve) => {
|
const keysSentPromise1 = new Promise((resolve) => {
|
||||||
@@ -795,7 +869,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Re-sends key if a member changes membership ID", async () => {
|
it("re-sends key if a member changes membership ID", async () => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
try {
|
try {
|
||||||
const keysSentPromise1 = new Promise((resolve) => {
|
const keysSentPromise1 = new Promise((resolve) => {
|
||||||
@@ -878,7 +952,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Re-sends key if a member changes created_ts", async () => {
|
it("re-sends key if a member changes created_ts", async () => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
jest.setSystemTime(1000);
|
jest.setSystemTime(1000);
|
||||||
try {
|
try {
|
||||||
@@ -963,7 +1037,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Rotates key if a member leaves", async () => {
|
it("rotates key if a member leaves", async () => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
try {
|
try {
|
||||||
const member2 = Object.assign({}, membershipTemplate, {
|
const member2 = Object.assign({}, membershipTemplate, {
|
||||||
@@ -1016,7 +1090,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Wraps key index around to 0 when it reaches the maximum", async () => {
|
it("wraps key index around to 0 when it reaches the maximum", async () => {
|
||||||
// this should give us keys with index [0...255, 0, 1]
|
// this should give us keys with index [0...255, 0, 1]
|
||||||
const membersToTest = 258;
|
const membersToTest = 258;
|
||||||
const members: CallMembershipData[] = [];
|
const members: CallMembershipData[] = [];
|
||||||
@@ -1058,7 +1132,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Doesn't re-send key immediately", async () => {
|
it("doesn't re-send key immediately", async () => {
|
||||||
const realSetTimeout = setTimeout;
|
const realSetTimeout = setTimeout;
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
try {
|
try {
|
||||||
@@ -1099,143 +1173,7 @@ describe("MatrixRTCSession", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Does not emit if no membership changes", () => {
|
describe("receiving", () => {
|
||||||
const mockRoom = makeMockRoom([membershipTemplate]);
|
|
||||||
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
|
||||||
|
|
||||||
const onMembershipsChanged = jest.fn();
|
|
||||||
sess.on(MatrixRTCSessionEvent.MembershipsChanged, onMembershipsChanged);
|
|
||||||
sess.onMembershipUpdate();
|
|
||||||
|
|
||||||
expect(onMembershipsChanged).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Emits on membership changes", () => {
|
|
||||||
const mockRoom = makeMockRoom([membershipTemplate]);
|
|
||||||
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
|
||||||
|
|
||||||
const onMembershipsChanged = jest.fn();
|
|
||||||
sess.on(MatrixRTCSessionEvent.MembershipsChanged, onMembershipsChanged);
|
|
||||||
|
|
||||||
mockRoom.getLiveTimeline().getState = jest.fn().mockReturnValue(makeMockRoomState([], mockRoom.roomId));
|
|
||||||
sess.onMembershipUpdate();
|
|
||||||
|
|
||||||
expect(onMembershipsChanged).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("emits an event at the time a membership event expires", () => {
|
|
||||||
jest.useFakeTimers();
|
|
||||||
try {
|
|
||||||
const membership = Object.assign({}, membershipTemplate);
|
|
||||||
const mockRoom = makeMockRoom([membership]);
|
|
||||||
|
|
||||||
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
|
||||||
const membershipObject = sess.memberships[0];
|
|
||||||
|
|
||||||
const onMembershipsChanged = jest.fn();
|
|
||||||
sess.on(MatrixRTCSessionEvent.MembershipsChanged, onMembershipsChanged);
|
|
||||||
|
|
||||||
jest.advanceTimersByTime(61 * 1000 * 1000);
|
|
||||||
|
|
||||||
expect(onMembershipsChanged).toHaveBeenCalledWith([membershipObject], []);
|
|
||||||
expect(sess?.memberships.length).toEqual(0);
|
|
||||||
} finally {
|
|
||||||
jest.useRealTimers();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it("prunes expired memberships on update", () => {
|
|
||||||
jest.useFakeTimers();
|
|
||||||
try {
|
|
||||||
client.sendStateEvent = jest.fn();
|
|
||||||
|
|
||||||
const mockMemberships = [
|
|
||||||
Object.assign({}, membershipTemplate, {
|
|
||||||
device_id: "OTHERDEVICE",
|
|
||||||
expires: 1000,
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
const mockRoomNoExpired = makeMockRoom(mockMemberships);
|
|
||||||
|
|
||||||
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoomNoExpired);
|
|
||||||
|
|
||||||
// sanity check
|
|
||||||
expect(sess.memberships).toHaveLength(1);
|
|
||||||
expect(sess.memberships[0].deviceId).toEqual("OTHERDEVICE");
|
|
||||||
|
|
||||||
jest.advanceTimersByTime(10000);
|
|
||||||
|
|
||||||
sess.joinRoomSession([mockFocus], mockFocus);
|
|
||||||
|
|
||||||
expect(client.sendStateEvent).toHaveBeenCalledWith(
|
|
||||||
mockRoomNoExpired!.roomId,
|
|
||||||
EventType.GroupCallMemberPrefix,
|
|
||||||
{
|
|
||||||
memberships: [
|
|
||||||
{
|
|
||||||
application: "m.call",
|
|
||||||
scope: "m.room",
|
|
||||||
call_id: "",
|
|
||||||
device_id: "AAAAAAA",
|
|
||||||
expires: 3600000,
|
|
||||||
expires_ts: Date.now() + 3600000,
|
|
||||||
foci_active: [mockFocus],
|
|
||||||
membershipID: expect.stringMatching(".*"),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
"@alice:example.org",
|
|
||||||
);
|
|
||||||
} finally {
|
|
||||||
jest.useRealTimers();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it("fills in created_ts for other memberships on update", () => {
|
|
||||||
client.sendStateEvent = jest.fn();
|
|
||||||
jest.useFakeTimers();
|
|
||||||
jest.setSystemTime(1000);
|
|
||||||
const mockRoom = makeMockRoom([
|
|
||||||
Object.assign({}, membershipTemplate, {
|
|
||||||
device_id: "OTHERDEVICE",
|
|
||||||
}),
|
|
||||||
]);
|
|
||||||
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
|
||||||
|
|
||||||
sess.joinRoomSession([mockFocus], mockFocus);
|
|
||||||
|
|
||||||
expect(client.sendStateEvent).toHaveBeenCalledWith(
|
|
||||||
mockRoom!.roomId,
|
|
||||||
EventType.GroupCallMemberPrefix,
|
|
||||||
{
|
|
||||||
memberships: [
|
|
||||||
{
|
|
||||||
application: "m.call",
|
|
||||||
scope: "m.room",
|
|
||||||
call_id: "",
|
|
||||||
device_id: "OTHERDEVICE",
|
|
||||||
expires: 3600000,
|
|
||||||
created_ts: 1000,
|
|
||||||
foci_active: [{ type: "livekit", livekit_service_url: "https://lk.url" }],
|
|
||||||
membershipID: expect.stringMatching(".*"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
application: "m.call",
|
|
||||||
scope: "m.room",
|
|
||||||
call_id: "",
|
|
||||||
device_id: "AAAAAAA",
|
|
||||||
expires: 3600000,
|
|
||||||
expires_ts: Date.now() + 3600000,
|
|
||||||
foci_active: [mockFocus],
|
|
||||||
membershipID: expect.stringMatching(".*"),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
"@alice:example.org",
|
|
||||||
);
|
|
||||||
jest.useRealTimers();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("collects keys from encryption events", () => {
|
it("collects keys from encryption events", () => {
|
||||||
const mockRoom = makeMockRoom([membershipTemplate]);
|
const mockRoom = makeMockRoom([membershipTemplate]);
|
||||||
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
sess = MatrixRTCSession.roomSessionForRoom(client, mockRoom);
|
||||||
@@ -1551,4 +1489,6 @@ describe("MatrixRTCSession", () => {
|
|||||||
jest.useRealTimers();
|
jest.useRealTimers();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user