chore: Add tests to Event.downloadAndDecryptAttachment
This commit is contained in:
parent
e90793bef1
commit
089ce88b57
|
@ -372,7 +372,8 @@ class Event extends MatrixEvent {
|
||||||
/// contain an attachment, this throws an error. Set [getThumbnail] to
|
/// contain an attachment, this throws an error. Set [getThumbnail] to
|
||||||
/// true to download the thumbnail instead.
|
/// true to download the thumbnail instead.
|
||||||
Future<MatrixFile> downloadAndDecryptAttachment(
|
Future<MatrixFile> downloadAndDecryptAttachment(
|
||||||
{bool getThumbnail = false}) async {
|
{bool getThumbnail = false,
|
||||||
|
Future<Uint8List> Function(String) downloadCallback}) async {
|
||||||
if (![EventTypes.Message, EventTypes.Sticker].contains(type)) {
|
if (![EventTypes.Message, EventTypes.Sticker].contains(type)) {
|
||||||
throw ("This event has the type '$type' and so it can't contain an attachment.");
|
throw ("This event has the type '$type' and so it can't contain an attachment.");
|
||||||
}
|
}
|
||||||
|
@ -413,8 +414,11 @@ class Event extends MatrixEvent {
|
||||||
|
|
||||||
// Download the file
|
// Download the file
|
||||||
if (uint8list == null) {
|
if (uint8list == null) {
|
||||||
|
downloadCallback ??= (String url) async {
|
||||||
|
return (await http.get(url)).bodyBytes;
|
||||||
|
};
|
||||||
uint8list =
|
uint8list =
|
||||||
(await http.get(mxContent.getDownloadLink(room.client))).bodyBytes;
|
await downloadCallback(mxContent.getDownloadLink(room.client));
|
||||||
if (storeable) {
|
if (storeable) {
|
||||||
await room.client.database
|
await room.client.database
|
||||||
.storeFile(mxContent.toString(), uint8list, DateTime.now());
|
.storeFile(mxContent.toString(), uint8list, DateTime.now());
|
||||||
|
|
|
@ -17,19 +17,33 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:famedlysdk/famedlysdk.dart';
|
import 'package:famedlysdk/famedlysdk.dart';
|
||||||
import 'package:famedlysdk/matrix_api.dart';
|
import 'package:famedlysdk/matrix_api.dart';
|
||||||
import 'package:famedlysdk/encryption.dart';
|
import 'package:famedlysdk/encryption.dart';
|
||||||
import 'package:famedlysdk/src/event.dart';
|
import 'package:famedlysdk/src/event.dart';
|
||||||
|
import 'package:famedlysdk/src/utils/logs.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
import 'package:olm/olm.dart' as olm;
|
||||||
|
|
||||||
|
import 'fake_client.dart';
|
||||||
import 'fake_matrix_api.dart';
|
import 'fake_matrix_api.dart';
|
||||||
import 'fake_matrix_localizations.dart';
|
import 'fake_matrix_localizations.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
/// All Tests related to the Event
|
/// All Tests related to the Event
|
||||||
group('Event', () {
|
group('Event', () {
|
||||||
|
var olmEnabled = true;
|
||||||
|
try {
|
||||||
|
olm.init();
|
||||||
|
olm.Account();
|
||||||
|
} catch (_) {
|
||||||
|
olmEnabled = false;
|
||||||
|
Logs.warning('[LibOlm] Failed to load LibOlm: ' + _.toString());
|
||||||
|
}
|
||||||
|
Logs.success('[LibOlm] Enabled: $olmEnabled');
|
||||||
|
|
||||||
final timestamp = DateTime.now().millisecondsSinceEpoch;
|
final timestamp = DateTime.now().millisecondsSinceEpoch;
|
||||||
final id = '!4fsdfjisjf:server.abc';
|
final id = '!4fsdfjisjf:server.abc';
|
||||||
final senderID = '@alice:server.abc';
|
final senderID = '@alice:server.abc';
|
||||||
|
@ -960,5 +974,185 @@ void main() {
|
||||||
Timeline(events: <Event>[event, edit1, edit2, edit3], room: room));
|
Timeline(events: <Event>[event, edit1, edit2, edit3], room: room));
|
||||||
expect(displayEvent.body, 'edit 2');
|
expect(displayEvent.body, 'edit 2');
|
||||||
});
|
});
|
||||||
|
test('downloadAndDecryptAttachment', () async {
|
||||||
|
final FILE_BUFF = Uint8List.fromList([0]);
|
||||||
|
final THUMBNAIL_BUFF = Uint8List.fromList([2]);
|
||||||
|
final downloadCallback = (String url) async {
|
||||||
|
return {
|
||||||
|
'https://fakeserver.notexisting/_matrix/media/r0/download/example.org/file':
|
||||||
|
FILE_BUFF,
|
||||||
|
'https://fakeserver.notexisting/_matrix/media/r0/download/example.org/thumb':
|
||||||
|
THUMBNAIL_BUFF,
|
||||||
|
}[url];
|
||||||
|
};
|
||||||
|
await client.checkServer('https://fakeServer.notExisting');
|
||||||
|
final room = Room(id: '!localpart:server.abc', client: client);
|
||||||
|
var event = Event.fromJson({
|
||||||
|
'type': EventTypes.Message,
|
||||||
|
'content': {
|
||||||
|
'body': 'image',
|
||||||
|
'msgtype': 'm.image',
|
||||||
|
'url': 'mxc://example.org/file',
|
||||||
|
},
|
||||||
|
'event_id': '\$edit2',
|
||||||
|
'sender': '@alice:example.org',
|
||||||
|
}, room);
|
||||||
|
var buffer = await event.downloadAndDecryptAttachment(
|
||||||
|
downloadCallback: downloadCallback);
|
||||||
|
expect(buffer.bytes, FILE_BUFF);
|
||||||
|
|
||||||
|
event = Event.fromJson({
|
||||||
|
'type': EventTypes.Message,
|
||||||
|
'content': {
|
||||||
|
'body': 'image',
|
||||||
|
'msgtype': 'm.image',
|
||||||
|
'url': 'mxc://example.org/file',
|
||||||
|
'info': {
|
||||||
|
'thumbnail_url': 'mxc://example.org/thumb',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'event_id': '\$edit2',
|
||||||
|
'sender': '@alice:example.org',
|
||||||
|
}, room);
|
||||||
|
buffer = await event.downloadAndDecryptAttachment(
|
||||||
|
downloadCallback: downloadCallback);
|
||||||
|
expect(buffer.bytes, FILE_BUFF);
|
||||||
|
|
||||||
|
buffer = await event.downloadAndDecryptAttachment(
|
||||||
|
getThumbnail: true, downloadCallback: downloadCallback);
|
||||||
|
expect(buffer.bytes, THUMBNAIL_BUFF);
|
||||||
|
});
|
||||||
|
test('downloadAndDecryptAttachment encrypted', () async {
|
||||||
|
if (!olmEnabled) return;
|
||||||
|
|
||||||
|
final FILE_BUFF_ENC = Uint8List.fromList([0x3B, 0x6B, 0xB2, 0x8C, 0xAF]);
|
||||||
|
final FILE_BUFF_DEC = Uint8List.fromList([0x74, 0x65, 0x73, 0x74, 0x0A]);
|
||||||
|
final THUMB_BUFF_ENC =
|
||||||
|
Uint8List.fromList([0x55, 0xD7, 0xEB, 0x72, 0x05, 0x13]);
|
||||||
|
final THUMB_BUFF_DEC =
|
||||||
|
Uint8List.fromList([0x74, 0x68, 0x75, 0x6D, 0x62, 0x0A]);
|
||||||
|
final downloadCallback = (String url) async {
|
||||||
|
return {
|
||||||
|
'https://fakeserver.notexisting/_matrix/media/r0/download/example.com/file':
|
||||||
|
FILE_BUFF_ENC,
|
||||||
|
'https://fakeserver.notexisting/_matrix/media/r0/download/example.com/thumb':
|
||||||
|
THUMB_BUFF_ENC,
|
||||||
|
}[url];
|
||||||
|
};
|
||||||
|
final room = Room(id: '!localpart:server.abc', client: await getClient());
|
||||||
|
var event = Event.fromJson({
|
||||||
|
'type': EventTypes.Message,
|
||||||
|
'content': {
|
||||||
|
'body': 'image',
|
||||||
|
'msgtype': 'm.image',
|
||||||
|
'file': {
|
||||||
|
'v': 'v2',
|
||||||
|
'key': {
|
||||||
|
'alg': 'A256CTR',
|
||||||
|
'ext': true,
|
||||||
|
'k': '7aPRNIDPeUAUqD6SPR3vVX5W9liyMG98NexVJ9udnCc',
|
||||||
|
'key_ops': ['encrypt', 'decrypt'],
|
||||||
|
'kty': 'oct'
|
||||||
|
},
|
||||||
|
'iv': 'Wdsf+tnOHIoAAAAAAAAAAA',
|
||||||
|
'hashes': {'sha256': 'WgC7fw2alBC5t+xDx+PFlZxfFJXtIstQCg+j0WDaXxE'},
|
||||||
|
'url': 'mxc://example.com/file',
|
||||||
|
'mimetype': 'text/plain'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'event_id': '\$edit2',
|
||||||
|
'sender': '@alice:example.org',
|
||||||
|
}, room);
|
||||||
|
var buffer = await event.downloadAndDecryptAttachment(
|
||||||
|
downloadCallback: downloadCallback);
|
||||||
|
expect(buffer.bytes, FILE_BUFF_DEC);
|
||||||
|
|
||||||
|
event = Event.fromJson({
|
||||||
|
'type': EventTypes.Message,
|
||||||
|
'content': {
|
||||||
|
'body': 'image',
|
||||||
|
'msgtype': 'm.image',
|
||||||
|
'file': {
|
||||||
|
'v': 'v2',
|
||||||
|
'key': {
|
||||||
|
'alg': 'A256CTR',
|
||||||
|
'ext': true,
|
||||||
|
'k': '7aPRNIDPeUAUqD6SPR3vVX5W9liyMG98NexVJ9udnCc',
|
||||||
|
'key_ops': ['encrypt', 'decrypt'],
|
||||||
|
'kty': 'oct'
|
||||||
|
},
|
||||||
|
'iv': 'Wdsf+tnOHIoAAAAAAAAAAA',
|
||||||
|
'hashes': {'sha256': 'WgC7fw2alBC5t+xDx+PFlZxfFJXtIstQCg+j0WDaXxE'},
|
||||||
|
'url': 'mxc://example.com/file',
|
||||||
|
'mimetype': 'text/plain'
|
||||||
|
},
|
||||||
|
'info': {
|
||||||
|
'thumbnail_file': {
|
||||||
|
'v': 'v2',
|
||||||
|
'key': {
|
||||||
|
'alg': 'A256CTR',
|
||||||
|
'ext': true,
|
||||||
|
'k': 'TmF-rZYetZbxpL5yjDPE21UALQJcpEE6X-nvUDD5rA0',
|
||||||
|
'key_ops': ['encrypt', 'decrypt'],
|
||||||
|
'kty': 'oct'
|
||||||
|
},
|
||||||
|
'iv': '41ZqNRZSLFUAAAAAAAAAAA',
|
||||||
|
'hashes': {
|
||||||
|
'sha256': 'zccOwXiOTAYhGXyk0Fra7CRreBF6itjiCKdd+ov8mO4'
|
||||||
|
},
|
||||||
|
'url': 'mxc://example.com/thumb',
|
||||||
|
'mimetype': 'text/plain'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'event_id': '\$edit2',
|
||||||
|
'sender': '@alice:example.org',
|
||||||
|
}, room);
|
||||||
|
buffer = await event.downloadAndDecryptAttachment(
|
||||||
|
downloadCallback: downloadCallback);
|
||||||
|
expect(buffer.bytes, FILE_BUFF_DEC);
|
||||||
|
|
||||||
|
buffer = await event.downloadAndDecryptAttachment(
|
||||||
|
getThumbnail: true, downloadCallback: downloadCallback);
|
||||||
|
expect(buffer.bytes, THUMB_BUFF_DEC);
|
||||||
|
|
||||||
|
await room.client.dispose(closeDatabase: true);
|
||||||
|
});
|
||||||
|
test('downloadAndDecryptAttachment store', () async {
|
||||||
|
final FILE_BUFF = Uint8List.fromList([0]);
|
||||||
|
var serverHits = 0;
|
||||||
|
final downloadCallback = (String url) async {
|
||||||
|
serverHits++;
|
||||||
|
return {
|
||||||
|
'https://fakeserver.notexisting/_matrix/media/r0/download/example.org/newfile':
|
||||||
|
FILE_BUFF,
|
||||||
|
}[url];
|
||||||
|
};
|
||||||
|
await client.checkServer('https://fakeServer.notExisting');
|
||||||
|
final room = Room(id: '!localpart:server.abc', client: await getClient());
|
||||||
|
var event = Event.fromJson({
|
||||||
|
'type': EventTypes.Message,
|
||||||
|
'content': {
|
||||||
|
'body': 'image',
|
||||||
|
'msgtype': 'm.image',
|
||||||
|
'url': 'mxc://example.org/newfile',
|
||||||
|
'info': {
|
||||||
|
'size': 5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'event_id': '\$edit2',
|
||||||
|
'sender': '@alice:example.org',
|
||||||
|
}, room);
|
||||||
|
var buffer = await event.downloadAndDecryptAttachment(
|
||||||
|
downloadCallback: downloadCallback);
|
||||||
|
expect(buffer.bytes, FILE_BUFF);
|
||||||
|
expect(serverHits, 1);
|
||||||
|
buffer = await event.downloadAndDecryptAttachment(
|
||||||
|
downloadCallback: downloadCallback);
|
||||||
|
expect(buffer.bytes, FILE_BUFF);
|
||||||
|
expect(serverHits, 1);
|
||||||
|
|
||||||
|
await room.client.dispose(closeDatabase: true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue