@@ -31,6 +31,8 @@ describe('Firebase Performance > transport_service', () => {
31
31
let fetchStub : SinonStub < [ RequestInfo , RequestInit ?] , Promise < Response > > ;
32
32
const INITIAL_SEND_TIME_DELAY_MS = 5.5 * 1000 ;
33
33
const DEFAULT_SEND_INTERVAL_MS = 10 * 1000 ;
34
+ const MAX_EVENT_COUNT_PER_REQUEST = 1000 ;
35
+ const TRANSPORT_DELAY_INTERVAL = 10000 ;
34
36
// Starts date at timestamp 1 instead of 0, otherwise it causes validation errors.
35
37
let clock : SinonFakeTimers ;
36
38
const testTransportHandler = transportHandler ( ( ...args ) => {
@@ -66,8 +68,7 @@ describe('Firebase Performance > transport_service', () => {
66
68
clock . tick ( INITIAL_SEND_TIME_DELAY_MS ) ;
67
69
expect ( fetchStub ) . to . not . have . been . called ;
68
70
} ) ;
69
-
70
- it ( 'attempts to log an event to cc after DEFAULT_SEND_INTERVAL_MS if queue not empty' , ( ) => {
71
+ it ( 'attempts to log an event to cc after DEFAULT_SEND_INTERVAL_MS if queue not empty' , async ( ) => {
71
72
fetchStub . resolves (
72
73
new Response ( '' , {
73
74
status : 200 ,
@@ -82,32 +83,99 @@ describe('Firebase Performance > transport_service', () => {
82
83
} ) ;
83
84
84
85
it ( 'successful send a meesage to transport' , ( ) => {
85
- const transportDelayInterval = 30000 ;
86
86
const setting = SettingsService . getInstance ( ) ;
87
87
const flTransportFullUrl =
88
88
setting . flTransportEndpointUrl + '?key=' + setting . transportKey ;
89
89
fetchStub . withArgs ( flTransportFullUrl , match . any ) . resolves (
90
90
// DELETE_REQUEST means event dispatch is successful.
91
- new Response (
92
- '{\
93
- "nextRequestWaitMillis": "' +
94
- transportDelayInterval +
95
- '",\
96
- "logResponseDetails": [\
97
- {\
98
- "responseAction": "DELETE_REQUEST"\
99
- }\
100
- ]\
101
- }' ,
102
- {
103
- status : 200 ,
104
- headers : { 'Content-type' : 'application/json' }
105
- }
106
- )
91
+ generateSuccessResponse ( )
107
92
) ;
108
93
109
94
testTransportHandler ( 'event1' ) ;
110
95
clock . tick ( INITIAL_SEND_TIME_DELAY_MS ) ;
111
96
expect ( fetchStub ) . to . have . been . calledOnce ;
112
97
} ) ;
98
+
99
+ it ( 'sends up to the maximum event limit in one request' , async ( ) => {
100
+ // Arrange
101
+ const setting = SettingsService . getInstance ( ) ;
102
+ const flTransportFullUrl =
103
+ setting . flTransportEndpointUrl + '?key=' + setting . transportKey ;
104
+
105
+ // Returns successful response from fl for logRequests.
106
+ const response = generateSuccessResponse ( ) ;
107
+ fetchStub . resolves ( response ) ;
108
+ stub ( response , 'json' ) . resolves ( JSON . parse ( generateSuccessResponseBody ( ) ) ) ;
109
+
110
+ // Act
111
+ // Generate 1020 events, which should be dispatched in two batches (1000 events and 20 events).
112
+ for ( let i = 0 ; i < 1020 ; i ++ ) {
113
+ testTransportHandler ( 'event' + i ) ;
114
+ }
115
+ // Wait for first and second event dispatch to happen.
116
+ clock . tick ( INITIAL_SEND_TIME_DELAY_MS ) ;
117
+ await Promise . resolve ( ) . then ( ) . then ( ) . then ( ) ;
118
+ clock . tick ( DEFAULT_SEND_INTERVAL_MS ) ;
119
+
120
+ // Assert
121
+ // Expects the first logRequest which contains first 1000 events.
122
+ const firstLogRequest = generateLogRequest ( '5501' ) ;
123
+ for ( let i = 0 ; i < MAX_EVENT_COUNT_PER_REQUEST ; i ++ ) {
124
+ firstLogRequest [ 'log_event' ] . push ( {
125
+ 'source_extension_json_proto3' : 'event' + i ,
126
+ 'event_time_ms' : '1'
127
+ } ) ;
128
+ }
129
+ expect ( fetchStub ) . which . to . have . been . calledWith ( flTransportFullUrl , {
130
+ method : 'POST' ,
131
+ body : JSON . stringify ( firstLogRequest )
132
+ } ) ;
133
+ // Expects the second logRequest which contains remaining 20 events;
134
+ const secondLogRequest = generateLogRequest ( '15501' ) ;
135
+ for ( let i = 0 ; i < 20 ; i ++ ) {
136
+ secondLogRequest [ 'log_event' ] . push ( {
137
+ 'source_extension_json_proto3' :
138
+ 'event' + ( MAX_EVENT_COUNT_PER_REQUEST + i ) ,
139
+ 'event_time_ms' : '1'
140
+ } ) ;
141
+ }
142
+ expect ( fetchStub ) . calledWith ( flTransportFullUrl , {
143
+ method : 'POST' ,
144
+ body : JSON . stringify ( secondLogRequest )
145
+ } ) ;
146
+ } ) ;
147
+
148
+ function generateLogRequest ( requestTimeMs : string ) : any {
149
+ return {
150
+ 'request_time_ms' : requestTimeMs ,
151
+ 'client_info' : {
152
+ 'client_type' : 1 ,
153
+ 'js_client_info' : { }
154
+ } ,
155
+ 'log_source' : 462 ,
156
+ 'log_event' : [ ] as any
157
+ } ;
158
+ }
159
+
160
+ function generateSuccessResponse ( ) : Response {
161
+ return new Response ( generateSuccessResponseBody ( ) , {
162
+ status : 200 ,
163
+ headers : { 'Content-type' : 'application/json' }
164
+ } ) ;
165
+ }
166
+
167
+ function generateSuccessResponseBody ( ) : string {
168
+ return (
169
+ '{\
170
+ "nextRequestWaitMillis": "' +
171
+ TRANSPORT_DELAY_INTERVAL +
172
+ '",\
173
+ "logResponseDetails": [\
174
+ {\
175
+ "responseAction": "DELETE_REQUEST"\
176
+ }\
177
+ ]\
178
+ }'
179
+ ) ;
180
+ }
113
181
} ) ;
0 commit comments