UNPKG

transfer-stats

Version:

Track download/upload and provide transfer stats

221 lines (194 loc) 8.19 kB
'use strict'; /* eslint-env jest */ const Transfer = require('../'); require('./helpers'); let transfer; let transfer2; let elapsedTime; elapsedTime = 0; const delayMs = 300; const delay = () => { elapsedTime += delayMs; return new Promise(resolve => setTimeout(resolve, 300)); }; describe('simple transfer flow with content-length', () => { it('should create new file transfer', () => { transfer = new Transfer({ bytesTotal: 10000 }); expect(transfer.stats.started).toBe(false); expect(transfer.stats.finished).toBe(false); expect(transfer.stats.bytesCompleted).toBe(0); expect(transfer.stats.bytesTotal).toBe(10000); expect(transfer.stats.bytesRemaining).toBe(10000); expect(transfer.stats.percentage).toBe(0); }); it('should error when transferring bytes on unstarted transfer', () => { expect(() => { transfer.updateBytes(50); }).toThrow(); }); it('should start transfer', () => { transfer.start(); expect(transfer.stats.started).toBe(true); expect(transfer.stats.finished).toBe(false); expect(transfer.stats.bytesCompleted).toBe(0); expect(transfer.stats.bytesRemaining).toBe(10000); expect(transfer.stats.bytesTotal).toBe(10000); expect(transfer.stats.percentage).toBe(0); return delay(); }); it('should transfer data', () => { transfer.updateBytes(100); expect(transfer.stats.started).toBe(true); expect(transfer.stats.finished).toBe(false); expect(transfer.stats.bytesCompleted).toBe(100); expect(transfer.stats.bytesRemaining).toBe(9900); expect(transfer.stats.bytesTotal).toBe(10000); expect(transfer.stats.percentage).toBe(0.01); expect(transfer.stats.msElapsed).toBeWithin20PercentOf(elapsedTime); const bps = 333; // 100B / 300MS * 1000; expect(transfer.stats.bytesPerSecond).toBeWithin20PercentOf(bps); const ms = 30030; // 10000B / 333BPS * 1000; expect(transfer.stats.msTotal).toBeWithin20PercentOf(ms); const msRemaining = 30030 - 300; expect(transfer.stats.msRemaining).toBeWithin20PercentOf(msRemaining); return delay(); }); it('should transfer more data', () => { transfer.updateBytes(500); expect(transfer.stats.started).toBe(true); expect(transfer.stats.finished).toBe(false); expect(transfer.stats.bytesCompleted).toBe(500); expect(transfer.stats.bytesRemaining).toBe(9500); expect(transfer.stats.bytesTotal).toBe(10000); expect(transfer.stats.percentage).toBe(0.05); expect(transfer.stats.msElapsed).toBeWithin20PercentOf(elapsedTime); const bps = 833; // 500B / 600MS * 1000; expect(transfer.stats.bytesPerSecond).toBeWithin20PercentOf(bps); const ms = 12000; // 10000B / 833BPS * 1000; expect(transfer.stats.msTotal).toBeWithin20PercentOf(ms); const msRemaining = 12000 - 600; expect(transfer.stats.msRemaining).toBeWithin20PercentOf(msRemaining); return delay(); }); it('should transfer all the data', () => { transfer.updateBytes(10000); expect(transfer.stats.started).toBe(true); expect(transfer.stats.finished).toBe(false); expect(transfer.stats.bytesCompleted).toBe(10000); expect(transfer.stats.bytesRemaining).toBe(0); expect(transfer.stats.bytesTotal).toBe(10000); expect(transfer.stats.percentage).toBe(1); expect(transfer.stats.msElapsed).toBeWithin20PercentOf(elapsedTime); const bps = 11111; // 10000B / 900MS * 1000; expect(transfer.stats.bytesPerSecond).toBeWithin20PercentOf(bps); const ms = 900; // 10000B / 11111BPS * 1000; expect(transfer.stats.msTotal).toBeWithin20PercentOf(ms); const msRemaining = 0; expect(transfer.stats.msRemaining).toBe(msRemaining); return delay(); }); it('should be able to be marked as finished', () => { transfer.finish(); expect(transfer.stats.started).toBe(false); expect(transfer.stats.finished).toBe(true); }); it('should create new file transfer', () => { elapsedTime = 0; transfer2 = new Transfer({ bytesTotal: 10000 }); expect(transfer2.stats.started).toBe(false); expect(transfer2.stats.finished).toBe(false); expect(transfer2.stats.bytesCompleted).toBe(0); expect(transfer2.stats.bytesTotal).toBe(10000); expect(transfer2.stats.bytesRemaining).toBe(10000); expect(transfer2.stats.percentage).toBe(0); }); it('should start transfer', () => { transfer2.start(); expect(transfer2.stats.started).toBe(true); expect(transfer2.stats.finished).toBe(false); expect(transfer2.stats.bytesCompleted).toBe(0); expect(transfer2.stats.bytesRemaining).toBe(10000); expect(transfer2.stats.bytesTotal).toBe(10000); expect(transfer2.stats.percentage).toBe(0); return delay(); }); it('should transfer data', () => { transfer2.updateBytes(100); expect(transfer2.stats.started).toBe(true); expect(transfer2.stats.finished).toBe(false); expect(transfer2.stats.bytesCompleted).toBe(100); expect(transfer2.stats.bytesRemaining).toBe(9900); expect(transfer2.stats.bytesTotal).toBe(10000); expect(transfer2.stats.percentage).toBe(0.01); expect(transfer2.stats.msElapsed).toBeWithin20PercentOf(elapsedTime); const bps = 333; // 100B / 300MS * 1000; expect(transfer2.stats.bytesPerSecond).toBeWithin20PercentOf(bps); const ms = 30030; // 10000B / 333BPS * 1000; expect(transfer2.stats.msTotal).toBeWithin20PercentOf(ms); const msRemaining = 30030 - 300; expect(transfer2.stats.msRemaining).toBeWithin20PercentOf(msRemaining); return delay(); }); it('should go back to 0 bps if no data incoming', () => { transfer2.updateBytes(100); transfer2.updateBytes(100); transfer2.updateBytes(100); transfer2.updateBytes(100); transfer2.updateBytes(100); expect(transfer2.stats.started).toBe(true); expect(transfer2.stats.paused).toBe(false); expect(transfer2.stats.finished).toBe(false); expect(transfer2.stats.bytesCompleted).toBe(100); expect(transfer2.stats.bytesRemaining).toBe(9900); expect(transfer2.stats.bytesTotal).toBe(10000); expect(transfer2.stats.percentage).toBe(0.01); expect(transfer2.stats.msElapsed).toBeWithin20PercentOf(elapsedTime); const bps = 0; expect(transfer2.stats.bytesPerSecond).toBe(bps); const ms = Infinity; expect(transfer2.stats.msTotal).toBe(ms); const msRemaining = Infinity; expect(transfer2.stats.msRemaining).toBe(msRemaining); return delay(); }); it('should handle pause', () => { transfer2.updateBytes(150); transfer2.pause(); expect(transfer2.stats.started).toBe(true); expect(transfer2.stats.paused).toBe(true); expect(transfer2.stats.finished).toBe(false); expect(transfer2.stats.bytesCompleted).toBe(150); expect(transfer2.stats.bytesRemaining).toBe(9850); expect(transfer2.stats.bytesTotal).toBe(10000); expect(transfer2.stats.percentage).toBe(0.015); expect(transfer2.stats.msElapsed).toBeWithin20PercentOf(elapsedTime); expect(isNaN(transfer2.stats.bytesPerSecond)).toBe(true); expect(isNaN(transfer2.stats.msTotal)).toBe(true); expect(isNaN(transfer2.stats.msRemaining)).toBe(true); return delay(); }); it('should handle resume', () => { transfer2.resume(); return delay().then(() => { transfer2.updateBytes(400); expect(transfer2.stats.started).toBe(true); expect(transfer2.stats.paused).toBe(false); expect(transfer2.stats.finished).toBe(false); expect(transfer2.stats.bytesCompleted).toBe(400); expect(transfer2.stats.bytesRemaining).toBe(9600); expect(transfer2.stats.bytesTotal).toBe(10000); expect(transfer2.stats.percentage).toBe(0.04); expect(transfer2.stats.msElapsed).toBeWithin20PercentOf(elapsedTime - delayMs); const bps = 833; // ((400-150) = 250B) / 300MS * 1000; expect(transfer2.stats.bytesPerSecond).toBeWithin20PercentOf(bps); const ms = 12004; // 10000B / 333BPS * 1000; expect(transfer2.stats.msTotal).toBeWithin20PercentOf(ms); const msRemaining = 12004 - 1200; expect(transfer2.stats.msRemaining).toBeWithin20PercentOf(msRemaining); }); }); });