pull/6029/head
yang-g 9 years ago
parent cb7a80266b
commit a863b8e4ef
  1. 29
      test/core/transport/chttp2/hpack_encoder_test.c
  2. 46
      test/core/transport/metadata_test.c

@ -179,6 +179,34 @@ static void test_decode_table_overflow(void) {
verify(0, 0, 0, "000007 0104 deadbeef 40 026161 026261", 1, "aa", "ba");
}
static void verify_table_size_change_match_elem_size(const char *key,
const char *value) {
gpr_slice_buffer output;
grpc_mdelem *elem = grpc_mdelem_from_strings(key, value);
size_t elem_size = grpc_mdelem_get_size_in_hpack_table(elem);
size_t initial_table_size = g_compressor.table_size;
grpc_linked_mdelem *e = gpr_malloc(sizeof(*e));
grpc_metadata_batch b;
grpc_metadata_batch_init(&b);
e[0].md = elem;
e[0].prev = NULL;
e[0].next = NULL;
b.list.head = &e[0];
b.list.tail = &e[0];
gpr_slice_buffer_init(&output);
grpc_chttp2_encode_header(&g_compressor, 0xdeadbeef, &b, 0, &output);
gpr_slice_buffer_destroy(&output);
grpc_metadata_batch_destroy(&b);
GPR_ASSERT(g_compressor.table_size == elem_size + initial_table_size);
}
static void test_encode_header_size(void) {
verify_table_size_change_match_elem_size("hello", "world");
verify_table_size_change_match_elem_size("hello-bin", "world");
}
static void run_test(void (*test)(), const char *name) {
gpr_log(GPR_INFO, "RUN TEST: %s", name);
grpc_chttp2_hpack_compressor_init(&g_compressor);
@ -193,6 +221,7 @@ int main(int argc, char **argv) {
grpc_init();
TEST(test_basic_headers);
TEST(test_decode_table_overflow);
TEST(test_encode_header_size);
grpc_shutdown();
for (i = 0; i < num_to_delete; i++) {
gpr_free(to_delete[i]);

@ -34,6 +34,7 @@
#include "src/core/lib/transport/metadata.h"
#include <stdio.h>
#include <string.h>
#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
@ -260,6 +261,50 @@ static void test_user_data_works(void) {
grpc_shutdown();
}
static void verify_ascii_header_size(const char *key, const char *value) {
grpc_mdelem *elem = grpc_mdelem_from_strings(key, value);
size_t elem_size = grpc_mdelem_get_size_in_hpack_table(elem);
size_t expected_size = 32 + strlen(key) + strlen(value);
GPR_ASSERT(expected_size == elem_size);
GRPC_MDELEM_UNREF(elem);
}
static void verify_binary_header_size(const char *key, const uint8_t *value,
size_t value_len) {
grpc_mdelem *elem = grpc_mdelem_from_string_and_buffer(key, value, value_len);
GPR_ASSERT(grpc_is_binary_header(key, strlen(key)));
size_t elem_size = grpc_mdelem_get_size_in_hpack_table(elem);
gpr_slice value_slice =
gpr_slice_from_copied_buffer((const char *)value, value_len);
gpr_slice base64_encoded = grpc_chttp2_base64_encode(value_slice);
size_t expected_size = 32 + strlen(key) + GPR_SLICE_LENGTH(base64_encoded);
GPR_ASSERT(expected_size == elem_size);
gpr_slice_unref(value_slice);
gpr_slice_unref(base64_encoded);
GRPC_MDELEM_UNREF(elem);
}
#define BUFFER_SIZE 64
static void test_mdelem_sizes_in_hpack(void) {
LOG_TEST("test_mdelem_size");
grpc_init();
uint8_t binary_value[BUFFER_SIZE] = {0};
for (uint8_t i = 0; i < BUFFER_SIZE; i++) {
binary_value[i] = i;
}
verify_ascii_header_size("hello", "world");
verify_ascii_header_size("hello", "worldxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
verify_ascii_header_size(":scheme", "http");
for (uint8_t i = 0; i < BUFFER_SIZE; i++) {
verify_binary_header_size("hello-bin", binary_value, i);
}
grpc_shutdown();
}
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
test_no_op();
@ -272,5 +317,6 @@ int main(int argc, char **argv) {
test_slices_work();
test_base64_and_huffman_works();
test_user_data_works();
test_mdelem_sizes_in_hpack();
return 0;
}

Loading…
Cancel
Save