@@ -138,6 +138,10 @@ TEST_CASE("Group Members", "[config][groups][members]") {
138138 CHECK (gmem2.get_status (m) ==
139139 session::config::groups::member::Status::promotion_accepted);
140140 } 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
141145 CHECK (gmem2.get_status (m) ==
142146 session::config::groups::member::Status::invite_not_sent);
143147 CHECK_FALSE (m.admin );
@@ -330,3 +334,43 @@ TEST_CASE("Group Members", "[config][groups][members]") {
330334 " 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678"
331335 " 901234567890" );
332336}
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