evaluate_args_test.cc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. // Copyright 2021 gRPC authors.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <grpc/support/port_platform.h>
  15. #include "src/core/lib/security/authorization/evaluate_args.h"
  16. #include <gmock/gmock.h>
  17. #include <gtest/gtest.h>
  18. #include "src/core/lib/address_utils/sockaddr_utils.h"
  19. #include "test/core/util/evaluate_args_test_util.h"
  20. #include "test/core/util/test_config.h"
  21. namespace grpc_core {
  22. class EvaluateArgsTest : public ::testing::Test {
  23. protected:
  24. EvaluateArgsTestUtil util_;
  25. };
  26. TEST_F(EvaluateArgsTest, EmptyMetadata) {
  27. EvaluateArgs args = util_.MakeEvaluateArgs();
  28. EXPECT_THAT(args.GetPath(), ::testing::IsEmpty());
  29. EXPECT_THAT(args.GetMethod(), ::testing::IsEmpty());
  30. EXPECT_THAT(args.GetAuthority(), ::testing::IsEmpty());
  31. EXPECT_EQ(args.GetHeaderValue("some_key", nullptr), absl::nullopt);
  32. }
  33. TEST_F(EvaluateArgsTest, GetPathSuccess) {
  34. util_.AddPairToMetadata(":path", "/expected/path");
  35. EvaluateArgs args = util_.MakeEvaluateArgs();
  36. EXPECT_EQ(args.GetPath(), "/expected/path");
  37. }
  38. TEST_F(EvaluateArgsTest, GetAuthoritySuccess) {
  39. util_.AddPairToMetadata(":authority", "test.google.com");
  40. EvaluateArgs args = util_.MakeEvaluateArgs();
  41. EXPECT_EQ(args.GetAuthority(), "test.google.com");
  42. }
  43. TEST_F(EvaluateArgsTest, GetMethodSuccess) {
  44. util_.AddPairToMetadata(":method", "GET");
  45. EvaluateArgs args = util_.MakeEvaluateArgs();
  46. EXPECT_EQ(args.GetMethod(), "GET");
  47. }
  48. TEST_F(EvaluateArgsTest, GetHeaderValueSuccess) {
  49. util_.AddPairToMetadata("key123", "value123");
  50. EvaluateArgs args = util_.MakeEvaluateArgs();
  51. std::string concatenated_value;
  52. absl::optional<absl::string_view> value =
  53. args.GetHeaderValue("key123", &concatenated_value);
  54. ASSERT_TRUE(value.has_value());
  55. EXPECT_EQ(value.value(), "value123");
  56. }
  57. TEST_F(EvaluateArgsTest, GetHeaderValueAliasesHost) {
  58. util_.AddPairToMetadata(":authority", "test.google.com");
  59. EvaluateArgs args = util_.MakeEvaluateArgs();
  60. std::string concatenated_value;
  61. absl::optional<absl::string_view> value =
  62. args.GetHeaderValue("host", &concatenated_value);
  63. ASSERT_TRUE(value.has_value());
  64. EXPECT_EQ(value.value(), "test.google.com");
  65. }
  66. TEST_F(EvaluateArgsTest, TestLocalAddressAndPort) {
  67. util_.SetLocalEndpoint("ipv6:[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:456");
  68. EvaluateArgs args = util_.MakeEvaluateArgs();
  69. grpc_resolved_address local_address = args.GetLocalAddress();
  70. EXPECT_EQ(grpc_sockaddr_to_uri(&local_address),
  71. "ipv6:[2001:db8:85a3::8a2e:370:7334]:456");
  72. EXPECT_EQ(args.GetLocalAddressString(),
  73. "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
  74. EXPECT_EQ(args.GetLocalPort(), 456);
  75. }
  76. TEST_F(EvaluateArgsTest, TestPeerAddressAndPort) {
  77. util_.SetPeerEndpoint("ipv4:255.255.255.255:123");
  78. EvaluateArgs args = util_.MakeEvaluateArgs();
  79. grpc_resolved_address peer_address = args.GetPeerAddress();
  80. EXPECT_EQ(grpc_sockaddr_to_uri(&peer_address), "ipv4:255.255.255.255:123");
  81. EXPECT_EQ(args.GetPeerAddressString(), "255.255.255.255");
  82. EXPECT_EQ(args.GetPeerPort(), 123);
  83. }
  84. TEST_F(EvaluateArgsTest, EmptyAuthContext) {
  85. EvaluateArgs args = util_.MakeEvaluateArgs();
  86. EXPECT_TRUE(args.GetTransportSecurityType().empty());
  87. EXPECT_TRUE(args.GetSpiffeId().empty());
  88. EXPECT_TRUE(args.GetUriSans().empty());
  89. EXPECT_TRUE(args.GetDnsSans().empty());
  90. EXPECT_TRUE(args.GetSubject().empty());
  91. EXPECT_TRUE(args.GetCommonName().empty());
  92. }
  93. TEST_F(EvaluateArgsTest, GetTransportSecurityTypeSuccessOneProperty) {
  94. util_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  95. "ssl");
  96. EvaluateArgs args = util_.MakeEvaluateArgs();
  97. EXPECT_EQ(args.GetTransportSecurityType(), "ssl");
  98. }
  99. TEST_F(EvaluateArgsTest, GetTransportSecurityTypeFailDuplicateProperty) {
  100. util_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  101. "type1");
  102. util_.AddPropertyToAuthContext(GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
  103. "type2");
  104. EvaluateArgs args = util_.MakeEvaluateArgs();
  105. EXPECT_TRUE(args.GetTransportSecurityType().empty());
  106. }
  107. TEST_F(EvaluateArgsTest, GetSpiffeIdSuccessOneProperty) {
  108. util_.AddPropertyToAuthContext(GRPC_PEER_SPIFFE_ID_PROPERTY_NAME, "id123");
  109. EvaluateArgs args = util_.MakeEvaluateArgs();
  110. EXPECT_EQ(args.GetSpiffeId(), "id123");
  111. }
  112. TEST_F(EvaluateArgsTest, GetSpiffeIdFailDuplicateProperty) {
  113. util_.AddPropertyToAuthContext(GRPC_PEER_SPIFFE_ID_PROPERTY_NAME, "id123");
  114. util_.AddPropertyToAuthContext(GRPC_PEER_SPIFFE_ID_PROPERTY_NAME, "id456");
  115. EvaluateArgs args = util_.MakeEvaluateArgs();
  116. EXPECT_TRUE(args.GetSpiffeId().empty());
  117. }
  118. TEST_F(EvaluateArgsTest, GetUriSanSuccessMultipleProperties) {
  119. util_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME, "foo");
  120. util_.AddPropertyToAuthContext(GRPC_PEER_URI_PROPERTY_NAME, "bar");
  121. EvaluateArgs args = util_.MakeEvaluateArgs();
  122. EXPECT_THAT(args.GetUriSans(), ::testing::ElementsAre("foo", "bar"));
  123. }
  124. TEST_F(EvaluateArgsTest, GetDnsSanSuccessMultipleProperties) {
  125. util_.AddPropertyToAuthContext(GRPC_PEER_DNS_PROPERTY_NAME, "foo");
  126. util_.AddPropertyToAuthContext(GRPC_PEER_DNS_PROPERTY_NAME, "bar");
  127. EvaluateArgs args = util_.MakeEvaluateArgs();
  128. EXPECT_THAT(args.GetDnsSans(), ::testing::ElementsAre("foo", "bar"));
  129. }
  130. TEST_F(EvaluateArgsTest, GetCommonNameSuccessOneProperty) {
  131. util_.AddPropertyToAuthContext(GRPC_X509_CN_PROPERTY_NAME, "server123");
  132. EvaluateArgs args = util_.MakeEvaluateArgs();
  133. EXPECT_EQ(args.GetCommonName(), "server123");
  134. }
  135. TEST_F(EvaluateArgsTest, GetCommonNameFailDuplicateProperty) {
  136. util_.AddPropertyToAuthContext(GRPC_X509_CN_PROPERTY_NAME, "server123");
  137. util_.AddPropertyToAuthContext(GRPC_X509_CN_PROPERTY_NAME, "server456");
  138. EvaluateArgs args = util_.MakeEvaluateArgs();
  139. EXPECT_TRUE(args.GetCommonName().empty());
  140. }
  141. TEST_F(EvaluateArgsTest, GetSubjectSuccessOneProperty) {
  142. util_.AddPropertyToAuthContext(GRPC_X509_SUBJECT_PROPERTY_NAME,
  143. "CN=abc,OU=Google");
  144. EvaluateArgs args = util_.MakeEvaluateArgs();
  145. EXPECT_EQ(args.GetSubject(), "CN=abc,OU=Google");
  146. }
  147. TEST_F(EvaluateArgsTest, GetSubjectFailDuplicateProperty) {
  148. util_.AddPropertyToAuthContext(GRPC_X509_SUBJECT_PROPERTY_NAME,
  149. "CN=abc,OU=Google");
  150. util_.AddPropertyToAuthContext(GRPC_X509_SUBJECT_PROPERTY_NAME,
  151. "CN=def,OU=Google");
  152. EvaluateArgs args = util_.MakeEvaluateArgs();
  153. EXPECT_TRUE(args.GetSubject().empty());
  154. }
  155. } // namespace grpc_core
  156. int main(int argc, char** argv) {
  157. grpc::testing::TestEnvironment env(argc, argv);
  158. ::testing::InitGoogleTest(&argc, argv);
  159. grpc_init();
  160. int ret = RUN_ALL_TESTS();
  161. grpc_shutdown();
  162. return ret;
  163. }