webp2p
Version:
The server-less signaling channel for WebRTC
179 lines (136 loc) • 3.79 kB
JavaScript
function melée(numPeers)
{
function onconnected()
{
ok(true, this.sessionID+' connected');
start()
};
function onpeerconnection(peerconnection, channels)
{
var self = this;
if(channels.length)
channels.forEach(function(channel)
{
if(channel.label == 'test')
channel.addEventListener('message', function(event)
{
var message = event.data;
equal(message, 'ping', self.sessionID+' received PING from '+peerconnection.sessionID);
this.send('pong');
start();
});
});
else
peerconnection.addEventListener('datachannel', function(event)
{
var channel = event.channel;
var label = channel.label;
if(label == 'test')
{
channel.addEventListener('message', function(event)
{
var message = event.data;
equal(message, 'pong', self.sessionID+' received PONG from '+peerconnection.sessionID);
start();
});
channel.addEventListener('open', function()
{
channel.send('ping');
});
}
});
};
function onerror(error)
{
ok(false, this.sessionID+' error: '+error);
start()
};
QUnit.module(numPeers+' peers melée',
{
setup: function()
{
console.debug('***'+QUnit.config.current.testNumber+'. '+QUnit.config.current.testName+'***');
var handshake_servers =
[
{
type: "PubNub",
config_init:
{
publish_key : "pub-6ee5d4df-fe10-4990-bbc7-c1b0525f5d2b",
subscribe_key: "sub-e5919840-3564-11e2-b8d0-c7df1d04ae4a",
ssl : true
},
config_mess:
{
channel: "ShareIt"
}
}
];
this.conns = new Array(numPeers);
for(var i=0; i<this.conns.length; i++)
{
var option =
{
handshake_servers: handshake_servers,
commonLabels: ['test'],
sessionID: 'Peer '+QUnit.config.current.testNumber+'.'+i
};
this.conns[i] = new WebP2P(option);
}
},
teardown: function()
{
this.conns.forEach(function(conn)
{
conn.close();
});
console.debug('***'+QUnit.config.current.testNumber+'. '+QUnit.config.current.testName+'***');
}
});
test('Connect '+numPeers+' peers to PubNub at the same time', function()
{
expect(numPeers);
stop(numPeers);
this.conns.forEach(function(conn)
{
conn.on('connected', onconnected);
conn.on('error', onerror);
});
});
test('Interconnect '+numPeers+' peers', function()
{
expect(2*numPeers);
stop(numPeers);
var connectedPeers = {};
function onpeerconnection(peerconnection)
{
var sessionID = this.sessionID;
ok(true, sessionID+' onpeerconnection: '+peerconnection.sessionID);
var peers = Object.keys(this.peers);
equal(peers.length, (connectedPeers[sessionID] || []).length+1,
sessionID+' peers: '+peers);
connectedPeers[sessionID] = peers;
start();
};
this.conns.forEach(function(conn)
{
conn.on('peerconnection', onpeerconnection);
conn.on('error', onerror);
});
});
test('Exchange data between '+numPeers+' peers', function()
{
var n = numPeers - 1;
var links = n*(n+1)/2; // http://en.wikipedia.org/wiki/Triangular_number
expect(2*links);
stop(2*links);
this.conns.forEach(function(conn)
{
conn.on('peerconnection', onpeerconnection);
conn.on('error', onerror);
});
});
};
//for(var i=2; i<=6; i++)
for(var i=2; i<=3; i++)
melée(i);