From 28758be915194fb1cae2ad6ffc1327653f380871 Mon Sep 17 00:00:00 2001 From: td Date: Wed, 31 Jul 2024 14:13:14 +0530 Subject: [PATCH 1/3] chore: increase log level to verbose in tests --- test/fake_client.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fake_client.dart b/test/fake_client.dart index 331f3f68..42911fe5 100644 --- a/test/fake_client.dart +++ b/test/fake_client.dart @@ -32,6 +32,7 @@ Future getClient({ String? databasePath, }) async { final client = Client( + logLevel: Level.verbose, 'testclient', httpClient: FakeMatrixApi(), databaseBuilder: (client) => From 1cb3dd1b5984bf08bca1020a58ac671e98513150 Mon Sep 17 00:00:00 2001 From: td Date: Wed, 31 Jul 2024 14:13:30 +0530 Subject: [PATCH 2/3] chore: add info about tests to readme --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f74ed8e2..14c01c9e 100644 --- a/README.md +++ b/README.md @@ -20,4 +20,14 @@ flutter pub add flutter_openssl_crypto See the API documentation for details: -[API documentation](https://pub.dev/documentation/matrix/latest/) \ No newline at end of file +[API documentation](https://pub.dev/documentation/matrix/latest/) + +### Tests + +```shell +thread_count=$(getconf _NPROCESSORS_ONLN) // or your favourite number :3 +dart test --concurrency=$thread_count test +``` + +- Adding the `-x olm` flag will skip tests which require olm +- Using `-t olm` will run only olm specific tests, but these will probably break as they need prior setup (which is not marked as olm and hence won't be run) From 4eb18f670f62c90ff23f48501045fe720cb4896f Mon Sep 17 00:00:00 2001 From: td Date: Wed, 31 Jul 2024 14:36:25 +0530 Subject: [PATCH 3/3] fix: update last event properly on cancel send also stores status in db --- lib/src/event.dart | 48 +++- lib/src/event_status.dart | 21 +- .../utils/matrix_default_localizations.dart | 3 + lib/src/utils/matrix_localizations.dart | 2 + test/event_test.dart | 4 +- test/room_test.dart | 231 +++++++++--------- 6 files changed, 169 insertions(+), 140 deletions(-) diff --git a/lib/src/event.dart b/lib/src/event.dart index 93268909..79695014 100644 --- a/lib/src/event.dart +++ b/lib/src/event.dart @@ -225,6 +225,7 @@ class Event extends MatrixEvent { if (originalSource != null) { data['original_source'] = originalSource?.toJson(); } + data['status'] = status.intValue; return data; } @@ -349,12 +350,42 @@ class Event extends MatrixEvent { /// Removes an unsent or yet-to-send event from the database and timeline. /// These are events marked with the status `SENDING` or `ERROR`. /// Throws an exception if used for an already sent event! + /// Future cancelSend() async { if (status.isSent) { throw Exception('Can only delete events which are not sent yet!'); } await room.client.database?.removeEvent(eventId, room.id); + + if (room.lastEvent != null && room.lastEvent!.eventId == eventId) { + final redactedBecause = Event.fromMatrixEvent( + MatrixEvent( + type: EventTypes.Redaction, + content: {'redacts': eventId}, + redacts: eventId, + senderId: senderId, + eventId: '${eventId}_cancel_send', + originServerTs: DateTime.now(), + ), + room, + ); + + await room.client.handleSync( + SyncUpdate( + nextBatch: '', + rooms: RoomsUpdate( + join: { + room.id: JoinedRoomUpdate( + timeline: TimelineUpdate( + events: [redactedBecause], + ), + ) + }, + ), + ), + ); + } room.client.onCancelSendEvent.add(eventId); } @@ -687,12 +718,14 @@ class Event extends MatrixEvent { await fetchSenderUser(); } - return calcLocalizedBodyFallback(i18n, - withSenderNamePrefix: withSenderNamePrefix, - hideReply: hideReply, - hideEdit: hideEdit, - plaintextBody: plaintextBody, - removeMarkdown: removeMarkdown); + return calcLocalizedBodyFallback( + i18n, + withSenderNamePrefix: withSenderNamePrefix, + hideReply: hideReply, + hideEdit: hideEdit, + plaintextBody: plaintextBody, + removeMarkdown: removeMarkdown, + ); } @Deprecated('Use calcLocalizedBody or calcLocalizedBodyFallback') @@ -721,6 +754,9 @@ class Event extends MatrixEvent { bool plaintextBody = false, bool removeMarkdown = false}) { if (redacted) { + if (status.intValue < EventStatus.synced.intValue) { + return i18n.cancelledSend; + } return i18n.removedBy(this); } diff --git a/lib/src/event_status.dart b/lib/src/event_status.dart index 77f529bc..418924c1 100644 --- a/lib/src/event_status.dart +++ b/lib/src/event_status.dart @@ -15,12 +15,11 @@ enum EventStatus { /// Returns `EventStatusEnum` value from `intValue`. /// -/// - -2 == removed; -/// - -1 == error; -/// - 0 == sending; -/// - 1 == sent; -/// - 2 == synced; -/// - 3 == roomState; +/// - -2 == error; +/// - -1 == sending; +/// - 0 == sent; +/// - 1 == synced; +/// - 2 == roomState; EventStatus eventStatusFromInt(int intValue) => EventStatus.values[intValue + 2]; @@ -32,11 +31,11 @@ EventStatus latestEventStatus(EventStatus status1, EventStatus status2) => extension EventStatusExtension on EventStatus { /// Returns int value of the event status. /// - /// - -1 == error; - /// - 0 == sending; - /// - 1 == sent; - /// - 2 == synced; - /// - 3 == roomState; + /// - -2 == error; + /// - -1 == sending; + /// - 0 == sent; + /// - 1 == synced; + /// - 2 == roomState; int get intValue => (index - 2); /// Return `true` if the `EventStatus` equals `error`. diff --git a/lib/src/utils/matrix_default_localizations.dart b/lib/src/utils/matrix_default_localizations.dart index ffa0b7b3..aea24605 100644 --- a/lib/src/utils/matrix_default_localizations.dart +++ b/lib/src/utils/matrix_default_localizations.dart @@ -125,6 +125,9 @@ class MatrixDefaultLocalizations extends MatrixLocalizations { @override String get guestsCanJoin => 'Guests can join'; + @override + String get cancelledSend => 'Cancelled sending message'; + @override String hasWithdrawnTheInvitationFor(String senderName, String targetName) => '$senderName has withdrawn the invitation for $targetName'; diff --git a/lib/src/utils/matrix_localizations.dart b/lib/src/utils/matrix_localizations.dart index 9ef98005..d76451f4 100644 --- a/lib/src/utils/matrix_localizations.dart +++ b/lib/src/utils/matrix_localizations.dart @@ -60,6 +60,8 @@ abstract class MatrixLocalizations { String get unknownUser; + String get cancelledSend; + String youInvitedBy(String senderName); String invitedBy(String senderName); diff --git a/test/event_test.dart b/test/event_test.dart index 8428b078..ea139fa7 100644 --- a/test/event_test.dart +++ b/test/event_test.dart @@ -57,7 +57,6 @@ void main() { jsonObj, Room(id: '!testroom:example.abc', client: client)); test('Create from json', () async { - jsonObj.remove('status'); jsonObj['content'] = json.decode(contentJson); expect(event.toJson(), jsonObj); jsonObj['content'] = contentJson; @@ -227,7 +226,8 @@ void main() { 'room_id': '1234', 'sender': '@example:example.org', 'type': 'm.room.redaction', - 'unsigned': {'age': 1234} + 'unsigned': {'age': 1234}, + 'status': 1, }; final redactedBecause = Event.fromJson(redactionEventJson, room); final event = Event.fromJson(redactJsonObj, room); diff --git a/test/room_test.dart b/test/room_test.dart index 8e1aa081..3e08e2cc 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -18,6 +18,7 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:math'; import 'dart:typed_data'; import 'package:test/test.dart'; @@ -292,6 +293,9 @@ void main() { ), ); expect(room.lastEvent?.body, 'cdc'); // because we edited the "cd" message + + // update even when status is sending + // https://github.com/famedly/matrix-dart-sdk/pull/1852#issuecomment-2173019450 await updateLastEvent( Event( senderId: '@test:example.com', @@ -313,8 +317,34 @@ void main() { ), ); expect(room.lastEvent?.body, 'edited cdc'); - expect(room.lastEvent?.status, EventStatus.sending); - expect(room.lastEvent?.eventId, '4'); + + // change because sent + await updateLastEvent( + Event( + senderId: '@test:example.com', + type: 'm.room.encrypted', + room: room, + eventId: '5', + originServerTs: DateTime.now(), + content: { + 'msgtype': 'm.text', + 'body': 'edited cdc just because', + 'm.new_content': { + 'msgtype': 'm.text', + 'body': 'edited cdc just because' + }, + 'm.relates_to': {'rel_type': 'm.replace', 'event_id': '2'}, + }, + unsigned: { + messageSendingStatusKey: EventStatus.sent.intValue, + 'transaction_id': 'messageID', + }, + status: EventStatus.sent, + ), + ); + expect(room.lastEvent?.body, 'edited cdc just because'); + expect(room.lastEvent?.status, EventStatus.sent); + expect(room.lastEvent?.eventId, '5'); // Status update on edits working? await updateLastEvent( @@ -322,7 +352,7 @@ void main() { senderId: '@test:example.com', type: 'm.room.encrypted', room: room, - eventId: '5', + eventId: '6', unsigned: { 'transaction_id': '4', messageSendingStatusKey: EventStatus.sent.intValue, @@ -330,24 +360,28 @@ void main() { originServerTs: DateTime.now(), content: { 'msgtype': 'm.text', - 'body': 'edited cdc', - 'm.new_content': {'msgtype': 'm.text', 'body': 'edited cdc'}, + 'body': 'edited cdc is back!', + 'm.new_content': { + 'msgtype': 'm.text', + 'body': 'edited cdc is back!' + }, 'm.relates_to': {'rel_type': 'm.replace', 'event_id': '2'}, }, stateKey: '', status: EventStatus.sent, ), ); - expect(room.lastEvent?.eventId, '5'); - expect(room.lastEvent?.body, 'edited cdc'); + expect(room.lastEvent?.eventId, '6'); + expect(room.lastEvent?.body, 'edited cdc is back!'); expect(room.lastEvent?.status, EventStatus.sent); + // Are reactions coming through? await updateLastEvent( Event( senderId: '@test:example.com', type: EventTypes.Reaction, room: room, - eventId: '123456', + eventId: 'lastEvent_reactions_dont_matter', originServerTs: DateTime.now(), content: { 'm.relates_to': { @@ -358,8 +392,8 @@ void main() { }, ), ); - expect(room.lastEvent?.eventId, '5'); - expect(room.lastEvent?.body, 'edited cdc'); + expect(room.lastEvent?.eventId, '6'); + expect(room.lastEvent?.body, 'edited cdc is back!'); expect(room.lastEvent?.status, EventStatus.sent); }); @@ -1522,121 +1556,76 @@ void main() { 'https://matrix.to/#/!localpart%3Aserver.abc?via=fakeServer.notExisting&via=matrix.org&via=test.abc'); }); - test('EventTooLarge on exceeding max PDU size', () async { + test('cancelSend because EventTooLarge in postLoaded room', () async { + expect(room.partial, false); + await room.sendTextEvent( + 'older_event', + txid: 'older_event', + ); + + // check if persisted in db + final sentEventFromDB = + await matrix.database?.getEventById('older_event', room); + expect(sentEventFromDB?.eventId, 'older_event'); + Room? roomFromDB; + + roomFromDB = await matrix.database?.getSingleRoom(matrix, room.id); + expect(roomFromDB?.lastEvent?.eventId, 'older_event'); + + expect(room.lastEvent?.body, 'older_event'); + // status will be error here because fakeapi + // but enough for us to fallback after calling cancelSend below + expect(room.lastEvent?.eventId, 'older_event'); + try { - await room.sendTextEvent(''' - -Հայերեն Shqip Български Català 中文简体 Hrvatski Česky Dansk Nederlands English Eesti Filipino Suomi Français ქართული Deutsch हिन्दी Magyar Indonesia Italiano Latviski Lietuviškai македонски Melayu Norsk Polski Português Româna Pyccкий Српски Slovenčina Slovenščina Español Svenska ไทย Türkçe Українська Tiếng Việt -Lorem Ipsum -"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..." -"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain..." - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce laoreet imperdiet molestie. Nulla facilisi. Duis pulvinar in dui in congue. Proin at odio eget urna facilisis ultricies et ac ipsum. Nam aliquam augue nunc, eget porta est aliquam a. Maecenas convallis sit amet justo vitae mollis. Duis luctus eleifend lacinia. Sed dictum nulla quis erat dapibus, at sollicitudin felis bibendum. Aenean ultricies, sem ac sollicitudin lobortis, nunc lectus aliquet arcu, in consequat lectus purus non quam. Suspendisse efficitur sagittis est a malesuada. Duis dictum mollis sem. Duis erat quam, malesuada non quam ac, rutrum varius mi. - -Fusce eleifend id arcu eu efficitur. Sed eu nisl ullamcorper, laoreet erat eget, tempor dui. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce congue faucibus enim, vitae aliquam magna. Quisque pharetra ut diam eget elementum. Etiam eget sapien velit. Pellentesque interdum, urna id laoreet commodo, tortor orci mollis orci, in sodales magna justo vel lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent semper, diam quis condimentum sagittis, felis arcu euismod quam, et vulputate tellus nibh quis libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. - -Phasellus nec elit erat. Phasellus vitae mi tempor, gravida orci sed, efficitur purus. Quisque a malesuada nunc. Phasellus varius convallis turpis non porttitor. Nulla venenatis feugiat convallis. Fusce eu pharetra erat. Aliquam in scelerisque eros, aliquam efficitur dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. - -Nunc vehicula libero libero, in tempus quam hendrerit at. Maecenas mattis, ligula sit amet placerat fringilla, diam erat viverra sapien, sit amet vehicula augue tellus sed nunc. Aliquam condimentum tristique tortor vel tincidunt. Nam iaculis tellus enim, vel finibus nulla pharetra eu. Quisque eu tristique enim. Morbi urna neque, tincidunt at malesuada non, fringilla ac arcu. Aliquam sed massa in odio consectetur volutpat. Donec ultrices, elit sed rhoncus blandit, ex tellus molestie magna, id iaculis elit libero ut augue. In fringilla ipsum a ante blandit, nec ornare ante dignissim. Mauris fermentum nisl in turpis gravida pellentesque. - -Sed fermentum sapien vitae laoreet tempor. Donec dapibus pulvinar lectus. Phasellus odio ipsum, fringilla quis ultrices ut, posuere egestas arcu. Donec ac pulvinar tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Aenean vitae mi a est ornare maximus at nec tortor. Quisque sit amet velit lacus. - -Nunc eget mollis nisl, et interdum ex. Nam ac augue laoreet orci ullamcorper condimentum. Donec luctus nisl at dui tristique, et viverra dui maximus. Quisque ut ex augue. Nullam venenatis id nunc quis pulvinar. Fusce nulla augue, lacinia nec vehicula a, suscipit suscipit magna. In et consectetur felis. - -Pellentesque suscipit augue in ipsum bibendum, et pretium arcu sagittis. Morbi quis purus nec tellus luctus imperdiet. Nullam porta, tellus at malesuada auctor, neque odio posuere magna, in auctor turpis lorem eu sapien. Vivamus tortor mauris, pellentesque ac aliquam id, tincidunt vel metus. Aliquam pharetra augue sapien, quis maximus nisi ullamcorper sit amet. Donec finibus velit nec massa imperdiet consequat. In nec neque justo. Vestibulum tristique placerat felis, quis ornare lacus maximus ut. - -Donec in sapien lectus. Nunc condimentum risus quis enim accumsan, quis consequat arcu auctor. In vel odio egestas, sollicitudin quam et, rutrum lectus. Mauris hendrerit rutrum cursus. Mauris sem ante, pretium sit amet risus in, semper auctor ligula. Integer ac urna leo. Aenean nec faucibus ipsum. Nam porttitor, felis quis vehicula vestibulum, mi metus malesuada purus, sed blandit ipsum libero molestie leo. Nam lacinia justo diam, convallis hendrerit eros maximus in. Phasellus fringilla consequat tempor. Sed nec arcu imperdiet, ullamcorper mi nec, faucibus libero. - -Curabitur vestibulum pretium sem sit amet eleifend. Ut lectus enim, faucibus at fermentum dapibus, viverra ac mauris. Ut eu ex pretium, egestas eros sodales, imperdiet risus. Etiam vitae tincidunt urna, et varius lectus. Aliquam erat volutpat. Pellentesque consectetur ex at dolor aliquet dapibus. Quisque vestibulum rhoncus tortor at semper. Nulla pharetra condimentum diam ac porta. Cras at interdum mi. Curabitur mattis lacus id neque euismod dignissim. Nullam nibh arcu, commodo nec blandit nec, placerat quis dolor. Cras finibus, arcu eu tempus pulvinar, turpis mi dapibus nibh, a vestibulum dui nulla id nulla. Sed dictum dolor at tempor imperdiet. Praesent vel lacus arcu. Mauris aliquam lacus in eros tincidunt iaculis. Sed vitae aliquam tortor, ut sodales diam. - -Aenean eu erat consequat, fermentum ex id, scelerisque tortor. Vestibulum eros nibh, consectetur quis maximus non, mattis non urna. Nullam at ligula ut nibh molestie elementum. Fusce accumsan arcu mattis arcu ultrices, sodales gravida nunc malesuada. Nam nec tincidunt mi. Cras sed tempor lacus. Donec maximus nunc id est hendrerit aliquet. Nulla elementum malesuada felis rutrum bibendum. Pellentesque non nisi vitae tellus consectetur tincidunt. Vestibulum ac magna pulvinar, semper velit et, eleifend dui. Fusce efficitur nulla dui, eget placerat risus vestibulum vitae. Praesent augue nisl, tempor sit amet arcu ac, rhoncus mattis magna. Sed pulvinar turpis a magna condimentum, a egestas turpis commodo. - -Phasellus id ante et purus tincidunt fermentum. Duis augue ante, laoreet eget tincidunt in, auctor at risus. Sed lacinia libero nisi, ac fringilla nisi sollicitudin ut. Integer auctor tristique placerat. In hac habitasse platea dictumst. Maecenas at rutrum neque. In scelerisque id lectus ut vulputate. Nullam aliquet pretium nulla ut bibendum. Aenean at tellus eget purus pulvinar vulputate. Mauris scelerisque porta elit sed rhoncus. Phasellus mollis nibh et elit fringilla, eget pharetra elit ornare. Proin malesuada ultrices enim sed egestas. Cras eu rhoncus nibh, nec aliquet velit. Pellentesque mattis placerat lorem sed pretium. - -Vivamus quis ultricies magna, sed pellentesque erat. Praesent non volutpat odio. Sed nisl metus, dignissim sed gravida sit amet, ultricies vel urna. Integer semper ex sed felis ullamcorper suscipit. Quisque et molestie velit, a pellentesque nulla. Nam iaculis tristique ipsum, a facilisis orci tristique et. Suspendisse pellentesque magna ut ligula accumsan, sit amet convallis sapien fermentum. Nulla mattis nunc justo. Vivamus semper sapien non turpis gravida, sed pellentesque leo imperdiet. Aenean eget justo quis ipsum aliquam faucibus sed eget orci. Nulla in bibendum tortor, eu lobortis lacus. Morbi tincidunt auctor purus, sit amet viverra metus condimentum aliquet. Aenean nec urna mollis, egestas elit non, lacinia eros. Curabitur mi odio, sodales vel ipsum id, hendrerit condimentum dui. - -Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec nunc odio, cursus quis sodales ac, porta eget purus. Mauris non est sit amet velit accumsan dignissim. Nam quis ultricies magna. Nulla facilisi. Pellentesque malesuada est a fringilla consectetur. Pellentesque ipsum eros, ultrices id viverra nec, tempus ut eros. Suspendisse commodo elit vel nisl commodo, non auctor justo dignissim. In sed pharetra ligula, sed lacinia felis. Nulla sodales elit sed erat dignissim faucibus. Etiam a augue ut tortor consectetur pellentesque et in mauris. Pellentesque convallis ligula eget arcu ornare, a tincidunt eros rutrum. Donec eu tellus sollicitudin, rhoncus turpis in, interdum odio. Vestibulum interdum orci convallis nisl ornare dignissim. - -Vivamus sagittis nunc eget ipsum dapibus euismod. Nunc sollicitudin elementum cursus. Vivamus ac sollicitudin leo, eget pretium libero. Vestibulum aliquet, turpis eget aliquet egestas, turpis dui ornare velit, et volutpat nisi felis vitae libero. Proin ut sapien urna. Ut eget nibh et mi maximus scelerisque. Nulla facilisis augue sem, sed auctor dolor bibendum at. Fusce eu volutpat magna. - -Aliquam ac ante porta, molestie magna tempus, dictum eros. Praesent consectetur interdum nulla, non rutrum libero egestas id. Phasellus sapien nulla, malesuada eu massa vehicula, tincidunt laoreet ipsum. Morbi eu luctus metus. Curabitur at tellus est. Cras blandit sed turpis sit amet fermentum. Morbi vitae enim lectus. - -Nulla dignissim dictum maximus. Pellentesque varius tincidunt justo, non dignissim erat egestas id. Cras vitae elit sed dui consectetur finibus vitae eu nunc. Vivamus mattis posuere neque viverra dapibus. Donec congue nunc at massa rutrum, a tristique mi rutrum. Sed accumsan malesuada sagittis. Vivamus nunc leo, aliquet eget mattis vitae, fermentum quis mi. Donec fermentum metus nec risus ultricies, sed dapibus orci dapibus. In nibh felis, feugiat vitae felis vel, dignissim molestie lorem. Fusce tincidunt, lorem et feugiat euismod, quam odio feugiat purus, at sagittis arcu nisi sed diam. Maecenas vestibulum sapien libero, sit amet feugiat nibh pellentesque in. Morbi velit lectus, varius vitae euismod id, mollis in est. Vestibulum vel risus pellentesque, placerat metus eget, cursus dolor. - -Duis eu finibus dui. In hac habitasse platea dictumst. Mauris ut elit ut ex malesuada dignissim a tristique dui. Fusce et fringilla dui. Praesent a pretium nulla, elementum tempor lacus. Aliquam maximus elit at orci pellentesque consequat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec venenatis consequat lectus, in cursus nisi ullamcorper eget. Nam tincidunt velit quis lorem eleifend sodales. Fusce ac lectus non lectus vehicula convallis. Maecenas tristique nisi mi, sed accumsan diam luctus nec. Praesent non vehicula purus. Fusce ac erat in leo mattis pharetra. Sed et sapien eget ipsum convallis congue. - -Fusce convallis, lorem ut luctus venenatis, tortor eros ultricies mi, eu ultricies elit elit at nunc. Mauris semper sagittis condimentum. Fusce consequat porta augue, nec aliquet lacus vestibulum vel. Nam mollis ultricies dui, non maximus urna semper in. Curabitur in lacus pharetra libero blandit mollis. Morbi bibendum at nulla in suscipit. Cras sit amet eros fermentum, interdum erat id, sagittis lorem. Aliquam augue felis, laoreet nec tempus nec, porttitor a augue. Praesent placerat et velit sed maximus. Sed malesuada, purus in porttitor congue, nisi magna pulvinar turpis, et viverra sem nunc eu velit. Fusce augue enim, pulvinar eu leo eget, eleifend blandit metus. Etiam feugiat erat eget efficitur viverra. Vestibulum elit ligula, aliquet sed malesuada a, auctor ut odio. Aenean tincidunt tristique velit nec finibus. Suspendisse eu consequat quam, ac faucibus risus. - -Maecenas fermentum tristique velit eget convallis. Proin elementum risus nibh, sed mattis risus mattis bibendum. Nullam id pulvinar arcu. Pellentesque lobortis, arcu et vulputate placerat, quam justo congue nunc, ut pharetra eros nibh eget massa. Nam vel lorem risus. Aliquam egestas volutpat sem malesuada fermentum. Sed justo tellus, mattis nec sapien varius, imperdiet iaculis eros. Maecenas eu congue elit. Nam finibus nisi sit amet sagittis tincidunt. Proin vitae pretium ante. Cras nulla dui, condimentum eget massa eu, ullamcorper posuere justo. Maecenas lobortis vestibulum ligula, eget consequat nibh vulputate sed. Aenean lorem ligula, suscipit sed placerat ut, mattis quis nulla. - -Cras diam sem, egestas sed tempor vel, placerat eget orci. Cras et sem a sapien ullamcorper imperdiet. Cras vulputate rutrum posuere. Morbi elementum lorem eget mi mattis aliquet. Nullam gravida eros metus, pharetra hendrerit felis sollicitudin vitae. Donec ultricies arcu nec semper lobortis. Vivamus sollicitudin ex diam, vitae egestas nulla ullamcorper ut. - -Aenean pretium sem id justo feugiat, porta fermentum nibh auctor. Quisque et venenatis est, vel semper urna. Suspendisse aliquet sit amet nisi non pretium. Nam sit amet ipsum feugiat, lacinia diam et, lobortis magna. Praesent luctus egestas nisl, quis euismod mi mollis ac. Aenean consequat lobortis mollis. Vestibulum diam tortor, laoreet a nunc vulputate, imperdiet luctus libero. Integer id nisi eu lorem commodo lobortis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In elit augue, feugiat at feugiat in, fermentum eu justo. Ut ut neque nisi. Maecenas tristique vestibulum quam, vel blandit erat ornare eget. Quisque ullamcorper tellus sit amet justo dictum laoreet. Praesent at elit condimentum, accumsan tortor vitae, ultrices justo. Cras in cursus justo, sit amet malesuada turpis. Suspendisse porta, turpis quis porttitor pharetra, ante erat ornare libero, nec pulvinar felis ex sed magna. - -Maecenas ac nisi quis nulla fringilla faucibus. Sed non lorem consectetur, tempor sem at, maximus libero. Sed aliquam facilisis varius. Curabitur quis molestie ante, sed finibus enim. Duis mattis arcu vitae viverra elementum. Suspendisse efficitur orci et justo ultrices porttitor. Donec scelerisque accumsan iaculis. Integer quis porttitor odio. Mauris in nisi quis ipsum dignissim condimentum. Phasellus ante lacus, porta pretium magna ac, tincidunt ornare urna. Curabitur semper ornare consequat. Maecenas commodo posuere nunc quis dapibus. Proin tincidunt malesuada arcu, nec consectetur magna tempor nec. - -Pellentesque neque risus, tempor a blandit non, tempor non lorem. Proin vitae turpis erat. Donec non ante non lacus elementum mollis nec at elit. Nunc facilisis eu sem sed commodo. Sed tristique euismod cursus. Maecenas sit amet ipsum laoreet dui faucibus pellentesque. In a porttitor nibh, a semper justo. Pellentesque vulputate commodo dolor eget sagittis. Nullam venenatis congue facilisis. Nam aliquam, nisl et vulputate sollicitudin, risus dolor iaculis magna, et suscipit nulla enim ut risus. Etiam vehicula sed leo ut volutpat. - -Maecenas condimentum lobortis eros, vehicula egestas augue pharetra sed. Pellentesque ac augue vel quam convallis imperdiet nec a orci. Mauris hendrerit hendrerit elit, sed sodales arcu feugiat ut. Fusce sit amet augue pulvinar, vehicula mauris non, posuere elit. In sed ante vel neque efficitur malesuada sed eu est. Etiam accumsan dapibus placerat. Aenean aliquet porta lacus, et dictum ipsum tincidunt id. Sed ut lacinia eros, vel maximus ligula. Maecenas scelerisque, nibh id porta semper, purus quam feugiat massa, vitae convallis tortor augue quis nisi. In in enim sagittis, dapibus enim at, gravida velit. Etiam sodales libero eget lectus posuere aliquam. Proin fermentum, justo eu tempor luctus, lacus nisi bibendum eros, et vulputate nunc sem porta neque. - -Fusce eu ipsum tellus. Sed et vulputate sem. Sed nec ipsum dictum, molestie lorem ut, pretium dolor. Vestibulum iaculis dignissim mi, vel lacinia sem consectetur a. Quisque in tortor eget enim viverra rhoncus eget eu magna. Sed ut sollicitudin lorem, in semper justo. Maecenas congue dui vitae sapien molestie interdum quis quis velit. Quisque nec sem in erat tempor sodales in quis nunc. - -Maecenas eleifend libero sed enim iaculis, vitae vestibulum elit auctor. Mauris nunc ligula, gravida sodales sagittis a, molestie a dui. Proin faucibus id sem imperdiet facilisis. Aenean aliquet ac diam eu facilisis. Maecenas interdum pellentesque augue quis aliquet. Sed iaculis mattis luctus. Pellentesque porttitor nisi eu sapien dictum, rhoncus laoreet neque vehicula. Vivamus in nisi justo. Aenean est leo, aliquet nec eros ut, hendrerit fermentum arcu. Praesent eget mi ultrices, semper mi ut, porta dui. Fusce vestibulum lacus augue, quis viverra lacus elementum euismod. Nullam tempus tincidunt blandit. Quisque ultricies mauris feugiat, pretium justo consectetur, lacinia metus. Maecenas condimentum augue arcu, vitae congue purus fringilla volutpat. - -Ut molestie massa libero, tempus finibus magna ultrices ut. Nunc consectetur arcu ultrices pharetra rutrum. Mauris fringilla hendrerit blandit. Phasellus ultrices consectetur purus, id bibendum velit elementum non. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla eu urna non felis facilisis finibus sed ac purus. Vivamus vestibulum, turpis ut tincidunt cursus, libero lectus ultricies quam, at vulputate arcu sem at nisi. Quisque ac mi sit amet nisi vestibulum faucibus ut a arcu. - -Suspendisse ornare auctor gravida. Donec vitae pellentesque risus. In placerat commodo sapien in laoreet. Quisque tempus ipsum nulla, a rhoncus nunc tincidunt id. In non luctus odio. Suspendisse non pretium nisi. Morbi orci eros, porttitor quis augue sit amet, rhoncus sodales erat. Phasellus at aliquet orci. - -Aliquam condimentum, ipsum quis consectetur posuere, magna justo posuere tortor, nec aliquet massa libero in orci. Cras quam lacus, dapibus a elit eu, maximus eleifend velit. Donec erat quam, egestas at viverra et, posuere sed neque. Praesent mattis nibh eget augue convallis, sit amet mattis purus rutrum. Nam nec ligula auctor, bibendum purus non, vestibulum mi. Curabitur fringilla consectetur dapibus. Donec dapibus blandit ultrices. Nulla sed sollicitudin arcu, vitae rhoncus risus. Vestibulum fermentum, libero vel aliquam hendrerit, orci felis vehicula diam, condimentum gravida sem arcu ut felis. Quisque id neque accumsan eros viverra tincidunt nec sit amet velit. Donec urna dui, pulvinar ut nisl a, luctus rutrum mi. Nulla erat odio, vulputate luctus consequat vulputate, venenatis a enim. Maecenas at suscipit justo, ac gravida odio. - -Duis elementum velit ac mauris elementum, sed eleifend tellus pharetra. Praesent eu consectetur ipsum. Proin vel bibendum ex. Nulla feugiat felis magna, et pharetra risus tempor vitae. Donec quis metus dui. Nunc egestas porttitor massa, id lacinia velit fermentum eu. Sed porttitor ligula nulla, eu auctor ex eleifend nec. Morbi viverra luctus ligula, eu facilisis nisi interdum ut. Phasellus auctor mauris ac ipsum eleifend, vitae ultrices est fermentum. Fusce fermentum maximus vehicula. Integer ullamcorper lectus non magna tempor venenatis. Donec non accumsan massa. Integer eu justo in velit mattis facilisis. - -In venenatis felis vel mi congue, a pulvinar velit volutpat. In nec justo sed dolor egestas tincidunt non et augue. Curabitur consectetur sem sed fringilla gravida. Duis porta mi arcu, vitae sodales ex scelerisque non. Duis a ante a orci ultricies molestie sed ac erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis auctor odio ut feugiat fermentum. Nunc maximus metus in finibus rutrum. Nulla suscipit metus sit amet neque pulvinar bibendum aliquam sed ipsum. Nunc purus neque, lobortis vitae hendrerit non, imperdiet a ipsum. Praesent ultricies justo ut aliquam laoreet. Etiam vel varius eros. Aliquam at consequat massa. - -Nulla ultrices arcu in vehicula eleifend. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam volutpat eleifend ultricies. Nunc fringilla turpis malesuada mi porttitor, a interdum mauris vestibulum. Ut eu orci quis ipsum finibus molestie vel vitae orci. Proin sollicitudin erat sapien, ac rutrum tortor fermentum in. In iaculis placerat neque ut rutrum. Donec enim felis, efficitur imperdiet viverra vel, sagittis eget ligula. - -Aliquam a purus aliquam, rhoncus diam sed, egestas odio. Etiam tincidunt lacus non magna blandit sagittis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam erat volutpat. Quisque ex est, lacinia ut auctor a, posuere vel sapien. Vivamus urna diam, condimentum et feugiat sed, ornare et nisi. Cras ac quam at velit iaculis luctus non sed ante. Donec bibendum quam metus, sit amet facilisis ligula euismod commodo. Proin rhoncus sodales enim at vestibulum. Quisque in ligula elementum eros luctus dapibus ut eget felis. Morbi in turpis diam. Etiam eleifend, lacus vitae condimentum rutrum, eros odio condimentum nisi, ut pulvinar tellus elit et orci. Phasellus sit amet laoreet diam. Etiam bibendum arcu odio, non tempor diam ultricies vel. - -Duis vestibulum iaculis lacus sed dapibus. Maecenas tincidunt nec eros quis semper. Pellentesque eget mauris ipsum. Ut sodales eros lacus, in lobortis neque facilisis ac. Pellentesque vestibulum quam ante, in posuere sapien tristique ut. Integer varius in libero eu varius. Donec varius lorem quis augue interdum convallis. - -Nullam faucibus arcu sed quam lobortis, quis mattis tellus viverra. Vivamus in metus dolor. Nam at auctor nisi, pellentesque varius justo. Maecenas viverra, erat eget pharetra rhoncus, nibh libero cursus nisi, quis lobortis felis odio quis ipsum. Aenean eget porta tellus, nec aliquam ipsum. Cras elementum lacinia ex, nec feugiat nibh mollis in. Pellentesque eget lectus ipsum. Fusce maximus velit a urna lobortis ultricies sit amet in lectus. In pharetra diam ut enim auctor, congue auctor nulla rhoncus. - -Vestibulum id eros tempus, fermentum elit sit amet, feugiat nisi. Cras sollicitudin lectus molestie diam feugiat dapibus. Sed dapibus congue venenatis. Sed quis interdum elit, aliquet luctus turpis. Donec sit amet eros et nunc porttitor accumsan vitae vel enim. Nunc ultricies rutrum dolor, ac ornare dui. Praesent quis interdum tortor. In dictum eleifend diam sed auctor. Cras vel massa nec turpis aliquam tempus sed a odio. Curabitur quis eleifend turpis, sed egestas ipsum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam laoreet tempus lobortis. Mauris scelerisque dui lectus, eu pharetra tellus faucibus a. Fusce ut nibh sed libero auctor fringilla. Aliquam tristique tristique turpis, quis egestas mi. Aliquam scelerisque lacus vel orci fringilla, eu tincidunt lectus tincidunt. - -Vivamus pulvinar aliquam purus in tempus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed eget sollicitudin urna. Vestibulum suscipit ut lacus hendrerit lobortis. Ut at elit turpis. Aliquam condimentum tellus vitae ante dignissim interdum. Aliquam gravida neque eu sem pulvinar, sed malesuada massa malesuada. Pellentesque nec posuere dolor. Etiam scelerisque velit dolor, ut fringilla elit cursus vitae. Nulla fermentum risus nunc, ullamcorper ultricies eros tristique lobortis. Duis sit amet aliquam enim. Sed maximus fermentum diam, at venenatis dolor bibendum sollicitudin. - -Mauris vestibulum eros id enim rhoncus ullamcorper nec eu nisi. Aenean placerat nulla eu dolor tempor dapibus. Donec porttitor velit vitae velit porttitor dictum. Nam sed laoreet leo. Integer id cursus risus. Nulla in nibh aliquet, sagittis sapien et, posuere risus. Pellentesque malesuada tristique eleifend. Proin nec sagittis enim. Curabitur eget ex at enim fermentum egestas. Integer hendrerit accumsan augue, posuere fermentum erat pharetra vel. Etiam faucibus vestibulum ipsum, eu pellentesque mi. Donec nec tortor et ex volutpat consectetur. Aliquam erat volutpat. Integer non enim justo. Quisque augue ante, fermentum eu ipsum tempus, maximus vulputate leo. Cras imperdiet pulvinar nisl, eget aliquet elit. - -Praesent nec nunc quis est pharetra efficitur. Nunc rutrum quis erat et dignissim. Proin ultricies sagittis tortor, quis finibus sapien interdum non. Vestibulum ex nulla, dictum ut enim ac, finibus pretium leo. Maecenas porta ex hendrerit justo rutrum lobortis. Nullam felis arcu, gravida ac tellus in, bibendum suscipit elit. Duis iaculis blandit metus nec fringilla. Maecenas a sapien non est consequat fringilla at tempor justo. Etiam turpis quam, vulputate eu elit at, lacinia scelerisque urna. Mauris massa lorem, auctor non scelerisque nec, vestibulum iaculis nisi. Duis at sapien mattis, placerat lacus a, tristique massa. Maecenas molestie justo vitae tellus euismod, ac dictum risus auctor. Cras sagittis dui risus, vitae hendrerit libero aliquam ornare. Nulla quis felis ac libero maximus feugiat quis vitae enim. Donec quam leo, egestas a congue vitae, tempus hendrerit est. In pulvinar turpis faucibus mi maximus cursus. - -In lacus velit, facilisis a erat et, blandit finibus eros. Vivamus nec laoreet est. Vivamus eu sapien consectetur, iaculis mi vel, condimentum justo. Vivamus tincidunt purus eu leo suscipit tempor. Etiam commodo porttitor ex id pellentesque. Vivamus ac erat et purus porttitor tristique. Maecenas quis nulla libero. - -Integer finibus libero ex, ac malesuada neque aliquet a. Etiam elementum a lacus sed rhoncus. Proin semper neque ac nulla interdum pretium. Nam porta convallis urna. Cras vel tempus nunc. Praesent eget suscipit elit, faucibus sollicitudin ex. Nulla vel eros a libero mollis varius quis eu justo. - -Nullam sed pulvinar magna. Mauris at mauris nec lorem lobortis condimentum. Morbi vestibulum malesuada lacus id molestie. Sed eu auctor mi, in laoreet ligula. Sed fringilla, diam et bibendum sagittis, nisi odio rutrum sem, et interdum dolor felis vitae enim. Donec id mollis enim. Nullam ut gravida dolor. - -Duis eget eros mollis, ullamcorper turpis eu, rhoncus felis. In semper quam nec dignissim dignissim. Praesent quis bibendum tellus, id tincidunt dolor. Morbi congue interdum odio non interdum. Proin at sem et ligula venenatis bibendum id id odio. Proin sit amet rutrum libero, eu dictum sapien. Aenean interdum felis quis sollicitudin tristique. Proin hendrerit ipsum vel enim mattis sollicitudin. - -Sed id auctor lorem, non auctor libero. Cras non augue tellus. Fusce scelerisque, nulla in imperdiet convallis, urna lorem consectetur urna, non hendrerit ipsum turpis ut ante. Sed justo leo, placerat vel bibendum sit amet, sollicitudin ornare ligula. Praesent laoreet dignissim accumsan. Proin cursus dui nisl, et interdum lacus dapibus malesuada. Nunc condimentum, dolor et tempor rhoncus, velit nisl accumsan elit, non imperdiet nulla sem a eros. - -Donec eu tortor porta mi semper pulvinar. Integer porttitor, tortor vitae malesuada facilisis, est metus bibendum erat, nec molestie nunc mi eu arcu. Aliquam sit amet vulputate nisi. Sed ullamcorper purus et odio facilisis, non pharetra odio suscipit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed semper tellus augue, facilisis placerat risus pulvinar eget. In in magna ut sapien pharetra bibendum porta ut leo. Ut varius est ac placerat pharetra. Integer eu feugiat quam, at porta lectus. Curabitur in interdum mi, sed scelerisque neque. Nullam pellentesque ex eu accumsan congue. Curabitur auctor blandit gravida. - -Nulla at lobortis felis. Quisque ante dui, aliquam non hendrerit vel, eleifend a massa. Maecenas eget massa ac lectus auctor molestie. Nullam at sagittis elit, ut aliquet augue. Integer eget augue ut mi vehicula pharetra euismod ut felis. Mauris mauris tellus, facilisis et vestibulum a, tincidunt sit amet elit. Maecenas consequat felis at enim congue, vitae eleifend nisi blandit. Suspendisse potenti. Donec at suscipit metus. Nam a sem at lacus maximus laoreet. Cras lacinia hendrerit ornare. Phasellus rhoncus imperdiet urna, sed malesuada eros laoreet at. Vivamus vel euismod urna. Donec sapien risus, tincidunt quis felis in, gravida tempor diam. - -Ut a lectus molestie enim sodales condimentum faucibus in diam. Suspendisse ultricies tincidunt felis, a venenatis est interdum in. Nulla a sem ac ligula fermentum sodales vitae id justo. Donec facilisis placerat est, sed tempor sapien condimentum vel. Fusce consectetur nulla accumsan quam consequat, vitae tempus elit maximus. Praesent egestas augue quis tortor porta bibendum. In ultricies urna ac bibendum suscipit. Morbi et arcu tempor, faucibus est quis, ullamcorper neque. Aenean accumsan urna mattis nulla rhoncus, a volutpat neque efficitur. Pellentesque quis risus facilisis, dignissim arcu in, venenatis diam. Phasellus lobortis massa et finibus lacinia. Praesent blandit eros in ex blandit, quis tincidunt orci dapibus. Pellentesque auctor orci ac lorem scelerisque porta. Aliquam ultricies dapibus consectetur. Vestibulum consequat, magna varius tempor posuere, lacus turpis gravida nulla, eu vestibulum est libero vitae magna. Aenean rutrum dolor sit amet rhoncus egestas. - -Ut eleifend hendrerit augue, eget bibendum orci porttitor eget. Donec pulvinar ligula massa, sed lobortis nunc condimentum et. Etiam sapien augue, faucibus varius gravida nec, aliquet id risus. Mauris in lacus lectus. Curabitur efficitur, sem lacinia posuere suscipit, augue quam consectetur leo, quis accumsan ante felis ac nisi. Vivamus condimentum at mauris sed sodales. In id quam mauris. Integer bibendum lacinia mauris ac consectetur. Integer vitae volutpat sapien, eu vestibulum libero. Suspendisse vel ante tortor. - -Curabitur tempus odio nunc, et rhoncus est laoreet vitae. Vestibulum a ipsum efficitur, ullamcorper nulla sit amet, consectetur lorem. Donec in accumsan ex. Mauris ac scelerisque velit, a rhoncus purus. Pellentesque aliquet, erat nec malesuada sollicitudin, massa nibh pretium orci, vel blandit orci mi nec nunc. Morbi luctus placerat sem, et ornare eros feugiat nec. Fusce aliquam justo eu ipsum ullamcorper, vitae vestibulum tellus mattis. - -Praesent iaculis congue venenatis. Aenean placerat pellentesque tempus. Praesent ornare, odio id feugiat dapibus, metus tortor pulvinar augue, nec ultrices lectus nulla at risus. Suspendisse condimentum feugiat nibh. Mauris eget neque ac eros porttitor mollis ut non nisl. Fusce dictum magna pretium, hendrerit magna tempus, rutrum elit. Vestibulum gravida vulputate leo, in consequat quam sagittis id. -Generated 50 paragraphs, 4331 words, 29263 bytes of Lorem Ipsum -help@lipsum.com -Privacy Policy · -'''); + await room.sendTextEvent( + txid: 'event_too_large', + // data just bigger than maxBodySize + base64Encode( + List.generate(60001, (i) => Random().nextInt(256)))); } catch (e) { expect(e.runtimeType, EventTooLarge); + expect(room.lastEvent?.eventId, 'event_too_large'); + expect(room.lastEvent?.status, EventStatus.error); + + roomFromDB = await matrix.database?.getSingleRoom(matrix, room.id); + expect(roomFromDB?.lastEvent?.eventId, 'event_too_large'); + + // force null because except would have caught it anyway + await room.lastEvent?.cancelSend(); } + + // work in postLoaded room + expect(room.lastEvent?.eventId, 'event_too_large'); + expect( + await room.lastEvent?.calcLocalizedBody(MatrixDefaultLocalizations()), + 'Cancelled sending message'); + + // check if persisted in db + final lastEventFromDB = + await matrix.database?.getEventById('event_too_large', room); + + // null here because cancelSend removes event. + expect(lastEventFromDB, null); + + roomFromDB = await matrix.database?.getSingleRoom(matrix, room.id); + + expect(roomFromDB?.partial, true); + + expect(roomFromDB?.lastEvent?.eventId, 'event_too_large'); + expect( + await room.lastEvent?.calcLocalizedBody(MatrixDefaultLocalizations()), + 'Cancelled sending message'); + + roomFromDB = await matrix.database?.getSingleRoom(matrix, room.id); + + await roomFromDB?.postLoad(); + expect(roomFromDB?.partial, false); + + expect(roomFromDB?.lastEvent?.eventId, 'event_too_large'); + expect( + await room.lastEvent?.calcLocalizedBody(MatrixDefaultLocalizations()), + 'Cancelled sending message'); }); test('logout', () async {