@@ -138,6 +138,10 @@ TEST_CASE("Group Members", "[config][groups][members]") {
138
138
CHECK (gmem2.get_status (m) ==
139
139
session::config::groups::member::Status::promotion_accepted);
140
140
} else {
141
+ // on gmem1, our local extra data marks m as invite_sending
142
+ CHECK (gmem1.get_status (m) ==
143
+ session::config::groups::member::Status::invite_sending);
144
+ // that extra data is not pushed, so gmem2 doesn't know about it
141
145
CHECK (gmem2.get_status (m) ==
142
146
session::config::groups::member::Status::invite_not_sent);
143
147
CHECK_FALSE (m.admin );
@@ -330,3 +334,43 @@ TEST_CASE("Group Members", "[config][groups][members]") {
330
334
" 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678"
331
335
" 901234567890" );
332
336
}
337
+
338
+ TEST_CASE (" Group Members restores extra data" , " [config][groups][members]" ) {
339
+
340
+ const auto seed = " 0123456789abcdef0123456789abcdeffedcba9876543210fedcba9876543210" _hexbytes;
341
+ std::array<unsigned char , 32 > ed_pk;
342
+ std::array<unsigned char , 64 > ed_sk;
343
+ crypto_sign_ed25519_seed_keypair (
344
+ ed_pk.data (), ed_sk.data (), reinterpret_cast <const unsigned char *>(seed.data ()));
345
+
346
+ REQUIRE (oxenc::to_hex (ed_pk.begin (), ed_pk.end ()) ==
347
+ " cbd569f56fb13ea95a3f0c05c331cc24139c0090feb412069dc49fab34406ece" );
348
+ CHECK (oxenc::to_hex (seed.begin (), seed.end ()) ==
349
+ oxenc::to_hex (ed_sk.begin (), ed_sk.begin () + 32 ));
350
+
351
+ groups::Members gmem1{to_usv (ed_pk), to_usv (ed_sk), std::nullopt};
352
+
353
+ auto memberId1 = " 050000000000000000000000000000000000000000000000000000000000000000" ;
354
+ auto memberId2 = " 051111111111111111111111111111111111111111111111111111111111111111" ;
355
+
356
+ auto member1 = gmem1.get_or_construct (memberId1);
357
+ auto member2 = gmem1.get_or_construct (memberId2);
358
+
359
+ member2.set_promoted ();
360
+ gmem1.set (member1); // should be marked as "invite sending" right away
361
+ gmem1.set (member2); // should be marked as "promotion sending" right away
362
+
363
+ CHECK (gmem1.get_status (gmem1.get_or_construct (memberId1)) ==
364
+ groups::member::Status::invite_sending);
365
+ CHECK (gmem1.get_status (gmem1.get_or_construct (memberId2)) ==
366
+ groups::member::Status::promotion_sending);
367
+
368
+ auto dumped = gmem1.dump ();
369
+
370
+ groups::Members gmem2{to_usv (ed_pk), to_usv (ed_sk), dumped};
371
+
372
+ CHECK (gmem2.get_status (gmem1.get_or_construct (memberId1)) ==
373
+ groups::member::Status::invite_sending);
374
+ CHECK (gmem2.get_status (gmem1.get_or_construct (memberId2)) ==
375
+ groups::member::Status::promotion_sending);
376
+ }
0 commit comments