398
404
g_object_unref (events->data);
399
405
g_list_free (events);
401
/* 4. Incoming message from a room */
402
event = g_object_new (TPL_TYPE_TEXT_EVENT,
407
/* 4. Incoming message from a room that hit some network lag. */
408
event = g_object_new (TPL_TYPE_TEXT_EVENT,
413
"timestamp", timestamp - 1,
415
"message-type", TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL,
416
"message", "my message 1",
419
_tpl_log_store_add_event (fixture->store, event, &error);
420
g_assert_no_error (error);
422
events = _tpl_log_store_get_filtered_events (fixture->store, account, room,
423
TPL_EVENT_MASK_TEXT, 2, NULL, NULL);
425
/* Events appear in their dbus-order for the most part
426
* (ignoring timestamps). */
427
g_assert_cmpint (g_list_length (events), ==, 2);
428
g_assert (TPL_IS_TEXT_EVENT (g_list_last (events)->data));
430
assert_cmp_text_event (event, g_list_last (events)->data);
432
g_object_unref (event);
433
g_list_foreach (events, (GFunc) g_object_unref, NULL);
434
g_list_free (events);
436
/* 5. Delayed delivery of incoming message from a room */
437
event = g_object_new (TPL_TYPE_TEXT_EVENT,
442
"timestamp", timestamp - (60 * 60 * 24),
444
"message-type", TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL,
445
"message", "my message 1",
448
_tpl_log_store_add_event (fixture->store, event, &error);
449
g_assert_no_error (error);
451
/* Ask for all of the events to this room... */
452
events = _tpl_log_store_get_filtered_events (fixture->store, account, room,
453
TPL_EVENT_MASK_ANY, 1000000, NULL, NULL);
455
/* ... but there are only 3. */
456
g_assert_cmpint (g_list_length (events), ==, 3);
457
g_assert (TPL_IS_TEXT_EVENT (events->data));
458
/* Also, because of the day discrepancy, this event will not appear in the
459
* order it arrived (note that the order is actually undefined (the only
460
* invariant is that we don't lose the message), so don't cry if you break
461
* this assertion, as long as you don't break message edits). */
462
assert_cmp_text_event (event, events->data);
464
g_object_unref (event);
465
g_list_foreach (events, (GFunc) g_object_unref, NULL);
466
g_list_free (events);
470
test_add_superseding_event (XmlTestCaseFixture *fixture,
471
gconstpointer user_data)
474
TplEntity *me, *contact;
476
TplTextEvent *new_event;
477
TplTextEvent *new_new_event;
478
TplTextEvent *late_event;
479
TplTextEvent *early_event;
480
GError *error = NULL;
483
gint64 timestamp = time (NULL);
485
account = tp_account_new (fixture->bus,
486
TP_ACCOUNT_OBJECT_PATH_BASE "idle/irc/me",
488
g_assert_no_error (error);
489
g_assert (account != NULL);
491
me = tpl_entity_new ("me", TPL_ENTITY_SELF, "my-alias", "my-avatar");
492
contact = tpl_entity_new ("contact", TPL_ENTITY_CONTACT, "contact-alias",
495
/* 1. Outgoing message to a contact. */
496
event = g_object_new (TPL_TYPE_TEXT_EVENT,
501
"message-token", "OMGCOMPLETELYRANDOMSTRING1",
407
502
"timestamp", timestamp,
408
503
/* TplTextEvent */
409
504
"message-type", TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL,
410
505
"message", "my message 1",
508
/* add and re-retrieve the event */
413
509
_tpl_log_store_add_event (fixture->store, event, &error);
414
510
g_assert_no_error (error);
416
events = _tpl_log_store_get_filtered_events (fixture->store, account, room,
511
events = _tpl_log_store_get_filtered_events (fixture->store, account, contact,
417
512
TPL_EVENT_MASK_TEXT, 1, NULL, NULL);
419
514
g_assert_cmpint (g_list_length (events), ==, 1);
422
517
assert_cmp_text_event (event, events->data);
424
g_object_unref (event);
425
519
g_object_unref (events->data);
426
520
g_list_free (events);
522
/* 2. Edit message 1. */
523
new_event = g_object_new (TPL_TYPE_TEXT_EVENT,
528
"timestamp", timestamp,
530
"edit-timestamp", timestamp + 1,
531
"message-token", "OMGCOMPLETELYRANDOMSTRING2",
532
"supersedes-token", "OMGCOMPLETELYRANDOMSTRING1",
533
"message-type", TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL,
534
"message", "My message 1 [FIXED]",
537
/* add and re-retrieve the event */
538
_tpl_log_store_add_event (fixture->store, TPL_EVENT (new_event), &error);
539
g_assert_no_error (error);
540
events = _tpl_log_store_get_filtered_events (fixture->store, account, contact,
541
TPL_EVENT_MASK_TEXT, 1, NULL, NULL);
542
assert_cmp_text_event (TPL_EVENT (new_event), events->data);
544
/* Check that the two events are linked */
545
superseded = tpl_text_event_get_supersedes (events->data);
546
g_assert (superseded != NULL);
547
assert_cmp_text_event (event, superseded->data);
548
g_assert (tpl_text_event_get_supersedes (superseded->data) == NULL);
550
g_list_foreach (events, (GFunc) g_object_unref, NULL);
551
g_list_free (events);
554
* Note that the (broken) edit-timestamp should not make any
555
* difference to the message processing, but it should be preserved.*/
556
new_new_event = g_object_new (TPL_TYPE_TEXT_EVENT,
561
"timestamp", timestamp,
563
"edit-timestamp", timestamp + (60 * 60 * 24),
564
"message-token", "OMGCOMPLETELYRANDOMSTRING3",
565
"supersedes-token", "OMGCOMPLETELYRANDOMSTRING1",
566
"message-type", TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL,
567
"message", "My Message 1 [FIXED] [FIXED]",
570
/* add and re-retrieve the event */
571
_tpl_log_store_add_event (fixture->store, TPL_EVENT (new_new_event), &error);
572
g_assert_no_error (error);
573
events = _tpl_log_store_get_filtered_events (fixture->store, account, contact,
574
TPL_EVENT_MASK_TEXT, 1, NULL, NULL);
575
assert_cmp_text_event (TPL_EVENT (new_new_event), events->data);
577
/* Check that the three events are linked */
578
superseded = tpl_text_event_get_supersedes (events->data);
579
g_assert (superseded != NULL);
580
assert_cmp_text_event (TPL_EVENT (new_event), superseded->data);
581
g_assert (superseded->next != NULL);
582
assert_cmp_text_event (event, superseded->next->data);
583
g_assert (tpl_text_event_get_supersedes (superseded->next->data) == NULL);
585
g_list_foreach (events, (GFunc) g_object_unref, NULL);
586
g_list_free (events);
588
/* Also note that the superseding events *replace* the old ones. */
589
events = _tpl_log_store_get_filtered_events (fixture->store, account, contact,
590
TPL_EVENT_MASK_TEXT, 1000000, NULL, NULL);
591
g_assert_cmpint (g_list_length (events), == , 1);
592
assert_cmp_text_event (TPL_EVENT (new_new_event), events->data);
594
g_list_foreach (events, (GFunc) g_object_unref, NULL);
595
g_list_free (events);
597
/* 4. Edit comes in with the wrong timestamp.
598
* Note that the (also broken) edit-timestamp should not make any
599
* difference to the message processing, but it should be preserved.*/
600
late_event = g_object_new (TPL_TYPE_TEXT_EVENT,
605
"timestamp", timestamp + (60 * 60 * 24),
607
"edit-timestamp", timestamp - (60 * 60 * 24),
608
"message-token", "OMGCOMPLETELYRANDOMSTRING4",
609
"supersedes-token", "OMGCOMPLETELYRANDOMSTRING1",
610
"message-type", TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL,
611
"message", "My Message 1 [FIXED_LATE]",
614
/* add and re-retrieve the event */
615
_tpl_log_store_add_event (fixture->store, TPL_EVENT (late_event), &error);
616
g_assert_no_error (error);
617
events = _tpl_log_store_get_filtered_events (fixture->store, account, contact,
618
TPL_EVENT_MASK_TEXT, 1, NULL, NULL);
619
assert_cmp_text_event (TPL_EVENT (late_event), events->data);
621
/* Check that the events are not linked (and a dummy was inserted instead)
622
* because the timestamp was wrong. */
623
superseded = tpl_text_event_get_supersedes (events->data);
624
g_assert (superseded != NULL);
625
g_assert_cmpstr (tpl_text_event_get_message (superseded->data), ==, "");
627
g_list_foreach (events, (GFunc) g_object_unref, NULL);
628
g_list_free (events);
630
/* And if we ask for all of the events, there will be 2 there. */
631
events = _tpl_log_store_get_filtered_events (fixture->store, account, contact,
632
TPL_EVENT_MASK_TEXT, 1000000, NULL, NULL);
633
g_assert_cmpint (g_list_length (events), == , 2);
634
assert_cmp_text_event (TPL_EVENT (new_new_event), events->data);
635
assert_cmp_text_event (TPL_EVENT (late_event), g_list_last (events)->data);
637
g_list_foreach (events, (GFunc) g_object_unref, NULL);
638
g_list_free (events);
640
/* 5. If we have an event that is broken in the other direction then it will
641
* also come out as a separate event (since each day is parsed on its own).
642
* Even though we don't currently omit edit-timestamp, we might as well
643
* see what happens if we forget it. */
644
early_event = g_object_new (TPL_TYPE_TEXT_EVENT,
649
"timestamp", timestamp - (60 * 60 * 24),
651
"message-token", "OMGCOMPLETELYRANDOMSTRING5",
652
"supersedes-token", "OMGCOMPLETELYRANDOMSTRING1",
653
"message-type", TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL,
654
"message", "My Message 1 [FIXED_EARLY]",
657
/* And if we ask for all of the events, there will be 3 there. */
658
_tpl_log_store_add_event (fixture->store, TPL_EVENT (early_event), &error);
659
g_assert_no_error (error);
660
events = _tpl_log_store_get_filtered_events (fixture->store, account, contact,
661
TPL_EVENT_MASK_TEXT, 1000000, NULL, NULL);
662
g_assert_cmpint (g_list_length (events), ==, 3);
663
assert_cmp_text_event (TPL_EVENT (early_event), events->data);
664
assert_cmp_text_event (TPL_EVENT (new_new_event), events->next->data);
665
assert_cmp_text_event (TPL_EVENT (late_event), g_list_last (events)->data);
667
g_list_foreach (events, (GFunc) g_object_unref, NULL);
668
g_list_free (events);
670
g_object_unref (event);
671
g_object_unref (new_event);
672
g_object_unref (new_new_event);
673
g_object_unref (late_event);
674
g_object_unref (early_event);
431
678
assert_cmp_call_event (TplEvent *event,
432
679
TplEvent *stored_event)
698
946
user4 = tpl_entity_new ("user4@collabora.co.uk", TPL_ENTITY_CONTACT,
949
user5 = tpl_entity_new ("user5@collabora.co.uk", TPL_ENTITY_CONTACT,
952
/* Check that text event and call event are merged properly, call events
953
* should come after any older or same timestamp event. */
701
954
events = _tpl_log_store_get_events_for_date (fixture->store, account, user4,
702
955
TPL_EVENT_MASK_ANY, date);
704
957
g_assert_cmpint (g_list_length (events), ==, 6);
706
g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 0)));
960
g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx)));
707
961
g_assert_cmpstr (
708
tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 0))),
962
tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))),
711
g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 1)));
965
g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx)));
967
tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))),
970
g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx)));
712
971
g_assert_cmpint (
713
tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 1))),
972
tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))),
716
g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 2)));
975
g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx)));
717
976
g_assert_cmpint (
718
tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 2))),
977
tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))),
721
g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 3)));
980
g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx)));
722
981
g_assert_cmpint (
723
tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 3))),
982
tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))),
726
g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 4)));
728
tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 4))),
731
g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 5)));
733
tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 5))),
736
g_list_foreach (events, (GFunc) g_object_unref, NULL);
737
g_list_free (events);
985
g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx)));
987
tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))),
990
g_list_foreach (events, (GFunc) g_object_unref, NULL);
991
g_list_free (events);
993
/* Check that a call older then any text event is sorted first */
994
events = _tpl_log_store_get_events_for_date (fixture->store, account, user5,
995
TPL_EVENT_MASK_ANY, date);
997
g_assert_cmpint (g_list_length (events), ==, 2);
1000
g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx)));
1002
tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))),
1005
g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx)));
1007
tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))),
1010
g_list_foreach (events, (GFunc) g_object_unref, NULL);
1011
g_list_free (events);
1013
/* Check that call mask work */
739
1014
events = _tpl_log_store_get_events_for_date (fixture->store, account, user4,
740
1015
TPL_EVENT_MASK_CALL, date);