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