| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 | var assert = require('assert');var hpack = require('../');var fixtures = require('./fixtures');describe('hpack/compressor', function() {  var comp;  beforeEach(function() {    comp = hpack.compressor.create({      table: {        maxSize: 1024      }    });  });  function expect(arr, enc) {    function isNumber(num) {      return typeof num === 'number';    }    var out = comp.read().toString('hex');    if (Array.isArray(arr) && !arr.every(isNumber)) {      arr = arr.map(function(item) {        return new Buffer(item, enc);      });      arr = Buffer.concat(arr);    } else {      arr = new Buffer(arr, enc);    }    var actual = arr.toString('hex');    assert.equal(out, actual);  }  describe('indexed field', function() {    it('should lookup entry from static table', function() {      comp.write([{ name: ':method', value: 'GET' }]);      expect([ 0b10000000 | 2 ]);    });    it('should fetch entry from the end of the static table', function() {      comp.write([{ name: 'www-authenticate', value: '' }]);      expect([ 0b10000000 | 61 ]);    });  });  describe('literal field', function() {    it('should lookup name in the table (incremental)', function() {      comp.write([{ name: 'host', value: 'localhost' }]);      expect('6686a0e41d139d09', 'hex');      comp.write([{ name: 'host', value: 'localhost' }]);      expect([ 0b10000000 | 62 ]);    });    it('should lookup name in the table (not-incremental)', function() {      comp.write([{ name: 'host', value: 'localhost', incremental: false }]);      expect('0f1786a0e41d139d09', 'hex');      // Should not use the table      comp.write([{ name: 'host', value: 'localhost' }]);      expect('6686a0e41d139d09', 'hex');    });    it('should evict header field from the table', function() {      for (var i = 0; i < 1000; i++) {        comp.write([{ name: 'host', value: 'localhost' + i }]);        comp.read();      }      assert(comp._table.size < comp._table.maxSize);      assert.equal(comp._table.dynamic.length, 21);    });  });  describe('update size', function() {    it('should evict header field from the table', function() {      comp.write([{ name: 'host', value: 'localhost' }]);      expect('6686a0e41d139d09', 'hex');      comp.reset();      // update=0, update=maxSize      expect('203fe107', 'hex');      comp.write([{ name: 'host', value: 'localhost' }]);      expect('6686a0e41d139d09', 'hex');    });    it('should send dynamic update if size >= protocolMaxSize', function() {      comp.updateTableSize(Infinity);      // update=maxSize      expect('3fe107', 'hex');    });  });  describe('spec examples', function() {    beforeEach(function() {      comp = hpack.compressor.create({        table: {          maxSize: 256        }      });    });    var tests = fixtures.specExamples;    tests.forEach(function(test, i) {      var prev = tests[i - 1];      it('should give expected output on ' + test.id, function() {        var startFrom = test.continuation ? prev.comp : comp;        if (!startFrom)          throw new Error('Previous test failed');        comp = startFrom;        comp.write(test.output.map(function(pair) {          return { name: pair[0], value: pair[1], huffman: test.huffman };        }));        expect(test.input.replace(/ /g, ''), 'hex');        // Verify table contents        assert.deepEqual(comp._table.dynamic.map(function(header) {          return [ header.name, header.value, header.totalSize ];        }).reverse(), test.table);        // Verify table size        var expectedSize = test.table.reduce(function(acc, item) {          return acc + item[2];        }, 0);        assert.equal(comp._table.size, expectedSize);        test.comp = comp;      });    });  });});
 |