xref: /aosp_15_r20/external/grpc-grpc/test/core/gprpp/validation_errors_test.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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/lib/gprpp/validation_errors.h"
18 
19 #include "gtest/gtest.h"
20 
21 #include "test/core/util/test_config.h"
22 
23 namespace grpc_core {
24 namespace testing {
25 namespace {
26 
TEST(ValidationErrors,NoErrors)27 TEST(ValidationErrors, NoErrors) {
28   ValidationErrors errors;
29   EXPECT_TRUE(errors.ok());
30   EXPECT_EQ(errors.size(), 0);
31   {
32     ValidationErrors::ScopedField field(&errors, "foo");
33     { ValidationErrors::ScopedField field(&errors, ".bar"); }
34   }
35   EXPECT_TRUE(errors.ok());
36   EXPECT_EQ(errors.size(), 0);
37   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
38                                       "errors validating config");
39   EXPECT_TRUE(status.ok()) << status;
40 }
41 
TEST(ValidationErrors,OneError)42 TEST(ValidationErrors, OneError) {
43   ValidationErrors errors;
44   {
45     ValidationErrors::ScopedField field(&errors, "foo");
46     {
47       ValidationErrors::ScopedField field(&errors, ".bar");
48       errors.AddError("value smells funny");
49     }
50   }
51   EXPECT_FALSE(errors.ok());
52   EXPECT_EQ(errors.size(), 1);
53   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
54                                       "errors validating config");
55   EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
56   EXPECT_EQ(
57       status.message(),
58       "errors validating config: [field:foo.bar error:value smells funny]")
59       << status;
60 }
61 
TEST(ValidationErrors,MultipleErrorsForSameField)62 TEST(ValidationErrors, MultipleErrorsForSameField) {
63   ValidationErrors errors;
64   {
65     ValidationErrors::ScopedField field(&errors, "foo");
66     {
67       ValidationErrors::ScopedField field(&errors, ".bar");
68       errors.AddError("value smells funny");
69       errors.AddError("value is ugly");
70     }
71   }
72   EXPECT_FALSE(errors.ok());
73   EXPECT_EQ(errors.size(), 1);
74   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
75                                       "errors validating config");
76   EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
77   EXPECT_EQ(status.message(),
78             "errors validating config: [field:foo.bar errors:["
79             "value smells funny; value is ugly]]")
80       << status;
81 }
82 
TEST(ValidationErrors,ErrorsForMultipleFields)83 TEST(ValidationErrors, ErrorsForMultipleFields) {
84   ValidationErrors errors;
85   {
86     ValidationErrors::ScopedField field(&errors, "foo");
87     {
88       ValidationErrors::ScopedField field(&errors, ".bar");
89       errors.AddError("value smells funny");
90     }
91     errors.AddError("too hot");
92   }
93   EXPECT_FALSE(errors.ok());
94   EXPECT_EQ(errors.size(), 2);
95   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
96                                       "errors validating config");
97   EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
98   EXPECT_EQ(status.message(),
99             "errors validating config: ["
100             "field:foo error:too hot; field:foo.bar error:value smells funny]")
101       << status;
102 }
103 
TEST(ValidationErrors,MessageMatchesStatusMessage)104 TEST(ValidationErrors, MessageMatchesStatusMessage) {
105   ValidationErrors errors;
106   {
107     ValidationErrors::ScopedField field(&errors, "foo");
108     {
109       ValidationErrors::ScopedField field(&errors, ".bar");
110       errors.AddError("value smells funny");
111     }
112     errors.AddError("too hot");
113   }
114   EXPECT_FALSE(errors.ok());
115   EXPECT_EQ(errors.size(), 2);
116   absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
117                                       "errors validating config");
118   std::string message = errors.message("errors validating config");
119   EXPECT_EQ(status.message(), message)
120       << status << " does not match " << message;
121 }
122 
123 }  // namespace
124 }  // namespace testing
125 }  // namespace grpc_core
126 
main(int argc,char ** argv)127 int main(int argc, char** argv) {
128   grpc::testing::TestEnvironment env(&argc, argv);
129   ::testing::InitGoogleTest(&argc, argv);
130   return RUN_ALL_TESTS();
131 }
132