Skip to content

Commit de7fae1

Browse files
author
Divjot Arora
committed
GODRIVER-1706 Ensure codeName is propagated for errors (#458)
1 parent 61c3712 commit de7fae1

File tree

3 files changed

+62
-6
lines changed

3 files changed

+62
-6
lines changed

mongo/errors.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,12 @@ func convertDriverWriteConcernError(wce *driver.WriteConcernError) *WriteConcern
201201
return nil
202202
}
203203

204-
return &WriteConcernError{Code: int(wce.Code), Message: wce.Message, Details: bson.Raw(wce.Details)}
204+
return &WriteConcernError{
205+
Name: wce.Name,
206+
Code: int(wce.Code),
207+
Message: wce.Message,
208+
Details: bson.Raw(wce.Details),
209+
}
205210
}
206211

207212
// BulkWriteError is an error that occurred during execution of one operation in a BulkWrite. This error type is only

mongo/integration/collection_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,16 @@ const (
3232
errorModifiedID = 66
3333
)
3434

35-
func TestCollection(t *testing.T) {
36-
mt := mtest.New(t, mtest.NewOptions().CreateClient(false))
37-
defer mt.Close()
38-
35+
var (
3936
// impossibleWc is a write concern that can't be satisfied and is used to test write concern errors
4037
// for various operations. It includes a timeout because legacy servers will wait for all W nodes to respond,
4138
// causing tests to hang.
42-
impossibleWc := writeconcern.New(writeconcern.W(30), writeconcern.WTimeout(time.Second))
39+
impossibleWc = writeconcern.New(writeconcern.W(30), writeconcern.WTimeout(time.Second))
40+
)
41+
42+
func TestCollection(t *testing.T) {
43+
mt := mtest.New(t, mtest.NewOptions().CreateClient(false))
44+
defer mt.Close()
4345

4446
mt.RunOpts("insert one", noClientOpts, func(mt *mtest.T) {
4547
mt.Run("success", func(mt *mtest.T) {

mongo/integration/crud_prose_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,52 @@ func TestAggregateSecondaryPreferredReadPreference(t *testing.T) {
6565
assert.NotNil(mt, err, "expected command %s to not contain $readPreference", evt.Command)
6666
})
6767
}
68+
69+
func TestErrorsCodeNamePropagated(t *testing.T) {
70+
// Ensure the codeName field is propagated for both command and write concern errors.
71+
72+
mtOpts := mtest.NewOptions().
73+
Topologies(mtest.ReplicaSet).
74+
CreateClient(false)
75+
mt := mtest.New(t, mtOpts)
76+
defer mt.Close()
77+
78+
mt.RunOpts("command error", mtest.NewOptions().MinServerVersion("3.4"), func(mt *mtest.T) {
79+
// codeName is propagated in an ok:0 error.
80+
81+
cmd := bson.D{
82+
{"insert", mt.Coll.Name()},
83+
{"documents", []bson.D{}},
84+
}
85+
err := mt.DB.RunCommand(mtest.Background, cmd).Err()
86+
assert.NotNil(mt, err, "expected RunCommand error, got nil")
87+
88+
ce, ok := err.(mongo.CommandError)
89+
assert.True(mt, ok, "expected error of type %T, got %v of type %T", mongo.CommandError{}, err, err)
90+
expectedCodeName := "InvalidLength"
91+
assert.Equal(mt, expectedCodeName, ce.Name, "expected error code name %q, got %q", expectedCodeName, ce.Name)
92+
})
93+
94+
wcCollOpts := options.Collection().
95+
SetWriteConcern(impossibleWc)
96+
wcMtOpts := mtest.NewOptions().
97+
CollectionOptions(wcCollOpts)
98+
mt.RunOpts("write concern error", wcMtOpts, func(mt *mtest.T) {
99+
// codeName is propagated for write concern errors.
100+
101+
_, err := mt.Coll.InsertOne(mtest.Background, bson.D{})
102+
assert.NotNil(mt, err, "expected InsertOne error, got nil")
103+
104+
we, ok := err.(mongo.WriteException)
105+
assert.True(mt, ok, "expected error of type %T, got %v of type %T", mongo.WriteException{}, err, err)
106+
wce := we.WriteConcernError
107+
assert.NotNil(mt, wce, "expected write concern error, got %v", we)
108+
109+
var expectedCodeName string
110+
if codeNameVal, err := mt.GetSucceededEvent().Reply.LookupErr("writeConcernError", "codeName"); err == nil {
111+
expectedCodeName = codeNameVal.StringValue()
112+
}
113+
114+
assert.Equal(mt, expectedCodeName, wce.Name, "expected code name %q, got %q", expectedCodeName, wce.Name)
115+
})
116+
}

0 commit comments

Comments
 (0)