439 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			439 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Dart
		
	
	
	
| /*
 | |
|  *   Famedly Matrix SDK
 | |
|  *   Copyright (C) 2019, 2020 Famedly GmbH
 | |
|  *
 | |
|  *   This program is free software: you can redistribute it and/or modify
 | |
|  *   it under the terms of the GNU Affero General Public License as
 | |
|  *   published by the Free Software Foundation, either version 3 of the
 | |
|  *   License, or (at your option) any later version.
 | |
|  *
 | |
|  *   This program is distributed in the hope that it will be useful,
 | |
|  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 | |
|  *   GNU Affero General Public License for more details.
 | |
|  *
 | |
|  *   You should have received a copy of the GNU Affero General Public License
 | |
|  *   along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | |
|  */
 | |
| import 'dart:convert';
 | |
| 
 | |
| import 'package:matrix/matrix.dart';
 | |
| import 'package:moor/moor.dart';
 | |
| import 'package:test/test.dart';
 | |
| import 'package:olm/olm.dart' as olm;
 | |
| 
 | |
| import 'fake_database_native.dart';
 | |
| 
 | |
| void main() {
 | |
|   /// All Tests related to the ChatTime
 | |
|   group('Moor Database Test', () {
 | |
|     testDatabase(getMoorDatabase(null), 0);
 | |
|   });
 | |
|   group('Hive Database Test', () {
 | |
|     testDatabase(getHiveDatabase(null), 0);
 | |
|   });
 | |
| }
 | |
| 
 | |
| Future<bool> olmEnabled() async {
 | |
|   var olmEnabled = true;
 | |
|   try {
 | |
|     await olm.init();
 | |
|     olm.get_library_version();
 | |
|   } catch (e) {
 | |
|     olmEnabled = false;
 | |
|   }
 | |
|   return olmEnabled;
 | |
| }
 | |
| 
 | |
| void testDatabase(Future<DatabaseApi> futureDatabase, int clientId) {
 | |
|   DatabaseApi database;
 | |
|   int toDeviceQueueIndex;
 | |
|   test('Open', () async {
 | |
|     database = await futureDatabase;
 | |
|   });
 | |
|   test('insertIntoToDeviceQueue', () async {
 | |
|     toDeviceQueueIndex = await database.insertIntoToDeviceQueue(
 | |
|       clientId,
 | |
|       'm.test',
 | |
|       'txnId',
 | |
|       '{"foo":"bar"}',
 | |
|     );
 | |
|   });
 | |
|   test('getToDeviceEventQueue', () async {
 | |
|     final toDeviceQueue = await database.getToDeviceEventQueue(clientId);
 | |
|     expect(toDeviceQueue.first.type, 'm.test');
 | |
|   });
 | |
|   test('deleteFromToDeviceQueue', () async {
 | |
|     await database.deleteFromToDeviceQueue(clientId, toDeviceQueueIndex);
 | |
|     final toDeviceQueue = await database.getToDeviceEventQueue(clientId);
 | |
|     expect(toDeviceQueue.isEmpty, true);
 | |
|   });
 | |
|   test('storeFile', () async {
 | |
|     await database.storeFile('mxc://test', Uint8List.fromList([0]), 0);
 | |
|     final file = await database.getFile('mxc://test');
 | |
|     expect(file != null, database.supportsFileStoring);
 | |
|   });
 | |
|   test('getFile', () async {
 | |
|     await database.getFile('mxc://test');
 | |
|   });
 | |
|   test('deleteOldFiles', () async {
 | |
|     await database.deleteOldFiles(1);
 | |
|     final file = await database.getFile('mxc://test');
 | |
|     expect(file == null, true);
 | |
|   });
 | |
|   test('storeRoomUpdate', () async {
 | |
|     await database.storeRoomUpdate(
 | |
|         clientId,
 | |
|         RoomUpdate(
 | |
|           id: '!testroom',
 | |
|           highlight_count: 0,
 | |
|           notification_count: 0,
 | |
|           limitedTimeline: false,
 | |
|           membership: Membership.join,
 | |
|         ));
 | |
|     final rooms = await database.getRoomList(Client('testclient'));
 | |
|     expect(rooms.single.id, '!testroom');
 | |
|   });
 | |
|   test('getRoomList', () async {
 | |
|     final list = await database.getRoomList(Client('testclient'));
 | |
|     expect(list.single.id, '!testroom');
 | |
|   });
 | |
|   test('setRoomPrevBatch', () async {
 | |
|     await database.setRoomPrevBatch('1234', clientId, '!testroom');
 | |
|     final rooms = await database.getRoomList(Client('testclient'));
 | |
|     expect(rooms.single.prev_batch, '1234');
 | |
|   });
 | |
|   test('forgetRoom', () async {
 | |
|     await database.forgetRoom(clientId, '!testroom');
 | |
|     final rooms = await database.getRoomList(Client('testclient'));
 | |
|     expect(rooms.isEmpty, true);
 | |
|   });
 | |
|   test('getClient', () async {
 | |
|     await database.getClient('name');
 | |
|   });
 | |
|   test('insertClient', () async {
 | |
|     clientId = await database.insertClient(
 | |
|       'name',
 | |
|       'homeserverUrl',
 | |
|       'token',
 | |
|       'userId',
 | |
|       'deviceId',
 | |
|       'deviceName',
 | |
|       'prevBatch',
 | |
|       'olmAccount',
 | |
|     );
 | |
|     final client = await database.getClient('name');
 | |
|     expect(client['token'], 'token');
 | |
|   });
 | |
|   test('updateClient', () async {
 | |
|     await database.updateClient(
 | |
|       'homeserverUrl',
 | |
|       'token_different',
 | |
|       'userId',
 | |
|       'deviceId',
 | |
|       'deviceName',
 | |
|       'prevBatch',
 | |
|       'olmAccount',
 | |
|       clientId,
 | |
|     );
 | |
|     final client = await database.getClient('name');
 | |
|     expect(client['token'], 'token_different');
 | |
|   });
 | |
|   test('updateClientKeys', () async {
 | |
|     await database.updateClientKeys('olmAccount2', clientId);
 | |
|     final client = await database.getClient('name');
 | |
|     expect(client['olm_account'], 'olmAccount2');
 | |
|   });
 | |
|   test('storeSyncFilterId', () async {
 | |
|     await database.storeSyncFilterId('1234', clientId);
 | |
|     final client = await database.getClient('name');
 | |
|     expect(client['sync_filter_id'], '1234');
 | |
|   });
 | |
|   test('getAccountData', () async {
 | |
|     await database.getAccountData(clientId);
 | |
|   });
 | |
|   test('storeAccountData', () async {
 | |
|     await database.storeAccountData(clientId, 'm.test', '{"foo":"bar"}');
 | |
|     final events = await database.getAccountData(clientId);
 | |
|     expect(events.values.single.type, 'm.test');
 | |
|   });
 | |
|   test('storeEventUpdate', () async {
 | |
|     await database.storeEventUpdate(
 | |
|       clientId,
 | |
|       EventUpdate(
 | |
|         roomID: '!testroom:example.com',
 | |
|         type: EventUpdateType.timeline,
 | |
|         sortOrder: DateTime.now().millisecondsSinceEpoch.toDouble(),
 | |
|         content: {
 | |
|           'type': EventTypes.Message,
 | |
|           'content': {
 | |
|             'body': '* edit 3',
 | |
|             'msgtype': 'm.text',
 | |
|             'm.new_content': {
 | |
|               'body': 'edit 3',
 | |
|               'msgtype': 'm.text',
 | |
|             },
 | |
|             'm.relates_to': {
 | |
|               'event_id': '\$source',
 | |
|               'rel_type': RelationshipTypes.edit,
 | |
|             },
 | |
|           },
 | |
|           'event_id': '\$event:example.com',
 | |
|           'sender': '@bob:example.org',
 | |
|         },
 | |
|       ),
 | |
|     );
 | |
|   });
 | |
|   test('getEventById', () async {
 | |
|     final event = await database.getEventById(
 | |
|         clientId, '\$event:example.com', Room(id: '!testroom:example.com'));
 | |
|     expect(event.type, EventTypes.Message);
 | |
|   });
 | |
|   test('getEventList', () async {
 | |
|     final events = await database.getEventList(
 | |
|         clientId, Room(id: '!testroom:example.com'));
 | |
|     expect(events.single.type, EventTypes.Message);
 | |
|   });
 | |
|   test('getUser', () async {
 | |
|     final user = await database.getUser(
 | |
|         clientId, '@bob:example.org', Room(id: '!testroom:example.com'));
 | |
|     expect(user, null);
 | |
|   });
 | |
|   test('getUsers', () async {
 | |
|     final users =
 | |
|         await database.getUsers(clientId, Room(id: '!testroom:example.com'));
 | |
|     expect(users.isEmpty, true);
 | |
|   });
 | |
|   test('removeEvent', () async {
 | |
|     await database.removeEvent(
 | |
|         clientId, '\$event:example.com', '!testroom:example.com');
 | |
|     final event = await database.getEventById(
 | |
|         clientId, '\$event:example.com', Room(id: '!testroom:example.com'));
 | |
|     expect(event, null);
 | |
|   });
 | |
|   test('getAllInboundGroupSessions', () async {
 | |
|     final result = await database.getAllInboundGroupSessions(clientId);
 | |
|     expect(result.isEmpty, true);
 | |
|   });
 | |
|   test('getInboundGroupSession', () async {
 | |
|     await database.getInboundGroupSession(
 | |
|         clientId, '!testroom:example.com', 'sessionId');
 | |
|   });
 | |
|   test('getInboundGroupSessionsToUpload', () async {
 | |
|     await database.getInboundGroupSessionsToUpload();
 | |
|   });
 | |
|   test('storeInboundGroupSession', () async {
 | |
|     await database.storeInboundGroupSession(
 | |
|       clientId,
 | |
|       '!testroom:example.com',
 | |
|       'sessionId',
 | |
|       'pickle',
 | |
|       '{"foo":"bar"}',
 | |
|       '{}',
 | |
|       '{}',
 | |
|       'senderKey',
 | |
|       '{}',
 | |
|     );
 | |
|     final session = await database.getInboundGroupSession(
 | |
|       clientId,
 | |
|       '!testroom:example.com',
 | |
|       'sessionId',
 | |
|     );
 | |
|     expect(jsonDecode(session.content)['foo'], 'bar');
 | |
|   });
 | |
|   test('markInboundGroupSessionAsUploaded', () async {
 | |
|     await database.markInboundGroupSessionAsUploaded(
 | |
|         clientId, '!testroom:example.com', 'sessionId');
 | |
|   });
 | |
|   test('markInboundGroupSessionsAsNeedingUpload', () async {
 | |
|     await database.markInboundGroupSessionsAsNeedingUpload(clientId);
 | |
|   });
 | |
|   test('updateInboundGroupSessionAllowedAtIndex', () async {
 | |
|     await database.updateInboundGroupSessionAllowedAtIndex(
 | |
|       '{}',
 | |
|       clientId,
 | |
|       '!testroom:example.com',
 | |
|       'sessionId',
 | |
|     );
 | |
|   });
 | |
|   test('updateInboundGroupSessionIndexes', () async {
 | |
|     await database.updateInboundGroupSessionIndexes(
 | |
|       '{}',
 | |
|       clientId,
 | |
|       '!testroom:example.com',
 | |
|       'sessionId',
 | |
|     );
 | |
|   });
 | |
|   test('getSSSSCache', () async {
 | |
|     final cache = await database.getSSSSCache(clientId, 'type');
 | |
|     expect(cache, null);
 | |
|   });
 | |
|   test('storeSSSSCache', () async {
 | |
|     await database.storeSSSSCache(
 | |
|         clientId, 'type', 'keyId', 'ciphertext', '{}');
 | |
|     final cache = await database.getSSSSCache(clientId, 'type');
 | |
|     expect(cache.type, 'type');
 | |
|     expect(cache.keyId, 'keyId');
 | |
|     expect(cache.ciphertext, 'ciphertext');
 | |
|     expect(cache.content, '{}');
 | |
|   });
 | |
|   test('getOlmSessions', () async {
 | |
|     final olm = await database.getOlmSessions(
 | |
|       clientId,
 | |
|       'identityKey',
 | |
|       'userId',
 | |
|     );
 | |
|     expect(olm.isEmpty, true);
 | |
|   });
 | |
|   test('getOlmSessionsForDevices', () async {
 | |
|     final olm = await database.getOlmSessionsForDevices(
 | |
|       clientId,
 | |
|       ['identityKeys'],
 | |
|       'userId',
 | |
|     );
 | |
|     expect(olm.isEmpty, true);
 | |
|   });
 | |
|   test('storeOlmSession', () async {
 | |
|     if (!(await olmEnabled())) return;
 | |
|     await database.storeOlmSession(
 | |
|       clientId,
 | |
|       'identityKey',
 | |
|       'sessionId',
 | |
|       'pickle',
 | |
|       0,
 | |
|     );
 | |
|     final olm = await database.getOlmSessions(
 | |
|       clientId,
 | |
|       'identityKey',
 | |
|       'userId',
 | |
|     );
 | |
|     expect(olm.isNotEmpty, true);
 | |
|   });
 | |
|   test('getOutboundGroupSession', () async {
 | |
|     final session = await database.getOutboundGroupSession(
 | |
|       clientId,
 | |
|       '!testroom:example.com',
 | |
|       '@alice:example.com',
 | |
|     );
 | |
|     expect(session, null);
 | |
|   });
 | |
|   test('storeOutboundGroupSession', () async {
 | |
|     if (!(await olmEnabled())) return;
 | |
|     await database.storeOutboundGroupSession(
 | |
|       clientId,
 | |
|       '!testroom:example.com',
 | |
|       'pickle',
 | |
|       '{}',
 | |
|       0,
 | |
|       0,
 | |
|     );
 | |
|     final session = await database.getOutboundGroupSession(
 | |
|       clientId,
 | |
|       '!testroom:example.com',
 | |
|       '@alice:example.com',
 | |
|     );
 | |
|     expect(session.devices.isEmpty, true);
 | |
|   });
 | |
|   test('getLastSentMessageUserDeviceKey', () async {
 | |
|     final list = await database.getLastSentMessageUserDeviceKey(
 | |
|       clientId,
 | |
|       'userId',
 | |
|       'deviceId',
 | |
|     );
 | |
|     expect(list.isEmpty, true);
 | |
|   });
 | |
|   test('getUnimportantRoomEventStatesForRoom', () async {
 | |
|     final events = await database.getUnimportantRoomEventStatesForRoom(
 | |
|       clientId,
 | |
|       ['events'],
 | |
|       Room(id: '!mep'),
 | |
|     );
 | |
|     expect(events.isEmpty, true);
 | |
|   });
 | |
|   test('getUserDeviceKeys', () async {
 | |
|     await database.getUserDeviceKeys(Client('testclient'));
 | |
|   });
 | |
|   test('storeUserCrossSigningKey', () async {
 | |
|     await database.storeUserCrossSigningKey(
 | |
|       clientId,
 | |
|       '@alice:example.com',
 | |
|       'publicKey',
 | |
|       '{}',
 | |
|       false,
 | |
|       false,
 | |
|     );
 | |
|   });
 | |
|   test('setVerifiedUserCrossSigningKey', () async {
 | |
|     await database.setVerifiedUserCrossSigningKey(
 | |
|       true,
 | |
|       clientId,
 | |
|       '@alice:example.com',
 | |
|       'publicKey',
 | |
|     );
 | |
|   });
 | |
|   test('setBlockedUserCrossSigningKey', () async {
 | |
|     await database.setBlockedUserCrossSigningKey(
 | |
|       true,
 | |
|       clientId,
 | |
|       '@alice:example.com',
 | |
|       'publicKey',
 | |
|     );
 | |
|   });
 | |
|   test('removeUserCrossSigningKey', () async {
 | |
|     await database.removeUserCrossSigningKey(
 | |
|       clientId,
 | |
|       '@alice:example.com',
 | |
|       'publicKey',
 | |
|     );
 | |
|   });
 | |
|   test('storeUserDeviceKeysInfo', () async {
 | |
|     await database.storeUserDeviceKeysInfo(
 | |
|       clientId,
 | |
|       '@alice:example.com',
 | |
|       true,
 | |
|     );
 | |
|   });
 | |
|   test('storeUserDeviceKey', () async {
 | |
|     await database.storeUserDeviceKey(
 | |
|       clientId,
 | |
|       '@alice:example.com',
 | |
|       'deviceId',
 | |
|       '{}',
 | |
|       false,
 | |
|       false,
 | |
|       0,
 | |
|     );
 | |
|   });
 | |
|   test('setVerifiedUserDeviceKey', () async {
 | |
|     await database.setVerifiedUserDeviceKey(
 | |
|       true,
 | |
|       clientId,
 | |
|       '@alice:example.com',
 | |
|       'deviceId',
 | |
|     );
 | |
|   });
 | |
|   test('setBlockedUserDeviceKey', () async {
 | |
|     await database.setBlockedUserDeviceKey(
 | |
|       true,
 | |
|       clientId,
 | |
|       '@alice:example.com',
 | |
|       'deviceId',
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   // Clearing up from here
 | |
|   test('clearSSSSCache', () async {
 | |
|     await database.clearSSSSCache(clientId);
 | |
|   });
 | |
|   test('clearCache', () async {
 | |
|     await database.clearCache(clientId);
 | |
|   });
 | |
|   test('clear', () async {
 | |
|     await database.clear(clientId);
 | |
|   });
 | |
|   test('Close', () async {
 | |
|     await database.close();
 | |
|   });
 | |
|   return;
 | |
| }
 |