Complete milestone 09 world integration gate (#75)
This commit is contained in:
@@ -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")));
|
||||
|
||||
Reference in New Issue
Block a user