var expect = require('chai').expect; var util = require('./util');
var compressor = require('../lib/protocol/compressor'); var HeaderTable = compressor.HeaderTable; var HuffmanTable = compressor.HuffmanTable; var HeaderSetCompressor = compressor.HeaderSetCompressor; var HeaderSetDecompressor = compressor.HeaderSetDecompressor; var Compressor = compressor.Compressor; var Decompressor = compressor.Decompressor;
describe('HuffmanTable', function() {
describe('method encode(buffer)', function() {
it('should return the Huffman encoded version of the input buffer', function() { var table = HuffmanTable.huffmanTable; for (var decoded in test_huffman_request) { var encoded = test_huffman_request[decoded];
expect(table.encode(Buffer.from(decoded)).toString('hex')).to.equal(encoded);
}
table = HuffmanTable.huffmanTable; for (decoded in test_huffman_response) {
encoded = test_huffman_response[decoded];
expect(table.encode(Buffer.from(decoded)).toString('hex')).to.equal(encoded);
}
});
});
describe('method decode(buffer)', function() {
it('should return the Huffman decoded version of the input buffer', function() { var table = HuffmanTable.huffmanTable; for (var decoded in test_huffman_request) { var encoded = test_huffman_request[decoded];
expect(table.decode(Buffer.from(encoded, 'hex')).toString()).to.equal(decoded);
}
table = HuffmanTable.huffmanTable; for (decoded in test_huffman_response) {
encoded = test_huffman_response[decoded];
expect(table.decode(Buffer.from(encoded, 'hex')).toString()).to.equal(decoded);
}
});
});
});
describe('HeaderSetCompressor', function() {
describe('static method .integer(I, N)', function() {
it('should return an array of buffers that represent the N-prefix coded form of the integer I', function() { for (var i = 0; i < test_integers.length; i++) { var test = test_integers[i];
test.buffer.cursor = 0;
expect(util.concat(HeaderSetCompressor.integer(test.I, test.N))).to.deep.equal(test.buffer);
}
});
});
describe('static method .string(string)', function() {
it('should return an array of buffers that represent the encoded form of the string', function() { var table = HuffmanTable.huffmanTable; for (var i = 0; i < test_strings.length; i++) { var test = test_strings[i];
expect(util.concat(HeaderSetCompressor.string(test.string, table))).to.deep.equal(test.buffer);
}
});
});
describe('static method .header({ name, value, index })', function() {
it('should return an array of buffers that represent the encoded form of the header', function() { var table = HuffmanTable.huffmanTable; for (var i = 0; i < test_headers.length; i++) { var test = test_headers[i];
expect(util.concat(HeaderSetCompressor.header(test.header, table))).to.deep.equal(test.buffer);
}
});
});
});
describe('HeaderSetDecompressor', function() {
describe('static method .integer(buffer, N)', function() {
it('should return the parsed N-prefix coded number and increase the cursor property of buffer', function() { for (var i = 0; i < test_integers.length; i++) { var test = test_integers[i];
test.buffer.cursor = 0;
expect(HeaderSetDecompressor.integer(test.buffer, test.N)).to.equal(test.I);
expect(test.buffer.cursor).to.equal(test.buffer.length);
}
});
});
describe('static method .string(buffer)', function() {
it('should return the parsed string and increase the cursor property of buffer', function() { var table = HuffmanTable.huffmanTable; for (var i = 0; i < test_strings.length; i++) { var test = test_strings[i];
test.buffer.cursor = 0;
expect(HeaderSetDecompressor.string(test.buffer, table)).to.equal(test.string);
expect(test.buffer.cursor).to.equal(test.buffer.length);
}
});
});
describe('static method .header(buffer)', function() {
it('should return the parsed header and increase the cursor property of buffer', function() { var table = HuffmanTable.huffmanTable; for (var i = 0; i < test_headers.length; i++) { var test = test_headers[i];
test.buffer.cursor = 0;
expect(HeaderSetDecompressor.header(test.buffer, table)).to.deep.equal(test.header);
expect(test.buffer.cursor).to.equal(test.buffer.length);
}
});
});
});
describe('Decompressor', function() {
describe('method decompress(buffer)', function() {
it('should return the parsed header set in { name1: value1, name2: [value2, value3], ... } format', function() { var decompressor = new Decompressor(util.log, 'REQUEST'); for (var i = 0; i < test_header_sets.length - 1; i++) { var header_set = test_header_sets[i];
expect(decompressor.decompress(header_set.buffer)).to.deep.equal(header_set.headers);
}
});
});
describe('transform stream', function() {
it('should emit an error event if a series of header frames is interleaved with other frames', function() { var decompressor = new Decompressor(util.log, 'REQUEST'); var error_occured = false;
decompressor.on('error', function() {
error_occured = true;
});
decompressor.write({
type: 'HEADERS',
flags: {
END_HEADERS: false
},
data: Buffer.alloc(5)
});
decompressor.write({
type: 'DATA',
flags: {},
data: Buffer.alloc(5)
});
expect(error_occured).to.be.equal(true);
});
});
});
describe('invariant', function() {
describe('decompressor.decompress(compressor.compress(headerset)) === headerset', function() {
it('should be true for any header set if the states are synchronized', function() { var compressor = new Compressor(util.log, 'REQUEST'); var decompressor = new Decompressor(util.log, 'REQUEST'); var n = test_header_sets.length; for (var i = 0; i < 10; i++) { var headers = test_header_sets[i%n].headers; var compressed = compressor.compress(headers); var decompressed = decompressor.decompress(compressed);
expect(decompressed).to.deep.equal(headers);
expect(compressor._table).to.deep.equal(decompressor._table);
}
});
});
describe('source.pipe(compressor).pipe(decompressor).pipe(destination)', function() {
it('should behave like source.pipe(destination) for a stream of frames', function(done) { var compressor = new Compressor(util.log, 'RESPONSE'); var decompressor = new Decompressor(util.log, 'RESPONSE'); var n = test_header_sets.length;
compressor.pipe(decompressor); for (var i = 0; i < 10; i++) {
compressor.write({
type: i%2 ? 'HEADERS' : 'PUSH_PROMISE',
flags: {},
headers: test_header_sets[i%n].headers
});
}
setTimeout(function() { for (var j = 0; j < 10; j++) {
expect(decompressor.read().headers).to.deep.equal(test_header_sets[j%n].headers);
}
done();
}, 10);
});
});
describe('huffmanTable.decompress(huffmanTable.compress(buffer)) === buffer', function() {
it('should be true for any buffer', function() { for (var i = 0; i < 10; i++) { var buffer = []; while (Math.random() > 0.1) {
buffer.push(Math.floor(Math.random() * 256))
}
buffer = Buffer.from(buffer); var table = HuffmanTable.huffmanTable; var result = table.decode(table.encode(buffer));
expect(result).to.deep.equal(buffer);
}
});
});
});
});
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.