Skip to content

Commit 28d6d12

Browse files
authored
Merge pull request #1708 from matthiasn/feat/matrix_user_per_device
test: use Matrix user per device
2 parents e27b2f9 + 204c51b commit 28d6d12

File tree

9 files changed

+158
-16
lines changed

9 files changed

+158
-16
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,5 @@ whisper.cpp/whisper.cpp-*/
7878

7979
# FVM Version Cache
8080
.fvm/
81+
82+
integration_test/dendrite/config/jetstream/

integration_test/README.md

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Integration test for Matrix sync
2+
3+
Clone [dendrite](https://github.com/matrix-org/dendrite) into a sibling directory,
4+
e.g. `~/github/dendrite`. Build it, we need the executable in order to create users for the test.
5+
6+
Run dendrite in a separate shell:
7+
8+
```shell
9+
$ cd integration_test/dendrite/
10+
$ docker-compose up
11+
```
12+
13+
Run the test script:
14+
15+
````shell
16+
$ ./integration_test/run_matrix_tests.sh
17+
````
18+
19+
The test script will create two users and then run a Flutter integration test that instantiates two
20+
separate clients with these users, and then initiates device verification, which should complete
21+
successfully. Also see [PR #1695](https://github.com/matthiasn/lotti/pull/1695) for more details.
22+
23+
24+
## Testing with simulated bad network
25+
26+
Install [comcast](https://github.com/tylertreat/Comcast), e.g.:
27+
28+
````shell
29+
$ GOBIN=~/bin/ go install github.com/tylertreat/comcast@latest
30+
````
31+
32+
To be continued.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN MATRIX PRIVATE KEY-----
2+
Key-ID: ed25519:m9ZDvn
3+
4+
m9ZDvnTcTK9BEbTapMxYnnduvC85/MF7JGCM81jTAII=
5+
-----END MATRIX PRIVATE KEY-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEvzCCAqegAwIBAgIQaFJAs058LlLB6G7cdoKFSDANBgkqhkiG9w0BAQsFADAA
3+
MB4XDTI0MDMyMjIxMDA0NloXDTM0MDMyMDIxMDA0NlowADCCAiIwDQYJKoZIhvcN
4+
AQEBBQADggIPADCCAgoCggIBANP+Vgi84ht36Y7YpiSL2DHr8fVPg2ZhLGU7z7Yj
5+
wcxudaRKzZyV3XGbtQkUQANdPzLYQGHa4ZxV7LACM6YuHBatw65Gpq1YSp06TzQT
6+
GGt6M52nGL0sgf/xHMOGFsIrn7Ol2h4VLkVLvHsEtSJZKFVcEq6l3Y4q52c1PUBK
7+
4BmdZJqh86qmupZ/z8ICl5vU8mfPIQ8i7HkX3hZ4aYoyQM5Fw/Myf+GVNsnYmGW9
8+
W+OucOv012tudWa99zUiRQ8wVONSvHuu2l+folTUiDr5VhZaquIczPl5NeH73+dK
9+
1JBaLzKemqsVfg2KjkkLMA6TXWEfgxb4fKq7c5LYS7bDkNRKsQPUr8bTaere0UEk
10+
NTwwuJpOUOSxzRi1YWGdBEHuE03iXsHh0B83CFDADIIR2qOcy/Q4Ib/a4DOU++Hd
11+
5ZKFoaFQwDh6rttw+h91DODWxLppPOLQoVK+EzQiVejpTl8Pa2FQ3hkJ/DBQmwgK
12+
3ClZQTxoMc/K68kPvUXGcxEBsJKfHr3SIT6t/3tl43T9j+vYXgxgdEJ4H3AzrAsv
13+
jXaG0HkElIh7OFjIanGeVthjhFVHgGs4YoprCsym+EFbcsjjOT9yjKpmtillwSwe
14+
BU614D9HHGOEMpUruEd1UH4EOEvk94P57zDlUAr6fjl1qJH31uWtKPSsPJoDoiR+
15+
m0+FAgMBAAGjNTAzMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcD
16+
ATAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQCZnsSQWP3pAziFtrUP
17+
LXuhysdzp/ciJbc2GrVD89VjSuxgivrb4hEGXBbf2ZzSLy6nVWToDltrtJhxGb0v
18+
1Oof3KOS6abQpvKJZs06L3BbzMWr0+oAeHvDvwFdW0QDswOr06/WwCOkYcRALB35
19+
YBfTaiLdvg/i2F2jEiEMAynGic5gRj2mFXcvQF3epwIph0haUm8Xqb5WQvi8s2mq
20+
vLQc2HnYZfKYlIMVNu3uaT3BL3k/G9nlWMOqy1wm7zPKCRaA22a2djz53lNT3tG8
21+
Jk82x1pAucQQbLTn+vzHbcDqDaBPd1B4ABV/u3SkKiX7sGdt4ZSAuOZKa3xKK4kG
22+
V0opWApQpYiF0aKvd1JurVzbth9s6aaHW/qleNa6UHGjCc6T0nQys5HF559dyra6
23+
hbFXPP0iiXhQXtH5123S1Ed2uzM7jecUuvMP2yQ4ZlxJOmu/62Eoy+u3XElid+L+
24+
339IBhBaSvpyQgCzwxRaIMKh+p5iws9D9b/mkiNr8wgWl9NYhFm7BQkEy+5LXjlK
25+
t6BLKGi+g57HHaO6OmopKP7EX3t5FYWbZ57IZCV9JCv9oDIfNucqw/2Sp4NIORpV
26+
8Zskxf62v5l5wTMGwnVSAJfeOwhOE2gaOsqCNcjaxxC7Kl82IwG66WPBgS1vS7OL
27+
2aERJZQxVIvxEO9KMr3Qjv3GQw==
28+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
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
51+
-----END RSA PRIVATE KEY-----

integration_test/matrix_service_test.dart

+29-10
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,41 @@ void main() {
2121
group('MatrixService Tests', () {
2222
final mockLoggingDb = MockLoggingDb();
2323
final secureStorageMock = MockSecureStorage();
24-
const testUserEnv = 'TEST_USER';
24+
const testUserEnv1 = 'TEST_USER1';
25+
const testUserEnv2 = 'TEST_USER2';
2526
const testServerEnv = 'TEST_SERVER';
2627
const testPasswordEnv = 'TEST_PASSWORD';
2728
const testSlowNetworkEnv = 'SLOW_NETWORK';
2829

29-
if (!const bool.hasEnvironment(testUserEnv)) {
30-
debugPrint('TEST_USER not defined!!! Run via run_matrix_tests.sh');
30+
if (!const bool.hasEnvironment(testUserEnv1)) {
31+
debugPrint('TEST_USER1 not defined!!! Run via run_matrix_tests.sh');
3132
exit(1);
3233
}
33-
const testUserName = String.fromEnvironment(testUserEnv);
34+
35+
if (!const bool.hasEnvironment(testUserEnv2)) {
36+
debugPrint('TEST_USER2 not defined!!! Run via run_matrix_tests.sh');
37+
exit(1);
38+
}
39+
40+
const testUserName1 = String.fromEnvironment(testUserEnv1);
41+
const testUserName2 = String.fromEnvironment(testUserEnv1);
42+
3443
const testHomeServer = bool.hasEnvironment(testServerEnv)
3544
? String.fromEnvironment(testServerEnv)
3645
: 'http://localhost:8008';
3746
const testPassword = bool.hasEnvironment(testPasswordEnv)
3847
? String.fromEnvironment(testPasswordEnv)
3948
: '?Secret123@!';
4049

41-
const config = MatrixConfig(
50+
const config1 = MatrixConfig(
4251
homeServer: testHomeServer,
43-
user: testUserName,
52+
user: testUserName1,
53+
password: testPassword,
54+
);
55+
56+
const config2 = MatrixConfig(
57+
homeServer: testHomeServer,
58+
user: testUserName2,
4459
password: testPassword,
4560
);
4661

@@ -67,7 +82,7 @@ void main() {
6782
() async {
6883
debugPrint('\n--- AliceDevice goes live');
6984
final aliceDevice = MatrixService(
70-
matrixConfig: config,
85+
matrixConfig: config1,
7186
hiveDbName: 'AliceDevice',
7287
deviceDisplayName: 'AliceDevice',
7388
);
@@ -89,7 +104,7 @@ void main() {
89104

90105
debugPrint('\n--- BobDevice goes live');
91106
final bobDevice = MatrixService(
92-
matrixConfig: config,
107+
matrixConfig: config2,
93108
hiveDbName: 'BobDevice',
94109
deviceDisplayName: 'BobDevice',
95110
);
@@ -101,14 +116,18 @@ void main() {
101116
final joinRes2 = await bobDevice.joinRoom(roomId);
102117
debugPrint('BobDevice - room joined: $joinRes2');
103118

119+
await Future<void>.delayed(
120+
const Duration(seconds: 1 * delayFactor),
121+
);
122+
104123
await waitUntil(() => aliceDevice.getUnverified().length == 1);
105124
await waitUntil(() => bobDevice.getUnverified().length == 1);
106125

107126
final unverifiedAlice = aliceDevice.getUnverified();
108127
final unverifiedBob = bobDevice.getUnverified();
109128

110-
debugPrint('AliceDevice - unverified: $unverifiedAlice');
111-
debugPrint('BobDevice - unverified: $unverifiedBob');
129+
debugPrint('\nAliceDevice - unverified: $unverifiedAlice');
130+
debugPrint('\nBobDevice - unverified: $unverifiedBob');
112131

113132
expect(unverifiedAlice.length, 1);
114133
expect(unverifiedBob.length, 1);

integration_test/run_matrix_tests.sh

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
#!/bin/bash
22

33
# Create user name
4-
uuid=$(uuidgen)
5-
TEST_USER="$(tr '[:upper:]' '[:lower:]' <<< "$uuid")"
4+
uuid1=$(uuidgen)
5+
uuid2=$(uuidgen)
6+
TEST_USER1="$(tr '[:upper:]' '[:lower:]' <<< "$uuid1")"
7+
TEST_USER2="$(tr '[:upper:]' '[:lower:]' <<< "$uuid2")"
68

79
# Go to dendrite docker directory that contains config and keys
810
cd ../dendrite/build/docker/config || exit
911

1012
# Create user using the create-account binary in dendrite build
11-
../../../bin/create-account -config dendrite.yaml -username "$TEST_USER" -admin -password "?Secret123@!"
13+
../../../bin/create-account -config dendrite.yaml -username "$TEST_USER1" -admin -password "?Secret123@!"
14+
../../../bin/create-account -config dendrite.yaml -username "$TEST_USER2" -admin -password "?Secret123@!"
1215
cd - > /dev/null || exit
1316

14-
fvm flutter test integration_test/matrix_service_test.dart --dart-define=TEST_USER="@$TEST_USER:localhost"
17+
fvm flutter test integration_test/matrix_service_test.dart \
18+
--dart-define=TEST_USER1="@$TEST_USER1:localhost" \
19+
--dart-define=TEST_USER2="@$TEST_USER2:localhost"

lib/sync/matrix/matrix_service.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class MatrixService {
8686
String? hiveDbName,
8787
}) {
8888
return Client(
89-
'lotti',
89+
deviceDisplayName ?? 'lotti',
9090
verificationMethods: {
9191
KeyVerificationMethod.emoji,
9292
KeyVerificationMethod.reciprocate,

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: lotti
22
description: Achieve your goals and keep your data private with Lotti.
33
publish_to: 'none'
4-
version: 0.9.444+2431
4+
version: 0.9.445+2432
55

66
msix_config:
77
display_name: LottiApp

0 commit comments

Comments
 (0)