@@ -10,6 +10,7 @@ import (
10
10
"context"
11
11
"errors"
12
12
"testing"
13
+ "time"
13
14
14
15
"go.mongodb.org/mongo-driver/bson"
15
16
"go.mongodb.org/mongo-driver/bson/bsoncodec"
@@ -18,6 +19,7 @@ import (
18
19
"go.mongodb.org/mongo-driver/mongo/readconcern"
19
20
"go.mongodb.org/mongo-driver/mongo/readpref"
20
21
"go.mongodb.org/mongo-driver/mongo/writeconcern"
22
+ "go.mongodb.org/mongo-driver/x/mongo/driver/topology"
21
23
)
22
24
23
25
func setupDb (name string , opts ... * options.DatabaseOptions ) * Database {
@@ -84,7 +86,6 @@ func TestDatabase(t *testing.T) {
84
86
})
85
87
t .Run ("replace topology error" , func (t * testing.T ) {
86
88
db := setupDb ("foo" )
87
-
88
89
err := db .RunCommand (bgCtx , bson.D {{"x" , 1 }}).Err ()
89
90
assert .Equal (t , ErrClientDisconnected , err , "expected error %v, got %v" , ErrClientDisconnected , err )
90
91
@@ -94,6 +95,43 @@ func TestDatabase(t *testing.T) {
94
95
_ , err = db .ListCollections (bgCtx , bson.D {})
95
96
assert .Equal (t , ErrClientDisconnected , err , "expected error %v, got %v" , ErrClientDisconnected , err )
96
97
})
98
+ t .Run ("TransientTransactionError label" , func (t * testing.T ) {
99
+ client := setupClient (options .Client ().ApplyURI ("mongodb://nonexistent" ).SetServerSelectionTimeout (3 * time .Second ))
100
+ err := client .Connect (bgCtx )
101
+ defer client .Disconnect (bgCtx )
102
+ assert .Nil (t , err , "expected nil, got %v" , err )
103
+
104
+ t .Run ("negative case of non-transaction" , func (t * testing.T ) {
105
+ var sse topology.ServerSelectionError
106
+ var le LabeledError
107
+
108
+ err := client .Ping (bgCtx , nil )
109
+ assert .NotNil (t , err , "expected error, got nil" )
110
+ assert .True (t , errors .As (err , & sse ), `expected error to be a "topology.ServerSelectionError"` )
111
+ if errors .As (err , & le ) {
112
+ assert .False (t , le .HasErrorLabel ("TransientTransactionError" ), `expected error not to include the "TransientTransactionError" label` )
113
+ }
114
+ })
115
+
116
+ t .Run ("positive case of transaction" , func (t * testing.T ) {
117
+ var sse topology.ServerSelectionError
118
+ var le LabeledError
119
+
120
+ sess , err := client .StartSession ()
121
+ assert .Nil (t , err , "expected nil, got %v" , err )
122
+ defer sess .EndSession (bgCtx )
123
+
124
+ sessCtx := NewSessionContext (bgCtx , sess )
125
+ err = sess .StartTransaction ()
126
+ assert .Nil (t , err , "expected nil, got %v" , err )
127
+
128
+ err = client .Ping (sessCtx , nil )
129
+ assert .NotNil (t , err , "expected error, got nil" )
130
+ assert .True (t , errors .As (err , & sse ), `expected error to be a "topology.ServerSelectionError"` )
131
+ assert .True (t , errors .As (err , & le ), `expected error to implement the "LabeledError" interface` )
132
+ assert .True (t , le .HasErrorLabel ("TransientTransactionError" ), `expected error to include the "TransientTransactionError" label` )
133
+ })
134
+ })
97
135
t .Run ("nil document error" , func (t * testing.T ) {
98
136
db := setupDb ("foo" )
99
137
0 commit comments