1#![no_std]
2
3extern crate alloc;
4
5#[cfg(test)]
6extern crate std;
7
8mod device;
9mod error;
10mod fundamentals;
11mod manager;
12mod socket;
13
14pub use device::*;
15pub use error::*;
16pub use fundamentals::*;
17pub use manager::*;
18pub use socket::*;
19
20#[cfg(test)]
21pub mod tests {
22 use alloc::boxed::Box;
23 use file_system::AccessFlags;
24 use synchronization::{blocking_mutex::raw::CriticalSectionRawMutex, mutex::Mutex};
25 use virtual_file_system::{File, create_default_hierarchy};
26
27 use super::*;
28
29 extern crate abi_definitions;
30
31 drivers_std::memory::instantiate_global_allocator!();
32
33 pub(crate) static TEST_TASK_MANAGER: synchronization::once_lock::OnceLock<
34 &'static task::Manager,
35 > = synchronization::once_lock::OnceLock::new();
36
37 pub(crate) async fn initialize() -> &'static crate::Manager {
38 static INITIALIZE_MUTEX: Mutex<CriticalSectionRawMutex, bool> = Mutex::new(false);
39
40 let mut initialized = INITIALIZE_MUTEX.lock().await;
41
42 if *initialized {
43 return crate::test_manager();
44 }
45
46 *initialized = true;
47
48 static RANDOM_DEVICE: drivers_shared::devices::RandomDevice =
49 drivers_shared::devices::RandomDevice;
50 static TIME_DEVICE: drivers_std::devices::TimeDevice = drivers_std::devices::TimeDevice;
51
52 let task_manager = Box::leak(Box::new(task::Manager::new()));
53 TEST_TASK_MANAGER.get_or_init(|| task_manager);
54 let task = task_manager.get_current_task_identifier().await;
55
56 log::initialize(&drivers_std::log::Logger).unwrap();
57
58 let user_manager = Box::leak(Box::new(users::Manager::new()));
59
60 let time_manager = Box::leak(Box::new(time::Manager::new(&TIME_DEVICE).unwrap()));
61
62 let memory_device = file_system::MemoryDevice::<512>::new_static(10 * 1024 * 1024);
63
64 let root_file_system = little_fs::FileSystem::get_or_format(memory_device, 512).unwrap();
65
66 let virtual_file_system = Box::leak(Box::new(
67 virtual_file_system::initialize(
68 task_manager,
69 user_manager,
70 time_manager,
71 root_file_system,
72 )
73 .unwrap(),
74 ));
75
76 create_default_hierarchy(virtual_file_system, task)
77 .await
78 .unwrap();
79
80 let network_manager = crate::TEST_MANAGER.get_or_init(|| {
81 crate::Manager::new(
82 task_manager,
83 virtual_file_system,
84 time_manager,
85 &RANDOM_DEVICE,
86 )
87 });
88
89 let (device, controler_device) = crate::create_loopback_device();
90
91 let spawner = drivers_std::executor::new_thread_executor(task_manager).await;
92
93 network_manager
94 .mount_interface(task, "loopback0", device, controler_device, Some(spawner))
95 .await
96 .unwrap();
97
98 let mut file = File::open(
99 virtual_file_system,
100 task,
101 "/devices/network/loopback0",
102 AccessFlags::Write.into(),
103 )
104 .await
105 .unwrap();
106
107 file.control(ADD_IP_ADDRESS, &IpCidr::new_ipv4([127, 0, 0, 1], 8))
108 .await
109 .unwrap();
110
111 file.close(virtual_file_system).await.unwrap();
112
113 network_manager
114 }
115
116 pub(crate) fn task_manager() -> &'static task::Manager {
117 crate::tests::TEST_TASK_MANAGER
118 .try_get()
119 .expect("Network test task manager not initialized")
120 }
121}