Assert profile updates leave feedback idle and preserve outer-commit change flags

This commit is contained in:
evgeny committed 2026-10-26 14:44:03 +01:00
1 parent 953e094c92
commit f3be00438b
1 file changed
+15 -2
+15 -2
View File
@@ -114,6 +114,19 @@ static void membership_regressions(struct UASYNC* ua) {
assert(chat_feedback_apply(&target, "1002", &other) == 1);
uint8_t before[32], after[32], empty[32] = {0}, other_root[32], key[32]; root(&target, before);
assert(merkle_sync_read_hash(&target, MT_DATA_FEEDBACK, "1002", 0, 0, other_root) == 0);
/* Подписанный профиль меняет MEMBERS, но не запускает feedback и его UI-события. */
uint8_t profile_join[64], profile_update[64], profile_body[256], profile_x[32] = {3}, profile_ed[32];
public_key(owner_private, profile_ed);
int profile_len = member_sync_build_join_msg(profile_x, profile_ed, author.node_id, author.my_keys.public_key,
1, profile_body, sizeof(profile_body)); assert(profile_len == 112);
assert(sc_ed25519_sign(author.my_ed25519_privkey, profile_body, profile_len, profile_join) == SC_OK);
profile_len = member_sync_build_update_msg(profile_join, 2, "{\"name\":\"profile\"}", profile_body, sizeof(profile_body));
assert(profile_len > 0 && sc_ed25519_sign(author.my_ed25519_privkey, profile_body, profile_len, profile_update) == SC_OK);
int profile_events = events;
int profile_changed = member_sync_put(&target, "1001", author.node_id, author.my_keys.public_key, author.my_ed25519_pubkey,
profile_join, 1, profile_update, 2, "{\"name\":\"profile\"}", NULL, NULL, 0, 0, NULL);
assert((profile_changed & MS_APPLY_CHANGED) && !(profile_changed & MS_APPLY_FEEDBACK) && events == profile_events);
root(&target, after); assert(!memcmp(before, after, 32));
int saved_events = events;
assert(set_deleted(&target, &author, 1, 1) & MS_APPLY_CHANGED);
root(&target, after); assert(!memcmp(after, empty, 32) && events > saved_events);
@@ -222,9 +235,9 @@ static void membership_regressions(struct UASYNC* ua) {
assert(sqlite3_exec(target.topo_sqlite_db, "ROLLBACK", NULL, NULL, NULL) == SQLITE_OK);
root(&target, after); assert(!memcmp(before, after, 32) && events == saved_events);
assert(sqlite3_exec(target.topo_sqlite_db, "BEGIN IMMEDIATE", NULL, NULL, NULL) == SQLITE_OK);
assert(set_deleted(&target, &author, 3, 1) & MS_APPLY_CHANGED);
int changes = set_deleted(&target, &author, 3, 1); assert(changes & MS_APPLY_CHANGED);
assert(sqlite3_exec(target.topo_sqlite_db, "COMMIT", NULL, NULL, NULL) == SQLITE_OK && events == saved_events);
member_sync_record_committed(&target, "1001", author.node_id); assert(events > saved_events);
member_sync_record_committed(&target, "1001", author.node_id, (unsigned)changes); assert(events > saved_events);
for (unsigned i = 0; i < 3; i++) assert_stored(&target, &original[i]);
puts("PASS: SQL lookup/index failures, commit veto and outer rollback publish no partial data, roots or events");
member_sync_destroy(&author); member_sync_destroy(&target); member_sync_destroy(&inviter);