Home | History | Annotate | Download | only in test
      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']);