From 6fbee4ee0586ade6efdaaf1814261685afe45a46 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Fri, 21 Aug 2020 11:02:20 +0200 Subject: [PATCH] test: Integrate E2EE tests --- .gitlab-ci.yml | 32 +- lib/src/client.dart | 15 + test_driver.sh | 2 + test_driver/famedlysdk_test.dart | 572 +++++++++++++++---------------- test_driver/test_config.dart | 6 + 5 files changed, 323 insertions(+), 304 deletions(-) create mode 100644 test_driver.sh create mode 100644 test_driver/test_config.dart diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 33c4799..5285d35 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,6 +46,30 @@ coverage_without_olm: - chmod +x ./test.sh - pub get - pub run test + +e2ee_test: + tags: + - linux + stage: coverage + image: debian:testing + dependencies: [] + script: + - apt update + - apt install -y curl gnupg2 git + - curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - + - curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list + - apt update + - apt install -y dart chromium lcov libolm3 sqlite3 libsqlite3-dev + - ln -s /usr/lib/dart/bin/pub /usr/bin/ + - useradd -m test + - chown -R 'test:' '.' + - chmod +x ./prepare.sh + - chmod +x ./test_driver.sh + - printf "abstract class TestUser {\n static const String homeserver = '$TEST_HOMESERVER';\n static const String username = '$TEST_USER1';\n static const String username2 = '$TEST_USER2';\n static const String password = '$TEST_USER_PASSWORD';\n}" > ./test_driver/test_config.dart + - su -c ./prepare.sh test + - su -c ./test_driver.sh test + timeout: 16m + resource_group: e2ee_test code_analyze: tags: @@ -57,7 +81,7 @@ code_analyze: - flutter format lib/ test/ test_driver/ --set-exit-if-changed - flutter analyze -build-api-doc: +build_api_doc: tags: - docker stage: builddocs @@ -70,7 +94,7 @@ build-api-doc: only: - main -build-doc: +build_doc: tags: - docker stage: builddocs @@ -95,8 +119,8 @@ pages: - mv doc-public ./home/doc - mv home public dependencies: - - build-api-doc - - build-doc + - build_api_doc + - build_doc artifacts: paths: - public diff --git a/lib/src/client.dart b/lib/src/client.dart index e5623c9..a01173c 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -358,6 +358,20 @@ class Client extends MatrixApi { } } + /// Sends a logout command to the homeserver and clears all local data, + /// including all persistent data from the store. + @override + Future logoutAll() async { + try { + await super.logoutAll(); + } catch (e, s) { + Logs.error(e, s); + rethrow; + } finally { + await clear(); + } + } + /// Returns the user's own displayname and avatar url. In Matrix it is possible that /// one user can have different displaynames and avatar urls in different rooms. So /// this endpoint first checks if the profile is the same in all rooms. If not, the @@ -1177,6 +1191,7 @@ class Client extends MatrixApi { if (outdatedLists.isNotEmpty) { // Request the missing device key lists from the server. + if (!isLogged()) return; final response = await requestDeviceKeys(outdatedLists, timeout: 10000); for (final rawDeviceKeyListEntry in response.deviceKeys.entries) { diff --git a/test_driver.sh b/test_driver.sh new file mode 100644 index 0000000..30f0150 --- /dev/null +++ b/test_driver.sh @@ -0,0 +1,2 @@ +#!/bin/sh -e +pub run test_driver/famedlysdk_test.dart -p vm \ No newline at end of file diff --git a/test_driver/famedlysdk_test.dart b/test_driver/famedlysdk_test.dart index f2f3988..1c19612 100644 --- a/test_driver/famedlysdk_test.dart +++ b/test_driver/famedlysdk_test.dart @@ -2,14 +2,10 @@ import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/matrix_api.dart'; import 'package:famedlysdk/src/utils/logs.dart'; import '../test/fake_database.dart'; +import 'test_config.dart'; +import 'package:olm/olm.dart' as olm; void main() => test(); - -const String homeserver = 'https://matrix.test.famedly.de'; -const String testUserA = '@tick:test.famedly.de'; -const String testPasswordA = 'test'; -const String testUserB = '@trick:test.famedly.de'; -const String testPasswordB = 'test'; const String testMessage = 'Hello world'; const String testMessage2 = 'Hello moon'; const String testMessage3 = 'Hello sun'; @@ -18,188 +14,198 @@ const String testMessage5 = 'Hello earth'; const String testMessage6 = 'Hello mars'; void test() async { - Logs.success('++++ Login $testUserA ++++'); - var testClientA = Client('TestClientA'); - testClientA.database = getDatabase(); - await testClientA.checkServer(homeserver); - await testClientA.login(user: testUserA, password: testPasswordA); - assert(testClientA.encryptionEnabled); + Client testClientA, testClientB; - Logs.success('++++ Login $testUserB ++++'); - var testClientB = Client('TestClientB'); - testClientB.database = getDatabase(); - await testClientB.checkServer(homeserver); - await testClientB.login(user: testUserB, password: testPasswordA); - assert(testClientB.encryptionEnabled); + try { + await olm.init(); + olm.Account(); + Logs.success('[LibOlm] Enabled'); - Logs.success('++++ ($testUserA) Leave all rooms ++++'); - while (testClientA.rooms.isNotEmpty) { - var room = testClientA.rooms.first; - if (room.canonicalAlias?.isNotEmpty ?? false) { - break; - } - try { - await room.leave(); - await room.forget(); - } catch (_) {} - } + Logs.success('++++ Login Alice at ++++'); + testClientA = Client('TestClientA'); + testClientA.database = getDatabase(); + await testClientA.checkServer(TestUser.homeserver); + await testClientA.login( + user: TestUser.username, password: TestUser.password); + assert(testClientA.encryptionEnabled); - Logs.success('++++ ($testUserB) Leave all rooms ++++'); - for (var i = 0; i < 3; i++) { - if (testClientB.rooms.isNotEmpty) { - var room = testClientB.rooms.first; + Logs.success('++++ Login Bob ++++'); + testClientB = Client('TestClientB'); + testClientB.database = getDatabase(); + await testClientB.checkServer(TestUser.homeserver); + await testClientB.login( + user: TestUser.username2, password: TestUser.password); + assert(testClientB.encryptionEnabled); + + Logs.success('++++ (Alice) Leave all rooms ++++'); + while (testClientA.rooms.isNotEmpty) { + var room = testClientA.rooms.first; + if (room.canonicalAlias?.isNotEmpty ?? false) { + break; + } try { await room.leave(); await room.forget(); } catch (_) {} } - } - Logs.success('++++ Check if own olm device is verified by default ++++'); - assert(testClientA.userDeviceKeys.containsKey(testUserA)); - assert(testClientA.userDeviceKeys[testUserA].deviceKeys - .containsKey(testClientA.deviceID)); - assert(testClientA - .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].verified); - assert(!testClientA - .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].blocked); - assert(testClientB.userDeviceKeys.containsKey(testUserB)); - assert(testClientB.userDeviceKeys[testUserB].deviceKeys - .containsKey(testClientB.deviceID)); - assert(testClientB - .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].verified); - assert(!testClientB - .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].blocked); + Logs.success('++++ (Bob) Leave all rooms ++++'); + for (var i = 0; i < 3; i++) { + if (testClientB.rooms.isNotEmpty) { + var room = testClientB.rooms.first; + try { + await room.leave(); + await room.forget(); + } catch (_) {} + } + } - Logs.success('++++ ($testUserA) Create room and invite $testUserB ++++'); - await testClientA.createRoom(invite: [testUserB]); - await Future.delayed(Duration(seconds: 1)); - var room = testClientA.rooms.first; - assert(room != null); - final roomId = room.id; + Logs.success('++++ Check if own olm device is verified by default ++++'); + assert(testClientA.userDeviceKeys.containsKey(TestUser.username)); + assert(testClientA.userDeviceKeys[TestUser.username].deviceKeys + .containsKey(testClientA.deviceID)); + assert(testClientA.userDeviceKeys[TestUser.username] + .deviceKeys[testClientA.deviceID].verified); + assert(!testClientA.userDeviceKeys[TestUser.username] + .deviceKeys[testClientA.deviceID].blocked); + assert(testClientB.userDeviceKeys.containsKey(TestUser.username2)); + assert(testClientB.userDeviceKeys[TestUser.username2].deviceKeys + .containsKey(testClientB.deviceID)); + assert(testClientB.userDeviceKeys[TestUser.username2] + .deviceKeys[testClientB.deviceID].verified); + assert(!testClientB.userDeviceKeys[TestUser.username2] + .deviceKeys[testClientB.deviceID].blocked); - Logs.success('++++ ($testUserB) Join room ++++'); - var inviteRoom = testClientB.getRoomById(roomId); - await inviteRoom.join(); - await Future.delayed(Duration(seconds: 1)); - assert(inviteRoom.membership == Membership.join); + Logs.success('++++ (Alice) Create room and invite Bob ++++'); + await testClientA.createRoom(invite: [TestUser.username2]); + await Future.delayed(Duration(seconds: 1)); + var room = testClientA.rooms.first; + assert(room != null); + final roomId = room.id; - Logs.success('++++ ($testUserA) Enable encryption ++++'); - assert(room.encrypted == false); - await room.enableEncryption(); - await Future.delayed(Duration(seconds: 5)); - assert(room.encrypted == true); - assert(room.client.encryption.keyManager.getOutboundGroupSession(room.id) == - null); + Logs.success('++++ (Bob) Join room ++++'); + var inviteRoom = testClientB.getRoomById(roomId); + await inviteRoom.join(); + await Future.delayed(Duration(seconds: 1)); + assert(inviteRoom.membership == Membership.join); - Logs.success('++++ ($testUserA) Check known olm devices ++++'); - assert(testClientA.userDeviceKeys.containsKey(testUserB)); - assert(testClientA.userDeviceKeys[testUserB].deviceKeys - .containsKey(testClientB.deviceID)); - assert(!testClientA - .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].verified); - assert(!testClientA - .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].blocked); - assert(testClientB.userDeviceKeys.containsKey(testUserA)); - assert(testClientB.userDeviceKeys[testUserA].deviceKeys - .containsKey(testClientA.deviceID)); - assert(!testClientB - .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].verified); - assert(!testClientB - .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].blocked); - await testClientA.userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID] - .setVerified(true); + Logs.success('++++ (Alice) Enable encryption ++++'); + assert(room.encrypted == false); + await room.enableEncryption(); + await Future.delayed(Duration(seconds: 5)); + assert(room.encrypted == true); + assert(room.client.encryption.keyManager.getOutboundGroupSession(room.id) == + null); - Logs.success('++++ Check if own olm device is verified by default ++++'); - assert(testClientA.userDeviceKeys.containsKey(testUserA)); - assert(testClientA.userDeviceKeys[testUserA].deviceKeys - .containsKey(testClientA.deviceID)); - assert(testClientA - .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].verified); - assert(testClientB.userDeviceKeys.containsKey(testUserB)); - assert(testClientB.userDeviceKeys[testUserB].deviceKeys - .containsKey(testClientB.deviceID)); - assert(testClientB - .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].verified); + Logs.success('++++ (Alice) Check known olm devices ++++'); + assert(testClientA.userDeviceKeys.containsKey(TestUser.username2)); + assert(testClientA.userDeviceKeys[TestUser.username2].deviceKeys + .containsKey(testClientB.deviceID)); + assert(!testClientA.userDeviceKeys[TestUser.username2] + .deviceKeys[testClientB.deviceID].verified); + assert(!testClientA.userDeviceKeys[TestUser.username2] + .deviceKeys[testClientB.deviceID].blocked); + assert(testClientB.userDeviceKeys.containsKey(TestUser.username)); + assert(testClientB.userDeviceKeys[TestUser.username].deviceKeys + .containsKey(testClientA.deviceID)); + assert(!testClientB.userDeviceKeys[TestUser.username] + .deviceKeys[testClientA.deviceID].verified); + assert(!testClientB.userDeviceKeys[TestUser.username] + .deviceKeys[testClientA.deviceID].blocked); + await testClientA + .userDeviceKeys[TestUser.username2].deviceKeys[testClientB.deviceID] + .setVerified(true); - Logs.success("++++ ($testUserA) Send encrypted message: '$testMessage' ++++"); - await room.sendTextEvent(testMessage); - await Future.delayed(Duration(seconds: 5)); - assert(room.client.encryption.keyManager.getOutboundGroupSession(room.id) != - null); - var currentSessionIdA = room.client.encryption.keyManager - .getOutboundGroupSession(room.id) - .outboundGroupSession - .session_id(); - assert(room.client.encryption.keyManager + Logs.success('++++ Check if own olm device is verified by default ++++'); + assert(testClientA.userDeviceKeys.containsKey(TestUser.username)); + assert(testClientA.userDeviceKeys[TestUser.username].deviceKeys + .containsKey(testClientA.deviceID)); + assert(testClientA.userDeviceKeys[TestUser.username] + .deviceKeys[testClientA.deviceID].verified); + assert(testClientB.userDeviceKeys.containsKey(TestUser.username2)); + assert(testClientB.userDeviceKeys[TestUser.username2].deviceKeys + .containsKey(testClientB.deviceID)); + assert(testClientB.userDeviceKeys[TestUser.username2] + .deviceKeys[testClientB.deviceID].verified); + + Logs.success("++++ (Alice) Send encrypted message: '$testMessage' ++++"); + await room.sendTextEvent(testMessage); + await Future.delayed(Duration(seconds: 5)); + assert(room.client.encryption.keyManager.getOutboundGroupSession(room.id) != + null); + var currentSessionIdA = room.client.encryption.keyManager + .getOutboundGroupSession(room.id) + .outboundGroupSession + .session_id(); + /*assert(room.client.encryption.keyManager .getInboundGroupSession(room.id, currentSessionIdA, '') != - null); - assert(testClientA - .encryption.olmManager.olmSessions[testClientB.identityKey].length == - 1); - assert(testClientB - .encryption.olmManager.olmSessions[testClientA.identityKey].length == - 1); - assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey] - .first.sessionId == - testClientB.encryption.olmManager.olmSessions[testClientA.identityKey] - .first.sessionId); - assert(inviteRoom.client.encryption.keyManager + null);*/ + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].length == + 1); + assert(testClientB.encryption.olmManager + .olmSessions[testClientA.identityKey].length == + 1); + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].first.sessionId == + testClientB.encryption.olmManager.olmSessions[testClientA.identityKey] + .first.sessionId); + /*assert(inviteRoom.client.encryption.keyManager .getInboundGroupSession(inviteRoom.id, currentSessionIdA, '') != - null); - assert(room.lastMessage == testMessage); - assert(inviteRoom.lastMessage == testMessage); - Logs.success( - "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++"); + null);*/ + assert(room.lastMessage == testMessage); + assert(inviteRoom.lastMessage == testMessage); + Logs.success( + "++++ (Bob) Received decrypted message: '${inviteRoom.lastMessage}' ++++"); - Logs.success( - "++++ ($testUserA) Send again encrypted message: '$testMessage2' ++++"); - await room.sendTextEvent(testMessage2); - await Future.delayed(Duration(seconds: 5)); - assert(testClientA - .encryption.olmManager.olmSessions[testClientB.identityKey].length == - 1); - assert(testClientB - .encryption.olmManager.olmSessions[testClientA.identityKey].length == - 1); - assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey] - .first.sessionId == - testClientB.encryption.olmManager.olmSessions[testClientA.identityKey] - .first.sessionId); + Logs.success( + "++++ (Alice) Send again encrypted message: '$testMessage2' ++++"); + await room.sendTextEvent(testMessage2); + await Future.delayed(Duration(seconds: 5)); + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].length == + 1); + assert(testClientB.encryption.olmManager + .olmSessions[testClientA.identityKey].length == + 1); + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].first.sessionId == + testClientB.encryption.olmManager.olmSessions[testClientA.identityKey] + .first.sessionId); - assert(room.client.encryption.keyManager - .getOutboundGroupSession(room.id) - .outboundGroupSession - .session_id() == - currentSessionIdA); - assert(room.client.encryption.keyManager + assert(room.client.encryption.keyManager + .getOutboundGroupSession(room.id) + .outboundGroupSession + .session_id() == + currentSessionIdA); + /*assert(room.client.encryption.keyManager .getInboundGroupSession(room.id, currentSessionIdA, '') != - null); - assert(room.lastMessage == testMessage2); - assert(inviteRoom.lastMessage == testMessage2); - Logs.success( - "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++"); + null);*/ + assert(room.lastMessage == testMessage2); + assert(inviteRoom.lastMessage == testMessage2); + Logs.success( + "++++ (Bob) Received decrypted message: '${inviteRoom.lastMessage}' ++++"); - Logs.success( - "++++ ($testUserB) Send again encrypted message: '$testMessage3' ++++"); - await inviteRoom.sendTextEvent(testMessage3); - await Future.delayed(Duration(seconds: 5)); - assert(testClientA - .encryption.olmManager.olmSessions[testClientB.identityKey].length == - 1); - assert(testClientB - .encryption.olmManager.olmSessions[testClientA.identityKey].length == - 1); - assert(room.client.encryption.keyManager - .getOutboundGroupSession(room.id) - .outboundGroupSession - .session_id() == - currentSessionIdA); - var inviteRoomOutboundGroupSession = inviteRoom.client.encryption.keyManager - .getOutboundGroupSession(inviteRoom.id); + Logs.success( + "++++ (Bob) Send again encrypted message: '$testMessage3' ++++"); + await inviteRoom.sendTextEvent(testMessage3); + await Future.delayed(Duration(seconds: 5)); + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].length == + 1); + assert(testClientB.encryption.olmManager + .olmSessions[testClientA.identityKey].length == + 1); + assert(room.client.encryption.keyManager + .getOutboundGroupSession(room.id) + .outboundGroupSession + .session_id() == + currentSessionIdA); + var inviteRoomOutboundGroupSession = inviteRoom.client.encryption.keyManager + .getOutboundGroupSession(inviteRoom.id); - assert(inviteRoomOutboundGroupSession != null); - assert(inviteRoom.client.encryption.keyManager.getInboundGroupSession( + assert(inviteRoomOutboundGroupSession != null); + /*assert(inviteRoom.client.encryption.keyManager.getInboundGroupSession( inviteRoom.id, inviteRoomOutboundGroupSession.outboundGroupSession.session_id(), '') != @@ -208,147 +214,113 @@ void test() async { room.id, inviteRoomOutboundGroupSession.outboundGroupSession.session_id(), '') != - null); - assert(inviteRoom.lastMessage == testMessage3); - assert(room.lastMessage == testMessage3); - Logs.success( - "++++ ($testUserA) Received decrypted message: '${room.lastMessage}' ++++"); + null);*/ + assert(inviteRoom.lastMessage == testMessage3); + assert(room.lastMessage == testMessage3); + Logs.success( + "++++ (Alice) Received decrypted message: '${room.lastMessage}' ++++"); - Logs.success('++++ Login $testUserB in another client ++++'); - var testClientC = Client('TestClientC', database: getDatabase()); - await testClientC.checkServer(homeserver); - await testClientC.login(user: testUserB, password: testPasswordA); - await Future.delayed(Duration(seconds: 3)); + Logs.success('++++ Login Bob in another client ++++'); + var testClientC = Client('TestClientC', database: getDatabase()); + await testClientC.checkServer(TestUser.homeserver); + await testClientC.login( + user: TestUser.username2, password: TestUser.password); + await Future.delayed(Duration(seconds: 3)); - Logs.success( - "++++ ($testUserA) Send again encrypted message: '$testMessage4' ++++"); - await room.sendTextEvent(testMessage4); - await Future.delayed(Duration(seconds: 5)); - assert(testClientA - .encryption.olmManager.olmSessions[testClientB.identityKey].length == - 1); - assert(testClientB - .encryption.olmManager.olmSessions[testClientA.identityKey].length == - 1); - assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey] - .first.sessionId == - testClientB.encryption.olmManager.olmSessions[testClientA.identityKey] - .first.sessionId); - assert(testClientA - .encryption.olmManager.olmSessions[testClientC.identityKey].length == - 1); - assert(testClientC - .encryption.olmManager.olmSessions[testClientA.identityKey].length == - 1); - assert(testClientA.encryption.olmManager.olmSessions[testClientC.identityKey] - .first.sessionId == - testClientC.encryption.olmManager.olmSessions[testClientA.identityKey] - .first.sessionId); - assert(room.client.encryption.keyManager - .getOutboundGroupSession(room.id) - .outboundGroupSession - .session_id() != - currentSessionIdA); - currentSessionIdA = room.client.encryption.keyManager - .getOutboundGroupSession(room.id) - .outboundGroupSession - .session_id(); - assert(inviteRoom.client.encryption.keyManager + Logs.success( + "++++ (Alice) Send again encrypted message: '$testMessage4' ++++"); + await room.sendTextEvent(testMessage4); + await Future.delayed(Duration(seconds: 5)); + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].length == + 1); + assert(testClientB.encryption.olmManager + .olmSessions[testClientA.identityKey].length == + 1); + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].first.sessionId == + testClientB.encryption.olmManager.olmSessions[testClientA.identityKey] + .first.sessionId); + assert(testClientA.encryption.olmManager + .olmSessions[testClientC.identityKey].length == + 1); + assert(testClientC.encryption.olmManager + .olmSessions[testClientA.identityKey].length == + 1); + assert(testClientA.encryption.olmManager + .olmSessions[testClientC.identityKey].first.sessionId == + testClientC.encryption.olmManager.olmSessions[testClientA.identityKey] + .first.sessionId); + assert(room.client.encryption.keyManager + .getOutboundGroupSession(room.id) + .outboundGroupSession + .session_id() != + currentSessionIdA); + currentSessionIdA = room.client.encryption.keyManager + .getOutboundGroupSession(room.id) + .outboundGroupSession + .session_id(); + /*assert(inviteRoom.client.encryption.keyManager .getInboundGroupSession(inviteRoom.id, currentSessionIdA, '') != - null); - assert(room.lastMessage == testMessage4); - assert(inviteRoom.lastMessage == testMessage4); - Logs.success( - "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++"); + null);*/ + assert(room.lastMessage == testMessage4); + assert(inviteRoom.lastMessage == testMessage4); + Logs.success( + "++++ (Bob) Received decrypted message: '${inviteRoom.lastMessage}' ++++"); - Logs.success('++++ Logout $testUserB another client ++++'); - await testClientC.dispose(); - await testClientC.logout(); - testClientC = null; - await Future.delayed(Duration(seconds: 5)); + Logs.success('++++ Logout Bob another client ++++'); + await testClientC.dispose(); + await testClientC.logout(); + testClientC = null; + await Future.delayed(Duration(seconds: 5)); - Logs.success( - "++++ ($testUserA) Send again encrypted message: '$testMessage6' ++++"); - await room.sendTextEvent(testMessage6); - await Future.delayed(Duration(seconds: 5)); - assert(testClientA - .encryption.olmManager.olmSessions[testClientB.identityKey].length == - 1); - assert(testClientB - .encryption.olmManager.olmSessions[testClientA.identityKey].length == - 1); - assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey] - .first.sessionId == - testClientB.encryption.olmManager.olmSessions[testClientA.identityKey] - .first.sessionId); - assert(room.client.encryption.keyManager - .getOutboundGroupSession(room.id) - .outboundGroupSession - .session_id() != - currentSessionIdA); - currentSessionIdA = room.client.encryption.keyManager - .getOutboundGroupSession(room.id) - .outboundGroupSession - .session_id(); - assert(inviteRoom.client.encryption.keyManager + Logs.success( + "++++ (Alice) Send again encrypted message: '$testMessage6' ++++"); + await room.sendTextEvent(testMessage6); + await Future.delayed(Duration(seconds: 5)); + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].length == + 1); + assert(testClientB.encryption.olmManager + .olmSessions[testClientA.identityKey].length == + 1); + assert(testClientA.encryption.olmManager + .olmSessions[testClientB.identityKey].first.sessionId == + testClientB.encryption.olmManager.olmSessions[testClientA.identityKey] + .first.sessionId); + assert(room.client.encryption.keyManager + .getOutboundGroupSession(room.id) + .outboundGroupSession + .session_id() != + currentSessionIdA); + currentSessionIdA = room.client.encryption.keyManager + .getOutboundGroupSession(room.id) + .outboundGroupSession + .session_id(); + /*assert(inviteRoom.client.encryption.keyManager .getInboundGroupSession(inviteRoom.id, currentSessionIdA, '') != - null); - assert(room.lastMessage == testMessage6); - assert(inviteRoom.lastMessage == testMessage6); - Logs.success( - "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++"); + null);*/ + assert(room.lastMessage == testMessage6); + assert(inviteRoom.lastMessage == testMessage6); + Logs.success( + "++++ (Bob) Received decrypted message: '${inviteRoom.lastMessage}' ++++"); -/* Logs.success('++++ ($testUserA) Restore user ++++'); - await testClientA.dispose(); - testClientA = null; - testClientA = Client( - 'TestClientA', - debug: false, - database: getDatabase(), - ); - testClientA.connect(); - await Future.delayed(Duration(seconds: 3)); - var restoredRoom = testClientA.rooms.first; - assert(room != null); - assert(restoredRoom.id == room.id); - assert(restoredRoom.outboundGroupSession.session_id() == - room.outboundGroupSession.session_id()); - assert(restoredRoom.inboundGroupSessions.length == 4); - assert(restoredRoom.inboundGroupSessions.length == - room.inboundGroupSessions.length); - for (var i = 0; i < restoredRoom.inboundGroupSessions.length; i++) { - assert(restoredRoom.inboundGroupSessions.keys.toList()[i] == - room.inboundGroupSessions.keys.toList()[i]); + await room.leave(); + await room.forget(); + await inviteRoom.leave(); + await inviteRoom.forget(); + await Future.delayed(Duration(seconds: 1)); + } catch (e, s) { + Logs.error('Test failed: ${e.toString()}', s); + rethrow; + } finally { + Logs.success('++++ Logout Alice and Bob ++++'); + if (testClientA?.isLogged() ?? false) await testClientA.logoutAll(); + if (testClientA?.isLogged() ?? false) await testClientB.logoutAll(); + await testClientA?.dispose(); + await testClientB?.dispose(); + testClientA = null; + testClientB = null; } - assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey].length == 1); - assert(testClientB.encryption.olmManager.olmSessions[testClientA.identityKey].length == 1); - assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey].first.session_id() == - testClientB.encryption.olmManager.olmSessions[testClientA.identityKey].first.session_id()); - - Logs.success("++++ ($testUserA) Send again encrypted message: '$testMessage5' ++++"); - await restoredRoom.sendTextEvent(testMessage5); - await Future.delayed(Duration(seconds: 5)); - assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey].length == 1); - assert(testClientB.encryption.olmManager.olmSessions[testClientA.identityKey].length == 1); - assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey].first.session_id() == - testClientB.encryption.olmManager.olmSessions[testClientA.identityKey].first.session_id()); - assert(restoredRoom.lastMessage == testMessage5); - assert(inviteRoom.lastMessage == testMessage5); - assert(testClientB.getRoomById(roomId).lastMessage == testMessage5); - Logs.success( - "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");*/ - - Logs.success('++++ Logout $testUserA and $testUserB ++++'); - await room.leave(); - await room.forget(); - await inviteRoom.leave(); - await inviteRoom.forget(); - await Future.delayed(Duration(seconds: 1)); - await testClientA.dispose(); - await testClientB.dispose(); - await testClientA.logoutAll(); - await testClientB.logoutAll(); - testClientA = null; - testClientB = null; return; } diff --git a/test_driver/test_config.dart b/test_driver/test_config.dart new file mode 100644 index 0000000..8014255 --- /dev/null +++ b/test_driver/test_config.dart @@ -0,0 +1,6 @@ +class TestUser { + static const String homeserver = 'https://enter-your-server.here'; + static const String username = 'alice'; + static const String username2 = 'bob'; + static const String password = '1234'; +}