deps:
- gtest
- grpc_test_util
+ uses_polling: false
- name: varint_test
gtest: true
build: test
<< max_error_count_ << ")";
return;
}
- field_errors_[key].emplace_back(error);
+ field_errors_[key].emplace(error);
}
bool ValidationErrors::FieldHasErrors() const {
absl::StrJoin(field_errors, "; "), "]"));
} else {
errors.emplace_back(
- absl::StrCat("field:", field, " error:", field_errors[0]));
+ absl::StrCat("field:", field, " error:", *field_errors.begin()));
}
}
return absl::StrCat(prefix, ": [", absl::StrJoin(errors, "; "), "]");
#include <stddef.h>
#include <map>
+#include <set>
#include <string>
#include <utility>
#include <vector>
void PopField() GPR_ATTRIBUTE_NOINLINE;
// Errors that we have encountered so far, keyed by field name.
- // TODO(roth): If we don't actually have any fields for which we
- // report more than one error, simplify this data structure.
- std::map<std::string /*field_name*/, std::vector<std::string>> field_errors_;
+ std::map<std::string /*field_name*/, std::set<std::string>> field_errors_;
// Stack of field names indicating the field that we are currently
// validating.
std::vector<std::string> fields_;
external_deps = [
"gtest",
],
+ uses_event_engine = False,
+ uses_polling = False,
deps = [
"//src/core:validation_errors",
"//test/core/test_util:grpc_test_util",
EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
EXPECT_EQ(status.message(),
"errors validating config: [field:foo.bar errors:["
- "value smells funny; value is ugly]]")
+ "value is ugly; value smells funny]]")
+ << status;
+}
+
+TEST(ValidationErrors, DedupsErrors) {
+ ValidationErrors errors;
+ {
+ ValidationErrors::ScopedField field(&errors, "foo");
+ {
+ ValidationErrors::ScopedField field(&errors, ".bar");
+ errors.AddError("value is ugly");
+ errors.AddError("value is ugly");
+ }
+ }
+ EXPECT_FALSE(errors.ok());
+ EXPECT_EQ(errors.size(), 1);
+ absl::Status status = errors.status(absl::StatusCode::kInvalidArgument,
+ "errors validating config");
+ EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(status.message(),
+ "errors validating config: [field:foo.bar error:value is ugly]")
<< status;
}
".value["
"envoy.extensions.filters.network.http_connection_manager.v3"
".HttpConnectionManager].http_filters errors:["
- "terminal filter for config type "
- "envoy.extensions.filters.http.router.v3.Router must be the "
- "last filter in the chain; "
"non-terminal filter for config type ",
(GetParam().in_api_listener
? "envoy.extensions.filters.http.fault.v3.HTTPFault"
: "envoy.extensions.filters.http.rbac.v3.RBAC"),
- " is the last filter in the chain]]"))
+ " is the last filter in the chain; "
+ "terminal filter for config type "
+ "envoy.extensions.filters.http.router.v3.Router must be the "
+ "last filter in the chain]]"))
<< decode_result.resource.status();
}
"posix",
"windows"
],
- "uses_polling": true
+ "uses_polling": false
},
{
"args": [],