summaryrefslogtreecommitdiff
path: root/src/mongo/s/write_ops/batch_downconvert_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/s/write_ops/batch_downconvert_test.cpp')
-rw-r--r--src/mongo/s/write_ops/batch_downconvert_test.cpp359
1 files changed, 172 insertions, 187 deletions
diff --git a/src/mongo/s/write_ops/batch_downconvert_test.cpp b/src/mongo/s/write_ops/batch_downconvert_test.cpp
index 8dd4b440a39..548bfb6f732 100644
--- a/src/mongo/s/write_ops/batch_downconvert_test.cpp
+++ b/src/mongo/s/write_ops/batch_downconvert_test.cpp
@@ -38,194 +38,179 @@
namespace {
- using namespace mongo;
- using std::vector;
- using std::deque;
-
- //
- // Tests for parsing GLE responses into write errors and write concern errors for write
- // commands. These tests essentially document our expected 2.4 GLE behaviors.
- //
+using namespace mongo;
+using std::vector;
+using std::deque;
+
+//
+// Tests for parsing GLE responses into write errors and write concern errors for write
+// commands. These tests essentially document our expected 2.4 GLE behaviors.
+//
+
+TEST(GLEParsing, Empty) {
+ const BSONObj gleResponse = fromjson("{ok: 1.0, err: null}");
+
+ GLEErrors errors;
+ ASSERT_OK(extractGLEErrors(gleResponse, &errors));
+ ASSERT(!errors.writeError.get());
+ ASSERT(!errors.wcError.get());
+}
+
+TEST(GLEParsing, WriteErr) {
+ const BSONObj gleResponse = fromjson("{ok: 1.0, err: 'message', code: 1000}");
+
+ GLEErrors errors;
+ ASSERT_OK(extractGLEErrors(gleResponse, &errors));
+ ASSERT(errors.writeError.get());
+ ASSERT_EQUALS(errors.writeError->getErrMessage(), "message");
+ ASSERT_EQUALS(errors.writeError->getErrCode(), 1000);
+ ASSERT(!errors.wcError.get());
+}
+
+TEST(GLEParsing, JournalFail) {
+ const BSONObj gleResponse = fromjson("{ok: 1.0, err: null, jnote: 'message'}");
+
+ GLEErrors errors;
+ ASSERT_OK(extractGLEErrors(gleResponse, &errors));
+ ASSERT(!errors.writeError.get());
+ ASSERT(errors.wcError.get());
+ ASSERT_EQUALS(errors.wcError->getErrMessage(), "message");
+ ASSERT_EQUALS(errors.wcError->getErrCode(), ErrorCodes::WriteConcernFailed);
+}
+
+TEST(GLEParsing, ReplErr) {
+ const BSONObj gleResponse = fromjson("{ok: 1.0, err: 'norepl', wnote: 'message'}");
+
+ GLEErrors errors;
+ ASSERT_OK(extractGLEErrors(gleResponse, &errors));
+ ASSERT(!errors.writeError.get());
+ ASSERT(errors.wcError.get());
+ ASSERT_EQUALS(errors.wcError->getErrMessage(), "message");
+ ASSERT_EQUALS(errors.wcError->getErrCode(), ErrorCodes::WriteConcernFailed);
+}
+
+TEST(GLEParsing, ReplTimeoutErr) {
+ const BSONObj gleResponse =
+ fromjson("{ok: 1.0, err: 'timeout', errmsg: 'message', wtimeout: true}");
+
+ GLEErrors errors;
+ ASSERT_OK(extractGLEErrors(gleResponse, &errors));
+ ASSERT(!errors.writeError.get());
+ ASSERT(errors.wcError.get());
+ ASSERT_EQUALS(errors.wcError->getErrMessage(), "message");
+ ASSERT(errors.wcError->getErrInfo()["wtimeout"].trueValue());
+ ASSERT_EQUALS(errors.wcError->getErrCode(), ErrorCodes::WriteConcernFailed);
+}
+
+TEST(GLEParsing, GLEFail) {
+ const BSONObj gleResponse = fromjson("{ok: 0.0, err: null, errmsg: 'message', code: 1000}");
+
+ GLEErrors errors;
+ Status status = extractGLEErrors(gleResponse, &errors);
+ ASSERT_NOT_OK(status);
+ ASSERT_EQUALS(status.reason(), "message");
+ ASSERT_EQUALS(status.code(), 1000);
+}
+
+TEST(GLEParsing, GLEFailNoCode) {
+ const BSONObj gleResponse = fromjson("{ok: 0.0, err: null, errmsg: 'message'}");
+
+ GLEErrors errors;
+ Status status = extractGLEErrors(gleResponse, &errors);
+ ASSERT_NOT_OK(status);
+ ASSERT_EQUALS(status.reason(), "message");
+ ASSERT_EQUALS(status.code(), ErrorCodes::UnknownError);
+}
+
+TEST(GLEParsing, NotMasterGLEFail) {
+ // Not master code in response
+ const BSONObj gleResponse = fromjson("{ok: 0.0, err: null, errmsg: 'message', code: 10990}");
- TEST(GLEParsing, Empty) {
+ GLEErrors errors;
+ ASSERT_OK(extractGLEErrors(gleResponse, &errors));
+ ASSERT(!errors.writeError.get());
+ ASSERT(errors.wcError.get());
+ ASSERT_EQUALS(errors.wcError->getErrMessage(), "message");
+ ASSERT_EQUALS(errors.wcError->getErrCode(), 10990);
+}
+
+TEST(GLEParsing, WriteErrWithStats) {
+ const BSONObj gleResponse = fromjson("{ok: 1.0, n: 2, err: 'message', code: 1000}");
+
+ GLEErrors errors;
+ ASSERT_OK(extractGLEErrors(gleResponse, &errors));
+ ASSERT(errors.writeError.get());
+ ASSERT_EQUALS(errors.writeError->getErrMessage(), "message");
+ ASSERT_EQUALS(errors.writeError->getErrCode(), 1000);
+ ASSERT(!errors.wcError.get());
+}
+
+TEST(GLEParsing, ReplTimeoutErrWithStats) {
+ const BSONObj gleResponse = fromjson(
+ "{ok: 1.0, err: 'timeout', errmsg: 'message', wtimeout: true,"
+ " n: 1, upserted: 'abcde'}");
+
+ GLEErrors errors;
+ ASSERT_OK(extractGLEErrors(gleResponse, &errors));
+ ASSERT(!errors.writeError.get());
+ ASSERT(errors.wcError.get());
+ ASSERT_EQUALS(errors.wcError->getErrMessage(), "message");
+ ASSERT(errors.wcError->getErrInfo()["wtimeout"].trueValue());
+ ASSERT_EQUALS(errors.wcError->getErrCode(), ErrorCodes::WriteConcernFailed);
+}
+
+//
+// Tests of processing and suppressing non-WC related fields from legacy GLE responses
+//
+
+TEST(LegacyGLESuppress, Basic) {
+ const BSONObj gleResponse = fromjson("{ok: 1.0, err: null}");
+
+ BSONObj stripped = stripNonWCInfo(gleResponse);
+ ASSERT_EQUALS(stripped.nFields(), 2); // with err, ok : true
+ ASSERT(stripped["ok"].trueValue());
+}
- const BSONObj gleResponse = fromjson( "{ok: 1.0, err: null}" );
-
- GLEErrors errors;
- ASSERT_OK( extractGLEErrors( gleResponse, &errors ) );
- ASSERT( !errors.writeError.get() );
- ASSERT( !errors.wcError.get() );
- }
-
- TEST(GLEParsing, WriteErr) {
-
- const BSONObj gleResponse = fromjson( "{ok: 1.0, err: 'message', code: 1000}" );
-
- GLEErrors errors;
- ASSERT_OK( extractGLEErrors( gleResponse, &errors ) );
- ASSERT( errors.writeError.get() );
- ASSERT_EQUALS( errors.writeError->getErrMessage(), "message" );
- ASSERT_EQUALS( errors.writeError->getErrCode(), 1000 );
- ASSERT( !errors.wcError.get() );
- }
-
- TEST(GLEParsing, JournalFail) {
-
- const BSONObj gleResponse = fromjson( "{ok: 1.0, err: null, jnote: 'message'}" );
-
- GLEErrors errors;
- ASSERT_OK( extractGLEErrors( gleResponse, &errors ) );
- ASSERT( !errors.writeError.get() );
- ASSERT( errors.wcError.get() );
- ASSERT_EQUALS( errors.wcError->getErrMessage(), "message" );
- ASSERT_EQUALS( errors.wcError->getErrCode(), ErrorCodes::WriteConcernFailed );
- }
-
- TEST(GLEParsing, ReplErr) {
-
- const BSONObj gleResponse = fromjson( "{ok: 1.0, err: 'norepl', wnote: 'message'}" );
-
- GLEErrors errors;
- ASSERT_OK( extractGLEErrors( gleResponse, &errors ) );
- ASSERT( !errors.writeError.get() );
- ASSERT( errors.wcError.get() );
- ASSERT_EQUALS( errors.wcError->getErrMessage(), "message" );
- ASSERT_EQUALS( errors.wcError->getErrCode(), ErrorCodes::WriteConcernFailed );
- }
-
- TEST(GLEParsing, ReplTimeoutErr) {
-
- const BSONObj gleResponse =
- fromjson( "{ok: 1.0, err: 'timeout', errmsg: 'message', wtimeout: true}" );
-
- GLEErrors errors;
- ASSERT_OK( extractGLEErrors( gleResponse, &errors ) );
- ASSERT( !errors.writeError.get() );
- ASSERT( errors.wcError.get() );
- ASSERT_EQUALS( errors.wcError->getErrMessage(), "message" );
- ASSERT( errors.wcError->getErrInfo()["wtimeout"].trueValue() );
- ASSERT_EQUALS( errors.wcError->getErrCode(), ErrorCodes::WriteConcernFailed );
- }
-
- TEST(GLEParsing, GLEFail) {
-
- const BSONObj gleResponse =
- fromjson( "{ok: 0.0, err: null, errmsg: 'message', code: 1000}" );
-
- GLEErrors errors;
- Status status = extractGLEErrors( gleResponse, &errors );
- ASSERT_NOT_OK( status );
- ASSERT_EQUALS( status.reason(), "message" );
- ASSERT_EQUALS( status.code(), 1000 );
- }
-
- TEST(GLEParsing, GLEFailNoCode) {
+TEST(LegacyGLESuppress, BasicStats) {
+ const BSONObj gleResponse = fromjson(
+ "{ok: 0.0, err: 'message',"
+ " n: 1, nModified: 1, upserted: 'abc', updatedExisting: true}");
- const BSONObj gleResponse = fromjson( "{ok: 0.0, err: null, errmsg: 'message'}" );
-
- GLEErrors errors;
- Status status = extractGLEErrors( gleResponse, &errors );
- ASSERT_NOT_OK( status );
- ASSERT_EQUALS( status.reason(), "message" );
- ASSERT_EQUALS( status.code(), ErrorCodes::UnknownError );
- }
-
- TEST(GLEParsing, NotMasterGLEFail) {
-
- // Not master code in response
- const BSONObj gleResponse =
- fromjson( "{ok: 0.0, err: null, errmsg: 'message', code: 10990}" );
-
- GLEErrors errors;
- ASSERT_OK( extractGLEErrors( gleResponse, &errors ) );
- ASSERT( !errors.writeError.get() );
- ASSERT( errors.wcError.get() );
- ASSERT_EQUALS( errors.wcError->getErrMessage(), "message" );
- ASSERT_EQUALS( errors.wcError->getErrCode(), 10990 );
- }
-
- TEST(GLEParsing, WriteErrWithStats) {
- const BSONObj gleResponse = fromjson( "{ok: 1.0, n: 2, err: 'message', code: 1000}" );
-
- GLEErrors errors;
- ASSERT_OK( extractGLEErrors( gleResponse, &errors ) );
- ASSERT( errors.writeError.get() );
- ASSERT_EQUALS( errors.writeError->getErrMessage(), "message" );
- ASSERT_EQUALS( errors.writeError->getErrCode(), 1000 );
- ASSERT( !errors.wcError.get() );
- }
-
- TEST(GLEParsing, ReplTimeoutErrWithStats) {
- const BSONObj gleResponse =
- fromjson( "{ok: 1.0, err: 'timeout', errmsg: 'message', wtimeout: true,"
- " n: 1, upserted: 'abcde'}" );
-
- GLEErrors errors;
- ASSERT_OK( extractGLEErrors( gleResponse, &errors ) );
- ASSERT( !errors.writeError.get() );
- ASSERT( errors.wcError.get() );
- ASSERT_EQUALS( errors.wcError->getErrMessage(), "message" );
- ASSERT( errors.wcError->getErrInfo()["wtimeout"].trueValue() );
- ASSERT_EQUALS( errors.wcError->getErrCode(), ErrorCodes::WriteConcernFailed );
- }
-
- //
- // Tests of processing and suppressing non-WC related fields from legacy GLE responses
- //
-
- TEST(LegacyGLESuppress, Basic) {
-
- const BSONObj gleResponse = fromjson( "{ok: 1.0, err: null}" );
-
- BSONObj stripped = stripNonWCInfo( gleResponse );
- ASSERT_EQUALS( stripped.nFields(), 2 ); // with err, ok : true
- ASSERT( stripped["ok"].trueValue() );
- }
-
- TEST(LegacyGLESuppress, BasicStats) {
-
- const BSONObj gleResponse =
- fromjson( "{ok: 0.0, err: 'message',"
- " n: 1, nModified: 1, upserted: 'abc', updatedExisting: true}" );
-
- BSONObj stripped = stripNonWCInfo( gleResponse );
- ASSERT_EQUALS( stripped.nFields(), 1 );
- ASSERT( !stripped["ok"].trueValue() );
- }
-
- TEST(LegacyGLESuppress, ReplError) {
-
- const BSONObj gleResponse =
- fromjson( "{ok: 0.0, err: 'norepl', n: 1, wcField: true}" );
-
- BSONObj stripped = stripNonWCInfo( gleResponse );
- ASSERT_EQUALS( stripped.nFields(), 3 );
- ASSERT( !stripped["ok"].trueValue() );
- ASSERT_EQUALS( stripped["err"].str(), "norepl" );
- ASSERT( stripped["wcField"].trueValue() );
- }
-
- TEST(LegacyGLESuppress, StripCode) {
-
- const BSONObj gleResponse =
- fromjson( "{ok: 1.0, err: 'message', code: 12345}" );
-
- BSONObj stripped = stripNonWCInfo( gleResponse );
- ASSERT_EQUALS( stripped.nFields(), 2 ); // with err, ok : true
- ASSERT( stripped["ok"].trueValue() );
- }
-
- TEST(LegacyGLESuppress, TimeoutDupError24) {
-
- const BSONObj gleResponse =
- BSON( "ok" << 0.0 << "err" << "message" << "code" << 12345
- << "err" << "timeout" << "code" << 56789 << "wtimeout" << true );
-
- BSONObj stripped = stripNonWCInfo( gleResponse );
- ASSERT_EQUALS( stripped.nFields(), 4 );
- ASSERT( !stripped["ok"].trueValue() );
- ASSERT_EQUALS( stripped["err"].str(), "timeout" );
- ASSERT_EQUALS( stripped["code"].numberInt(), 56789 );
- ASSERT( stripped["wtimeout"].trueValue() );
- }
+ BSONObj stripped = stripNonWCInfo(gleResponse);
+ ASSERT_EQUALS(stripped.nFields(), 1);
+ ASSERT(!stripped["ok"].trueValue());
+}
+
+TEST(LegacyGLESuppress, ReplError) {
+ const BSONObj gleResponse = fromjson("{ok: 0.0, err: 'norepl', n: 1, wcField: true}");
+
+ BSONObj stripped = stripNonWCInfo(gleResponse);
+ ASSERT_EQUALS(stripped.nFields(), 3);
+ ASSERT(!stripped["ok"].trueValue());
+ ASSERT_EQUALS(stripped["err"].str(), "norepl");
+ ASSERT(stripped["wcField"].trueValue());
+}
+
+TEST(LegacyGLESuppress, StripCode) {
+ const BSONObj gleResponse = fromjson("{ok: 1.0, err: 'message', code: 12345}");
+
+ BSONObj stripped = stripNonWCInfo(gleResponse);
+ ASSERT_EQUALS(stripped.nFields(), 2); // with err, ok : true
+ ASSERT(stripped["ok"].trueValue());
+}
+
+TEST(LegacyGLESuppress, TimeoutDupError24) {
+ const BSONObj gleResponse = BSON("ok" << 0.0 << "err"
+ << "message"
+ << "code" << 12345 << "err"
+ << "timeout"
+ << "code" << 56789 << "wtimeout" << true);
+
+ BSONObj stripped = stripNonWCInfo(gleResponse);
+ ASSERT_EQUALS(stripped.nFields(), 4);
+ ASSERT(!stripped["ok"].trueValue());
+ ASSERT_EQUALS(stripped["err"].str(), "timeout");
+ ASSERT_EQUALS(stripped["code"].numberInt(), 56789);
+ ASSERT(stripped["wtimeout"].trueValue());
+}
}