36
36
import com .google .android .datatransport .runtime .backends .BackendRequest ;
37
37
import com .google .android .datatransport .runtime .backends .BackendResponse ;
38
38
import com .google .android .datatransport .runtime .backends .TransportBackend ;
39
+ import com .google .android .datatransport .runtime .firebase .transport .LogEventDropped ;
40
+ import com .google .android .datatransport .runtime .firebase .transport .LogSourceMetrics ;
39
41
import com .google .android .datatransport .runtime .scheduling .jobscheduling .WorkScheduler ;
40
42
import com .google .android .datatransport .runtime .scheduling .persistence .EventStore ;
41
43
import com .google .android .datatransport .runtime .scheduling .persistence .PersistedEvent ;
44
+ import com .google .android .datatransport .runtime .scheduling .persistence .SQLiteEventStore ;
42
45
import com .google .android .datatransport .runtime .synchronization .SynchronizationException ;
43
46
import java .nio .charset .Charset ;
47
+ import java .util .Arrays ;
44
48
import java .util .Collections ;
49
+ import java .util .List ;
45
50
import java .util .UUID ;
51
+ import org .junit .After ;
46
52
import org .junit .Before ;
47
53
import org .junit .Rule ;
48
54
import org .junit .Test ;
@@ -77,6 +83,12 @@ public void setUp() {
77
83
invocation -> invocation .<EventInternal >getArgument (0 ).toBuilder ().build ());
78
84
}
79
85
86
+ @ After
87
+ public void tearDown () {
88
+ component .getEventStore ().clearDb ();
89
+ component .getEventStore ().resetClientMetrics ();
90
+ }
91
+
80
92
private String generateBackendName () {
81
93
return UUID .randomUUID ().toString ().replace ("-" , "" );
82
94
}
@@ -201,6 +213,61 @@ public void uploader_dbException_shouldReschedule() {
201
213
Transport <String > transport =
202
214
factory .getTransport (testTransport , String .class , String ::getBytes );
203
215
Event <String > stringEvent = Event .ofTelemetry ("TelemetryData" );
216
+
217
+ transport .send (stringEvent );
218
+ verify (spyScheduler , times (1 )).schedule (any (), eq (2 ));
219
+ assertThat (store .getNextCallTime (transportContext )).isEqualTo (0 );
220
+ }
221
+
222
+ @ Test
223
+ public void uploader_invalidPayload_shouldNotReschedule () {
224
+ TransportRuntime runtime = TransportRuntime .getInstance ();
225
+ SQLiteEventStore store = component .getEventStore ();
226
+ String mockBackendName = generateBackendName ();
227
+ byte [] mockExtras = "extras" .getBytes (Charset .defaultCharset ());
228
+
229
+ when (mockRegistry .get (mockBackendName )).thenReturn (mockBackend );
230
+ when (mockBackend .send (any ())).thenReturn (BackendResponse .invalidPayload ());
231
+
232
+ Transport <String > transport =
233
+ runtime
234
+ .newFactory (new TestDestination (mockBackendName , mockExtras ))
235
+ .getTransport (testTransport , String .class , String ::getBytes );
236
+ transport .send (Event .ofTelemetry ("TelemetryData" ));
237
+
238
+ verify (spyScheduler , times (0 )).schedule (any (), eq (2 ));
239
+
240
+ List <LogSourceMetrics > logSourceMetrics = store .loadClientMetrics ().getLogSourceMetricsList ();
241
+ assertThat (logSourceMetrics ).hasSize (1 );
242
+ LogSourceMetrics metrics = logSourceMetrics .get (0 );
243
+ List <LogEventDropped > logEventDroppedList = metrics .getLogEventDroppedList ();
244
+ assertThat (logEventDroppedList ).hasSize (1 );
245
+ LogEventDropped logEventDropped = logEventDroppedList .get (0 );
246
+ assertThat (logEventDropped .getEventsDroppedCount ()).isEqualTo (1 );
247
+ assertThat (logEventDropped .getReason ()).isEqualTo (LogEventDropped .Reason .INVALID_PAYLOD );
248
+ }
249
+
250
+ @ Test
251
+ public void uploader_withPendingClientMetricsAndSuccessfulUpload_shouldResetCounters () {
252
+ TransportRuntime runtime = TransportRuntime .getInstance ();
253
+ SQLiteEventStore store = component .getEventStore ();
254
+ String anotherTransport = "anotherTransport" ;
255
+ store .recordLogEventDropped (20 , LogEventDropped .Reason .CACHE_FULL , testTransport );
256
+ store .recordLogEventDropped (1 , LogEventDropped .Reason .MAX_RETRIES_REACHED , testTransport );
257
+ store .recordLogEventDropped (1 , LogEventDropped .Reason .INVALID_PAYLOD , anotherTransport );
258
+
259
+ assertThat (store .loadClientMetrics ().getLogSourceMetricsList ()).hasSize (2 );
260
+
261
+ String mockBackendName = generateBackendName ();
262
+ byte [] mockExtras = "extras" .getBytes (Charset .defaultCharset ());
263
+
264
+ when (mockRegistry .get (mockBackendName )).thenReturn (mockBackend );
265
+ when (mockBackend .send (any ())).thenReturn (BackendResponse .ok (1 ));
266
+
267
+ Transport <String > transport =
268
+ runtime
269
+ .newFactory (new TestDestination (mockBackendName , mockExtras ))
270
+ .getTransport (testTransport , String .class , String ::getBytes );
204
271
EventInternal expectedEvent =
205
272
EventInternal .builder ()
206
273
.setEventMillis (3 )
@@ -210,8 +277,142 @@ public void uploader_dbException_shouldReschedule() {
210
277
new EncodedPayload (
211
278
PROTOBUF_ENCODING , "TelemetryData" .getBytes (Charset .defaultCharset ())))
212
279
.build ();
213
- transport .send (stringEvent );
214
- verify (spyScheduler , times (1 )).schedule (any (), eq (2 ));
215
- assertThat (store .getNextCallTime (transportContext )).isEqualTo (0 );
280
+ EventInternal metricsEvent = component .getUploader ().createMetricsEvent (mockBackend );
281
+ transport .send (Event .ofTelemetry ("TelemetryData" ));
282
+ verify (mockBackend , times (1 ))
283
+ .send (
284
+ eq (
285
+ BackendRequest .builder ()
286
+ .setEvents (Arrays .asList (expectedEvent , metricsEvent ))
287
+ .setExtras (mockExtras )
288
+ .build ()));
289
+
290
+ verify (spyScheduler , times (0 )).schedule (any (), eq (2 ));
291
+
292
+ assertThat (store .loadClientMetrics ().getLogSourceMetricsList ()).isEmpty ();
293
+ }
294
+
295
+ @ Test
296
+ public void uploader_withPendingClientMetricsAndInvalidPayload_shouldNotResetCounters () {
297
+ TransportRuntime runtime = TransportRuntime .getInstance ();
298
+ SQLiteEventStore store = component .getEventStore ();
299
+ String anotherTransport = "anotherTransport" ;
300
+ store .recordLogEventDropped (1 , LogEventDropped .Reason .INVALID_PAYLOD , anotherTransport );
301
+
302
+ assertThat (store .loadClientMetrics ().getLogSourceMetricsList ()).hasSize (1 );
303
+
304
+ String mockBackendName = generateBackendName ();
305
+ byte [] mockExtras = "extras" .getBytes (Charset .defaultCharset ());
306
+
307
+ when (mockRegistry .get (mockBackendName )).thenReturn (mockBackend );
308
+ when (mockBackend .send (any ())).thenReturn (BackendResponse .invalidPayload ());
309
+
310
+ Transport <String > transport =
311
+ runtime
312
+ .newFactory (new TestDestination (mockBackendName , mockExtras ))
313
+ .getTransport (testTransport , String .class , String ::getBytes );
314
+ EventInternal expectedEvent =
315
+ EventInternal .builder ()
316
+ .setEventMillis (3 )
317
+ .setUptimeMillis (1 )
318
+ .setTransportName (testTransport )
319
+ .setEncodedPayload (
320
+ new EncodedPayload (
321
+ PROTOBUF_ENCODING , "TelemetryData" .getBytes (Charset .defaultCharset ())))
322
+ .build ();
323
+ EventInternal metricsEvent = component .getUploader ().createMetricsEvent (mockBackend );
324
+ transport .send (Event .ofTelemetry ("TelemetryData" ));
325
+ verify (mockBackend , times (1 ))
326
+ .send (
327
+ eq (
328
+ BackendRequest .builder ()
329
+ .setEvents (Arrays .asList (expectedEvent , metricsEvent ))
330
+ .setExtras (mockExtras )
331
+ .build ()));
332
+
333
+ verify (spyScheduler , times (0 )).schedule (any (), eq (2 ));
334
+
335
+ assertThat (store .loadClientMetrics ().getLogSourceMetricsList ()).hasSize (2 );
336
+ }
337
+
338
+ @ Test
339
+ public void uploader_withPendingClientMetricsAndFatalError_shouldNotResetCounters () {
340
+ TransportRuntime runtime = TransportRuntime .getInstance ();
341
+ SQLiteEventStore store = component .getEventStore ();
342
+ String anotherTransport = "anotherTransport" ;
343
+ store .recordLogEventDropped (1 , LogEventDropped .Reason .INVALID_PAYLOD , anotherTransport );
344
+
345
+ assertThat (store .loadClientMetrics ().getLogSourceMetricsList ()).hasSize (1 );
346
+
347
+ String mockBackendName = generateBackendName ();
348
+ byte [] mockExtras = "extras" .getBytes (Charset .defaultCharset ());
349
+
350
+ when (mockRegistry .get (mockBackendName )).thenReturn (mockBackend );
351
+ when (mockBackend .send (any ())).thenReturn (BackendResponse .fatalError ());
352
+
353
+ Transport <String > transport =
354
+ runtime
355
+ .newFactory (new TestDestination (mockBackendName , mockExtras ))
356
+ .getTransport (testTransport , String .class , String ::getBytes );
357
+ EventInternal expectedEvent =
358
+ EventInternal .builder ()
359
+ .setEventMillis (3 )
360
+ .setUptimeMillis (1 )
361
+ .setTransportName (testTransport )
362
+ .setEncodedPayload (
363
+ new EncodedPayload (
364
+ PROTOBUF_ENCODING , "TelemetryData" .getBytes (Charset .defaultCharset ())))
365
+ .build ();
366
+ EventInternal metricsEvent = component .getUploader ().createMetricsEvent (mockBackend );
367
+ transport .send (Event .ofTelemetry ("TelemetryData" ));
368
+ verify (mockBackend , times (1 ))
369
+ .send (
370
+ eq (
371
+ BackendRequest .builder ()
372
+ .setEvents (Arrays .asList (expectedEvent , metricsEvent ))
373
+ .setExtras (mockExtras )
374
+ .build ()));
375
+
376
+ verify (spyScheduler , times (0 )).schedule (any (), eq (2 ));
377
+
378
+ assertThat (store .loadClientMetrics ().getLogSourceMetricsList ()).hasSize (1 );
379
+ }
380
+
381
+ @ Test
382
+ public void
383
+ uploader_withPendingClientMetricsAndSuccessfulUploadButNotLegacyTarget_shouldNotResetCounters () {
384
+ TransportRuntime runtime = TransportRuntime .getInstance ();
385
+ SQLiteEventStore store = component .getEventStore ();
386
+ String anotherTransport = "anotherTransport" ;
387
+ store .recordLogEventDropped (1 , LogEventDropped .Reason .INVALID_PAYLOD , anotherTransport );
388
+
389
+ assertThat (store .loadClientMetrics ().getLogSourceMetricsList ()).hasSize (1 );
390
+
391
+ String mockBackendName = generateBackendName ();
392
+
393
+ when (mockRegistry .get (mockBackendName )).thenReturn (mockBackend );
394
+ when (mockBackend .send (any ())).thenReturn (BackendResponse .ok (1 ));
395
+
396
+ Transport <String > transport =
397
+ runtime
398
+ .newFactory (new TestDestination (mockBackendName , null ))
399
+ .getTransport (testTransport , String .class , String ::getBytes );
400
+ EventInternal expectedEvent =
401
+ EventInternal .builder ()
402
+ .setEventMillis (3 )
403
+ .setUptimeMillis (1 )
404
+ .setTransportName (testTransport )
405
+ .setEncodedPayload (
406
+ new EncodedPayload (
407
+ PROTOBUF_ENCODING , "TelemetryData" .getBytes (Charset .defaultCharset ())))
408
+ .build ();
409
+
410
+ transport .send (Event .ofTelemetry ("TelemetryData" ));
411
+ verify (mockBackend , times (1 ))
412
+ .send (eq (BackendRequest .create (Collections .singletonList (expectedEvent ))));
413
+
414
+ verify (spyScheduler , times (0 )).schedule (any (), eq (2 ));
415
+
416
+ assertThat (store .loadClientMetrics ().getLogSourceMetricsList ()).hasSize (1 );
216
417
}
217
418
}
0 commit comments