@@ -101,6 +101,9 @@ extension EventDispatcherTests_Batch {
101
101
extension EventDispatcherTests_Batch {
102
102
103
103
func testFlushEvents( ) {
104
+ // this tests timer-based dispatch, available for iOS 10+
105
+ guard #available( iOS 10 . 0 , tvOS 10 . 0 , * ) else { return }
106
+
104
107
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
105
108
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventB) , completionHandler: nil )
106
109
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
@@ -127,6 +130,9 @@ extension EventDispatcherTests_Batch {
127
130
}
128
131
129
132
func testFlushEventsWhenBatchFails( ) {
133
+ // this tests timer-based dispatch, available for iOS 10+
134
+ guard #available( iOS 10 . 0 , tvOS 10 . 0 , * ) else { return }
135
+
130
136
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
131
137
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
132
138
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlB, event: batchEventB) , completionHandler: nil )
@@ -182,6 +188,9 @@ extension EventDispatcherTests_Batch {
182
188
}
183
189
184
190
func testFlushEventsWhenSendEventFails( ) {
191
+ // this tests timer-based dispatch, available for iOS 10+
192
+ guard #available( iOS 10 . 0 , tvOS 10 . 0 , * ) else { return }
193
+
185
194
eventDispatcher. forceError = true
186
195
187
196
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
@@ -209,6 +218,9 @@ extension EventDispatcherTests_Batch {
209
218
}
210
219
211
220
func testFlushEventsWhenSendEventFailsAndRecovers( ) {
221
+ // this tests timer-based dispatch, available for iOS 10+
222
+ guard #available( iOS 10 . 0 , tvOS 10 . 0 , * ) else { return }
223
+
212
224
// (1) error injected - all event send fails
213
225
214
226
eventDispatcher. forceError = true
@@ -258,13 +270,27 @@ extension EventDispatcherTests_Batch {
258
270
259
271
func testEventDispatchedOnTimer( ) {
260
272
eventDispatcher. timerInterval = 3
261
-
273
+
262
274
eventDispatcher. exp = expectation ( description: " timer " )
263
-
275
+
264
276
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
265
-
277
+
266
278
wait ( for: [ eventDispatcher. exp!] , timeout: 10 )
279
+
280
+ let batch = eventDispatcher. sendRequestedEvents [ 0 ]
281
+ let batchedEvents = try ! JSONDecoder ( ) . decode ( BatchEvent . self, from: batch. body)
282
+ XCTAssertEqual ( batch. url. absoluteString, kUrlA)
283
+ XCTAssertEqual ( batchedEvents. visitors [ 0 ] , visitorA)
284
+ XCTAssertEqual ( batchedEvents. visitors. count, 1 )
285
+ }
286
+
287
+ func testEventDispatchedOnTimer_ZeroInterval( ) {
288
+ // zero-interval means that all events are sent out immediately
289
+ eventDispatcher. timerInterval = 0
267
290
291
+ eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
292
+ eventDispatcher. dispatcher. sync { }
293
+
268
294
let batch = eventDispatcher. sendRequestedEvents [ 0 ]
269
295
let batchedEvents = try ! JSONDecoder ( ) . decode ( BatchEvent . self, from: batch. body)
270
296
XCTAssertEqual ( batch. url. absoluteString, kUrlA)
@@ -273,6 +299,9 @@ extension EventDispatcherTests_Batch {
273
299
}
274
300
275
301
func testEventBatchedOnTimer( ) {
302
+ // this tests timer-based dispatch, available for iOS 10+
303
+ guard #available( iOS 10 . 0 , tvOS 10 . 0 , * ) else { return }
304
+
276
305
eventDispatcher. timerInterval = 3
277
306
278
307
eventDispatcher. exp = expectation ( description: " timer " )
@@ -315,35 +344,147 @@ extension EventDispatcherTests_Batch {
315
344
}
316
345
317
346
func testEventBatchedAndErrorRecoveredOnTimer( ) {
347
+ // this tests timer-based dispatch, available for iOS 10+
348
+ guard #available( iOS 10 . 0 , tvOS 10 . 0 , * ) else { return }
349
+
318
350
eventDispatcher. timerInterval = 5
319
-
351
+
320
352
// (1) inject error
321
-
353
+
322
354
eventDispatcher. forceError = true
323
355
eventDispatcher. exp = expectation ( description: " timer " )
324
-
356
+
325
357
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
326
358
sleep ( 1 )
327
359
eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventB) , completionHandler: nil )
328
-
360
+
329
361
// wait for the first timer-fire
330
362
wait ( for: [ eventDispatcher. exp!] , timeout: 10 )
331
363
// tranmission is expected to fail
332
364
XCTAssertEqual ( eventDispatcher. dataStore. count, 2 , " all failed to transmit, so should keep all original events " )
333
-
365
+
334
366
// (2) remove error. check if events are transmitted successfully on next timer-fire
335
367
sleep ( 3 ) // wait all failure-retries (3 times) completed
336
368
eventDispatcher. forceError = false
337
369
eventDispatcher. exp = expectation ( description: " timer " )
338
-
370
+
339
371
// wait for the next timer-fire
340
372
wait ( for: [ eventDispatcher. exp!] , timeout: 10 )
341
-
373
+
342
374
XCTAssertEqual ( eventDispatcher. dataStore. count, 0 , " all expected to get transmitted successfully " )
375
+
376
+ }
377
+
378
+ }
379
+
380
+ // MARK: - iOS9 Devices
381
+
382
+ extension EventDispatcherTests_Batch {
383
+
384
+ func testFlushEventsForIOS9Only( ) {
385
+ // this tests iOS9 (no-timer)
386
+ if #available( iOS 10 . 0 , tvOS 10 . 0 , * ) { return }
387
+
388
+ eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
389
+ eventDispatcher. dispatcher. sync { }
390
+
391
+ XCTAssertEqual ( eventDispatcher. sendRequestedEvents. count, 1 )
392
+ let batch = eventDispatcher. sendRequestedEvents [ 0 ]
393
+ let batchedEvents = try ! JSONDecoder ( ) . decode ( BatchEvent . self, from: batch. body)
394
+ XCTAssertEqual ( batch. url. absoluteString, kUrlA)
395
+ XCTAssertEqual ( batchedEvents. revision, kRevision)
396
+ XCTAssertEqual ( batchedEvents. accountID, kAccountId)
397
+ XCTAssertEqual ( batchedEvents. projectID, kProjectId)
398
+ XCTAssertEqual ( batchedEvents. clientVersion, kClientVersion)
399
+ XCTAssertEqual ( batchedEvents. clientName, kClientName)
400
+ XCTAssertEqual ( batchedEvents. anonymizeIP, kAnonymizeIP)
401
+ XCTAssertEqual ( batchedEvents. enrichDecisions, kEnrichDecision)
402
+ XCTAssertEqual ( batchedEvents. visitors [ 0 ] , visitorA)
403
+ XCTAssertEqual ( eventDispatcher. dataStore. count, 0 )
343
404
}
405
+
406
+ func testFlushEventsForIOS9Only_ZeroInterval( ) {
407
+ // this tests iOS9 (no-timer)
408
+ if #available( iOS 10 . 0 , tvOS 10 . 0 , * ) { return }
409
+
410
+ eventDispatcher. timerInterval = 0
411
+
412
+ eventDispatcher. dispatchEvent ( event: makeEventForDispatch ( url: kUrlA, event: batchEventA) , completionHandler: nil )
413
+ eventDispatcher. dispatcher. sync { }
414
+
415
+ XCTAssertEqual ( eventDispatcher. sendRequestedEvents. count, 1 )
416
+ let batch = eventDispatcher. sendRequestedEvents [ 0 ]
417
+ let batchedEvents = try ! JSONDecoder ( ) . decode ( BatchEvent . self, from: batch. body)
418
+ XCTAssertEqual ( batch. url. absoluteString, kUrlA)
419
+ XCTAssertEqual ( batchedEvents. revision, kRevision)
420
+ XCTAssertEqual ( eventDispatcher. dataStore. count, 0 )
421
+ }
422
+
423
+
424
+
425
+ // TODO: [Tom] these 2 tests fails - please take a look
426
+
427
+ // func testFlushEventsForIOS9Only_MultipleEvents_NotBatchable() {
428
+ // // this tests iOS9 (no-timer)
429
+ // if #available(iOS 10.0, tvOS 10.0, *) { return }
430
+ //
431
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlA, event: batchEventA), completionHandler: nil)
432
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlB, event: batchEventB), completionHandler: nil)
433
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlC, event: batchEventC), completionHandler: nil)
434
+ // eventDispatcher.dispatcher.sync {}
435
+ //
436
+ // continueAfterFailure = false // stop on XCTAssertEqual failure instead of array out-of-bound exception
437
+ // XCTAssertEqual(eventDispatcher.sendRequestedEvents.count, 3)
438
+ //
439
+ // var batch = eventDispatcher.sendRequestedEvents[0]
440
+ // var batchedEvents = try! JSONDecoder().decode(BatchEvent.self, from: batch.body)
441
+ // XCTAssertEqual(batch.url.absoluteString, kUrlA)
442
+ // XCTAssertEqual(batchedEvents.visitors[0], visitorA)
443
+ // XCTAssertEqual(batchedEvents.visitors.count, 1)
444
+ //
445
+ // batch = eventDispatcher.sendRequestedEvents[1]
446
+ // batchedEvents = try! JSONDecoder().decode(BatchEvent.self, from: batch.body)
447
+ // XCTAssertEqual(batch.url.absoluteString, kUrlB)
448
+ // XCTAssertEqual(batchedEvents.visitors[0], visitorB)
449
+ // XCTAssertEqual(batchedEvents.visitors.count, 1)
450
+ //
451
+ // batch = eventDispatcher.sendRequestedEvents[2]
452
+ // batchedEvents = try! JSONDecoder().decode(BatchEvent.self, from: batch.body)
453
+ // XCTAssertEqual(batch.url.absoluteString, kUrlC)
454
+ // XCTAssertEqual(batchedEvents.visitors[0], visitorC)
455
+ // XCTAssertEqual(batchedEvents.visitors.count, 1)
456
+ //
457
+ // XCTAssertEqual(eventDispatcher.dataStore.count, 0)
458
+ // }
459
+ //
460
+ // func testFlushEventsForIOS9Only_MultipleEvents_Batchable() {
461
+ // // this tests iOS9 (no-timer)
462
+ // if #available(iOS 10.0, tvOS 10.0, *) { return }
463
+ //
464
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlA, event: batchEventA), completionHandler: nil)
465
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlA, event: batchEventB), completionHandler: nil)
466
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlA, event: batchEventC), completionHandler: nil)
467
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlA, event: batchEventC), completionHandler: nil)
468
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlA, event: batchEventB), completionHandler: nil)
469
+ // eventDispatcher.dispatchEvent(event: makeEventForDispatch(url: kUrlA, event: batchEventA), completionHandler: nil)
470
+ // eventDispatcher.dispatcher.sync {}
471
+ //
472
+ // // batch is not deterministic since it is sensitive to event arrival time.
473
+ // // we check if all visitors are included in all (non-)bateched events successfully
474
+ //
475
+ // var receivedVisistors = [Visitor]()
476
+ // eventDispatcher.sendRequestedEvents.forEach { batch in
477
+ // let batchedEvents = try! JSONDecoder().decode(BatchEvent.self, from: batch.body)
478
+ // receivedVisistors.append(contentsOf: batchedEvents.visitors)
479
+ // }
480
+ //
481
+ // XCTAssertEqual(receivedVisistors, [visitorA, visitorB, visitorC, visitorC, visitorB, visitorA])
482
+ // XCTAssertEqual(eventDispatcher.dataStore.count, 0)
483
+ // }
344
484
345
485
}
346
486
487
+
347
488
// MARK: - Utils
348
489
349
490
extension EventDispatcherTests_Batch {
0 commit comments