• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2022 gRPC authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include "src/core/util/validation_errors.h"
18 
19 #include "gtest/gtest.h"
20 #include "test/core/test_util/test_config.h"
21 
22 namespace grpc_core {
23 namespace testing {
24 namespace {
25 
TEST(ValidationErrors,NoErrors)26 TEST(ValidationErrors, NoErrors) {
27   ValidationErrors errors;
28   EXPECT_TRUE(errors.ok());
29   EXPECT_EQ(errors.size(), 0);
30   {
31     ValidationErrors::ScopedField field(&errors, "foo");
32     {
33       ValidationErrors::ScopedField field(&errors, ".bar");
34     }
35   }
36   EXPECT_TRUE(errors.ok());
37   EXPECT_EQ(errors.size(), 0);
38   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
39                                       "errors validating config");
40   EXPECT_TRUE(status.ok()) << status;
41 }
42 
TEST(ValidationErrors,OneError)43 TEST(ValidationErrors, OneError) {
44   ValidationErrors errors;
45   {
46     ValidationErrors::ScopedField field(&errors, "foo");
47     {
48       ValidationErrors::ScopedField field(&errors, ".bar");
49       errors.AddError("value smells funny");
50     }
51   }
52   EXPECT_FALSE(errors.ok());
53   EXPECT_EQ(errors.size(), 1);
54   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
55                                       "errors validating config");
56   EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
57   EXPECT_EQ(
58       status.message(),
59       "errors validating config: [field:foo.bar error:value smells funny]")
60       << status;
61 }
62 
TEST(ValidationErrors,MultipleErrorsForSameField)63 TEST(ValidationErrors, MultipleErrorsForSameField) {
64   ValidationErrors errors;
65   {
66     ValidationErrors::ScopedField field(&errors, "foo");
67     {
68       ValidationErrors::ScopedField field(&errors, ".bar");
69       errors.AddError("value smells funny");
70       errors.AddError("value is ugly");
71     }
72   }
73   EXPECT_FALSE(errors.ok());
74   EXPECT_EQ(errors.size(), 1);
75   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
76                                       "errors validating config");
77   EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
78   EXPECT_EQ(status.message(),
79             "errors validating config: [field:foo.bar errors:["
80             "value smells funny; value is ugly]]")
81       << status;
82 }
83 
TEST(ValidationErrors,ErrorsForMultipleFields)84 TEST(ValidationErrors, ErrorsForMultipleFields) {
85   ValidationErrors errors;
86   {
87     ValidationErrors::ScopedField field(&errors, "foo");
88     {
89       ValidationErrors::ScopedField field(&errors, ".bar");
90       errors.AddError("value smells funny");
91     }
92     errors.AddError("too hot");
93   }
94   EXPECT_FALSE(errors.ok());
95   EXPECT_EQ(errors.size(), 2);
96   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
97                                       "errors validating config");
98   EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
99   EXPECT_EQ(status.message(),
100             "errors validating config: ["
101             "field:foo error:too hot; field:foo.bar error:value smells funny]")
102       << status;
103 }
104 
TEST(ValidationErrors,MessageMatchesStatusMessage)105 TEST(ValidationErrors, MessageMatchesStatusMessage) {
106   ValidationErrors errors;
107   {
108     ValidationErrors::ScopedField field(&errors, "foo");
109     {
110       ValidationErrors::ScopedField field(&errors, ".bar");
111       errors.AddError("value smells funny");
112     }
113     errors.AddError("too hot");
114   }
115   EXPECT_FALSE(errors.ok());
116   EXPECT_EQ(errors.size(), 2);
117   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
118                                       "errors validating config");
119   std::string message = errors.message("errors validating config");
120   EXPECT_EQ(status.message(), message)
121       << status << " does not match " << message;
122 }
123 
124 }  // namespace
125 }  // namespace testing
126 }  // namespace grpc_core
127 
main(int argc,char ** argv)128 int main(int argc, char** argv) {
129   grpc::testing::TestEnvironment env(&argc, argv);
130   ::testing::InitGoogleTest(&argc, argv);
131   return RUN_ALL_TESTS();
132 }
133