137 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| });
 |