@@ -51,4 +51,117 @@ describe('connectors/firehose.js', () => {
5151 } ) ;
5252 expect ( data ) . to . deep . equal ( { } ) ;
5353 } ) ;
54+
55+ it ( 'should retry' , async ( ) => {
56+ const responses = [
57+ { RequestResponses : [ { SequenceNumber : '1' } , { ErrorCode : 'X' } , { ErrorCode : 'X' } ] , FailedPutCount : 2 } ,
58+ { RequestResponses : [ { SequenceNumber : '2' } , { ErrorCode : 'X' } ] , FailedPutCount : 1 } ,
59+ { RequestResponses : [ { SequenceNumber : '3' } ] , FailedPutCount : 0 } ,
60+ ] ;
61+
62+ const spy = sinon . spy ( ( _ ) => responses . shift ( ) ) ;
63+ mockFirehose . on ( PutRecordBatchCommand ) . callsFake ( spy ) ;
64+
65+ const inputParams = {
66+ Records : [
67+ {
68+ Data : Buffer . from ( JSON . stringify ( { type : 't1' } ) ) ,
69+ } ,
70+ {
71+ Data : Buffer . from ( JSON . stringify ( { type : 't2' } ) ) ,
72+ } ,
73+ {
74+ Data : Buffer . from ( JSON . stringify ( { type : 't3' } ) ) ,
75+ } ,
76+ ] ,
77+ } ;
78+
79+ const data = await new Connector ( {
80+ debug : debug ( 'firehose' ) ,
81+ deliveryStreamName : 'ds1' ,
82+ } ) . putRecordBatch ( inputParams ) ;
83+
84+ expect ( spy ) . to . have . been . calledWith ( {
85+ DeliveryStreamName : 'ds1' ,
86+ Records : [ inputParams . Records [ 0 ] , inputParams . Records [ 1 ] , inputParams . Records [ 2 ] ] ,
87+ } ) ;
88+ expect ( spy ) . to . have . been . calledWith ( {
89+ DeliveryStreamName : 'ds1' ,
90+ Records : [ inputParams . Records [ 1 ] , inputParams . Records [ 2 ] ] ,
91+ } ) ;
92+ expect ( spy ) . to . have . been . calledWith ( {
93+ DeliveryStreamName : 'ds1' ,
94+ Records : [ inputParams . Records [ 2 ] ] ,
95+ } ) ;
96+
97+ expect ( data ) . to . deep . equal ( {
98+ RequestResponses : [ { SequenceNumber : '1' } , { SequenceNumber : '2' } , { SequenceNumber : '3' } ] ,
99+ FailedPutCount : 0 ,
100+ attempts : [
101+ {
102+ RequestResponses : [ { SequenceNumber : '1' } , { ErrorCode : 'X' } , { ErrorCode : 'X' } ] ,
103+ FailedPutCount : 2 ,
104+ } ,
105+ {
106+ RequestResponses : [ { SequenceNumber : '2' } , { ErrorCode : 'X' } ] ,
107+ FailedPutCount : 1 ,
108+ } ,
109+ {
110+ RequestResponses : [ { SequenceNumber : '3' } ] ,
111+ FailedPutCount : 0 ,
112+ } ,
113+ ] ,
114+ } ) ;
115+ } ) ;
116+
117+ it ( 'should throw on max retry' , async ( ) => {
118+ const responses = [
119+ { RequestResponses : [ { SequenceNumber : '1' } , { ErrorCode : 'X' } , { ErrorCode : 'X' } ] , FailedPutCount : 2 } ,
120+ { RequestResponses : [ { SequenceNumber : '2' } , { ErrorCode : 'X' } ] , FailedPutCount : 1 } ,
121+ ] ;
122+
123+ const spy = sinon . spy ( ( _ ) => responses . shift ( ) ) ;
124+ mockFirehose . on ( PutRecordBatchCommand ) . callsFake ( spy ) ;
125+
126+ const inputParams = {
127+ Records : [
128+ {
129+ Data : Buffer . from ( JSON . stringify ( { type : 't1' } ) ) ,
130+ } ,
131+ {
132+ Data : Buffer . from ( JSON . stringify ( { type : 't2' } ) ) ,
133+ } ,
134+ {
135+ Data : Buffer . from ( JSON . stringify ( { type : 't3' } ) ) ,
136+ } ,
137+ ] ,
138+ } ;
139+
140+ await new Connector ( {
141+ debug : debug ( 'firehose' ) ,
142+ deliveryStreamName : 'ds1' ,
143+ retryConfig : {
144+ maxRetries : 1 ,
145+ retryWait : 100 ,
146+ } ,
147+ } ) . putRecordBatch ( inputParams )
148+ . then ( ( ) => {
149+ expect . fail ( 'should have thrown' ) ;
150+ } ) . catch ( ( err ) => {
151+ expect ( spy ) . to . have . been . calledWith ( {
152+ DeliveryStreamName : 'ds1' ,
153+ Records : [ inputParams . Records [ 0 ] , inputParams . Records [ 1 ] , inputParams . Records [ 2 ] ] ,
154+ } ) ;
155+ expect ( spy ) . to . have . been . calledWith ( {
156+ DeliveryStreamName : 'ds1' ,
157+ Records : [ inputParams . Records [ 1 ] , inputParams . Records [ 2 ] ] ,
158+ } ) ;
159+ expect ( spy ) . to . not . have . been . calledWith ( {
160+ DeliveryStreamName : 'ds1' ,
161+ Records : [ inputParams . Records [ 2 ] ] ,
162+ } ) ;
163+
164+ expect ( err . message ) . to . contain ( 'Failed batch requests' ) ;
165+ } ) ;
166+ } ) ;
54167} ) ;
0 commit comments