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