|
|
|
@ -21,6 +21,8 @@ |
|
|
|
|
#include <limits.h> |
|
|
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
|
#include <gtest/gtest.h> |
|
|
|
|
|
|
|
|
|
#include <grpc/support/alloc.h> |
|
|
|
|
#include <grpc/support/log.h> |
|
|
|
|
#include <grpc/support/string_util.h> |
|
|
|
@ -30,33 +32,37 @@ |
|
|
|
|
#include "src/core/lib/surface/channel_init.h" |
|
|
|
|
#include "test/core/util/test_config.h" |
|
|
|
|
|
|
|
|
|
static grpc_error_handle channel_init_func( |
|
|
|
|
grpc_channel_element* /*elem*/, grpc_channel_element_args* /*args*/) { |
|
|
|
|
namespace grpc_core { |
|
|
|
|
namespace testing { |
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
grpc_error_handle ChannelInitFunc(grpc_channel_element* /*elem*/, |
|
|
|
|
grpc_channel_element_args* /*args*/) { |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static grpc_error_handle call_init_func( |
|
|
|
|
grpc_call_element* /*elem*/, const grpc_call_element_args* /*args*/) { |
|
|
|
|
grpc_error_handle CallInitFunc(grpc_call_element* /*elem*/, |
|
|
|
|
const grpc_call_element_args* /*args*/) { |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void channel_destroy_func(grpc_channel_element* /*elem*/) {} |
|
|
|
|
void ChannelDestroyFunc(grpc_channel_element* /*elem*/) {} |
|
|
|
|
|
|
|
|
|
static void call_destroy_func(grpc_call_element* /*elem*/, |
|
|
|
|
const grpc_call_final_info* /*final_info*/, |
|
|
|
|
grpc_closure* /*ignored*/) {} |
|
|
|
|
void CallDestroyFunc(grpc_call_element* /*elem*/, |
|
|
|
|
const grpc_call_final_info* /*final_info*/, |
|
|
|
|
grpc_closure* /*ignored*/) {} |
|
|
|
|
|
|
|
|
|
bool g_replacement_fn_called = false; |
|
|
|
|
bool g_original_fn_called = false; |
|
|
|
|
void set_arg_once_fn(grpc_channel_stack* /*channel_stack*/, |
|
|
|
|
grpc_channel_element* /*elem*/, void* arg) { |
|
|
|
|
void SetArgOnceFn(grpc_channel_stack* /*channel_stack*/, |
|
|
|
|
grpc_channel_element* /*elem*/, void* arg) { |
|
|
|
|
bool* called = static_cast<bool*>(arg); |
|
|
|
|
// Make sure this function is only called once per arg.
|
|
|
|
|
GPR_ASSERT(*called == false); |
|
|
|
|
*called = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void test_channel_stack_builder_filter_replace(void) { |
|
|
|
|
TEST(ChannelStackBuilderTest, ReplaceFilter) { |
|
|
|
|
grpc_channel* channel = |
|
|
|
|
grpc_insecure_channel_create("target name isn't used", nullptr, nullptr); |
|
|
|
|
GPR_ASSERT(channel != nullptr); |
|
|
|
@ -71,12 +77,12 @@ const grpc_channel_filter replacement_filter = { |
|
|
|
|
grpc_call_next_op, |
|
|
|
|
grpc_channel_next_op, |
|
|
|
|
0, |
|
|
|
|
call_init_func, |
|
|
|
|
CallInitFunc, |
|
|
|
|
grpc_call_stack_ignore_set_pollset_or_pollset_set, |
|
|
|
|
call_destroy_func, |
|
|
|
|
CallDestroyFunc, |
|
|
|
|
0, |
|
|
|
|
channel_init_func, |
|
|
|
|
channel_destroy_func, |
|
|
|
|
ChannelInitFunc, |
|
|
|
|
ChannelDestroyFunc, |
|
|
|
|
grpc_channel_next_get_info, |
|
|
|
|
"filter_name"}; |
|
|
|
|
|
|
|
|
@ -84,40 +90,47 @@ const grpc_channel_filter original_filter = { |
|
|
|
|
grpc_call_next_op, |
|
|
|
|
grpc_channel_next_op, |
|
|
|
|
0, |
|
|
|
|
call_init_func, |
|
|
|
|
CallInitFunc, |
|
|
|
|
grpc_call_stack_ignore_set_pollset_or_pollset_set, |
|
|
|
|
call_destroy_func, |
|
|
|
|
CallDestroyFunc, |
|
|
|
|
0, |
|
|
|
|
channel_init_func, |
|
|
|
|
channel_destroy_func, |
|
|
|
|
ChannelInitFunc, |
|
|
|
|
ChannelDestroyFunc, |
|
|
|
|
grpc_channel_next_get_info, |
|
|
|
|
"filter_name"}; |
|
|
|
|
|
|
|
|
|
static bool add_replacement_filter(grpc_channel_stack_builder* builder) { |
|
|
|
|
static bool AddReplacementFilter(grpc_channel_stack_builder* builder) { |
|
|
|
|
// Get rid of any other version of the filter, as determined by having the
|
|
|
|
|
// same name.
|
|
|
|
|
GPR_ASSERT(grpc_channel_stack_builder_remove_filter(builder, |
|
|
|
|
replacement_filter.name)); |
|
|
|
|
return grpc_channel_stack_builder_prepend_filter( |
|
|
|
|
builder, &replacement_filter, set_arg_once_fn, &g_replacement_fn_called); |
|
|
|
|
builder, &replacement_filter, SetArgOnceFn, &g_replacement_fn_called); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool add_original_filter(grpc_channel_stack_builder* builder) { |
|
|
|
|
bool AddOriginalFilter(grpc_channel_stack_builder* builder) { |
|
|
|
|
return grpc_channel_stack_builder_prepend_filter( |
|
|
|
|
builder, &original_filter, set_arg_once_fn, &g_original_fn_called); |
|
|
|
|
builder, &original_filter, SetArgOnceFn, &g_original_fn_called); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
} // namespace testing
|
|
|
|
|
} // namespace grpc_core
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) { |
|
|
|
|
::testing::InitGoogleTest(&argc, argv); |
|
|
|
|
grpc::testing::TestEnvironment env(argc, argv); |
|
|
|
|
grpc_core::CoreConfiguration::RegisterBuilder( |
|
|
|
|
[](grpc_core::CoreConfiguration::Builder* builder) { |
|
|
|
|
builder->channel_init()->RegisterStage(GRPC_CLIENT_CHANNEL, INT_MAX, |
|
|
|
|
add_original_filter); |
|
|
|
|
builder->channel_init()->RegisterStage(GRPC_CLIENT_CHANNEL, INT_MAX, |
|
|
|
|
add_replacement_filter); |
|
|
|
|
builder->channel_init()->RegisterStage( |
|
|
|
|
GRPC_CLIENT_CHANNEL, INT_MAX, |
|
|
|
|
grpc_core::testing::AddOriginalFilter); |
|
|
|
|
builder->channel_init()->RegisterStage( |
|
|
|
|
GRPC_CLIENT_CHANNEL, INT_MAX, |
|
|
|
|
grpc_core::testing::AddReplacementFilter); |
|
|
|
|
}); |
|
|
|
|
grpc_init(); |
|
|
|
|
test_channel_stack_builder_filter_replace(); |
|
|
|
|
int ret = RUN_ALL_TESTS(); |
|
|
|
|
grpc_shutdown(); |
|
|
|
|
return 0; |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|