Projekt

Obecné

Profil

Stáhnout (5.17 KB) Statistiky
| Větev: | Revize:
1
var assert = require('assert');
2
var hpack = require('../');
3

    
4
describe('hpack/decoder', function() {
5
  var decoder;
6

    
7
  beforeEach(function() {
8
    decoder = hpack.decoder.create();
9
  });
10

    
11
  describe('bit', function() {
12
    it('should decode number bit-by-bit', function() {
13
      decoder.push([ 0b11101010, 0b10101111 ]);
14
      var out = '';
15
      for (var i = 0; i < 16; i++)
16
        out += decoder.decodeBit();
17
      assert.equal(out, '11101010' + '10101111');
18
    });
19
  });
20

    
21
  describe('integer', function() {
22
    it('should decode 10 in prefix-5 (C.1.1)', function() {
23
      decoder.push([ 0b11101010 ]);
24
      decoder.skipBits(3);
25
      assert.equal(decoder.decodeInt(), 10);
26
    });
27

    
28
    it('should decode 1337 in prefix-5 (C.1.2)', function() {
29
      decoder.push([ 0b11111111, 0b10011010, 0b00001010 ]);
30
      decoder.skipBits(3);
31
      assert.equal(decoder.decodeInt(), 1337);
32
    });
33

    
34
    it('should decode 42 at octect boundary (C.1.3)', function() {
35
      decoder.push([ 0b00101010 ]);
36
      assert.equal(decoder.decodeInt(8), 42);
37
    });
38

    
39
    it('should throw on empty input', function() {
40
      assert.throws(function() {
41
        decoder.decodeInt();
42
      });
43
    });
44

    
45
    it('should throw on incomplete int', function() {
46
      decoder.push([ 0b11111111, 0b10011010 ]);
47
      decoder.skipBits(3);
48
      assert.throws(function() {
49
        decoder.decodeInt();
50
      });
51
    });
52

    
53
    it('should throw on overflowing int', function() {
54
      decoder.push([
55
        0b11111111,
56
        0b10011010,
57
        0b10011010,
58
        0b10011010,
59
        0b10011010,
60
        0b10011010
61
      ]);
62
      decoder.skipBits(3);
63
      assert.throws(function() {
64
        decoder.decodeInt();
65
      });
66
    });
67
  });
68

    
69
  describe('string', function() {
70
    it('should decode literal from (C.2.1)', function() {
71
      decoder.push([ 0x0a ]);
72
      decoder.push(new Buffer('custom-key'));
73

    
74
      assert.equal(decoder.decodeStr().toString(), 'custom-key');
75
    });
76

    
77
    it('should decode literal from (C.4.1)', function() {
78
      decoder.push(new Buffer(
79
        '8c' +
80
            'f1e3 c2e5 f23a 6ba0 ab90 f4ff'.replace(/ /g, ''),
81
        'hex'));
82

    
83
      assert.equal(new Buffer(decoder.decodeStr()).toString(),
84
                   'www.example.com');
85
    });
86

    
87
    it('should decode literal from (C.4.2)', function() {
88
      decoder.push(new Buffer(
89
        '86' +
90
            'a8eb 1064 9cbf'.replace(/ /g, ''),
91
        'hex'));
92

    
93
      assert.equal(new Buffer(decoder.decodeStr()).toString(), 'no-cache');
94
    });
95

    
96
    it('should decode literal from (C.4.3) #1', function() {
97
      decoder.push(new Buffer(
98
        '88' +
99
            '25a8 49e9 5ba9 7d7f'.replace(/ /g, ''),
100
        'hex'));
101

    
102
      assert.equal(new Buffer(decoder.decodeStr()).toString(), 'custom-key');
103
    });
104

    
105
    it('should decode literal from (C.4.3) #2', function() {
106
      decoder.push(new Buffer(
107
        '89' +
108
            '25a8 49e9 5bb8 e8b4 bf'.replace(/ /g, ''),
109
        'hex'));
110

    
111
      assert.equal(new Buffer(decoder.decodeStr()).toString(), 'custom-value');
112
    });
113

    
114
    it('should decode literal from (C.6.1) #1', function() {
115
      decoder.push(new Buffer(
116
        ('96' +
117
            'd07a be94 1054 d444 a820 0595 040b 8166' +
118
            'e082 a62d 1bff').replace(/ /g, ''),
119
        'hex'));
120

    
121
      assert.equal(new Buffer(decoder.decodeStr()).toString(),
122
                   'Mon, 21 Oct 2013 20:13:21 GMT');
123
    });
124

    
125
    it('should decode literal from (C.6.1) #2', function() {
126
      decoder.push(new Buffer(
127
        ('91' +
128
            '9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43' +
129
            'd3').replace(/ /g, ''),
130
        'hex'));
131
      assert.equal(new Buffer(decoder.decodeStr()).toString(),
132
                   'https://www.example.com');
133
    });
134

    
135
    it('should decode many 5 bit chars', function() {
136
      // e = 00101, 0x294A5294A5 = 00101 x 8
137
      decoder.push(new Buffer('85294A5294A5', 'hex'));
138
      assert.equal(new Buffer(decoder.decodeStr()).toString(), 'eeeeeeee');
139
    });
140

    
141
    it('should decode many 5 bit chars with 3-bit EOS', function() {
142
      // e = 00101, EOS=111,
143
      // 0x294A5294A52F = 00101 x 9 + 111
144
      decoder.push(new Buffer('86294A5294A52F', 'hex'));
145
      assert.equal(new Buffer(decoder.decodeStr()).toString(), 'eeeeeeeee');
146
    });
147

    
148
    it('should decode many 5 bit chars with 2-bit EOS', function() {
149
      // e = 00101, EOS=11,
150
      // 0x294A5297 = 00101 x 6 + 11
151
      decoder.push(new Buffer('84294A5297', 'hex'));
152
      assert.equal(new Buffer(decoder.decodeStr()).toString(), 'eeeeee');
153
    });
154

    
155
    it('should decode many multi-octet chars', function() {
156
      decoder.push(new Buffer(
157
          '97ffffb1ffff63fffec7fffd8ffffb1ffff63fffec7fffd8',
158
          'hex'));
159
      assert.deepEqual(decoder.decodeStr(), [
160
        1, 1, 1, 1, 1, 1, 1, 1
161
      ]);
162
    });
163

    
164
    it('should fail on 8 bit EOS', function() {
165
      // e = 00101, 0x294A5294A5 = 00101 x 8
166
      decoder.push(new Buffer('86294A5294A5ff', 'hex'));
167
      assert.throws(function() {
168
        decoder.decodeStr();
169
      });
170
    });
171

    
172
    it('should fail on invalid 2-bit EOS', function() {
173
      // e = 00101, EOS=10,
174
      // 0x294A5297 = 00101 x 6 + 11
175
      decoder.push(new Buffer('84294A5296', 'hex'));
176
      assert.throws(function() {
177
        decoder.decodeStr();
178
      });
179
    });
180
  });
181
});
(2-2/5)