| // |
| // |
| // Copyright 2015 gRPC authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| // |
| |
| #include <string.h> |
| |
| #include <functional> |
| #include <memory> |
| |
| #include <grpc/grpc.h> |
| #include <grpc/grpc_security.h> |
| #include <grpc/support/log.h> |
| |
| #include "src/core/lib/channel/channel_args.h" |
| #include "test/core/end2end/end2end_tests.h" |
| #include "test/core/end2end/fixtures/proxy.h" |
| #include "test/core/util/test_config.h" |
| |
| class ProxyFixture : public CoreTestFixture { |
| public: |
| ProxyFixture(const grpc_core::ChannelArgs& client_args, |
| const grpc_core::ChannelArgs& server_args) |
| : proxy_(grpc_end2end_proxy_create(&proxy_def_, client_args.ToC().get(), |
| server_args.ToC().get())) {} |
| ~ProxyFixture() override { grpc_end2end_proxy_destroy(proxy_); } |
| |
| private: |
| static grpc_server* CreateProxyServer(const char* port, |
| const grpc_channel_args* server_args) { |
| grpc_server* s = grpc_server_create(server_args, nullptr); |
| grpc_server_credentials* server_creds = |
| grpc_insecure_server_credentials_create(); |
| GPR_ASSERT(grpc_server_add_http2_port(s, port, server_creds)); |
| grpc_server_credentials_release(server_creds); |
| return s; |
| } |
| |
| static grpc_channel* CreateProxyClient(const char* target, |
| const grpc_channel_args* client_args) { |
| grpc_channel_credentials* creds = grpc_insecure_credentials_create(); |
| grpc_channel* channel = grpc_channel_create(target, creds, client_args); |
| grpc_channel_credentials_release(creds); |
| return channel; |
| } |
| |
| grpc_server* MakeServer(const grpc_core::ChannelArgs& args) override { |
| auto* server = grpc_server_create(args.ToC().get(), nullptr); |
| grpc_server_register_completion_queue(server, cq(), nullptr); |
| grpc_server_credentials* server_creds = |
| grpc_insecure_server_credentials_create(); |
| GPR_ASSERT(grpc_server_add_http2_port( |
| server, grpc_end2end_proxy_get_server_port(proxy_), server_creds)); |
| grpc_server_credentials_release(server_creds); |
| grpc_server_start(server); |
| return server; |
| } |
| |
| grpc_channel* MakeClient(const grpc_core::ChannelArgs& args) override { |
| grpc_channel_credentials* creds = grpc_insecure_credentials_create(); |
| auto* client = grpc_channel_create( |
| grpc_end2end_proxy_get_client_target(proxy_), creds, args.ToC().get()); |
| grpc_channel_credentials_release(creds); |
| GPR_ASSERT(client); |
| return client; |
| } |
| const grpc_end2end_proxy_def proxy_def_ = {CreateProxyServer, |
| CreateProxyClient}; |
| grpc_end2end_proxy* proxy_; |
| }; |
| |
| // All test configurations |
| static CoreTestConfiguration configs[] = { |
| {"chttp2/fullstack+proxy", |
| FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION | |
| FEATURE_MASK_SUPPORTS_REQUEST_PROXYING | |
| FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL | |
| FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER, |
| nullptr, |
| [](const grpc_core::ChannelArgs& client_args, |
| const grpc_core::ChannelArgs& server_args) { |
| return std::make_unique<ProxyFixture>(client_args, server_args); |
| }}, |
| }; |
| |
| int main(int argc, char** argv) { |
| size_t i; |
| |
| grpc::testing::TestEnvironment env(&argc, argv); |
| grpc_end2end_tests_pre_init(); |
| grpc_init(); |
| |
| for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) { |
| grpc_end2end_tests(argc, argv, configs[i]); |
| } |
| |
| grpc_shutdown(); |
| |
| return 0; |
| } |