Skip to content

Commit

Permalink
Merge pull request bigbluebutton#13428 from antonbsa/add-stress-test-…
Browse files Browse the repository at this point in the history
…breakout-invitation

test: Add breakout room invitation stress test
  • Loading branch information
antobinary authored Oct 14, 2021
2 parents 1b19ba7 + 11bc9c2 commit 0f05cd9
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ class BreakoutJoinConfirmation extends Component {
))
}
</select>
{ waiting ? <span>{intl.formatMessage(intlMessages.generatingURL)}</span> : null}
{ waiting ? <span data-test="labelGeneratingURL">{intl.formatMessage(intlMessages.generatingURL)}</span> : null}
</div>
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,7 @@ class BreakoutRoom extends PureComponent {
size="lg"
label={intl.formatMessage(intlMessages.endAllBreakouts)}
className={styles.endButton}
data-test="endBreakoutRoomsButton"
onClick={() => {
this.closePanel();
endAllBreakouts();
Expand Down
1 change: 1 addition & 0 deletions bigbluebutton-tests/puppeteer/core/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ exports.CLIENT_RECONNECTION_TIMEOUT = 120000;
// STRESS TESTS VARS
exports.JOIN_AS_MODERATOR_TEST_ROUNDS = 100;
exports.MAX_JOIN_AS_MODERATOR_FAIL_RATE = 0.05;
exports.BREAKOUT_ROOM_INVITATION_TEST_ROUNDS = 20;

// MEDIA CONNECTION TIMEOUTS
exports.VIDEO_LOADING_WAIT_TIME = 15000;
Expand Down
3 changes: 3 additions & 0 deletions bigbluebutton-tests/puppeteer/core/elements.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ exports.breakoutRoomsButton = 'div[aria-label="Breakout Rooms"]';
exports.generateRoom1 = 'button[aria-label="Generate URL Room 1"]';
exports.joinGeneratedRoom1 = 'button[aria-label="Generated Room 1"]';
exports.joinRoom1 = 'button[aria-label="Join room Room 1"]';
exports.allowChoiceRoom = 'input[id="freeJoinCheckbox"]';
exports.labelGeneratingURL = 'span[data-test="labelGeneratingURL"]';
exports.endBreakoutRoomsButton = 'button[data-test="endBreakoutRoomsButton"]';

// Chat
exports.chatButton = 'div[data-test="chatButton"]';
Expand Down
96 changes: 84 additions & 12 deletions bigbluebutton-tests/puppeteer/stress/stress.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,108 @@ const c = require('../core/constants');
const util = require('./util');
const { checkElementLengthEqualTo } = require('../core/util');

class Stress extends Page {
class Stress {
constructor() {
super();
this.modPage = new Page();
this.userPages = [];
}

async moderatorAsPresenter(testName) {
try {
const maxFailRate = c.JOIN_AS_MODERATOR_TEST_ROUNDS * c.MAX_JOIN_AS_MODERATOR_FAIL_RATE;
let failureCount = 0;
for (let i = 1; i <= c.JOIN_AS_MODERATOR_TEST_ROUNDS; i++) {
await this.init(true, true, testName, `Moderator-${i}`);
await this.waitForSelector(e.userAvatar);
const hasPresenterClass = await this.page.evaluate(util.checkIncludeClass, e.userAvatar, e.presenterClassName);
await this.waitAndClick(e.actions);
const canStartPoll = await this.page.evaluate(checkElementLengthEqualTo, e.polling, 1);
await this.modPage.init(true, true, testName, `Moderator-${i}`);
await this.modPage.waitForSelector(e.userAvatar);
const hasPresenterClass = await this.modPage.page.evaluate(util.checkIncludeClass, e.userAvatar, e.presenterClassName);
await this.modPage.waitAndClick(e.actions);
const canStartPoll = await this.modPage.page.evaluate(checkElementLengthEqualTo, e.polling, 1);
if (!hasPresenterClass || !canStartPoll) {
failureCount++;
await this.screenshot(testName, `loop-${i}-failure-${testName}`);
await this.modPage.screenshot(testName, `loop-${i}-failure-${testName}`);
}
await this.close();
await this.logger(`Loop ${i} of ${c.JOIN_AS_MODERATOR_TEST_ROUNDS} completed`);
await this.modPage.close();
await this.modPage.logger(`Loop ${i} of ${c.JOIN_AS_MODERATOR_TEST_ROUNDS} completed`);
if (failureCount > maxFailRate) return false;
}
return true;
} catch (err) {
await this.close();
this.logger(err);
await this.modPage.logger(err);
return false;
}
}

async breakoutRoomInvitation(testName) {
try {
await this.modPage.init(true, true, testName, 'Moderator');
for (let i = 1; i <= c.BREAKOUT_ROOM_INVITATION_TEST_ROUNDS; i++) {
const userName = `User-${i}`;
const userPage = new Page();
await userPage.init(false, true, testName, userName, this.modPage.meetingId);
await userPage.logger(`${userName} joined`);
this.userPages.push(userPage);
}

// Create breakout rooms with the allow choice option enabled
await this.modPage.bringToFront();
await this.modPage.waitAndClick(e.manageUsers);
await this.modPage.waitAndClick(e.createBreakoutRooms);
await this.modPage.waitAndClick(e.allowChoiceRoom);
await this.modPage.screenshot(testName, '01-modPage-before-create-breakout-rooms-allowing-choice');
await this.modPage.waitAndClick(e.modalConfirmButton);

for (const page of this.userPages) {
await page.bringToFront();
const firstCheck = await page.hasElement(e.modalConfirmButton, c.ELEMENT_WAIT_LONGER_TIME);
const secondCheck = await page.wasRemoved(e.labelGeneratingURL, c.ELEMENT_WAIT_LONGER_TIME);

if (!firstCheck || !secondCheck) {
await page.screenshot(testName, `${page.effectiveParams.fullName}-breakout-modal-failed`);
return false;
}
await page.screenshot(testName, `${page.effectiveParams.fullName}-breakout-modal-allowing-choice-success`);
}

// End breakout rooms
await this.modPage.bringToFront();
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.waitAndClick(e.endBreakoutRoomsButton);
await this.modPage.closeAudioModal();

// Create breakout rooms with the allow choice option NOT enabled (randomly assign)
await this.modPage.waitAndClick(e.manageUsers);
await this.modPage.waitAndClick(e.createBreakoutRooms);
await this.modPage.waitAndClick(e.randomlyAssign);
await this.modPage.screenshot(testName, '02-modPage-before-create-breakout-rooms-not-allowing-choice');
await this.modPage.waitAndClick(e.modalConfirmButton);

for (const page of this.userPages) {
await page.bringToFront();
const check = await page.hasElement(e.modalConfirmButton);

if (!check) {
await page.screenshot(testName, `${page.effectiveParams.fullName}-breakout-modal-not-allowing-choose-failed`);
return false;
}
await page.screenshot(testName, `${page.effectiveParams.fullName}-breakout-modal-not-allowing-choose-success`);
}

return true;
} catch (err) {
await this.modPage.logger(err);
return false;
}
}

async closeUserPages() {
for (const page of this.userPages) {
try {
await page.close();
} catch (err) {
await this.modPage.logger(err);
}
}
}
}

module.exports = exports = Stress;
26 changes: 23 additions & 3 deletions bigbluebutton-tests/puppeteer/stress/stress.obj.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,31 @@ const stressTest = () => {
let response;
try {
const testName = 'firstModeratorAsPresenter';
await test.logger('begin of ', testName);
await test.modPage.logger('begin of ', testName);
response = await test.moderatorAsPresenter(testName);
await test.logger('end of ', testName);
await test.modPage.logger('end of ', testName);
} catch (err) {
await test.logger(err);
await test.modPage.logger(err);
} finally {
await test.modPage.close();
}
expect(response).toBe(true);
});

// Check that all users invited to a breakout room can join it
test('All users must receive breakout room invitations', async () => {
const test = new Stress();
let response;
try {
const testName = 'breakoutRoomInvitation';
await test.modPage.logger('begin of ', testName);
response = await test.breakoutRoomInvitation(testName);
await test.modPage.logger('end of ', testName);
} catch (err) {
await test.modPage.logger(err);
} finally {
await test.modPage.close();
await test.closeUserPages();
}
expect(response).toBe(true);
});
Expand Down

0 comments on commit 0f05cd9

Please sign in to comment.