@@ -113,4 +113,84 @@ describe('Topology (unit)', function() {
113113 } ) ;
114114 } ) ;
115115 } ) ;
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+ } ) ;
116196} ) ;
0 commit comments