summaryrefslogtreecommitdiff
path: root/src/mongo/bson/bson_validate_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/bson/bson_validate_test.cpp')
-rw-r--r--src/mongo/bson/bson_validate_test.cpp280
1 files changed, 4 insertions, 276 deletions
diff --git a/src/mongo/bson/bson_validate_test.cpp b/src/mongo/bson/bson_validate_test.cpp
index c128da6e268..413efec49b7 100644
--- a/src/mongo/bson/bson_validate_test.cpp
+++ b/src/mongo/bson/bson_validate_test.cpp
@@ -34,9 +34,6 @@
#include "mongo/base/data_view.h"
#include "mongo/bson/bson_depth.h"
#include "mongo/bson/bson_validate.h"
-#include "mongo/bson/util/bsoncolumn.h"
-#include "mongo/bson/util/bsoncolumn_util.h"
-#include "mongo/bson/util/bsoncolumnbuilder.h"
#include "mongo/db/jsobj.h"
#include "mongo/logv2/log.h"
#include "mongo/platform/random.h"
@@ -58,10 +55,10 @@ void appendInvalidStringElement(const char* fieldName, BufBuilder* bb) {
TEST(BSONValidate, Basic) {
BSONObj x;
- ASSERT_TRUE(validateBSON(x).isOK());
+ ASSERT_TRUE(x.valid());
x = BSON("x" << 1);
- ASSERT_TRUE(validateBSON(x).isOK());
+ ASSERT_TRUE(x.valid());
}
TEST(BSONValidate, RandomData) {
@@ -87,7 +84,7 @@ TEST(BSONValidate, RandomData) {
ASSERT_EQUALS(size, o.objsize());
- if (validateBSON(o).isOK()) {
+ if (o.valid()) {
numValid++;
jsonSize += o.jsonString().size();
ASSERT_OK(validateBSON(o.objdata(), o.objsize()));
@@ -138,7 +135,7 @@ TEST(BSONValidate, MuckingData1) {
data[i] = 0xc8U;
numToRun++;
- if (validateBSON(mine).isOK()) {
+ if (mine.valid()) {
numValid++;
jsonSize += mine.jsonString().size();
ASSERT_OK(validateBSON(mine.objdata(), mine.objsize()));
@@ -434,273 +431,4 @@ TEST(BSONValidateFast, MaxNestingDepth) {
Status status = validateBSON(tooDeepNesting.objdata(), tooDeepNesting.objsize());
ASSERT_EQ(status.code(), ErrorCodes::Overflow);
}
-
-TEST(BSONValidateFast, ErrorTooShort) {
- BSONObj x;
- x = BSON("foo" << 17 << "bar"
- << "eliot");
- ASSERT_OK(validateBSON(x.objdata(), x.objsize()));
- ASSERT_NOT_OK(validateBSON(x.objdata(), x.objsize() - 1));
- // Check if previous byte looks like EOO
- char badCopy[16384];
- memcpy(badCopy, x.objdata(), x.objsize() - 1);
- badCopy[x.objsize() - 2] = 0;
- ASSERT_NOT_OK(validateBSON(badCopy, x.objsize() - 1));
-}
-
-class BSONValidateColumn : public unittest::Test {
-public:
- BSONElement objToElement(BSONObj val) {
- BSONObjBuilder ob;
- ob.append("0"_sd, val);
- _elementMemory.emplace_front(ob.obj());
- return _elementMemory.front().firstElement();
- }
-
-private:
- std::forward_list<BSONObj> _elementMemory;
-};
-
-TEST_F(BSONValidateColumn, BSONColumnInBSON) {
- BSONColumnBuilder cb("");
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- cb.append(BSON("a" << 1).getField("a"));
- cb.append(BSON("a" << 2).getField("a"));
- cb.append(BSON("a" << 1).getField("a"));
- BSONBinData columnData = cb.finalize();
- BSONObj obj = BSON("a" << columnData);
- Status status = validateBSON(obj.objdata(), obj.objsize());
- ASSERT_OK(status);
-
- // Change one important byte.
- ((char*)columnData.data)[0] = '0';
- obj = BSON("a" << columnData);
- status = validateBSON(obj.objdata(), obj.objsize());
- ASSERT_EQ(status.code(), ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnMissingEOO) {
- BSONColumnBuilder cb("");
-
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-
- // Remove final EOO
- ASSERT_EQ(validateBSONColumn((char*)columnData.data, columnData.length - 1).code(),
- ErrorCodes::InvalidBSON);
- // Remove final EOO and 0 previous byte (check no overflow)
- ((char*)columnData.data)[columnData.length - 2] = 0;
- ASSERT_EQ(validateBSONColumn((char*)columnData.data, columnData.length - 1).code(),
- ErrorCodes::InvalidBSON);
-}
-
-TEST(BSONValidateColumn, BSONColumnFieldnameNotEmpty) {
- BSONColumnBuilder cb("");
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-
- char buf[1024];
- buf[0] = ((const char*)columnData.data)[0];
- buf[1] = 'f';
- buf[2] = 'o';
- buf[3] = 'o';
- memcpy(buf + 4, ((const char*)columnData.data) + 1, columnData.length - 1);
-
- ASSERT_EQ(validateBSONColumn(buf, columnData.length + 3).code(), ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnNoOverflowMissingAllEOOInColumn) {
- BSONColumnBuilder cb("");
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- BSONBinData columnData = cb.finalize();
- for (int i = 0; i < columnData.length; ++i)
- if (((char*)columnData.data)[i] == 0)
- ((char*)columnData.data)[i] = 1;
- BSONObj obj = BSON("a" << columnData);
- ASSERT_EQ(validateBSON(obj.objdata(), obj.objsize()).code(), ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnTrailingGarbage) {
- BSONColumnBuilder cb("");
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
- char badData[4096];
- memcpy(badData, columnData.data, columnData.length);
- badData[columnData.length] = 1;
-
- ASSERT_EQ(validateBSONColumn(badData, columnData.length + 1).code(),
- ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnNoOverflowBadContent) {
- BSONColumnBuilder cb("");
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-
- // Remove all string null terminators, expect failure but not overflow
- for (int i = 0; i < columnData.length; ++i)
- if (((char*)columnData.data)[i] == 0)
- ((char*)columnData.data)[i] = 1;
- ASSERT_EQ(validateBSONColumn((char*)columnData.data, columnData.length).code(),
- ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnNoOverflowMissingFieldname) {
- BSONColumnBuilder cb("");
- cb.append(objToElement(BSON("a"
- << "deadbeef")));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-
- ASSERT_EQ(validateBSONColumn((char*)columnData.data, 6 /* start of "a" */).code(),
- ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnNoOverflowBadFieldname) {
- BSONColumnBuilder cb("");
- cb.append(objToElement(BSON("a"
- << "deadbeef")));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-
- for (int i = 6 /* start of "a" string */; i < columnData.length; ++i)
- if (((char*)columnData.data)[i] == 0)
- ((char*)columnData.data)[i] = 1;
- ASSERT_EQ(validateBSONColumn((char*)columnData.data, columnData.length).code(),
- ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnNoOverflowBadLiteral) {
- BSONColumnBuilder cb("");
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-
- // Remove all string null terminators after string start, expect failure but not overflow
- for (int i = 6 /* start of "deadbeef" string */; i < columnData.length; ++i)
- if (((char*)columnData.data)[i] == 0)
- ((char*)columnData.data)[i] = 1;
- ASSERT_EQ(validateBSONColumn((char*)columnData.data, columnData.length).code(),
- ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnInterleavedObjectPasses) {
- BSONColumnBuilder cb("");
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- BSONObj subObj1 = BSON("b"
- << "inside");
- cb.append(objToElement(subObj1));
- BSONObj subObj2 = BSON("b"
- << "outside");
- cb.append(objToElement(subObj2));
- BSONObj subObj3 = BSON("b"
- << "gone");
- cb.append(objToElement(subObj3));
- cb.append(BSON("c"
- << "foobar")
- .getField("c"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-}
-
-TEST_F(BSONValidateColumn, BSONColumnInterleavedNestedObjectPasses) {
- BSONColumnBuilder cb("");
- cb.append(BSON("a"
- << "deadbeef")
- .getField("a"));
- BSONObj subObj1 = BSON("d"
- << "inside");
- BSONObj subObj2 = BSON("c" << subObj1);
- BSONObj subObj3 = BSON("b" << subObj2);
- cb.append(objToElement(subObj3));
- cb.append(BSON("c"
- << "foobar")
- .getField("c"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-}
-
-TEST_F(BSONValidateColumn, BSONColumnInterleavedEmptyObjectPasses) {
- BSONColumnBuilder cb("");
- BSONObj subObj1;
- cb.append(objToElement(subObj1));
- cb.append(BSON("c"
- << "foobar")
- .getField("c"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-}
-
-TEST(BSONValidateColumn, BSONColumnInterleavedNestedInterleaved) {
- BufBuilder buffer;
- BSONObj ref = BSON("c" << 1);
-
- buffer.appendChar(bsoncolumn::kInterleavedStartControlByteLegacy);
- buffer.appendBuf(ref.objdata(), ref.objsize());
- buffer.appendChar(bsoncolumn::kInterleavedStartControlByteLegacy);
- buffer.appendBuf(ref.objdata(), ref.objsize());
- buffer.appendChar(0);
- buffer.appendChar(0);
-
- ASSERT_EQ(validateBSONColumn(buffer.buf(), buffer.len()), ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnNoOverflowBlocksShort) {
- BSONColumnBuilder cb("");
- for (int i = 0; i < 100; ++i)
- cb.append(BSON("a" << i).getField("a"));
-
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
- /* Remove EOO and one block */
- ASSERT_EQ(validateBSONColumn((char*)columnData.data, columnData.length - 1 - 8).code(),
- ErrorCodes::NonConformantBSON);
-}
-
-TEST_F(BSONValidateColumn, BSONColumnBadExtendedSelector) {
- BSONColumnBuilder cb("");
- for (int i = 0; i < 100; ++i)
- cb.append(BSON("a" << i).getField("a"));
-
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
- /* Change extended selector on a 7 selector to 14 */
- uint64_t block = ConstDataView((char*)columnData.data + 31) /* first 7 selector */
- .read<LittleEndian<uint64_t>>();
- ASSERT_EQ(7, block & 15); // Check that we found a 7 selector
- block = (14 << 4) /* 14 extended selector */
- + 7 /* original selector */
- + ((block >> 8) << 8); /* original blocks */
- memcpy((char*)columnData.data + 31, &block, sizeof(block));
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-}
-
-TEST(BSONValidateColumn, BSONColumnWithCodeWScope) {
- BSONObj obj = BSON("a" << BSONCodeWScope("code", BSON("c" << 1)));
- BSONColumnBuilder cb("");
- cb.append(obj.getField("a"));
- BSONBinData columnData = cb.finalize();
- ASSERT_OK(validateBSONColumn((char*)columnData.data, columnData.length));
-}
-
} // namespace