@@ -504,14 +504,74 @@ TEST_CASE("sync metadata: can open old metadata realms", "[sync][metadata]") {
504504 const auto identity = " metadata migration test" ;
505505 const std::string sample_token = " metadata migration token" ;
506506
507+ const auto access_token_1 = encode_fake_jwt (" access token 1" , 456 , 123 );
508+ const auto access_token_2 = encode_fake_jwt (" access token 2" , 456 , 124 );
509+ const auto refresh_token_1 = encode_fake_jwt (" refresh token 1" , 456 , 123 );
510+ const auto refresh_token_2 = encode_fake_jwt (" refresh token 2" , 456 , 124 );
511+
507512 // change to true to create a test file for the current schema version
508513 // this will only work on unix-like systems
509514 if ((false )) {
515+ #if true
516+ // Code to generate the v6 metadata Realm used to test the 6 -> 7 migration
517+ {
518+ using State = SyncUser::State;
519+ SyncMetadataManager manager (metadata_path, false );
520+
521+ auto user = manager.get_or_make_user_metadata (" removed user" , " " );
522+ user->set_state (State::Removed);
523+
524+ auto make_user_pair = [&](const char * name, State state1, State state2, const std::string& token_1,
525+ const std::string& token_2) {
526+ auto user = manager.get_or_make_user_metadata (name, " a" );
527+ user->set_state_and_tokens (state1, token_1, refresh_token_1);
528+ user->set_identities ({{" identity 1" , " a" }, {" shared identity" , " shared" }});
529+ user->add_realm_file_path (" file 1" );
530+ user->add_realm_file_path (" file 2" );
531+
532+ user = manager.get_or_make_user_metadata (name, " b" );
533+ user->set_state_and_tokens (state2, token_2, refresh_token_2);
534+ user->set_identities ({{" identity 2" , " b" }, {" shared identity" , " shared" }});
535+ user->add_realm_file_path (" file 2" );
536+ user->add_realm_file_path (" file 3" );
537+ };
538+
539+ make_user_pair (" first logged in, second logged out" , State::LoggedIn, State::LoggedOut, access_token_1,
540+ access_token_2);
541+ make_user_pair (" first logged in, second removed" , State::LoggedIn, State::Removed, access_token_1,
542+ access_token_2);
543+ make_user_pair (" second logged in, first logged out" , State::LoggedOut, State::LoggedIn, access_token_1,
544+ access_token_2);
545+ make_user_pair (" second logged in, first removed" , State::Removed, State::LoggedIn, access_token_1,
546+ access_token_2);
547+ make_user_pair (" both logged in, first newer" , State::LoggedIn, State::LoggedIn, access_token_2,
548+ access_token_1);
549+ make_user_pair (" both logged in, second newer" , State::LoggedIn, State::LoggedIn, access_token_1,
550+ access_token_2);
551+ }
552+
553+ // Replace the randomly generated UUIDs with deterministic values
554+ {
555+ Realm::Config config;
556+ config.path = metadata_path;
557+ auto realm = Realm::get_shared_realm (config);
558+ realm->begin_transaction ();
559+ auto & group = realm->read_group ();
560+ auto table = group.get_table (" class_UserMetadata" );
561+ auto col = table->get_column_key (" local_uuid" );
562+ size_t i = 0 ;
563+ for (auto & obj : *table) {
564+ obj.set (col, util::to_string (i++));
565+ }
566+ realm->commit_transaction ();
567+ }
568+ #else
510569 { // Create a metadata Realm with a test user
511570 SyncMetadataManager manager (metadata_path, false );
512571 auto user_metadata = manager.get_or_make_user_metadata (identity, provider_type);
513572 user_metadata->set_access_token (sample_token);
514573 }
574+ #endif
515575
516576 // Open the metadata Realm directly and grab the schema version from it
517577 Realm::Config config;
0 commit comments