Adding support for loading the SSL roots from an environment variable.
- Had to add support for files and environment variables as well. - I can't compile on windows so I'm sure there will be some issues. - Tested end-to-end with the simple ssl fullstack test.
This commit is contained in:
parent
40562576bc
commit
026a417def
31
build.json
31
build.json
|
|
@ -229,6 +229,8 @@
|
|||
],
|
||||
"headers": [
|
||||
"src/core/support/cpu.h",
|
||||
"src/core/support/env.h",
|
||||
"src/core/support/file.h",
|
||||
"src/core/support/murmur_hash.h",
|
||||
"src/core/support/string.h",
|
||||
"src/core/support/thd_internal.h"
|
||||
|
|
@ -239,6 +241,11 @@
|
|||
"src/core/support/cmdline.c",
|
||||
"src/core/support/cpu_linux.c",
|
||||
"src/core/support/cpu_posix.c",
|
||||
"src/core/support/env_posix.c",
|
||||
"src/core/support/env_win32.c",
|
||||
"src/core/support/file.c",
|
||||
"src/core/support/file_posix.c",
|
||||
"src/core/support/file_win32.c",
|
||||
"src/core/support/histogram.c",
|
||||
"src/core/support/host_port.c",
|
||||
"src/core/support/log.c",
|
||||
|
|
@ -912,6 +919,30 @@
|
|||
"gpr"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gpr_file_test",
|
||||
"build": "test",
|
||||
"language": "c",
|
||||
"src": [
|
||||
"test/core/support/file_test.c"
|
||||
],
|
||||
"deps": [
|
||||
"gpr_test_util",
|
||||
"gpr"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gpr_env_test",
|
||||
"build": "test",
|
||||
"language": "c",
|
||||
"src": [
|
||||
"test/core/support/env_test.c"
|
||||
],
|
||||
"deps": [
|
||||
"gpr_test_util",
|
||||
"gpr"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "gpr_slice_buffer_test",
|
||||
"build": "test",
|
||||
|
|
|
|||
|
|
@ -66,14 +66,13 @@ class Credentials final {
|
|||
|
||||
// Options used to build SslCredentials
|
||||
// pem_roots_cert is the buffer containing the PEM encoding of the server root
|
||||
// certificates. This parameter cannot be empty.
|
||||
// certificates. If this parameter is empty, the default roots will be used.
|
||||
// pem_private_key is the buffer containing the PEM encoding of the client's
|
||||
// private key. This parameter can be empty if the client does not have a
|
||||
// private key.
|
||||
// pem_cert_chain is the buffer containing the PEM encoding of the client's
|
||||
// certificate chain. This parameter can be empty if the client does not have
|
||||
// a certificate chain.
|
||||
// TODO(jboeuf) Change it to point to a file.
|
||||
struct SslCredentialsOptions {
|
||||
grpc::string pem_root_certs;
|
||||
grpc::string pem_private_key;
|
||||
|
|
|
|||
|
|
@ -54,6 +54,12 @@ void grpc_credentials_release(grpc_credentials *creds);
|
|||
/* Creates default credentials. */
|
||||
grpc_credentials *grpc_default_credentials_create(void);
|
||||
|
||||
/* Environment variable that points to the default SSL roots file. This file
|
||||
must be a PEM encoded file with all the roots such as the one that can be
|
||||
downloaded from https://pki.google.com/roots.pem. */
|
||||
#define GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR \
|
||||
"GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"
|
||||
|
||||
/* Object that holds a private key / certificate chain pair in PEM format. */
|
||||
typedef struct {
|
||||
/* private_key is the NULL-terminated string containing the PEM encoding of
|
||||
|
|
|
|||
|
|
@ -61,6 +61,8 @@
|
|||
#define GPR_POSIX_SOCKET 1
|
||||
#define GPR_POSIX_SOCKETADDR 1
|
||||
#define GPR_POSIX_SOCKETUTILS 1
|
||||
#define GPR_POSIX_ENV 1
|
||||
#define GPR_POSIX_FILE 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
|
|
@ -74,6 +76,8 @@
|
|||
#define GPR_LINUX_EVENTFD 1
|
||||
#define GPR_POSIX_SOCKET 1
|
||||
#define GPR_POSIX_SOCKETADDR 1
|
||||
#define GPR_POSIX_ENV 1
|
||||
#define GPR_POSIX_FILE 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
|
|
@ -93,6 +97,8 @@
|
|||
#define GPR_POSIX_SOCKET 1
|
||||
#define GPR_POSIX_SOCKETADDR 1
|
||||
#define GPR_POSIX_SOCKETUTILS 1
|
||||
#define GPR_POSIX_ENV 1
|
||||
#define GPR_POSIX_FILE 1
|
||||
#define GPR_POSIX_STRING 1
|
||||
#define GPR_POSIX_SYNC 1
|
||||
#define GPR_POSIX_TIME 1
|
||||
|
|
|
|||
|
|
@ -216,14 +216,10 @@ static void ssl_copy_key_material(const char *input, unsigned char **output,
|
|||
static void ssl_build_config(const char *pem_root_certs,
|
||||
grpc_ssl_pem_key_cert_pair *pem_key_cert_pair,
|
||||
grpc_ssl_config *config) {
|
||||
if (pem_root_certs == NULL) {
|
||||
/* TODO(jboeuf): Get them from the environment. */
|
||||
gpr_log(GPR_ERROR, "Default SSL roots not yet implemented.");
|
||||
} else {
|
||||
if (pem_root_certs != NULL) {
|
||||
ssl_copy_key_material(pem_root_certs, &config->pem_root_certs,
|
||||
&config->pem_root_certs_size);
|
||||
}
|
||||
|
||||
if (pem_key_cert_pair != NULL) {
|
||||
GPR_ASSERT(pem_key_cert_pair->private_key != NULL);
|
||||
GPR_ASSERT(pem_key_cert_pair->cert_chain != NULL);
|
||||
|
|
|
|||
|
|
@ -39,6 +39,8 @@
|
|||
#include "src/core/channel/http_client_filter.h"
|
||||
#include "src/core/security/credentials.h"
|
||||
#include "src/core/security/secure_endpoint.h"
|
||||
#include "src/core/support/env.h"
|
||||
#include "src/core/support/file.h"
|
||||
#include "src/core/support/string.h"
|
||||
#include "src/core/surface/lame_client.h"
|
||||
#include "src/core/transport/chttp2/alpn.h"
|
||||
|
|
@ -319,6 +321,28 @@ static grpc_security_context_vtable ssl_channel_vtable = {
|
|||
static grpc_security_context_vtable ssl_server_vtable = {
|
||||
ssl_server_destroy, ssl_server_create_handshaker, ssl_server_check_peer};
|
||||
|
||||
static gpr_slice default_pem_root_certs;
|
||||
|
||||
static void init_default_pem_root_certs(void) {
|
||||
char *default_root_certs_path =
|
||||
gpr_getenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR);
|
||||
if (default_root_certs_path == NULL) {
|
||||
default_pem_root_certs = gpr_empty_slice();
|
||||
} else {
|
||||
default_pem_root_certs = gpr_load_file(default_root_certs_path, NULL);
|
||||
gpr_free(default_root_certs_path);
|
||||
}
|
||||
}
|
||||
|
||||
static size_t get_default_pem_roots(const unsigned char **pem_root_certs) {
|
||||
/* TODO(jboeuf@google.com): Maybe revisit the approach which consists in
|
||||
loading all the roots once for the lifetime of the process. */
|
||||
static gpr_once once = GPR_ONCE_INIT;
|
||||
gpr_once_init(&once, init_default_pem_root_certs);
|
||||
*pem_root_certs = GPR_SLICE_START_PTR(default_pem_root_certs);
|
||||
return GPR_SLICE_LENGTH(default_pem_root_certs);
|
||||
}
|
||||
|
||||
grpc_security_status grpc_ssl_channel_security_context_create(
|
||||
grpc_credentials *request_metadata_creds, const grpc_ssl_config *config,
|
||||
const char *secure_peer_name, grpc_channel_security_context **ctx) {
|
||||
|
|
@ -330,6 +354,8 @@ grpc_security_status grpc_ssl_channel_security_context_create(
|
|||
tsi_result result = TSI_OK;
|
||||
grpc_ssl_channel_security_context *c;
|
||||
size_t i;
|
||||
const unsigned char *pem_root_certs;
|
||||
size_t pem_root_certs_size;
|
||||
|
||||
for (i = 0; i < num_alpn_protocols; i++) {
|
||||
alpn_protocol_strings[i] =
|
||||
|
|
@ -338,9 +364,8 @@ grpc_security_status grpc_ssl_channel_security_context_create(
|
|||
strlen(grpc_chttp2_get_alpn_version_index(i));
|
||||
}
|
||||
|
||||
if (config == NULL || secure_peer_name == NULL ||
|
||||
config->pem_root_certs == NULL) {
|
||||
gpr_log(GPR_ERROR, "An ssl channel needs a secure name and root certs.");
|
||||
if (config == NULL || secure_peer_name == NULL) {
|
||||
gpr_log(GPR_ERROR, "An ssl channel needs a config and a secure name.");
|
||||
goto error;
|
||||
}
|
||||
if (!check_request_metadata_creds(request_metadata_creds)) {
|
||||
|
|
@ -357,11 +382,20 @@ grpc_security_status grpc_ssl_channel_security_context_create(
|
|||
if (secure_peer_name != NULL) {
|
||||
c->secure_peer_name = gpr_strdup(secure_peer_name);
|
||||
}
|
||||
if (config->pem_root_certs == NULL) {
|
||||
pem_root_certs_size = get_default_pem_roots(&pem_root_certs);
|
||||
if (pem_root_certs == NULL || pem_root_certs_size == 0) {
|
||||
gpr_log(GPR_ERROR, "Could not get default pem root certs.");
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
pem_root_certs = config->pem_root_certs;
|
||||
pem_root_certs_size = config->pem_root_certs_size;
|
||||
}
|
||||
result = tsi_create_ssl_client_handshaker_factory(
|
||||
config->pem_private_key, config->pem_private_key_size,
|
||||
config->pem_cert_chain, config->pem_cert_chain_size,
|
||||
config->pem_root_certs, config->pem_root_certs_size,
|
||||
GRPC_SSL_CIPHER_SUITES, alpn_protocol_strings,
|
||||
config->pem_cert_chain, config->pem_cert_chain_size, pem_root_certs,
|
||||
pem_root_certs_size, GRPC_SSL_CIPHER_SUITES, alpn_protocol_strings,
|
||||
alpn_protocol_string_lengths, num_alpn_protocols, &c->handshaker_factory);
|
||||
if (result != TSI_OK) {
|
||||
gpr_log(GPR_ERROR, "Handshaker factory creation failed with %s.",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __GRPC_SUPPORT_ENV_H__
|
||||
#define __GRPC_SUPPORT_ENV_H__
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <grpc/support/slice.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Env utility functions */
|
||||
|
||||
/* Gets the environment variable value with the specified name.
|
||||
Returns a newly allocated string. It is the responsability of the caller to
|
||||
gpr_free the return value if not NULL (which means that the environment
|
||||
variable exists). */
|
||||
char *gpr_getenv(const char *name);
|
||||
|
||||
/* Sets the the environment with the specified name to the specified value. */
|
||||
void gpr_setenv(const char *name, const char *value);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __GRPC_SUPPORT_ENV_H__ */
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/* for secure_getenv. */
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#ifdef GPR_POSIX_ENV
|
||||
|
||||
#include "src/core/support/env.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/core/support/string.h"
|
||||
|
||||
char *gpr_getenv(const char *name) {
|
||||
char *result = secure_getenv(name);
|
||||
return result == NULL ? result : gpr_strdup(result);
|
||||
}
|
||||
|
||||
void gpr_setenv(const char *name, const char *value) {
|
||||
GPR_ASSERT(setenv(name, value, 1) == 0);
|
||||
}
|
||||
|
||||
#endif /* GPR_POSIX_ENV */
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#ifdef GPR_WIN32
|
||||
|
||||
#include "src/core/support/env.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
char *gpr_getenv(const char *name) {
|
||||
size_t required_size;
|
||||
char *result = NULL;
|
||||
|
||||
getenv_s(&required_size, NULL, 0, name);
|
||||
if (required_size == 0) return NULL;
|
||||
result = gpr_malloc(required_size);
|
||||
getenv_s(&required_size, result, required_size, name);
|
||||
return result;
|
||||
}
|
||||
|
||||
void gpr_setenv(const char *name, const char *value) {
|
||||
GPR_ASSERT(_putenv_s(name, value) == 0);
|
||||
}
|
||||
|
||||
#endif /* GPR_WIN32 */
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "src/core/support/file.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/core/support/string.h"
|
||||
|
||||
gpr_slice gpr_load_file(const char *filename, int *success) {
|
||||
unsigned char *contents = NULL;
|
||||
size_t contents_size = 0;
|
||||
unsigned char buf[4096];
|
||||
char *error_msg = NULL;
|
||||
gpr_slice result = gpr_empty_slice();
|
||||
FILE *file = fopen(filename, "rb");
|
||||
|
||||
if (file == NULL) {
|
||||
gpr_asprintf(&error_msg, "Could not open file %s (error = %s).", filename,
|
||||
strerror(errno));
|
||||
GPR_ASSERT(error_msg != NULL);
|
||||
goto end;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
size_t bytes_read = fread(buf, 1, sizeof(buf), file);
|
||||
if (bytes_read > 0) {
|
||||
contents = gpr_realloc(contents, contents_size + bytes_read);
|
||||
memcpy(contents + contents_size, buf, bytes_read);
|
||||
contents_size += bytes_read;
|
||||
}
|
||||
if (bytes_read < sizeof(buf)) {
|
||||
if (ferror(file)) {
|
||||
gpr_asprintf(&error_msg, "Error %s occured while reading file %s.",
|
||||
strerror(errno), filename);
|
||||
GPR_ASSERT(error_msg != NULL);
|
||||
goto end;
|
||||
} else {
|
||||
GPR_ASSERT(feof(file));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (success != NULL) *success = 1;
|
||||
result = gpr_slice_new(contents, contents_size, gpr_free);
|
||||
|
||||
end:
|
||||
if (error_msg != NULL) {
|
||||
gpr_log(GPR_ERROR, "%s", error_msg);
|
||||
gpr_free(error_msg);
|
||||
if (success != NULL) *success = 0;
|
||||
}
|
||||
if (file != NULL) fclose(file);
|
||||
return result;
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __GRPC_SUPPORT_FILE_H__
|
||||
#define __GRPC_SUPPORT_FILE_H__
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <grpc/support/slice.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* File utility functions */
|
||||
|
||||
/* Loads the content of a file into a slice. The success parameter, if not NULL,
|
||||
will be set to 1 in case of success and 0 in case of failure. */
|
||||
gpr_slice gpr_load_file(const char *filename, int *success);
|
||||
|
||||
/* Creates a temporary file from a template.
|
||||
The last six characters of template must be "XXXXXX" and these are replaced
|
||||
with a string that makes the filename unique. Since it will be modified,
|
||||
template must not be a string constant. */
|
||||
FILE *gpr_tmpfile(char *template);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __GRPC_SUPPORT_FILE_H__ */
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Posix code for gpr fdopen and mkstemp support. */
|
||||
|
||||
#ifndef _POSIX_C_SOURCE
|
||||
#define _POSIX_C_SOURCE 200112L
|
||||
#endif
|
||||
|
||||
/* Don't know why I have to do this for mkstemp, looks like _POSIX_C_SOURCE
|
||||
should be enough... */
|
||||
#ifndef _BSD_SOURCE
|
||||
#define _BSD_SOURCE
|
||||
#endif
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#ifdef GPR_POSIX_FILE
|
||||
|
||||
#include "src/core/support/file.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
FILE *gpr_tmpfile(char *template) {
|
||||
FILE *result = NULL;
|
||||
int fd = mkstemp(template);
|
||||
if (fd == -1) {
|
||||
gpr_log(GPR_ERROR, "mkstemp failed for template %s with error %s.",
|
||||
template, strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
result = fdopen(fd, "w+");
|
||||
if (result == NULL) {
|
||||
gpr_log(GPR_ERROR, "Could not open file %s from fd %d (error = %s).",
|
||||
template, fd, strerror(errno));
|
||||
unlink(template);
|
||||
close(fd);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif /* GPR_POSIX_FILE */
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <grpc/support/port_platform.h>
|
||||
|
||||
#ifdef GPR_WIN32
|
||||
|
||||
#include "src/core/support/file.h"
|
||||
|
||||
#include <io.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
FILE *gpr_tmpfile(char *template) {
|
||||
FILE *result = NULL;
|
||||
|
||||
/* _mktemp_s can only create a maximum of 26 file names for any combination of
|
||||
base and template values which is kind of sad... We may revisit this
|
||||
function later to have something better... */
|
||||
if (_mktemp_s(template, strlen(template) + 1) != 0) {
|
||||
gpr_log(LOG_ERROR, "Could not create tmp file.");
|
||||
return NULL;
|
||||
}
|
||||
if (fopen_s(&result, template, "wb+") == 0) {
|
||||
return result;
|
||||
} else {
|
||||
gpr_log(GPR_ERROR, "Could not open file %s", template);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* GPR_WIN32 */
|
||||
|
|
@ -39,6 +39,9 @@
|
|||
#include "src/core/channel/channel_args.h"
|
||||
#include "src/core/security/credentials.h"
|
||||
#include "src/core/security/security_context.h"
|
||||
#include "src/core/support/env.h"
|
||||
#include "src/core/support/file.h"
|
||||
#include "src/core/support/string.h"
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/host_port.h>
|
||||
#include <grpc/support/log.h>
|
||||
|
|
@ -99,7 +102,7 @@ void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture *f) {
|
|||
static void chttp2_init_client_simple_ssl_secure_fullstack(
|
||||
grpc_end2end_test_fixture *f, grpc_channel_args *client_args) {
|
||||
grpc_credentials *ssl_creds =
|
||||
grpc_ssl_credentials_create(test_root_cert, NULL);
|
||||
grpc_ssl_credentials_create(NULL, NULL);
|
||||
grpc_arg ssl_name_override = {GRPC_ARG_STRING,
|
||||
GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
|
||||
{"foo.test.google.com"}};
|
||||
|
|
@ -129,8 +132,21 @@ static grpc_end2end_test_config configs[] = {
|
|||
|
||||
int main(int argc, char **argv) {
|
||||
size_t i;
|
||||
FILE *roots_file;
|
||||
size_t roots_size = strlen(test_root_cert);
|
||||
char *roots_filename;
|
||||
|
||||
grpc_test_init(argc, argv);
|
||||
|
||||
/* Set the SSL roots env var. */
|
||||
roots_filename = gpr_strdup("chttp2_simple_ssl_fullstack_test_XXXXXX");
|
||||
GPR_ASSERT(roots_filename != NULL);
|
||||
roots_file = gpr_tmpfile(roots_filename);
|
||||
GPR_ASSERT(roots_file != NULL);
|
||||
GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size);
|
||||
fclose(roots_file);
|
||||
gpr_setenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR, roots_filename);
|
||||
|
||||
grpc_init();
|
||||
|
||||
for (i = 0; i < sizeof(configs) / sizeof(*configs); i++) {
|
||||
|
|
@ -139,5 +155,9 @@ int main(int argc, char **argv) {
|
|||
|
||||
grpc_shutdown();
|
||||
|
||||
/* Cleanup. */
|
||||
remove(roots_filename);
|
||||
gpr_free(roots_filename);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/core/support/env.h"
|
||||
#include "src/core/support/string.h"
|
||||
#include "test/core/util/test_config.h"
|
||||
|
||||
#define LOG_TEST_NAME() gpr_log(GPR_INFO, "%s", __FUNCTION__)
|
||||
|
||||
static void test_setenv_getenv(void) {
|
||||
const char *name = "FOO";
|
||||
const char *value = "BAR";
|
||||
char *retrieved_value;
|
||||
|
||||
LOG_TEST_NAME();
|
||||
|
||||
gpr_setenv(name, value);
|
||||
retrieved_value = gpr_getenv(name);
|
||||
GPR_ASSERT(retrieved_value != NULL);
|
||||
GPR_ASSERT(!strcmp(value, retrieved_value));
|
||||
gpr_free(retrieved_value);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
grpc_test_init(argc, argv);
|
||||
test_setenv_getenv();
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1,157 @@
|
|||
/*
|
||||
*
|
||||
* Copyright 2014, Google Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
#include <grpc/support/slice.h>
|
||||
|
||||
#include "src/core/support/file.h"
|
||||
#include "src/core/support/string.h"
|
||||
#include "test/core/util/test_config.h"
|
||||
|
||||
#define LOG_TEST_NAME() gpr_log(GPR_INFO, "%s", __FUNCTION__)
|
||||
|
||||
static const char template[] = "file_test_XXXXXX";
|
||||
|
||||
static void test_load_empty_file(void) {
|
||||
FILE *tmp = NULL;
|
||||
gpr_slice slice;
|
||||
int success;
|
||||
char *tmp_name = gpr_strdup(template);
|
||||
|
||||
LOG_TEST_NAME();
|
||||
|
||||
tmp = gpr_tmpfile(tmp_name);
|
||||
GPR_ASSERT(tmp != NULL);
|
||||
fclose(tmp);
|
||||
|
||||
slice = gpr_load_file(tmp_name, &success);
|
||||
GPR_ASSERT(success == 1);
|
||||
GPR_ASSERT(GPR_SLICE_LENGTH(slice) == 0);
|
||||
|
||||
remove(tmp_name);
|
||||
gpr_free(tmp_name);
|
||||
gpr_slice_unref(slice);
|
||||
}
|
||||
|
||||
static void test_load_failure(void) {
|
||||
FILE *tmp = NULL;
|
||||
gpr_slice slice;
|
||||
int success;
|
||||
char *tmp_name = gpr_strdup(template);
|
||||
|
||||
LOG_TEST_NAME();
|
||||
|
||||
tmp = gpr_tmpfile(tmp_name);
|
||||
GPR_ASSERT(tmp != NULL);
|
||||
fclose(tmp);
|
||||
remove(tmp_name);
|
||||
|
||||
GPR_ASSERT(tmp_name != NULL);
|
||||
|
||||
slice = gpr_load_file(tmp_name, &success);
|
||||
GPR_ASSERT(success == 0);
|
||||
GPR_ASSERT(GPR_SLICE_LENGTH(slice) == 0);
|
||||
gpr_free(tmp_name);
|
||||
gpr_slice_unref(slice);
|
||||
}
|
||||
|
||||
static void test_load_small_file(void) {
|
||||
FILE *tmp = NULL;
|
||||
gpr_slice slice;
|
||||
int success;
|
||||
char *tmp_name = gpr_strdup(template);
|
||||
const char *blah = "blah";
|
||||
|
||||
LOG_TEST_NAME();
|
||||
|
||||
tmp = gpr_tmpfile(tmp_name);
|
||||
GPR_ASSERT(tmp != NULL);
|
||||
GPR_ASSERT(fwrite(blah, 1, strlen(blah), tmp) == strlen(blah));
|
||||
fclose(tmp);
|
||||
|
||||
slice = gpr_load_file(tmp_name, &success);
|
||||
GPR_ASSERT(success == 1);
|
||||
GPR_ASSERT(GPR_SLICE_LENGTH(slice) == strlen(blah));
|
||||
GPR_ASSERT(!memcmp(GPR_SLICE_START_PTR(slice), blah, strlen(blah)));
|
||||
|
||||
remove(tmp_name);
|
||||
gpr_free(tmp_name);
|
||||
gpr_slice_unref(slice);
|
||||
}
|
||||
|
||||
static void test_load_big_file(void) {
|
||||
FILE *tmp = NULL;
|
||||
gpr_slice slice;
|
||||
int success;
|
||||
char *tmp_name = gpr_strdup(template);
|
||||
unsigned char buffer[124631];
|
||||
unsigned char *current;
|
||||
size_t i;
|
||||
|
||||
LOG_TEST_NAME();
|
||||
|
||||
for (i = 0; i < sizeof(buffer); i++) {
|
||||
buffer[i] = 42;
|
||||
}
|
||||
|
||||
tmp = gpr_tmpfile(tmp_name);
|
||||
GPR_ASSERT(tmp != NULL);
|
||||
GPR_ASSERT(fwrite(buffer, 1, sizeof(buffer), tmp) == sizeof(buffer));
|
||||
fclose(tmp);
|
||||
|
||||
slice = gpr_load_file(tmp_name, &success);
|
||||
GPR_ASSERT(success == 1);
|
||||
GPR_ASSERT(GPR_SLICE_LENGTH(slice) == sizeof(buffer));
|
||||
current = GPR_SLICE_START_PTR(slice);
|
||||
for (i = 0; i < sizeof(buffer); i++) {
|
||||
GPR_ASSERT(current[i] == 42);
|
||||
}
|
||||
|
||||
remove(tmp_name);
|
||||
gpr_free(tmp_name);
|
||||
gpr_slice_unref(slice);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
grpc_test_init(argc, argv);
|
||||
test_load_empty_file();
|
||||
test_load_failure();
|
||||
test_load_small_file();
|
||||
test_load_big_file();
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -109,6 +109,14 @@
|
|||
"language": "c",
|
||||
"name": "gpr_log_test"
|
||||
},
|
||||
{
|
||||
"language": "c",
|
||||
"name": "gpr_file_test"
|
||||
},
|
||||
{
|
||||
"language": "c",
|
||||
"name": "gpr_env_test"
|
||||
},
|
||||
{
|
||||
"language": "c",
|
||||
"name": "gpr_slice_buffer_test"
|
||||
|
|
|
|||
|
|
@ -49,6 +49,22 @@ echo Running test gpr_log_test
|
|||
test_bin\gpr_log_test.exe || echo TEST FAILED: gpr_log_test && exit /b
|
||||
echo(
|
||||
|
||||
echo Building test gpr_file_test
|
||||
cl.exe /c /I..\.. /I..\..\include /nologo /ZI /W3 /WX- /sdl /D WIN32 /D _LIB /D _USE_32BIT_TIME_T /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TC /analyze- /Fo:test_bin\ ..\..\test\core\support\file_test.c
|
||||
link.exe /OUT:"test_bin\gpr_file_test.exe" /INCREMENTAL /NOLOGO /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 Debug\gpr_test_util.lib Debug\gpr.lib test_bin\file_test.obj
|
||||
echo(
|
||||
echo Running test gpr_file_test
|
||||
test_bin\gpr_file_test.exe || echo TEST FAILED: gpr_file_test && exit /b
|
||||
echo(
|
||||
|
||||
echo Building test gpr_env_test
|
||||
cl.exe /c /I..\.. /I..\..\include /nologo /ZI /W3 /WX- /sdl /D WIN32 /D _LIB /D _USE_32BIT_TIME_T /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TC /analyze- /Fo:test_bin\ ..\..\test\core\support\env_test.c
|
||||
link.exe /OUT:"test_bin\gpr_env_test.exe" /INCREMENTAL /NOLOGO /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 Debug\gpr_test_util.lib Debug\gpr.lib test_bin\env_test.obj
|
||||
echo(
|
||||
echo Running test gpr_env_test
|
||||
test_bin\gpr_env_test.exe || echo TEST FAILED: gpr_env_test && exit /b
|
||||
echo(
|
||||
|
||||
echo Building test gpr_slice_buffer_test
|
||||
cl.exe /c /I..\.. /I..\..\include /nologo /ZI /W3 /WX- /sdl /D WIN32 /D _LIB /D _USE_32BIT_TIME_T /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TC /analyze- /Fo:test_bin\ ..\..\test\core\support\slice_buffer_test.c
|
||||
link.exe /OUT:"test_bin\gpr_slice_buffer_test.exe" /INCREMENTAL /NOLOGO /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 Debug\gpr_test_util.lib Debug\gpr.lib test_bin\slice_buffer_test.obj
|
||||
|
|
|
|||
|
|
@ -100,6 +100,8 @@
|
|||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\src\core\support\cpu.h" />
|
||||
<ClInclude Include="..\..\src\core\support\env.h" />
|
||||
<ClInclude Include="..\..\src\core\support\file.h" />
|
||||
<ClInclude Include="..\..\src\core\support\murmur_hash.h" />
|
||||
<ClInclude Include="..\..\src\core\support\string.h" />
|
||||
<ClInclude Include="..\..\src\core\support\thd_internal.h" />
|
||||
|
|
@ -115,6 +117,16 @@
|
|||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\cpu_posix.c">
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\env_posix.c">
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\env_win32.c">
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\file.c">
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\file_posix.c">
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\file_win32.c">
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\histogram.c">
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\host_port.c">
|
||||
|
|
|
|||
|
|
@ -16,6 +16,21 @@
|
|||
<ClCompile Include="..\..\src\core\support\cpu_posix.c">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\env_posix.c">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\env_win32.c">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\file.c">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\file_posix.c">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\file_win32.c">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\core\support\histogram.c">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClCompile>
|
||||
|
|
@ -158,6 +173,12 @@
|
|||
<ClInclude Include="..\..\src\core\support\cpu.h">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\core\support\env.h">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\core\support\file.h">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\core\support\murmur_hash.h">
|
||||
<Filter>src\core\support</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
Loading…
Reference in New Issue