Home | History | Annotate | Download | only in fixtures
      1 /*
      2  *
      3  * Copyright 2015 gRPC authors.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  */
     18 
     19 #include "test/core/end2end/end2end_tests.h"
     20 
     21 #include <stdio.h>
     22 #include <string.h>
     23 
     24 #include <grpc/support/alloc.h>
     25 #include <grpc/support/log.h>
     26 
     27 #include "src/core/lib/channel/channel_args.h"
     28 #include "src/core/lib/gpr/env.h"
     29 #include "src/core/lib/gpr/host_port.h"
     30 #include "src/core/lib/gpr/string.h"
     31 #include "src/core/lib/gpr/tmpfile.h"
     32 #include "src/core/lib/security/credentials/credentials.h"
     33 #include "test/core/end2end/data/ssl_test_data.h"
     34 #include "test/core/end2end/fixtures/proxy.h"
     35 #include "test/core/util/port.h"
     36 #include "test/core/util/test_config.h"
     37 
     38 typedef struct fullstack_secure_fixture_data {
     39   grpc_end2end_proxy* proxy;
     40 } fullstack_secure_fixture_data;
     41 
     42 static grpc_server* create_proxy_server(const char* port,
     43                                         grpc_channel_args* server_args) {
     44   grpc_server* s = grpc_server_create(server_args, nullptr);
     45   grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
     46                                                   test_server1_cert};
     47   grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create(
     48       nullptr, &pem_cert_key_pair, 1, 0, nullptr);
     49   GPR_ASSERT(grpc_server_add_secure_http2_port(s, port, ssl_creds));
     50   grpc_server_credentials_release(ssl_creds);
     51   return s;
     52 }
     53 
     54 static grpc_channel* create_proxy_client(const char* target,
     55                                          grpc_channel_args* client_args) {
     56   grpc_channel* channel;
     57   grpc_channel_credentials* ssl_creds =
     58       grpc_ssl_credentials_create(nullptr, nullptr, nullptr, nullptr);
     59   grpc_arg ssl_name_override = {
     60       GRPC_ARG_STRING,
     61       const_cast<char*>(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG),
     62       {const_cast<char*>("foo.test.google.fr")}};
     63   grpc_channel_args* new_client_args =
     64       grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);
     65   channel =
     66       grpc_secure_channel_create(ssl_creds, target, new_client_args, nullptr);
     67   grpc_channel_credentials_release(ssl_creds);
     68   {
     69     grpc_core::ExecCtx exec_ctx;
     70     grpc_channel_args_destroy(new_client_args);
     71   }
     72   return channel;
     73 }
     74 
     75 static const grpc_end2end_proxy_def proxy_def = {create_proxy_server,
     76                                                  create_proxy_client};
     77 
     78 static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack(
     79     grpc_channel_args* client_args, grpc_channel_args* server_args) {
     80   grpc_end2end_test_fixture f;
     81   fullstack_secure_fixture_data* ffd =
     82       static_cast<fullstack_secure_fixture_data*>(
     83           gpr_malloc(sizeof(fullstack_secure_fixture_data)));
     84   memset(&f, 0, sizeof(f));
     85 
     86   ffd->proxy = grpc_end2end_proxy_create(&proxy_def, client_args, server_args);
     87 
     88   f.fixture_data = ffd;
     89   f.cq = grpc_completion_queue_create_for_next(nullptr);
     90   f.shutdown_cq = grpc_completion_queue_create_for_pluck(nullptr);
     91 
     92   return f;
     93 }
     94 
     95 static void process_auth_failure(void* state, grpc_auth_context* ctx,
     96                                  const grpc_metadata* md, size_t md_count,
     97                                  grpc_process_auth_metadata_done_cb cb,
     98                                  void* user_data) {
     99   GPR_ASSERT(state == nullptr);
    100   cb(user_data, nullptr, 0, nullptr, 0, GRPC_STATUS_UNAUTHENTICATED, nullptr);
    101 }
    102 
    103 static void chttp2_init_client_secure_fullstack(
    104     grpc_end2end_test_fixture* f, grpc_channel_args* client_args,
    105     grpc_channel_credentials* creds) {
    106   fullstack_secure_fixture_data* ffd =
    107       static_cast<fullstack_secure_fixture_data*>(f->fixture_data);
    108   f->client = grpc_secure_channel_create(
    109       creds, grpc_end2end_proxy_get_client_target(ffd->proxy), client_args,
    110       nullptr);
    111   GPR_ASSERT(f->client != nullptr);
    112   grpc_channel_credentials_release(creds);
    113 }
    114 
    115 static void chttp2_init_server_secure_fullstack(
    116     grpc_end2end_test_fixture* f, grpc_channel_args* server_args,
    117     grpc_server_credentials* server_creds) {
    118   fullstack_secure_fixture_data* ffd =
    119       static_cast<fullstack_secure_fixture_data*>(f->fixture_data);
    120   if (f->server) {
    121     grpc_server_destroy(f->server);
    122   }
    123   f->server = grpc_server_create(server_args, nullptr);
    124   grpc_server_register_completion_queue(f->server, f->cq, nullptr);
    125   GPR_ASSERT(grpc_server_add_secure_http2_port(
    126       f->server, grpc_end2end_proxy_get_server_port(ffd->proxy), server_creds));
    127   grpc_server_credentials_release(server_creds);
    128   grpc_server_start(f->server);
    129 }
    130 
    131 void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture* f) {
    132   fullstack_secure_fixture_data* ffd =
    133       static_cast<fullstack_secure_fixture_data*>(f->fixture_data);
    134   grpc_end2end_proxy_destroy(ffd->proxy);
    135   gpr_free(ffd);
    136 }
    137 
    138 static void chttp2_init_client_simple_ssl_secure_fullstack(
    139     grpc_end2end_test_fixture* f, grpc_channel_args* client_args) {
    140   grpc_channel_credentials* ssl_creds =
    141       grpc_ssl_credentials_create(nullptr, nullptr, nullptr, nullptr);
    142   grpc_arg ssl_name_override = {
    143       GRPC_ARG_STRING,
    144       const_cast<char*>(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG),
    145       {const_cast<char*>("foo.test.google.fr")}};
    146   grpc_channel_args* new_client_args =
    147       grpc_channel_args_copy_and_add(client_args, &ssl_name_override, 1);
    148   chttp2_init_client_secure_fullstack(f, new_client_args, ssl_creds);
    149   {
    150     grpc_core::ExecCtx exec_ctx;
    151     grpc_channel_args_destroy(new_client_args);
    152   }
    153 }
    154 
    155 static int fail_server_auth_check(grpc_channel_args* server_args) {
    156   size_t i;
    157   if (server_args == nullptr) return 0;
    158   for (i = 0; i < server_args->num_args; i++) {
    159     if (strcmp(server_args->args[i].key, FAIL_AUTH_CHECK_SERVER_ARG_NAME) ==
    160         0) {
    161       return 1;
    162     }
    163   }
    164   return 0;
    165 }
    166 
    167 static void chttp2_init_server_simple_ssl_secure_fullstack(
    168     grpc_end2end_test_fixture* f, grpc_channel_args* server_args) {
    169   grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key,
    170                                                   test_server1_cert};
    171   grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create(
    172       nullptr, &pem_cert_key_pair, 1, 0, nullptr);
    173   if (fail_server_auth_check(server_args)) {
    174     grpc_auth_metadata_processor processor = {process_auth_failure, nullptr,
    175                                               nullptr};
    176     grpc_server_credentials_set_auth_metadata_processor(ssl_creds, processor);
    177   }
    178   chttp2_init_server_secure_fullstack(f, server_args, ssl_creds);
    179 }
    180 
    181 /* All test configurations */
    182 
    183 static grpc_end2end_test_config configs[] = {
    184     {"chttp2/simple_ssl_fullstack",
    185      FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION |
    186          FEATURE_MASK_SUPPORTS_REQUEST_PROXYING |
    187          FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS |
    188          FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL |
    189          FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER,
    190      "foo.test.google.fr", chttp2_create_fixture_secure_fullstack,
    191      chttp2_init_client_simple_ssl_secure_fullstack,
    192      chttp2_init_server_simple_ssl_secure_fullstack,
    193      chttp2_tear_down_secure_fullstack},
    194 };
    195 
    196 int main(int argc, char** argv) {
    197   size_t i;
    198   FILE* roots_file;
    199   size_t roots_size = strlen(test_root_cert);
    200   char* roots_filename;
    201 
    202   grpc_test_init(argc, argv);
    203   grpc_end2end_tests_pre_init();
    204 
    205   /* Set the SSL roots env var. */
    206   roots_file = gpr_tmpfile("chttp2_simple_ssl_fullstack_test", &roots_filename);
    207   GPR_ASSERT(roots_filename != nullptr);
    208   GPR_ASSERT(roots_file != nullptr);
    209   GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size);
    210   fclose(roots_file);
    211   gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, roots_filename);
    212 
    213   grpc_init();
    214 
    215   for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) {
    216     grpc_end2end_tests(argc, argv, configs[i]);
    217   }
    218 
    219   grpc_shutdown();
    220 
    221   /* Cleanup. */
    222   remove(roots_filename);
    223   gpr_free(roots_filename);
    224 
    225   return 0;
    226 }
    227