Add broker management and writer transfer UI
This commit is contained in:
@@ -150,6 +150,61 @@ int main(void) {
|
||||
comparison(1); comparison(2);
|
||||
assert(allocations == initial_allocations);
|
||||
puts("PASS no post-init broker allocations; 7 diagnostic groups passed");
|
||||
session_broker_management_snapshot_t management;
|
||||
assert(session_broker_get_management_snapshot(NULL) == ESP_ERR_INVALID_ARG);
|
||||
mutex = 1; assert(session_broker_get_management_snapshot(&management) == ESP_ERR_TIMEOUT); mutex = 0;
|
||||
session_broker_client_id_t usb = connect_type(SESSION_BROKER_CLIENT_USB);
|
||||
session_broker_client_id_t ssh = connect_type(SESSION_BROKER_CLIENT_SSH);
|
||||
session_broker_client_id_t web = connect_type(SESSION_BROKER_CLIENT_WEB);
|
||||
assert(session_broker_request_writer(usb) == ESP_OK);
|
||||
feed(128);
|
||||
assert(session_broker_get_management_snapshot(&management) == ESP_OK);
|
||||
assert(management.count == 3 && management.writer_id == usb && management.clients[0].pending == 128);
|
||||
uint32_t generation = management.generation;
|
||||
before = global();
|
||||
assert(session_broker_assign_writer_current(0, generation) == ESP_ERR_INVALID_ARG);
|
||||
assert(session_broker_assign_writer_current(ssh, 0) == ESP_ERR_INVALID_ARG);
|
||||
assert(session_broker_get_management_snapshot(&management) == ESP_OK && management.generation == generation);
|
||||
assert(global().latest_event_sequence == before.latest_event_sequence && snapshot(usb).output_bytes_pending == 128);
|
||||
assert(session_broker_assign_writer_current(ssh, generation) == ESP_OK);
|
||||
assert(global().writer_id == ssh && !snapshot(usb).is_writer && snapshot(ssh).is_writer);
|
||||
before = global();
|
||||
assert(session_broker_assign_writer_current(web, generation) == ESP_ERR_INVALID_STATE);
|
||||
assert(global().writer_id == ssh && global().latest_event_sequence == before.latest_event_sequence);
|
||||
assert(session_broker_get_management_snapshot(&management) == ESP_OK); generation = management.generation;
|
||||
assert(session_broker_release_writer(ssh) == ESP_OK && session_broker_request_writer(ssh) == ESP_OK);
|
||||
assert(session_broker_assign_writer_current(web, generation) == ESP_ERR_INVALID_STATE);
|
||||
assert(session_broker_get_management_snapshot(&management) == ESP_OK); generation = management.generation;
|
||||
assert(session_broker_disconnect(web) == ESP_OK);
|
||||
session_broker_client_id_t reused = connect_type(SESSION_BROKER_CLIENT_WEB);
|
||||
assert(reused != web && (reused & 7) == (web & 7));
|
||||
before = global();
|
||||
assert(session_broker_assign_writer_current(web, generation) == ESP_ERR_NOT_FOUND);
|
||||
assert(global().writer_id == ssh && global().latest_event_sequence == before.latest_event_sequence);
|
||||
assert(session_broker_clear_counters() == ESP_OK);
|
||||
assert(session_broker_get_management_snapshot(&management) == ESP_OK && management.generation == generation);
|
||||
assert(session_broker_assign_writer_current(reused, generation) == ESP_OK);
|
||||
assert(session_broker_get_management_snapshot(&management) == ESP_OK); generation = management.generation;
|
||||
assert(session_broker_force_release_writer(reused) == ESP_OK);
|
||||
assert(session_broker_assign_writer_current(usb, generation) == ESP_ERR_INVALID_STATE);
|
||||
assert(session_broker_request_writer(usb) == ESP_OK);
|
||||
assert(session_broker_get_management_snapshot(&management) == ESP_OK); generation = management.generation;
|
||||
assert(session_broker_disconnect(usb) == ESP_OK);
|
||||
assert(session_broker_assign_writer_current(ssh, generation) == ESP_ERR_INVALID_STATE);
|
||||
puts("PASS Broker management: atomic nonconsuming snapshot, one writer, USB/SSH/Web interleavings, stale target/reuse/ABA and counter-clear fencing");
|
||||
s_writer_generation = UINT32_MAX - 1;
|
||||
assert(session_broker_request_writer(ssh) == ESP_OK && s_writer_generation == UINT32_MAX);
|
||||
assert(session_broker_assign_writer_current(reused, UINT32_MAX) == ESP_ERR_INVALID_STATE);
|
||||
assert(session_broker_force_writer(reused) == ESP_OK && s_writer_generation == UINT32_MAX);
|
||||
disconnect_all();
|
||||
for (size_t i = 0; i < SESSION_BROKER_MAX_CLIENTS; ++i) s_slots[i].generation = SESSION_BROKER_MAX_GENERATION;
|
||||
s_slots[7].generation--;
|
||||
session_broker_client_id_t last = connect_type(SESSION_BROKER_CLIENT_USB);
|
||||
assert(last == UINT32_MAX);
|
||||
assert(session_broker_disconnect(last) == ESP_OK);
|
||||
assert(session_broker_connect(SESSION_BROKER_CLIENT_USB, "exhausted", &last) == ESP_ERR_NO_MEM);
|
||||
assert(!global().connected_clients && !global().writer_id);
|
||||
puts("PASS Broker wrap: saturated confirmation rejects, ordinary recovery remains; all 29-bit client generations retire without reuse");
|
||||
cleanup_allocations();
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user