mirror of https://github.com/grpc/grpc.git
TlsCredentials: Comparator implementation (#28940)
* TlsCredentials: Comparator implementation * Update tests * Redundant namespace qualifiers * clang-tidy * Reviewer comments * Reviewer comments * Reviewer comments * Reviewer comments * Reviewer comments * Add generator for grpc_tls_credentials_options.h * Generator script modifications for tests * Sanity * Reviewer comments * Reviewer comments * Add a common place to look-up known types * Formatting * Script fix * Reviewer comments * Add test mode to script * Add to sanitize.sh * clang-tidy * Fix * Fix * Reviewer comments * Clang-formatpull/29125/head^2
parent
3e5a5bba59
commit
01f333a1c1
65 changed files with 1361 additions and 331 deletions
@ -0,0 +1,57 @@ |
||||
//
|
||||
//
|
||||
// Copyright 2022 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.
|
||||
//
|
||||
//
|
||||
|
||||
#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_INSECURE_INSECURE_CREDENTIALS_H |
||||
#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_INSECURE_INSECURE_CREDENTIALS_H |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include <grpc/grpc_security.h> |
||||
|
||||
#include "src/core/lib/security/credentials/credentials.h" |
||||
|
||||
namespace grpc_core { |
||||
|
||||
class InsecureCredentials final : public grpc_channel_credentials { |
||||
public: |
||||
RefCountedPtr<grpc_channel_security_connector> create_security_connector( |
||||
RefCountedPtr<grpc_call_credentials> request_metadata_creds, |
||||
const char* /* target_name */, const grpc_channel_args* /* args */, |
||||
grpc_channel_args** /* new_args */) override; |
||||
|
||||
static const char* Type(); |
||||
|
||||
const char* type() const override { return Type(); } |
||||
|
||||
private: |
||||
int cmp_impl(const grpc_channel_credentials* other) const override; |
||||
}; |
||||
|
||||
class InsecureServerCredentials final : public grpc_server_credentials { |
||||
public: |
||||
RefCountedPtr<grpc_server_security_connector> create_security_connector( |
||||
const grpc_channel_args* /* args */) override; |
||||
|
||||
static const char* Type(); |
||||
|
||||
const char* type() const override { return Type(); } |
||||
}; |
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif // GRPC_CORE_LIB_SECURITY_CREDENTIALS_INSECURE_INSECURE_CREDENTIALS_H
|
@ -0,0 +1,175 @@ |
||||
//
|
||||
//
|
||||
// Copyright 2022 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.
|
||||
//
|
||||
//
|
||||
|
||||
// Generated by tools/codegen/core/gen_grpc_tls_credentials_options.py
|
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include <string> |
||||
|
||||
#include <gmock/gmock.h> |
||||
|
||||
#include "src/core/lib/security/credentials/xds/xds_credentials.h" |
||||
#include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" |
||||
#include "test/core/util/test_config.h" |
||||
|
||||
namespace grpc_core { |
||||
namespace { |
||||
|
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentCertRequestType) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_cert_request_type(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); |
||||
options_2->set_cert_request_type(GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentVerifyServerCert) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_verify_server_cert(false); |
||||
options_2->set_verify_server_cert(true); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentMinTlsVersion) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_min_tls_version(grpc_tls_version::TLS1_2); |
||||
options_2->set_min_tls_version(grpc_tls_version::TLS1_3); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentMaxTlsVersion) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_max_tls_version(grpc_tls_version::TLS1_2); |
||||
options_2->set_max_tls_version(grpc_tls_version::TLS1_3); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentCertificateVerifier) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_certificate_verifier(MakeRefCounted<HostNameCertificateVerifier>()); |
||||
options_2->set_certificate_verifier(MakeRefCounted<XdsCertificateVerifier>(nullptr, "")); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentCheckCallHost) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_check_call_host(false); |
||||
options_2->set_check_call_host(true); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentCertificateProvider) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_certificate_provider(MakeRefCounted<StaticDataCertificateProvider>("root_cert_1", PemKeyCertPairList())); |
||||
options_2->set_certificate_provider(MakeRefCounted<StaticDataCertificateProvider>("root_cert_2", PemKeyCertPairList())); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentWatchRootCert) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_watch_root_cert(false); |
||||
options_2->set_watch_root_cert(true); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentRootCertName) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_root_cert_name("root_cert_name_1"); |
||||
options_2->set_root_cert_name("root_cert_name_2"); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentWatchIdentityPair) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_watch_identity_pair(false); |
||||
options_2->set_watch_identity_pair(true); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentIdentityCertName) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_identity_cert_name("identity_cert_name_1"); |
||||
options_2->set_identity_cert_name("identity_cert_name_2"); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentTlsSessionKeyLogFilePath) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_tls_session_key_log_file_path("file_path_1"); |
||||
options_2->set_tls_session_key_log_file_path("file_path_2"); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
TEST(TlsCredentialsOptionsComparatorTest, DifferentCrlDirectory) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_crl_directory("crl_directory_1"); |
||||
options_2->set_crl_directory("crl_directory_2"); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
} |
||||
|
||||
} // namespace
|
||||
} // namespace grpc_core
|
||||
|
||||
int main(int argc, char** argv) { |
||||
testing::InitGoogleTest(&argc, argv); |
||||
grpc::testing::TestEnvironment env(argc, argv); |
||||
grpc_init(); |
||||
auto result = RUN_ALL_TESTS(); |
||||
grpc_shutdown(); |
||||
return result; |
||||
} |
@ -0,0 +1,394 @@ |
||||
#!/usr/bin/env python3 |
||||
|
||||
# Copyright 2022 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. |
||||
|
||||
# Generator script for src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h and test/core/security/grpc_tls_credentials_options_comparator_test.cc |
||||
# Should be executed from grpc's root directory. |
||||
|
||||
from __future__ import print_function |
||||
|
||||
import collections |
||||
from dataclasses import dataclass |
||||
import difflib |
||||
import filecmp |
||||
import os |
||||
import sys |
||||
import tempfile |
||||
|
||||
|
||||
@dataclass |
||||
class DataMember: |
||||
name: str # name of the data member without the trailing '_' |
||||
type: str # Type (eg. std::string, bool) |
||||
test_name: str # The name to use for the associated test |
||||
test_value_1: str # Test-specific value to use for comparison |
||||
test_value_2: str # Test-specific value (different from test_value_1) |
||||
default_initializer: str = '' # If non-empty, this will be used as the default initialization of this field |
||||
getter_comment: str = '' # Comment to add before the getter for this field |
||||
special_getter_return_type: str = '' # Override for the return type of getter (eg. const std::string&) |
||||
override_getter: str = '' # Override for the entire getter method. Relevant for certificate_verifier and certificate_provider |
||||
setter_comment: str = '' # Commend to add before the setter for this field |
||||
setter_move_semantics: bool = False # Should the setter use move-semantics |
||||
special_comparator: str = '' # If non-empty, this will be used in `operator==` |
||||
|
||||
|
||||
_DATA_MEMBERS = [ |
||||
DataMember(name='cert_request_type', |
||||
type='grpc_ssl_client_certificate_request_type', |
||||
default_initializer='GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE', |
||||
test_name="DifferentCertRequestType", |
||||
test_value_1="GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE", |
||||
test_value_2="GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY"), |
||||
DataMember(name='verify_server_cert', |
||||
type='bool', |
||||
default_initializer='true', |
||||
test_name="DifferentVerifyServerCert", |
||||
test_value_1="false", |
||||
test_value_2="true"), |
||||
DataMember(name='min_tls_version', |
||||
type='grpc_tls_version', |
||||
default_initializer='grpc_tls_version::TLS1_2', |
||||
test_name="DifferentMinTlsVersion", |
||||
test_value_1="grpc_tls_version::TLS1_2", |
||||
test_value_2="grpc_tls_version::TLS1_3"), |
||||
DataMember(name='max_tls_version', |
||||
type='grpc_tls_version', |
||||
default_initializer='grpc_tls_version::TLS1_3', |
||||
test_name="DifferentMaxTlsVersion", |
||||
test_value_1="grpc_tls_version::TLS1_2", |
||||
test_value_2="grpc_tls_version::TLS1_3"), |
||||
DataMember( |
||||
name='certificate_verifier', |
||||
type='grpc_core::RefCountedPtr<grpc_tls_certificate_verifier>', |
||||
override_getter="""grpc_tls_certificate_verifier* certificate_verifier() { |
||||
return certificate_verifier_.get(); |
||||
}""", |
||||
setter_move_semantics=True, |
||||
special_comparator= |
||||
'(certificate_verifier_ == other.certificate_verifier_ || (certificate_verifier_ != nullptr && other.certificate_verifier_ != nullptr && certificate_verifier_->Compare(other.certificate_verifier_.get()) == 0))', |
||||
test_name="DifferentCertificateVerifier", |
||||
test_value_1="MakeRefCounted<HostNameCertificateVerifier>()", |
||||
test_value_2="MakeRefCounted<XdsCertificateVerifier>(nullptr, \"\")"), |
||||
DataMember(name='check_call_host', |
||||
type='bool', |
||||
default_initializer='true', |
||||
test_name="DifferentCheckCallHost", |
||||
test_value_1="false", |
||||
test_value_2="true"), |
||||
DataMember( |
||||
name='certificate_provider', |
||||
type='grpc_core::RefCountedPtr<grpc_tls_certificate_provider>', |
||||
getter_comment= |
||||
'Returns the distributor from certificate_provider_ if it is set, nullptr otherwise.', |
||||
override_getter= |
||||
"""grpc_tls_certificate_distributor* certificate_distributor() { |
||||
if (certificate_provider_ != nullptr) { return certificate_provider_->distributor().get(); } |
||||
return nullptr; |
||||
}""", |
||||
setter_move_semantics=True, |
||||
special_comparator= |
||||
'(certificate_provider_ == other.certificate_provider_ || (certificate_provider_ != nullptr && other.certificate_provider_ != nullptr && certificate_provider_->Compare(other.certificate_provider_.get()) == 0))', |
||||
test_name="DifferentCertificateProvider", |
||||
test_value_1= |
||||
"MakeRefCounted<StaticDataCertificateProvider>(\"root_cert_1\", PemKeyCertPairList())", |
||||
test_value_2= |
||||
"MakeRefCounted<StaticDataCertificateProvider>(\"root_cert_2\", PemKeyCertPairList())" |
||||
), |
||||
DataMember( |
||||
name='watch_root_cert', |
||||
type='bool', |
||||
default_initializer='false', |
||||
setter_comment= |
||||
'If need to watch the updates of root certificates with name |root_cert_name|. The default value is false. If used in tls_credentials, it should always be set to true unless the root certificates are not needed.', |
||||
test_name="DifferentWatchRootCert", |
||||
test_value_1="false", |
||||
test_value_2="true"), |
||||
DataMember( |
||||
name='root_cert_name', |
||||
type='std::string', |
||||
special_getter_return_type='const std::string&', |
||||
setter_comment= |
||||
'Sets the name of root certificates being watched, if |set_watch_root_cert| is called. If not set, an empty string will be used as the name.', |
||||
setter_move_semantics=True, |
||||
test_name="DifferentRootCertName", |
||||
test_value_1="\"root_cert_name_1\"", |
||||
test_value_2="\"root_cert_name_2\""), |
||||
DataMember( |
||||
name='watch_identity_pair', |
||||
type='bool', |
||||
default_initializer='false', |
||||
setter_comment= |
||||
'If need to watch the updates of identity certificates with name |identity_cert_name|. The default value is false. If used in tls_credentials, it should always be set to true unless the identity key-cert pairs are not needed.', |
||||
test_name="DifferentWatchIdentityPair", |
||||
test_value_1="false", |
||||
test_value_2="true"), |
||||
DataMember( |
||||
name='identity_cert_name', |
||||
type='std::string', |
||||
special_getter_return_type='const std::string&', |
||||
setter_comment= |
||||
'Sets the name of identity key-cert pairs being watched, if |set_watch_identity_pair| is called. If not set, an empty string will be used as the name.', |
||||
setter_move_semantics=True, |
||||
test_name="DifferentIdentityCertName", |
||||
test_value_1="\"identity_cert_name_1\"", |
||||
test_value_2="\"identity_cert_name_2\""), |
||||
DataMember(name='tls_session_key_log_file_path', |
||||
type='std::string', |
||||
special_getter_return_type='const std::string&', |
||||
setter_move_semantics=True, |
||||
test_name="DifferentTlsSessionKeyLogFilePath", |
||||
test_value_1="\"file_path_1\"", |
||||
test_value_2="\"file_path_2\""), |
||||
DataMember( |
||||
name='crl_directory', |
||||
type='std::string', |
||||
special_getter_return_type='const std::string&', |
||||
setter_comment= |
||||
' gRPC will enforce CRLs on all handshakes from all hashed CRL files inside of the crl_directory. If not set, an empty string will be used, which will not enable CRL checking. Only supported for OpenSSL version > 1.1.', |
||||
setter_move_semantics=True, |
||||
test_name="DifferentCrlDirectory", |
||||
test_value_1="\"crl_directory_1\"", |
||||
test_value_2="\"crl_directory_2\"") |
||||
] |
||||
|
||||
|
||||
# print copyright notice from this file |
||||
def put_copyright(f, year): |
||||
print("""// |
||||
// |
||||
// Copyright %s 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. |
||||
// |
||||
// |
||||
""" % (year), |
||||
file=f) |
||||
|
||||
|
||||
# Prints differences between two files |
||||
def get_file_differences(file1, file2): |
||||
with open(file1) as f1: |
||||
file1_text = f1.readlines() |
||||
with open(file2) as f2: |
||||
file2_text = f2.readlines() |
||||
return difflib.unified_diff(file1_text, |
||||
file2_text, |
||||
fromfile=file1, |
||||
tofile=file2) |
||||
|
||||
|
||||
# Is this script executed in test mode? |
||||
test_mode = False |
||||
if len(sys.argv) > 1 and sys.argv[1] == "--test": |
||||
test_mode = True |
||||
|
||||
HEADER_FILE_NAME = 'src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h' |
||||
# Generate src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h |
||||
header_file_name = HEADER_FILE_NAME |
||||
if (test_mode): |
||||
header_file_name = tempfile.NamedTemporaryFile(delete=False).name |
||||
H = open(header_file_name, 'w') |
||||
|
||||
put_copyright(H, '2018') |
||||
print( |
||||
'// Generated by tools/codegen/core/gen_grpc_tls_credentials_options.py\n', |
||||
file=H) |
||||
print( |
||||
"""#ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CREDENTIALS_OPTIONS_H |
||||
#define GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CREDENTIALS_OPTIONS_H |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include "absl/container/inlined_vector.h" |
||||
|
||||
#include <grpc/grpc_security.h> |
||||
|
||||
#include "src/core/lib/gprpp/ref_counted.h" |
||||
#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h" |
||||
#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h" |
||||
#include "src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h" |
||||
#include "src/core/lib/security/security_connector/ssl_utils.h" |
||||
|
||||
// Contains configurable options specified by callers to configure their certain |
||||
// security features supported in TLS. |
||||
// TODO(ZhenLian): consider making this not ref-counted. |
||||
struct grpc_tls_credentials_options |
||||
: public grpc_core::RefCounted<grpc_tls_credentials_options> { |
||||
public: |
||||
~grpc_tls_credentials_options() override = default; |
||||
""", |
||||
file=H) |
||||
|
||||
# Print out getters for all data members |
||||
print(" // Getters for member fields.", file=H) |
||||
for data_member in _DATA_MEMBERS: |
||||
if data_member.getter_comment != '': |
||||
print(" // " + data_member.getter_comment, file=H) |
||||
if data_member.override_getter: |
||||
print(" " + data_member.override_getter, file=H) |
||||
else: |
||||
print( |
||||
" %s %s() const { return %s; }" % |
||||
(data_member.special_getter_return_type if |
||||
data_member.special_getter_return_type != '' else data_member.type, |
||||
data_member.name, data_member.name + '_'), |
||||
file=H) |
||||
|
||||
# Print out setters for all data members |
||||
print("", file=H) |
||||
print(" // Setters for member fields.", file=H) |
||||
for data_member in _DATA_MEMBERS: |
||||
if data_member.setter_comment != '': |
||||
print(" // " + data_member.setter_comment, file=H) |
||||
if (data_member.setter_move_semantics): |
||||
print(" void set_%s(%s %s) { %s_ = std::move(%s); }" % |
||||
(data_member.name, data_member.type, data_member.name, |
||||
data_member.name, data_member.name), |
||||
file=H) |
||||
else: |
||||
print(" void set_%s(%s %s) { %s_ = %s; }" % |
||||
(data_member.name, data_member.type, data_member.name, |
||||
data_member.name, data_member.name), |
||||
file=H) |
||||
|
||||
# Write out operator== |
||||
print("\n bool operator==(const grpc_tls_credentials_options& other) const {", |
||||
file=H) |
||||
operator_equal_content = " return " |
||||
for i in range(len(_DATA_MEMBERS)): |
||||
if (i != 0): |
||||
operator_equal_content += " " |
||||
if (_DATA_MEMBERS[i].special_comparator != ''): |
||||
operator_equal_content += _DATA_MEMBERS[i].special_comparator |
||||
else: |
||||
operator_equal_content += _DATA_MEMBERS[ |
||||
i].name + "_ == other." + _DATA_MEMBERS[i].name + "_" |
||||
if (i != len(_DATA_MEMBERS) - 1): |
||||
operator_equal_content += ' &&\n' |
||||
print(operator_equal_content + ";\n }", file=H) |
||||
|
||||
#Print out data member declarations |
||||
print("\n private:", file=H) |
||||
for data_member in _DATA_MEMBERS: |
||||
if data_member.default_initializer == '': |
||||
print(" %s %s_;" % ( |
||||
data_member.type, |
||||
data_member.name, |
||||
), file=H) |
||||
else: |
||||
print(" %s %s_ = %s;" % (data_member.type, data_member.name, |
||||
data_member.default_initializer), |
||||
file=H) |
||||
|
||||
# Print out file ending |
||||
print("""}; |
||||
|
||||
#endif // GRPC_CORE_LIB_SECURITY_CREDENTIALS_TLS_GRPC_TLS_CREDENTIALS_OPTIONS_H""", |
||||
file=H) |
||||
|
||||
H.close() |
||||
|
||||
# Generate test/core/security/grpc_tls_credentials_options_comparator_test.cc |
||||
TEST_FILE_NAME = 'test/core/security/grpc_tls_credentials_options_comparator_test.cc' |
||||
test_file_name = TEST_FILE_NAME |
||||
if (test_mode): |
||||
test_file_name = tempfile.NamedTemporaryFile(delete=False).name |
||||
T = open(test_file_name, 'w') |
||||
|
||||
put_copyright(T, '2022') |
||||
print('// Generated by tools/codegen/core/gen_grpc_tls_credentials_options.py', |
||||
file=T) |
||||
print(""" |
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include <string> |
||||
|
||||
#include <gmock/gmock.h> |
||||
|
||||
#include "src/core/lib/security/credentials/xds/xds_credentials.h" |
||||
#include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" |
||||
#include "test/core/util/test_config.h" |
||||
|
||||
namespace grpc_core { |
||||
namespace { |
||||
""", |
||||
file=T) |
||||
|
||||
# Generate negative test for each negative member |
||||
for data_member in _DATA_MEMBERS: |
||||
print("""TEST(TlsCredentialsOptionsComparatorTest, %s) { |
||||
auto* options_1 = grpc_tls_credentials_options_create(); |
||||
auto* options_2 = grpc_tls_credentials_options_create(); |
||||
options_1->set_%s(%s); |
||||
options_2->set_%s(%s); |
||||
EXPECT_FALSE(*options_1 == *options_2); |
||||
EXPECT_FALSE(*options_2 == *options_1); |
||||
delete options_1; |
||||
delete options_2; |
||||
}""" % (data_member.test_name, data_member.name, data_member.test_value_1, |
||||
data_member.name, data_member.test_value_2), |
||||
file=T) |
||||
|
||||
# Print out file ending |
||||
print(""" |
||||
} // namespace |
||||
} // namespace grpc_core |
||||
|
||||
int main(int argc, char** argv) { |
||||
testing::InitGoogleTest(&argc, argv); |
||||
grpc::testing::TestEnvironment env(argc, argv); |
||||
grpc_init(); |
||||
auto result = RUN_ALL_TESTS(); |
||||
grpc_shutdown(); |
||||
return result; |
||||
}""", |
||||
file=T) |
||||
T.close() |
||||
|
||||
if (test_mode): |
||||
header_diff = get_file_differences(header_file_name, HEADER_FILE_NAME) |
||||
test_diff = get_file_differences(test_file_name, TEST_FILE_NAME) |
||||
os.unlink(header_file_name) |
||||
os.unlink(test_file_name) |
||||
header_error = False |
||||
for line in header_diff: |
||||
print(line) |
||||
header_error = True |
||||
if header_error: |
||||
print( |
||||
HEADER_FILE_NAME + |
||||
' should not be manually modified. Please make changes to tools/distrib/gen_grpc_tls_credentials_options.py instead.' |
||||
) |
||||
test_error = False |
||||
for line in test_diff: |
||||
print(line) |
||||
test_error = True |
||||
if test_error: |
||||
print( |
||||
TEST_FILE_NAME + |
||||
' should not be manually modified. Please make changes to tools/distrib/gen_grpc_tls_credentials_options.py instead.' |
||||
) |
||||
if (header_error or test_error): |
||||
sys.exit(1) |
Loading…
Reference in new issue