|
|
|
|
@ -1046,6 +1046,30 @@ static void relay_role(unsigned member, int enabled, unsigned version) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Роль немедленно следует за подписанным блоком канала; deleted и чужой snapshot проверяются отдельно. */ |
|
|
|
|
static void test_supernode_lookup(void) { |
|
|
|
|
uint64_t member = nodes[1]->node_id; |
|
|
|
|
CHECK(stream_member_supernode(nodes[0], GROUP2, member) == 0); |
|
|
|
|
relay_role(1, 1, 90); |
|
|
|
|
CHECK(stream_member_supernode(nodes[0], GROUP1, member) == 0); |
|
|
|
|
CHECK(stream_member_supernode(nodes[0], GROUP2, UINT64_MAX) == 0); |
|
|
|
|
sqlite3 *db = nodes[0]->topo_sqlite_db; sqlite3_stmt *statement = NULL; |
|
|
|
|
CHECK(sqlite3_exec(db, "SAVEPOINT role_lookup", NULL, NULL, NULL) == SQLITE_OK); |
|
|
|
|
CHECK(sqlite3_prepare_v2(db, "UPDATE peers_710002 SET deleted=1 WHERE node_id=?", -1, &statement, NULL) == SQLITE_OK); |
|
|
|
|
sqlite3_bind_int64(statement, 1, (sqlite3_int64)member); |
|
|
|
|
CHECK(sqlite3_step(statement) == SQLITE_DONE && sqlite3_changes(db) == 1); sqlite3_finalize(statement); |
|
|
|
|
CHECK(stream_member_supernode(nodes[0], GROUP2, member) == 0); |
|
|
|
|
CHECK(sqlite3_exec(db, "ROLLBACK TO role_lookup", NULL, NULL, NULL) == SQLITE_OK); |
|
|
|
|
CHECK(stream_member_supernode(nodes[0], GROUP2, member) == 1); |
|
|
|
|
CHECK(sqlite3_prepare_v2(db, "UPDATE node_snapshots SET record=x'00' WHERE node_id=?", -1, &statement, NULL) == SQLITE_OK); |
|
|
|
|
sqlite3_bind_int64(statement, 1, (sqlite3_int64)nodes[2]->node_id); |
|
|
|
|
CHECK(sqlite3_step(statement) == SQLITE_DONE && sqlite3_changes(db) == 1); sqlite3_finalize(statement); |
|
|
|
|
CHECK(stream_member_supernode(nodes[0], GROUP2, member) == 1); |
|
|
|
|
CHECK(sqlite3_exec(db, "ROLLBACK TO role_lookup; RELEASE role_lookup", NULL, NULL, NULL) == SQLITE_OK); |
|
|
|
|
relay_role(1, 0, 91); |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_STREAM, "[PASS] supernode lookup: signed grant/revoke, channel isolation, absent/deleted member, unrelated snapshot"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Прямой stream-вход источника блокируем только у зрителей; Merkle/BGP и получение суперузла остаются настоящими. */ |
|
|
|
|
static void relay_test_raw(struct ETCP_CONN *conn, struct ll_entry *entry) { |
|
|
|
|
unsigned index = 0; while (index < 4 && conn->instance != nodes[index]) index++; CHECK(index < 4); |
|
|
|
|
@ -1586,6 +1610,7 @@ int main(int argc, char **argv) {
|
|
|
|
|
CHECK(identity && topo_node_sqlite_snapshot_put(nodes[destination]->topo_sqlite_db, identity) >= 0); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
test_supernode_lookup(); |
|
|
|
|
struct TOPO_PEER_REQUEST *connections[3] = {0}; |
|
|
|
|
for (unsigned i = 1; i < 4; i++) |
|
|
|
|
CHECK(topo_group_peer_open(topo_groups_find(nodes[0]->topo_groups, GROUP1), nodes[i]->node_id, &connections[i - 1]) == 0); |
|
|
|
|
|