| use super::*; | |
| use crate::collections::HashMap; | |
| use crate::io::Write; | |
| fn create_args_test() -> std::io::Result<Vec<u8>> { | |
| let mut sample_data = vec![]; | |
| let mut h = HashMap::new(); | |
| h.insert("foo", "bar"); | |
| h.insert("baz", "qux"); | |
| h.insert("some", "val"); | |
| // Magic number | |
| sample_data.write_all(&PARAMS_MAGIC)?; | |
| // Size of the AppP block | |
| sample_data.write_all(&4u32.to_le_bytes())?; | |
| // Number of blocks | |
| sample_data.write_all(&2u32.to_le_bytes())?; | |
| // Magic number | |
| sample_data.write_all(&ENV_MAGIC)?; | |
| let mut data = vec![]; | |
| for (key, value) in h.iter() { | |
| data.extend_from_slice(&(key.len() as u16).to_le_bytes()); | |
| data.extend_from_slice(key.as_bytes()); | |
| data.extend_from_slice(&(value.len() as u16).to_le_bytes()); | |
| data.extend_from_slice(value.as_bytes()); | |
| } | |
| // Size of the EnvB block | |
| sample_data.write_all(&(data.len() as u32 + 2).to_le_bytes())?; | |
| // Number of environment variables | |
| sample_data.write_all(&(h.len() as u16).to_le_bytes())?; | |
| // Environment variables | |
| sample_data.write_all(&data)?; | |
| // Write command line arguments | |
| let args = vec!["some", "command", "line variable", "entries"]; | |
| sample_data.write_all(&ARGS_MAGIC)?; | |
| let mut args_size = 0; | |
| for entry in args.iter() { | |
| args_size += entry.len() + 2; | |
| } | |
| sample_data.write_all(&(args_size as u32 + 2).to_le_bytes())?; | |
| sample_data.write_all(&(args.len() as u16).to_le_bytes())?; | |
| for entry in args { | |
| sample_data.write_all(&(entry.len() as u16).to_le_bytes())?; | |
| sample_data.write_all(entry.as_bytes())?; | |
| } | |
| Ok(sample_data) | |
| } | |
| #[test] | |
| fn basic_arg_parsing() { | |
| let arg_data = create_args_test().expect("couldn't create test data"); | |
| for byte in &arg_data { | |
| print!("{:02x} ", byte); | |
| } | |
| println!(); | |
| let args = ApplicationParameters::new(&arg_data).expect("Unable to parse arguments"); | |
| for arg in args { | |
| if let Ok(env) = EnvironmentBlock::try_from(&arg) { | |
| for env in env { | |
| println!("{}={}", env.key, env.value); | |
| } | |
| } else if let Ok(args) = ArgumentList::try_from(&arg) { | |
| for arg in args { | |
| println!("Arg: {}", arg.value); | |
| } | |
| } | |
| } | |
| } |