Complete milestone 09 world integration gate (#75)
Some checks failed
Native code generation / deterministic (push) Failing after 8m37s
Imaging and meshing gate / native (push) Successful in 5m24s
Native Rust workspace compile / compile (push) Failing after 6m15s

This commit is contained in:
2026-08-10 21:19:43 +00:00
parent 55424dbd7f
commit fdda05b53f
18 changed files with 767 additions and 82 deletions

View File

@@ -10,15 +10,15 @@ use libremetaverse::packets::{
SimStatsPacket, SimStatsPacketStatBlock, StartPingCheckPacket, UseCircuitCodePacket,
};
use libremetaverse::{
CapsEventDictionary, CapsEventQueueCallback, GridClient, Helpers, HttpCapsClient, LoginState,
LoginStatus, NetworkManager, NetworkManagerDisconnectType, NetworkManagerLoginResponseCallback,
PacketEventDictionary, Simulator,
CapsEventDictionary, CapsEventQueueCallback, GridClient, Helpers, HttpCapsClient,
InventoryItem, LoginState, LoginStatus, NetworkManager, NetworkManagerDisconnectType,
NetworkManagerLoginResponseCallback, PacketEventDictionary, Simulator,
};
use libremetaverse_structured_data::{OSD, OSDParser};
use libremetaverse_types::compat::{
CancellationTokenSource, EventHandler, HttpMessageHandler, HttpRequest, HttpResponse, Uri,
};
use libremetaverse_types::{UUID, Utils};
use libremetaverse_types::{AssetType, Error, UUID, Utils};
use std::collections::{BTreeMap, HashMap};
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
@@ -1843,12 +1843,17 @@ async fn offline_fake_grid_drives_the_complete_networking_lifecycle_without_task
client.settings().agent_settings_mut().multiple_sims = true;
client.set_http_caps_client(HttpCapsClient::new(handler).unwrap());
let manager = client.network();
let manager_event_order = Arc::new(Mutex::new(Vec::new()));
let (queue_sender, queue_receiver) = channel();
let queue_order = Arc::clone(&manager_event_order);
let _queue_guard = manager.subscribe_event_queue_running(Arc::new(move |args| {
queue_order.lock().unwrap().push("event_queue_running");
queue_sender.send(args.simulator().handle).unwrap();
}));
let (logout_sender, logout_receiver) = channel();
let logout_order = Arc::clone(&manager_event_order);
let _logout_guard = manager.subscribe_logged_out(Arc::new(move |args| {
logout_order.lock().unwrap().push("logged_out");
logout_sender.send(args.inventory_items).unwrap();
}));
@@ -1929,6 +1934,77 @@ async fn offline_fake_grid_drives_the_complete_networking_lifecycle_without_task
assert_eq!(asset, b"fake-grid-asset");
assert_eq!(downloads.active_download_count(), 0);
// Cross-manager construction is deliberately performed only after the
// authenticated simulator and seed capabilities are available. Every
// manager below shares the same client runtime and must preserve its
// local store when accessed again through GridClient.
{
let agent = client.self_();
assert_eq!(
agent.agent_id(),
UUID::new_with_string("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa".into()).unwrap()
);
assert_eq!(
agent.session_id(),
UUID::new_with_string("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb".into()).unwrap()
);
}
let inventory_id =
UUID::new_with_string("44444444-4444-4444-4444-444444444444".into()).unwrap();
let inventory = client.inventory();
let mut store = inventory.store().expect("authenticated inventory store");
let mut item = InventoryItem::new_with_uuid(inventory_id).unwrap();
item.base.set_name("fake-grid inventory marker".into());
store.set_item(inventory_id, item.base);
assert!(
client
.inventory()
.store()
.unwrap()
.contains_with_uuid(inventory_id)
.unwrap()
);
assert!(!client.ais_client().is_available());
assert_eq!(client.appearance().last_update_received_cof_version(), -1);
assert!(
client
.assets()
.create_asset_wrapper(AssetType::Texture)
.is_ok()
);
let _avatars = client.avatars();
assert!(client.animesh().get_player(UUID::zero()).unwrap().is_none());
client.objects().request_object(first.clone(), 1).unwrap();
assert!(client.parcels().current_parcel().is_none());
assert!(client.grid().regions_read_only().is_empty());
assert!(client.friends().friend_list().is_empty());
assert_eq!(client.groups().current_group_count(), -1);
assert!(client.marketplace().listings_by_id().is_empty());
let _terrain = client.terrain();
let _environment = client.environment();
let _sound = client.sound();
let _estate = client.estate();
let cancelled_search = CancellationTokenSource::new();
cancelled_search.cancel();
assert!(matches!(
client
.directory()
.search_people("Ada Lovelace".into(), Some(cancelled_search.token()),),
Err(Error::Cancelled)
));
let (marketplace_error_sender, marketplace_error_receiver) = channel();
let marketplace_order = Arc::clone(&manager_event_order);
let _marketplace_error_guard = client.marketplace().subscribe_error(Arc::new(move |_| {
marketplace_order.lock().unwrap().push("marketplace_error");
marketplace_error_sender.send(()).unwrap();
}));
client.marketplace().fetch_listings(None).await.unwrap();
marketplace_error_receiver
.recv_timeout(Duration::from_secs(1))
.unwrap();
second_server.commands.send(ServerCommand::Handoff).unwrap();
manager
.connect_with_ip_end_point_u_int64_boolean_uri_u_int32_u_int32(
@@ -2007,6 +2083,13 @@ async fn offline_fake_grid_drives_the_complete_networking_lifecycle_without_task
assert!(downloads.is_disposed());
assert!(!downloads.dispatcher_running());
assert_eq!(downloads.active_download_count(), 0);
assert_eq!(
*manager_event_order.lock().unwrap(),
["event_queue_running", "marketplace_error", "logged_out"]
);
let client_cancellation = client.cancellation_token();
client.dispose_with_method().unwrap();
assert!(client_cancellation.is_cancellation_requested());
let uris = request_uris.lock().unwrap();
assert!(uris.iter().any(|uri| uri.contains("/login")));
assert!(uris.iter().any(|uri| uri.contains("/seed")));