@@ -113,4 +113,84 @@ describe('Topology (unit)', function() {
113
113
} ) ;
114
114
} ) ;
115
115
} ) ;
116
+
117
+ describe ( 'error handling' , function ( ) {
118
+ let mockServer ;
119
+ beforeEach ( ( ) => mock . createServer ( ) . then ( server => ( mockServer = server ) ) ) ;
120
+ afterEach ( ( ) => mock . cleanup ( ) ) ;
121
+
122
+ it ( 'should set server to unknown and reset pool on `node is recovering` error' , function ( done ) {
123
+ mockServer . setMessageHandler ( request => {
124
+ const doc = request . document ;
125
+ if ( doc . ismaster ) {
126
+ request . reply ( Object . assign ( { } , mock . DEFAULT_ISMASTER , { maxWireVersion : 9 } ) ) ;
127
+ } else if ( doc . insert ) {
128
+ request . reply ( { ok : 0 , message : 'node is recovering' , code : 11600 } ) ;
129
+ } else {
130
+ request . reply ( { ok : 1 } ) ;
131
+ }
132
+ } ) ;
133
+
134
+ const topology = new Topology ( mockServer . uri ( ) ) ;
135
+ topology . connect ( err => {
136
+ expect ( err ) . to . not . exist ;
137
+
138
+ topology . selectServer ( 'primary' , ( err , server ) => {
139
+ expect ( err ) . to . not . exist ;
140
+ this . defer ( ( ) => topology . close ( ) ) ;
141
+
142
+ let serverError ;
143
+ server . on ( 'error' , err => ( serverError = err ) ) ;
144
+
145
+ let poolCleared = false ;
146
+ topology . on ( 'connectionPoolCleared' , ( ) => ( poolCleared = true ) ) ;
147
+
148
+ server . command ( 'test.test' , { insert : { a : 42 } } , ( err , result ) => {
149
+ expect ( result ) . to . not . exist ;
150
+ expect ( err ) . to . exist ;
151
+ expect ( err ) . to . eql ( serverError ) ;
152
+ expect ( poolCleared ) . to . be . true ;
153
+ done ( ) ;
154
+ } ) ;
155
+ } ) ;
156
+ } ) ;
157
+ } ) ;
158
+
159
+ it ( 'should set server to unknown and NOT reset pool on stepdown errors' , function ( done ) {
160
+ mockServer . setMessageHandler ( request => {
161
+ const doc = request . document ;
162
+ if ( doc . ismaster ) {
163
+ request . reply ( Object . assign ( { } , mock . DEFAULT_ISMASTER , { maxWireVersion : 9 } ) ) ;
164
+ } else if ( doc . insert ) {
165
+ request . reply ( { ok : 0 , message : 'not master' } ) ;
166
+ } else {
167
+ request . reply ( { ok : 1 } ) ;
168
+ }
169
+ } ) ;
170
+
171
+ const topology = new Topology ( mockServer . uri ( ) ) ;
172
+ topology . connect ( err => {
173
+ expect ( err ) . to . not . exist ;
174
+
175
+ topology . selectServer ( 'primary' , ( err , server ) => {
176
+ expect ( err ) . to . not . exist ;
177
+ this . defer ( ( ) => topology . close ( ) ) ;
178
+
179
+ let serverError ;
180
+ server . on ( 'error' , err => ( serverError = err ) ) ;
181
+
182
+ let poolCleared = false ;
183
+ topology . on ( 'connectionPoolCleared' , ( ) => ( poolCleared = true ) ) ;
184
+
185
+ server . command ( 'test.test' , { insert : { a : 42 } } , ( err , result ) => {
186
+ expect ( result ) . to . not . exist ;
187
+ expect ( err ) . to . exist ;
188
+ expect ( err ) . to . eql ( serverError ) ;
189
+ expect ( poolCleared ) . to . be . false ;
190
+ done ( ) ;
191
+ } ) ;
192
+ } ) ;
193
+ } ) ;
194
+ } ) ;
195
+ } ) ;
116
196
} ) ;
0 commit comments