@ -45,6 +45,7 @@
# include "src/core/lib/channel/channel_args.h"
# include "src/core/lib/channel/compress_filter.h"
# include "src/core/lib/surface/call.h"
# include "src/core/lib/surface/call_test_only.h"
# include "test/core/end2end/cq_verifier.h"
@ -104,10 +105,13 @@ static void end_test(grpc_end2end_test_fixture *f) {
static void request_with_payload_template (
grpc_end2end_test_config config , const char * test_name ,
uint32_t send_flags_bitmask ,
grpc_compression_algorithm requested_compression_algorithm ,
grpc_compression_algorithm expected_compression_algorithm ,
grpc_metadata * client_metadata ) {
uint32_t client_send_flags_bitmask ,
grpc_compression_algorithm default_client_channel_compression_algorithm ,
grpc_compression_algorithm default_server_channel_compression_algorithm ,
grpc_compression_algorithm expected_algorithm_from_client ,
grpc_compression_algorithm expected_algorithm_from_server ,
grpc_metadata * client_init_metadata ,
grpc_compression_level server_compression_level ) {
grpc_call * c ;
grpc_call * s ;
gpr_slice request_payload_slice ;
@ -122,6 +126,8 @@ static void request_with_payload_template(
grpc_metadata_array trailing_metadata_recv ;
grpc_metadata_array request_metadata_recv ;
grpc_byte_buffer * request_payload_recv = NULL ;
grpc_byte_buffer * response_payload ;
grpc_byte_buffer * response_payload_recv ;
grpc_call_details call_details ;
grpc_status_code status ;
grpc_call_error error ;
@ -129,17 +135,22 @@ static void request_with_payload_template(
size_t details_capacity = 0 ;
int was_cancelled = 2 ;
cq_verifier * cqv ;
char str [ 1024 ] ;
char request_str [ 1024 ] ;
char response_str [ 1024 ] ;
memset ( str , ' x ' , 1023 ) ;
str [ 1023 ] = ' \0 ' ;
request_payload_slice = gpr_slice_from_copied_string ( str ) ;
request_payload = grpc_raw_byte_buffer_create ( & request_payload_slice , 1 ) ;
memset ( request_str , ' x ' , 1023 ) ;
request_str [ 1023 ] = ' \0 ' ;
memset ( response_str , ' y ' , 1023 ) ;
response_str [ 1023 ] = ' \0 ' ;
request_payload_slice = gpr_slice_from_copied_string ( request_str ) ;
gpr_slice response_payload_slice = gpr_slice_from_copied_string ( response_str ) ;
client_args = grpc_channel_args_set_compression_algorithm (
NULL , requested_compression_algorithm ) ;
NULL , default_client_channel _compression_algorithm) ;
server_args = grpc_channel_args_set_compression_algorithm (
NULL , requested _compression_algorithm) ;
NULL , default_server_channel _compression_algorithm) ;
f = begin_test ( config , test_name , client_args , server_args ) ;
cqv = cq_verifier_create ( f . cq ) ;
@ -153,26 +164,18 @@ static void request_with_payload_template(
grpc_metadata_array_init ( & request_metadata_recv ) ;
grpc_call_details_init ( & call_details ) ;
memset ( ops , 0 , sizeof ( ops ) ) ;
op = ops ;
op - > op = GRPC_OP_SEND_INITIAL_METADATA ;
if ( client_metadata ! = NULL ) {
if ( client_init_ metadata ! = NULL ) {
op - > data . send_initial_metadata . count = 1 ;
op - > data . send_initial_metadata . metadata = client_metadata ;
op - > data . send_initial_metadata . metadata = client_init_ metadata ;
} else {
op - > data . send_initial_metadata . count = 0 ;
}
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
op - > op = GRPC_OP_SEND_MESSAGE ;
op - > data . send_message = request_payload ;
op - > flags = send_flags_bitmask ;
op - > reserved = NULL ;
op + + ;
op - > op = GRPC_OP_SEND_CLOSE_FROM_CLIENT ;
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
op - > op = GRPC_OP_RECV_INITIAL_METADATA ;
op - > data . recv_initial_metadata = & initial_metadata_recv ;
op - > flags = 0 ;
@ -191,9 +194,9 @@ static void request_with_payload_template(
error =
grpc_server_request_call ( f . server , & s , & call_details ,
& request_metadata_recv , f . cq , f . cq , tag ( 101 ) ) ;
& request_metadata_recv , f . cq , f . cq , tag ( 100 ) ) ;
GPR_ASSERT ( GRPC_CALL_OK = = error ) ;
cq_expect_completion ( cqv , tag ( 101 ) , 1 ) ;
cq_expect_completion ( cqv , tag ( 100 ) , 1 ) ;
cq_verify ( cqv ) ;
GPR_ASSERT (
@ -205,29 +208,103 @@ static void request_with_payload_template(
GPR_ASSERT ( GPR_BITGET ( grpc_call_test_only_get_encodings_accepted_by_peer ( s ) ,
GRPC_COMPRESS_GZIP ) ! = 0 ) ;
memset ( ops , 0 , sizeof ( ops ) ) ;
op = ops ;
op - > op = GRPC_OP_SEND_INITIAL_METADATA ;
op - > data . send_initial_metadata . count = 0 ;
op - > data . send_initial_metadata . compression_level = server_compression_level ;
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
op - > op = GRPC_OP_RECV_MESSAGE ;
op - > data . recv_message = & request_payload_recv ;
op - > op = GRPC_OP_RECV_CLOSE_ON_SERVER ;
op - > data . recv_close_on_server . cancelled = & was_cancelled ;
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
error = grpc_call_start_batch ( s , ops , ( size_t ) ( op - ops ) , tag ( 102 ) , NULL ) ;
error = grpc_call_start_batch ( s , ops , ( size_t ) ( op - ops ) , tag ( 101 ) , NULL ) ;
GPR_ASSERT ( GRPC_CALL_OK = = error ) ;
cq_expect_completion ( cqv , tag ( 102 ) , 1 ) ;
cq_verify ( cqv ) ;
for ( int i = 0 ; i < 2 ; i + + ) {
request_payload = grpc_raw_byte_buffer_create ( & request_payload_slice , 1 ) ;
response_payload = grpc_raw_byte_buffer_create ( & response_payload_slice , 1 ) ;
memset ( ops , 0 , sizeof ( ops ) ) ;
op = ops ;
op - > op = GRPC_OP_SEND_MESSAGE ;
op - > data . send_message = request_payload ;
op - > flags = client_send_flags_bitmask ;
op - > reserved = NULL ;
op + + ;
op - > op = GRPC_OP_RECV_MESSAGE ;
op - > data . recv_message = & response_payload_recv ;
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
error = grpc_call_start_batch ( c , ops , ( size_t ) ( op - ops ) , tag ( 2 ) , NULL ) ;
GPR_ASSERT ( GRPC_CALL_OK = = error ) ;
memset ( ops , 0 , sizeof ( ops ) ) ;
op = ops ;
op - > op = GRPC_OP_RECV_MESSAGE ;
op - > data . recv_message = & request_payload_recv ;
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
error = grpc_call_start_batch ( s , ops , ( size_t ) ( op - ops ) , tag ( 102 ) , NULL ) ;
GPR_ASSERT ( GRPC_CALL_OK = = error ) ;
cq_expect_completion ( cqv , tag ( 102 ) , 1 ) ;
cq_verify ( cqv ) ;
GPR_ASSERT ( request_payload_recv - > type = = GRPC_BB_RAW ) ;
GPR_ASSERT ( byte_buffer_eq_string ( request_payload_recv , request_str ) ) ;
GPR_ASSERT ( request_payload_recv - > data . raw . compression = =
expected_algorithm_from_client ) ;
memset ( ops , 0 , sizeof ( ops ) ) ;
op = ops ;
op - > op = GRPC_OP_SEND_MESSAGE ;
op - > data . send_message = response_payload ;
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
error = grpc_call_start_batch ( s , ops , ( size_t ) ( op - ops ) , tag ( 103 ) , NULL ) ;
GPR_ASSERT ( GRPC_CALL_OK = = error ) ;
cq_expect_completion ( cqv , tag ( 103 ) , 1 ) ;
cq_expect_completion ( cqv , tag ( 2 ) , 1 ) ;
cq_verify ( cqv ) ;
GPR_ASSERT ( response_payload_recv - > type = = GRPC_BB_RAW ) ;
GPR_ASSERT ( byte_buffer_eq_string ( response_payload_recv , response_str ) ) ;
if ( server_compression_level > GRPC_COMPRESS_LEVEL_NONE ) {
const grpc_compression_algorithm algo_for_server_level =
grpc_call_compression_for_level ( s , server_compression_level ) ;
GPR_ASSERT ( response_payload_recv - > data . raw . compression = =
algo_for_server_level ) ;
} else {
GPR_ASSERT ( response_payload_recv - > data . raw . compression = =
expected_algorithm_from_server ) ;
}
grpc_byte_buffer_destroy ( request_payload ) ;
grpc_byte_buffer_destroy ( response_payload ) ;
grpc_byte_buffer_destroy ( request_payload_recv ) ;
grpc_byte_buffer_destroy ( response_payload_recv ) ;
}
gpr_slice_unref ( request_payload_slice ) ;
gpr_slice_unref ( response_payload_slice ) ;
memset ( ops , 0 , sizeof ( ops ) ) ;
op = ops ;
op - > op = GRPC_OP_RECV_CLOSE_ON_SERVER ;
op - > data . recv_close_on_server . cancelled = & was_cancelled ;
op - > op = GRPC_OP_SEND_CLOSE_FROM_CLIENT ;
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
error = grpc_call_start_batch ( c , ops , ( size_t ) ( op - ops ) , tag ( 3 ) , NULL ) ;
GPR_ASSERT ( GRPC_CALL_OK = = error ) ;
memset ( ops , 0 , sizeof ( ops ) ) ;
op = ops ;
op - > op = GRPC_OP_SEND_STATUS_FROM_SERVER ;
op - > data . send_status_from_server . trailing_metadata_count = 0 ;
op - > data . send_status_from_server . status = GRPC_STATUS_OK ;
@ -235,11 +312,13 @@ static void request_with_payload_template(
op - > flags = 0 ;
op - > reserved = NULL ;
op + + ;
error = grpc_call_start_batch ( s , ops , ( size_t ) ( op - ops ) , tag ( 103 ) , NULL ) ;
error = grpc_call_start_batch ( s , ops , ( size_t ) ( op - ops ) , tag ( 104 ) , NULL ) ;
GPR_ASSERT ( GRPC_CALL_OK = = error ) ;
cq_expect_completion ( cqv , tag ( 103 ) , 1 ) ;
cq_expect_completion ( cqv , tag ( 1 ) , 1 ) ;
cq_expect_completion ( cqv , tag ( 3 ) , 1 ) ;
cq_expect_completion ( cqv , tag ( 101 ) , 1 ) ;
cq_expect_completion ( cqv , tag ( 104 ) , 1 ) ;
cq_verify ( cqv ) ;
GPR_ASSERT ( status = = GRPC_STATUS_OK ) ;
@ -248,12 +327,6 @@ static void request_with_payload_template(
GPR_ASSERT ( 0 = = strcmp ( call_details . host , " foo.test.google.fr " ) ) ;
GPR_ASSERT ( was_cancelled = = 0 ) ;
GPR_ASSERT ( request_payload_recv - > type = = GRPC_BB_RAW ) ;
GPR_ASSERT ( request_payload_recv - > data . raw . compression = =
expected_compression_algorithm ) ;
GPR_ASSERT ( byte_buffer_eq_string ( request_payload_recv , str ) ) ;
gpr_free ( details ) ;
grpc_metadata_array_destroy ( & initial_metadata_recv ) ;
grpc_metadata_array_destroy ( & trailing_metadata_recv ) ;
@ -265,10 +338,6 @@ static void request_with_payload_template(
cq_verifier_destroy ( cqv ) ;
gpr_slice_unref ( request_payload_slice ) ;
grpc_byte_buffer_destroy ( request_payload ) ;
grpc_byte_buffer_destroy ( request_payload_recv ) ;
grpc_channel_args_destroy ( client_args ) ;
grpc_channel_args_destroy ( server_args ) ;
@ -280,60 +349,78 @@ static void test_invoke_request_with_exceptionally_uncompressed_payload(
grpc_end2end_test_config config ) {
request_with_payload_template (
config , " test_invoke_request_with_exceptionally_uncompressed_payload " ,
GRPC_WRITE_NO_COMPRESS , GRPC_COMPRESS_GZIP , GRPC_COMPRESS_NONE , NULL ) ;
GRPC_WRITE_NO_COMPRESS , GRPC_COMPRESS_GZIP , GRPC_COMPRESS_GZIP ,
GRPC_COMPRESS_NONE , GRPC_COMPRESS_GZIP , NULL , GRPC_COMPRESS_LEVEL_NONE ) ;
}
static void test_invoke_request_with_uncompressed_payload (
grpc_end2end_test_config config ) {
request_with_payload_template (
config , " test_invoke_request_with_uncompressed_payload " , 0 ,
GRPC_COMPRESS_NONE , GRPC_COMPRESS_NONE , NULL ) ;
GRPC_COMPRESS_NONE , GRPC_COMPRESS_NONE , GRPC_COMPRESS_NONE ,
GRPC_COMPRESS_NONE , NULL , GRPC_COMPRESS_LEVEL_NONE ) ;
}
static void test_invoke_request_with_compressed_payload (
grpc_end2end_test_config config ) {
request_with_payload_template (
config , " test_invoke_request_with_compressed_payload " , 0 ,
GRPC_COMPRESS_GZIP , GRPC_COMPRESS_GZIP , NULL ) ;
GRPC_COMPRESS_GZIP , GRPC_COMPRESS_GZIP , GRPC_COMPRESS_GZIP ,
GRPC_COMPRESS_GZIP , NULL , GRPC_COMPRESS_LEVEL_NONE ) ;
}
static void test_invoke_request_with_server_level (
grpc_end2end_test_config config ) {
request_with_payload_template (
config , " test_invoke_request_with_server_level " , 0 , GRPC_COMPRESS_NONE ,
GRPC_COMPRESS_NONE , GRPC_COMPRESS_NONE , GRPC_COMPRESS_NONE /* ignored */ ,
NULL , GRPC_COMPRESS_LEVEL_HIGH ) ;
}
static void test_invoke_request_with_compressed_payload_md_override (
grpc_end2end_test_config config ) {
grpc_metadata gzip_compression_override ;
grpc_metadata none_compression_override ;
grpc_metadata identity _compression_override;
gzip_compression_override . key = GRPC_COMPRESS_REQUEST_ALGORITHM_KEY ;
gzip_compression_override . value = " gzip " ;
gzip_compression_override . value_length = 4 ;
gzip_compression_override . value_length =
strlen ( gzip_compression_override . value ) ;
memset ( & gzip_compression_override . internal_data , 0 ,
sizeof ( gzip_compression_override . internal_data ) ) ;
none_compression_override . key = GRPC_COMPRESS_REQUEST_ALGORITHM_KEY ;
none_compression_override . value = " identity " ;
none_compression_override . value_length = 4 ;
memset ( & none_compression_override . internal_data , 0 ,
sizeof ( none_compression_override . internal_data ) ) ;
identity_compression_override . key = GRPC_COMPRESS_REQUEST_ALGORITHM_KEY ;
identity_compression_override . value = " identity " ;
identity_compression_override . value_length =
strlen ( identity_compression_override . value ) ;
memset ( & identity_compression_override . internal_data , 0 ,
sizeof ( identity_compression_override . internal_data ) ) ;
/* Channel default NONE (aka IDENTITY), call override to GZIP */
request_with_payload_template (
config , " test_invoke_request_with_compressed_payload_md_override_1 " , 0 ,
GRPC_COMPRESS_NONE , GRPC_COMPRESS_GZIP , & gzip_compression_override ) ;
GRPC_COMPRESS_NONE , GRPC_COMPRESS_NONE , GRPC_COMPRESS_GZIP ,
GRPC_COMPRESS_NONE , & gzip_compression_override , GRPC_COMPRESS_LEVEL_NONE ) ;
/* Channel default DEFLATE, call override to GZIP */
request_with_payload_template (
config , " test_invoke_request_with_compressed_payload_md_override_2 " , 0 ,
GRPC_COMPRESS_DEFLATE , GRPC_COMPRESS_GZIP , & gzip_compression_override ) ;
GRPC_COMPRESS_DEFLATE , GRPC_COMPRESS_NONE , GRPC_COMPRESS_GZIP ,
GRPC_COMPRESS_NONE , & gzip_compression_override , GRPC_COMPRESS_LEVEL_NONE ) ;
/* Channel default DEFLATE, call override to NONE (aka IDENTITY) */
request_with_payload_template (
config , " test_invoke_request_with_compressed_payload_md_override_3 " , 0 ,
GRPC_COMPRESS_DEFLATE , GRPC_COMPRESS_NONE , & none_compression_override ) ;
GRPC_COMPRESS_DEFLATE , GRPC_COMPRESS_NONE , GRPC_COMPRESS_NONE ,
GRPC_COMPRESS_NONE , & identity_compression_override ,
GRPC_COMPRESS_LEVEL_NONE ) ;
}
void compressed_payload ( grpc_end2end_test_config config ) {
test_invoke_request_with_exceptionally_uncompressed_payload ( config ) ;
test_invoke_request_with_uncompressed_payload ( config ) ;
test_invoke_request_with_compressed_payload ( config ) ;
test_invoke_request_with_server_level ( config ) ;
test_invoke_request_with_compressed_payload_md_override ( config ) ;
}