UNPKG

turn-js

Version:

TURN (Traversal Using Relay NAT) library written entirely in JavaScript

133 lines (120 loc) 5.39 kB
'use strict' var Attributes = require('../lib/attributes') var Packet = require('../lib/packet') var chai = require('chai') var expect = chai.expect describe('#TURN attributes', function () { it('should encode and decode a channel-number attribute', function (done) { var testChannel = 0x4001 var ChannelNumber = Attributes.ChannelNumber var channelNumber = new ChannelNumber(testChannel) var bytes = channelNumber.encode() var decodedChannelNumber = ChannelNumber.decode(bytes.slice(4, bytes.lenght)) expect(decodedChannelNumber.channel).to.exist expect(decodedChannelNumber.channel).to.equal(testChannel) done() }) it('should encode and decode a lifetime attribute', function (done) { var testDuration = 3600 var Lifetime = Attributes.Lifetime var lifetime = new Lifetime(testDuration) var bytes = lifetime.encode() var decodedLifetime = Lifetime.decode(bytes.slice(4, bytes.lenght)) expect(decodedLifetime.duration).to.exist expect(decodedLifetime.duration).to.equal(testDuration) done() }) it('should encode and decode an xor-peer-address attribute', function (done) { var testAddress = '127.0.0.1' var testPort = 2345 var tid = Math.random() * Packet.TID_MAX var magic = Packet.MAGIC_COOKIE var testHeaderBytes = createTestHeaderBytes(magic, tid) var XORPeerAddress = Attributes.XORPeerAddress var xorPeerAddress = new XORPeerAddress(testAddress, testPort) var bytes = xorPeerAddress.encode(magic, tid) var decodedXORPeerAddress = XORPeerAddress.decode(bytes.slice(4, bytes.lenght), testHeaderBytes) expect(decodedXORPeerAddress.address).to.exist expect(decodedXORPeerAddress.address).to.equal(testAddress) expect(decodedXORPeerAddress.port).to.exist expect(decodedXORPeerAddress.port).to.equal(testPort) done() }) it('should encode and decode a data attribute', function (done) { var testData = 'this is such an awesome library' var testBytes = Buffer.from(testData) var Data = Attributes.Data var data = new Data(testBytes) var bytes = data.encode() var length = bytes.readUInt16BE(2) var decodedData = Data.decode(bytes.slice(4, 4 + length)) expect(decodedData.bytes).to.exist expect(decodedData.bytes.toString()).to.equal(testData) done() }) it('should encode and decode an xor-relayed-address attribute', function (done) { var testAddress = '127.0.0.1' var testPort = 2345 var tid = Math.random() * Packet.TID_MAX var magic = Packet.MAGIC_COOKIE var testHeaderBytes = createTestHeaderBytes(magic, tid) var XORRelayedAddress = Attributes.XORRelayedAddress var xorRelayedAddress = new XORRelayedAddress(testAddress, testPort) var bytes = xorRelayedAddress.encode(magic, tid) var decodedXORRelayedAddress = XORRelayedAddress.decode(bytes.slice(4, bytes.lenght), testHeaderBytes) expect(decodedXORRelayedAddress.address).to.exist expect(decodedXORRelayedAddress.address).to.equal(testAddress) expect(decodedXORRelayedAddress.port).to.exist expect(decodedXORRelayedAddress.port).to.equal(testPort) done() }) it('should encode and decode an even port attribute', function (done) { var reserveNextHigherPortNumber = true var EvenPort = Attributes.EvenPort var evenPort = new EvenPort(reserveNextHigherPortNumber) var bytes = evenPort.encode() var decodedEvenPort = EvenPort.decode(bytes.slice(4, bytes.lenght)) expect(decodedEvenPort.reserveNextHigherPortNumber).to.exist expect(decodedEvenPort.reserveNextHigherPortNumber).to.equal(reserveNextHigherPortNumber) done() }) it('should encode and decode a requested-transport attribute', function (done) { var RequestedTransport = Attributes.RequestedTransport var requestedTransport = new RequestedTransport() var bytes = requestedTransport.encode() var decodedRequestedTransport = RequestedTransport.decode(bytes.slice(4, bytes.lenght)) expect(decodedRequestedTransport.value).to.exist expect(decodedRequestedTransport.value).to.equal(17) done() }) it("should encode and decode a don't fragment attribute", function (done) { var DontFragment = Attributes.DontFragment var dontFragment = new DontFragment() var bytes = dontFragment.encode() var decodedDontFragment = DontFragment.decode(bytes.slice(4, bytes.lenght)) expect(decodedDontFragment).to.exist done() }) it('should encode and decode a reservation-token attribute', function (done) { var testToken = 'abcdefgh' var ReservationToken = Attributes.ReservationToken var reservationToken = new ReservationToken(testToken) var bytes = reservationToken.encode() var decodedReservationToken = ReservationToken.decode(bytes.slice(4, bytes.lenght)) expect(decodedReservationToken.token).to.exist expect(decodedReservationToken.token).to.equal(testToken) done() }) }) function createTestHeaderBytes (magic, tid) { var encodedHeader = Buffer.alloc(Packet.HEADER_LENGTH) var type = Packet.METHOD.ALLOCATE | Packet.TYPE.REQUEST var length = 0 encodedHeader.writeUInt16BE((type & 0x3fff), 0) encodedHeader.writeUInt16BE(length, 2) encodedHeader.writeUInt32BE(magic, 4) encodedHeader.writeUInt32BE(0, 8) encodedHeader.writeUInt32BE(0, 12) encodedHeader.writeUInt32BE(tid, 16) return encodedHeader }