summaryrefslogtreecommitdiff
path: root/src/mongo/idl
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2019-04-18 16:19:25 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2019-04-18 16:19:25 -0400
commit063d5ff4589aba211f7c6eaea2b180f29a752cd2 (patch)
treead5913198c17ec3347c35c1a348a8d0b6f85e06b /src/mongo/idl
parent2c8a3592b023cc8910ef86739d0205f4cb2d0db4 (diff)
downloadmongo-063d5ff4589aba211f7c6eaea2b180f29a752cd2.tar.gz
SERVER-40426 Extend IDL Validators for more types and structs
Diffstat (limited to 'src/mongo/idl')
-rw-r--r--src/mongo/idl/idl_test.cpp8
-rw-r--r--src/mongo/idl/idl_test.h32
-rw-r--r--src/mongo/idl/unittest.idl29
3 files changed, 69 insertions, 0 deletions
diff --git a/src/mongo/idl/idl_test.cpp b/src/mongo/idl/idl_test.cpp
index ab998137bf5..8bfae0cfa3b 100644
--- a/src/mongo/idl/idl_test.cpp
+++ b/src/mongo/idl/idl_test.cpp
@@ -2829,6 +2829,14 @@ TEST(IDLValidatedField, Callback_validators) {
tryFail(43, 123456789.01, "x-ray");
tryFail(42, 123456789.11, "x-ray");
tryFail(42, 123456789.01, "uniform");
+
+ Unusual_callback_validators obj1;
+ obj1.setInt_even(42);
+ ASSERT_THROWS(obj1.setInt_even(7), AssertionException);
+ obj1.setArray_of_int({42});
+ ASSERT_THROWS(obj1.setArray_of_int({7}), AssertionException);
+ obj1.setOne_int(One_int(42));
+ ASSERT_THROWS(obj1.setOne_int(One_int(7)), AssertionException);
}
// Positive: verify a command a string arg
diff --git a/src/mongo/idl/idl_test.h b/src/mongo/idl/idl_test.h
index 080c35ea949..40b840a1f39 100644
--- a/src/mongo/idl/idl_test.h
+++ b/src/mongo/idl/idl_test.h
@@ -27,7 +27,11 @@
* it in the license file.
*/
+#include <string>
+#include <vector>
+
#include "mongo/base/status.h"
+#include "mongo/idl/unittest_import_gen.h"
namespace mongo {
namespace idl {
@@ -43,6 +47,16 @@ inline Status validateEvenNumber(std::int32_t value) {
return Status::OK();
}
+inline Status validateEvenNumber(const std::vector<std::int32_t>& values) {
+ for (auto& value : values) {
+ auto status = validateEvenNumber(value);
+ if (!status.isOK()) {
+ return status;
+ }
+ }
+ return Status::OK();
+}
+
/**
* Validates that the number presented is within 0.1 of an integer value
*/
@@ -66,6 +80,24 @@ Status validateStartsWith(const std::string& value) {
return Status::OK();
}
+
+/**
+ * Validate a struct
+ */
+inline Status validateOneInt(const mongo::idl::import::One_int& one) {
+ return validateEvenNumber(one.getValue());
+}
+
+inline Status validateOneInt(const std::vector<mongo::idl::import::One_int>& values) {
+ for (auto& value : values) {
+ auto status = validateEvenNumber(value.getValue());
+ if (!status.isOK()) {
+ return status;
+ }
+ }
+ return Status::OK();
+}
+
} // namespace test
} // namespace idl
} // namespace mongo
diff --git a/src/mongo/idl/unittest.idl b/src/mongo/idl/unittest.idl
index 2478d10d12d..4f797cc67e0 100644
--- a/src/mongo/idl/unittest.idl
+++ b/src/mongo/idl/unittest.idl
@@ -588,6 +588,35 @@ structs:
optional: true
validator: { callback: "validateStartsWith<'x'>" }
+ unusual_callback_validators:
+ description: Struct using fields with unusual callback validators
+ fields:
+ int_even:
+ type: int
+ optional: true
+ validator: { callback: 'validateEvenNumber' }
+ string_starts_with_x:
+ type: string
+ optional: true
+ validator: { callback: "validateStartsWith<'x'>" }
+ array_of_int:
+ type: array<int>
+ validator: { callback: "validateEvenNumber" }
+ array_of_int_optional:
+ type: array<int>
+ optional: true
+ validator: { callback: "validateEvenNumber" }
+ one_int:
+ type: one_int
+ validator: { callback: 'validateOneInt' }
+ one_int_optional:
+ type: one_int
+ optional: true
+ validator: { callback: 'validateOneInt' }
+ one_int_array:
+ type: array<one_int>
+ validator: { callback: 'validateOneInt' }
+
##################################################################################################
#