-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathappearin.js
148 lines (124 loc) · 4.78 KB
/
appearin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
const test = require('tape');
const os = require('os');
const webdriver = require('selenium-webdriver');
const buildDriver = require('./webdriver').buildDriver;
const TIMEOUT = 30000;
function waitNPeerConnectionsExist(driver, n) {
return driver.wait(() => driver.executeScript(n => {
var RTCManager = angular.element(document.body).injector().get('RoomService')._currentRtcManager;
return RTCManager && Object.keys(RTCManager.peerConnections).length === n;
}, n), TIMEOUT, 'Timed out waiting for N peerconnections to exist');
}
function waitAllPeerConnectionsConnected(driver) {
return driver.wait(() => driver.executeScript(() => {
var RTCManager = angular.element(document.body).injector().get('RoomService')._currentRtcManager;
var states = [];
Object.keys(RTCManager.peerConnections).forEach(id => {
var connection = RTCManager.peerConnections[id];
states.push(connection.pc.iceConnectionState);
});
return states.length === states.filter((s) => s === 'connected' || s === 'completed').length;
}), TIMEOUT, 'Timed out waiting for N peerconnections to be connected');
}
function waitNVideosExist(driver, n) {
return driver.wait(() => driver.executeScript(n => document.querySelectorAll('.video-wrapper video').length === n, n), TIMEOUT, 'Timed out waiting for N videos to exist');
}
function waitAllVideosHaveEnoughData(driver) {
return driver.wait(() => driver.executeScript(() => {
var videos = document.querySelectorAll('.video-wrapper video');
var ready = 0;
for (var i = 0; i < videos.length; i++) {
if (videos[i].readyState >= videos[i].HAVE_ENOUGH_DATA) {
ready++;
}
}
return ready === videos.length;
}), TIMEOUT, 'Timed out waiting for N video to HAVE_ENOUGH_DATA');
}
// Edge Webdriver resolves quit slightly too early, wait a bit.
function maybeWaitForEdge(browserA, browserB) {
if (browserA === 'MicrosoftEdge' || browserB === 'MicrosoftEdge') {
return new Promise(resolve => {
setTimeout(resolve, 2000);
});
}
return Promise.resolve();
}
function interop(browserA, browserB, t) {
var driverA = buildDriver(browserA, {h264: true, bver: browserA === 'safari' ? 'TechnologyPreview' : 'beta'});
var driverB = buildDriver(browserB, {h264: true, bver: browserB === 'safari' ? 'TechnologyPreview' : 'beta'});
var baseURL = 'https://appear.in/';
var roomName = 'automated-testing-' + Math.random().toString(36).substr(2, 10);
var url = baseURL + roomName;
driverA.manage().timeouts().setScriptTimeout(TIMEOUT);
return driverA.get(url)
.then(() => driverB.get(baseURL + roomName))
.then(() => // check that we have a peerconnection
waitNPeerConnectionsExist(driverA, 1))
.then(() => {
t.pass('peerconnections exist');
})
.then(() => // wait for the ice connection state change to connected/completed.
waitAllPeerConnectionsConnected(driverA))
.then(() => {
t.pass('all ice connections connected');
})
.then(() => waitNVideosExist(driverA, 2))
.then(() => {
t.pass('have all video elements');
})
.then(() => waitAllVideosHaveEnoughData(driverA))
.then(() => {
t.pass('all videos have ENOUGH_DATA');
})
.then(() => waitNVideosExist(driverB, 2))
.then(() => {
t.pass('have all video elements');
})
.then(() => waitAllVideosHaveEnoughData(driverB))
.then(() => {
t.pass('all videos have ENOUGH_DATA');
})
.then(() => Promise.all([driverA.quit(), driverB.quit()]))
.then(() => maybeWaitForEdge(browserA, browserB))
.then(() => {
t.end();
})
.catch(e => {
t.fail(e);
});
}
const SELENIUM_SERVER = process.env.SELENIUM_SERVER;
test('Chrome-Chrome', t => {
interop('chrome', 'chrome', t);
});
test('Firefox-Firefox', t => {
interop('firefox', 'firefox', t);
});
test('Chrome-Firefox', t => {
interop('chrome', 'firefox', t);
});
test('Firefox-Chrome', t => {
interop('firefox', 'chrome', t);
});
test('Edge-Chrome', {skip: !SELENIUM_SERVER && os.platform() !== 'win32'}, t => {
interop('MicrosoftEdge', 'chrome', t);
});
test('Safari-Chrome', {skip: !SELENIUM_SERVER && os.platform() !== 'darwin'}, t => {
interop('safari', 'chrome', t);
});
test('Chrome-Safari', {skip: !SELENIUM_SERVER && os.platform() !== 'darwin'}, t => {
interop('safari', 'chrome', t);
});
test('Firefox-Safari', {skip: !SELENIUM_SERVER && os.platform() !== 'darwin'}, t => {
interop('firefox', 'safari', t);
});
test('Safari-Firefox', {skip: !SELENIUM_SERVER && os.platform() !== 'darwin'}, t => {
interop('safari', 'firefox', t);
});
test('Edge-Safari', {skip: !SELENIUM_SERVER}, t => {
interop('MicrosoftEdge', 'safari', t);
});
test('Safari-Edge', {skip: !SELENIUM_SERVER}, t => {
interop('safari', 'MicrosoftEdge', t);
});