| 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; | 
|       }); | 
|     }); | 
|   }); | 
| }); |