1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
# -*- coding: utf-8 -*-
import pytest
from hpack import InvalidTableIndex
from hpack.table import HeaderTable, table_entry_size
class TestPackageFunctions:
def test_table_entry_size(self):
res = table_entry_size(b'TestName', b'TestValue')
assert res == 49
class TestHeaderTable:
def test_get_by_index_dynamic_table(self):
tbl = HeaderTable()
off = len(HeaderTable.STATIC_TABLE)
val = (b'TestName', b'TestValue')
tbl.add(*val)
res = tbl.get_by_index(off + 1)
assert res == val
def test_get_by_index_static_table(self):
tbl = HeaderTable()
exp = (b':authority', b'')
res = tbl.get_by_index(1)
assert res == exp
idx = len(HeaderTable.STATIC_TABLE)
exp = (b'www-authenticate', b'')
res = tbl.get_by_index(idx)
assert res == exp
def test_get_by_index_zero_index(self):
tbl = HeaderTable()
with pytest.raises(InvalidTableIndex):
tbl.get_by_index(0)
def test_get_by_index_out_of_range(self):
tbl = HeaderTable()
off = len(HeaderTable.STATIC_TABLE)
tbl.add(b'TestName', b'TestValue')
with pytest.raises(InvalidTableIndex) as e:
tbl.get_by_index(off + 2)
assert (
"Invalid table index %d" % (off + 2) in str(e.value)
)
def test_repr(self):
tbl = HeaderTable()
tbl.add(b'TestName1', b'TestValue1')
tbl.add(b'TestName2', b'TestValue2')
tbl.add(b'TestName2', b'TestValue2')
exp = (
"HeaderTable(4096, False, deque(["
"(b'TestName2', b'TestValue2'), "
"(b'TestName2', b'TestValue2'), "
"(b'TestName1', b'TestValue1')"
"]))"
)
res = repr(tbl)
assert res == exp
def test_add_to_large(self):
tbl = HeaderTable()
# Max size to small to hold the value we specify
tbl.maxsize = 1
tbl.add(b'TestName', b'TestValue')
# Table length should be 0
assert len(tbl.dynamic_entries) == 0
def test_search_in_static_full(self):
tbl = HeaderTable()
itm = (b':authority', b'')
exp = (1, itm[0], itm[1])
res = tbl.search(itm[0], itm[1])
assert res == exp
def test_search_in_static_partial(self):
tbl = HeaderTable()
exp = (1, b':authority', None)
res = tbl.search(b':authority', b'NotInTable')
assert res == exp
def test_search_in_dynamic_full(self):
tbl = HeaderTable()
idx = len(HeaderTable.STATIC_TABLE) + 1
tbl.add(b'TestName', b'TestValue')
exp = (idx, b'TestName', b'TestValue')
res = tbl.search(b'TestName', b'TestValue')
assert res == exp
def test_search_in_dynamic_partial(self):
tbl = HeaderTable()
idx = len(HeaderTable.STATIC_TABLE) + 1
tbl.add(b'TestName', b'TestValue')
exp = (idx, b'TestName', None)
res = tbl.search(b'TestName', b'NotInTable')
assert res == exp
def test_search_no_match(self):
tbl = HeaderTable()
tbl.add(b'TestName', b'TestValue')
res = tbl.search(b'NotInTable', b'NotInTable')
assert res is None
def test_maxsize_prop_getter(self):
tbl = HeaderTable()
assert tbl.maxsize == HeaderTable.DEFAULT_SIZE
def test_maxsize_prop_setter(self):
tbl = HeaderTable()
exp = int(HeaderTable.DEFAULT_SIZE / 2)
tbl.maxsize = exp
assert tbl.resized is True
assert tbl.maxsize == exp
tbl.resized = False
tbl.maxsize = exp
assert tbl.resized is False
assert tbl.maxsize == exp
def test_size(self):
tbl = HeaderTable()
for i in range(3):
tbl.add(b'TestName', b'TestValue')
res = tbl._current_size
assert res == 147
def test_shrink_maxsize_is_zero(self):
tbl = HeaderTable()
tbl.add(b'TestName', b'TestValue')
assert len(tbl.dynamic_entries) == 1
tbl.maxsize = 0
assert len(tbl.dynamic_entries) == 0
def test_shrink_maxsize(self):
tbl = HeaderTable()
for i in range(3):
tbl.add(b'TestName', b'TestValue')
assert tbl._current_size == 147
tbl.maxsize = 146
assert len(tbl.dynamic_entries) == 2
assert tbl._current_size == 98
|