diff options
Diffstat (limited to 'src/mongo/s/write_ops/batch_downconvert_test.cpp')
-rw-r--r-- | src/mongo/s/write_ops/batch_downconvert_test.cpp | 359 |
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()); +} } |