Upstream version 11.40.271.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / tools / rtcbot / test / three_bots_video_conference.js
1 // Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
2 //
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the LICENSE file in the root of the source
5 // tree. An additional intellectual property rights grant can be found
6 // in the file PATENTS.  All contributing project authors may
7 // be found in the AUTHORS file in the root of the source tree.
8 //
9 // A video conference between 3 bots streaming video and audio between
10 // each other.
11 // The test succeeds after establishing the call between the three
12 // devices.
13 //
14 // Note: the source of the video and audio stream is getUserMedia().
15 function testTwoWayVideoStreaming(test, bot1, bot2, bot3) {
16   var answersCount = 0;
17   var statsCollector;
18
19   test.wait([
20       createBotPeerConnectionsWithLocalStream.bind(bot1),
21       createBotPeerConnectionsWithLocalStream.bind(bot2),
22       createBotPeerConnectionsWithLocalStream.bind(bot3)],
23     onPeerConnectionCreated);
24
25   // done() callback is called with list of peers as argument.
26   function createBotPeerConnectionsWithLocalStream(done) {
27     var peerConnections = [];
28
29     this.getUserMedia({video:true, audio:true},
30         onUserMediaSuccess.bind(this), test.fail);
31
32     function onUserMediaSuccess(stream) {
33       test.log("User has granted access to local media.");
34       this.showStream(stream.id, true, true);
35
36       test.createTurnConfig(onTurnConfig.bind(this), test.fail);
37
38       function onTurnConfig(config) {
39         this.createPeerConnection(config, addStream.bind(this),
40             test.fail);
41         this.createPeerConnection(config, addStream.bind(this),
42             test.fail);
43       }
44
45       function addStream(pc) {
46         pc.addStream(stream);
47         pc.addEventListener('addstream', onAddStream.bind(this));
48
49         peerConnections.push(pc);
50         if(peerConnections.length == 2)
51           done(peerConnections);
52       }
53     }
54   }
55
56   function onPeerConnectionCreated(peerConnections1,
57       peerConnections2, peerConnections3) {
58     test.log("RTC Peers created.");
59
60     // Bot1 and Bot2
61     establichCall(peerConnections1[0], peerConnections2[1]);
62     // Bot2 and Bot3
63     establichCall(peerConnections2[0], peerConnections3[1]);
64     // Bot3 and Bot1
65     establichCall(peerConnections3[0], peerConnections1[1]);
66   }
67
68   function establichCall(pc1, pc2) {
69     pc1.addEventListener('icecandidate', onIceCandidate.bind(pc2));
70     pc2.addEventListener('icecandidate', onIceCandidate.bind(pc1));
71
72     createOfferAndAnswer(pc1, pc2);
73   }
74
75   function onAddStream(event) {
76     test.log("On Add stream.");
77     this.showStream(event.stream.id, true, false);
78   }
79
80   function onIceCandidate(event) {
81     if(event.candidate) {
82       this.addIceCandidate(event.candidate,
83          onAddIceCandidateSuccess, test.fail);
84     };
85
86     function onAddIceCandidateSuccess() {
87       test.log("Candidate added successfully");
88     };
89   }
90
91   function createOfferAndAnswer(pc1, pc2) {
92     test.log("Creating offer.");
93     pc1.createOffer(gotOffer, test.fail);
94
95     function gotOffer(offer) {
96       test.log("Got offer");
97       pc1.setLocalDescription(offer, onSetSessionDescriptionSuccess, test.fail);
98       pc2.setRemoteDescription(offer, onSetSessionDescriptionSuccess,
99           test.fail);
100       test.log("Creating answer");
101       pc2.createAnswer(gotAnswer, test.fail);
102     }
103
104     function gotAnswer(answer) {
105       test.log("Got answer");
106       pc2.setLocalDescription(answer, onSetSessionDescriptionSuccess,
107           test.fail);
108       pc1.setRemoteDescription(answer, onSetSessionDescriptionSuccess,
109           test.fail);
110
111       answersCount++;
112       if(answersCount == 3) {
113         // SetTimeout used because creating the three answers will very fast
114         // and test will success and the vm will be closed before establishing
115         // the calls.
116         setTimeout(function() {
117             test.done();
118           }, 5000);
119       }
120     }
121
122     function onSetSessionDescriptionSuccess() {
123       test.log("Set session description success.");
124     }
125   }
126 }
127
128 registerBotTest('threeBotsVideoConference/android+android+chrome',
129                 testTwoWayVideoStreaming, ['android-chrome', 'android-chrome',
130                 'chrome']);
131 registerBotTest('threeBotsVideoConference/chrome-chrome-chrome',
132                 testTwoWayVideoStreaming, ['chrome', 'chrome', 'chrome']);
133 registerBotTest('threeBotsVideoConference/android-android-android',
134                 testTwoWayVideoStreaming, ['android-chrome', 'android-chrome',
135                 'android-chrome']);