require "test_helper" class HPACKEncoderTest < Minitest::Test # C.1.1 def test_hpack_encode_integer_small result = new_encoder(1 << 31).__send__(:encode_integer, 10, 5, 0b00000000) assert_equal([0b00001010].pack("C*"), result) end # C.1.2 def test_hpack_encode_integer_big result = new_encoder(1 << 31).__send__(:encode_integer, 1337, 5, 0b000000) assert_equal([0b00011111, 0b10011010, 0b00001010].pack("C*"), result) end # C.1.3 def test_hpack_encode_integer_8prefix result = new_encoder(1 << 31).__send__(:encode_integer, 42, 8, 0b000000) assert_equal([0b00101010].pack("C*"), result) end def test_hpack_encode_single headers = [["custom-key", "custom-header"]] encoded = new_encoder(1 << 31).encode(headers) decoded = new_decoder.decode(encoded) assert_equal(headers, decoded) end def test_hpack_encode_multiple headers = [ [":method", "GET"], [":scheme", "http"], [":path", "/"], [":authority", "www.example.com"] ] encoded = new_encoder(1 << 31).encode(headers) decoded = new_decoder.decode(encoded) assert_equal(headers, decoded) end def test_hpack_encode_without_indexing encoder = new_encoder(1 << 31, indexing: false) headers1 = [["custom-key", "custom-header"]] ret1 = encoder.encode(headers1) assert_equal([], encoder.dynamic_table) headers2 = [[":method", "custom-header"]] ret2 = encoder.encode(headers2) assert_equal([], encoder.dynamic_table) end def test_hpack_encode_without_huffman encoder = new_encoder(1 << 31, huffman: false) headers = [["custom-key", "custom-header"]] ret = encoder.encode(headers) assert_equal("\x40\x0acustom-key\x0dcustom-header", ret) end private def new_decoder(settings_header_table_size = 1 << 31) Plum::HPACK::Decoder.new(settings_header_table_size) end def new_encoder(*args) Plum::HPACK::Encoder.new(*args) end end