fixed tc insertion, added unit tests for releasing single tcs as well as inserting and releasing multiple tcs with same timestamp #27

Merged
muellerr merged 2 commits from scheduler_unit_tests into main 2023-01-25 00:32:25 +01:00
Showing only changes of commit 299135a4c4 - Show all commits

View File

@ -6,7 +6,6 @@ use std::collections::BTreeMap;
use std::time::SystemTimeError; use std::time::SystemTimeError;
use std::vec; use std::vec;
use std::vec::Vec; use std::vec::Vec;
use std::sync::{mpsc, Arc, RwLock};
#[derive(Debug)] #[derive(Debug)]
pub struct PusScheduler { pub struct PusScheduler {
@ -66,10 +65,10 @@ impl PusScheduler {
match self.tc_map.entry(time_stamp) { match self.tc_map.entry(time_stamp) {
Entry::Vacant(e) => { Entry::Vacant(e) => {
e.insert(vec![addr]); e.insert(vec![addr]);
}, }
Entry::Occupied(mut v) => { Entry::Occupied(mut v) => {
v.get_mut().push(addr); v.get_mut().push(addr);
}, }
} }
true true
} }
@ -98,15 +97,15 @@ impl PusScheduler {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::{println, vec};
use std::sync::mpsc;
use std::sync::mpsc::{channel, Receiver, TryRecvError};
use crate::pool::StoreAddr; use crate::pool::StoreAddr;
use crate::pus::scheduling::PusScheduler; use crate::pus::scheduling::PusScheduler;
use spacepackets::time::UnixTimestamp;
use std::time::Duration;
use spacepackets::ecss::PacketTypeCodes::UnsignedInt; use spacepackets::ecss::PacketTypeCodes::UnsignedInt;
use spacepackets::time::UnixTimestamp;
use std::sync::mpsc;
use std::sync::mpsc::{channel, Receiver, TryRecvError};
use std::time::Duration;
use std::vec::Vec; use std::vec::Vec;
use std::{println, vec};
#[test] #[test]
fn basic() { fn basic() {
@ -142,7 +141,7 @@ mod tests {
assert!(worked); assert!(worked);
let worked = scheduler.insert_tc( let worked = scheduler.insert_tc(
UnixTimestamp::new_only_seconds(300), UnixTimestamp::new_only_seconds(300),
StoreAddr { StoreAddr {
pool_idx: 0, pool_idx: 0,
@ -164,7 +163,7 @@ mod tests {
let mut scheduler = let mut scheduler =
PusScheduler::new(UnixTimestamp::new_only_seconds(0), Duration::from_secs(5)); PusScheduler::new(UnixTimestamp::new_only_seconds(0), Duration::from_secs(5));
scheduler.insert_tc( let worked = scheduler.insert_tc(
UnixTimestamp::new_only_seconds(100), UnixTimestamp::new_only_seconds(100),
StoreAddr { StoreAddr {
pool_idx: 0, pool_idx: 0,
@ -172,6 +171,8 @@ mod tests {
}, },
); );
assert!(worked);
let worked = scheduler.insert_tc( let worked = scheduler.insert_tc(
UnixTimestamp::new_only_seconds(100), UnixTimestamp::new_only_seconds(100),
StoreAddr { StoreAddr {
@ -180,7 +181,9 @@ mod tests {
}, },
); );
scheduler.insert_tc( assert!(worked);
let worked = scheduler.insert_tc(
UnixTimestamp::new_only_seconds(300), UnixTimestamp::new_only_seconds(300),
StoreAddr { StoreAddr {
pool_idx: 0, pool_idx: 0,
@ -188,15 +191,16 @@ mod tests {
}, },
); );
assert!(worked);
assert_eq!(scheduler.num_scheduled_telecommands(), 3); assert_eq!(scheduler.num_scheduled_telecommands(), 3);
} }
#[test] #[test]
fn time() { fn time() {
let mut scheduler = let mut scheduler =
PusScheduler::new(UnixTimestamp::new_only_seconds(0), Duration::from_secs(5)); PusScheduler::new(UnixTimestamp::new_only_seconds(0), Duration::from_secs(5));
let time = UnixTimestamp::new(1,2).unwrap(); let time = UnixTimestamp::new(1, 2).unwrap();
scheduler.update_time(time); scheduler.update_time(time);
assert_eq!(scheduler.current_time(), &time); assert_eq!(scheduler.current_time(), &time);
} }
@ -225,17 +229,20 @@ mod tests {
let mut i = 0; let mut i = 0;
let mut test_closure_1 = |boolvar: bool, store_addr: &StoreAddr| { let mut test_closure_1 = |boolvar: bool, store_addr: &StoreAddr| {
assert_eq!(boolvar, true); assert_eq!(boolvar, true);
assert_eq!(store_addr, &StoreAddr { assert_eq!(
pool_idx: 0, store_addr,
packet_idx: 1, &StoreAddr {
}); pool_idx: 0,
packet_idx: 1,
}
);
i += 1; i += 1;
}; };
// test 1: too early, no tcs // test 1: too early, no tcs
scheduler.update_time(UnixTimestamp::new_only_seconds(99)); scheduler.update_time(UnixTimestamp::new_only_seconds(99));
scheduler.release_telecommands( &mut test_closure_1); scheduler.release_telecommands(&mut test_closure_1);
// test 2: exact time stamp of tc, releases 1 tc // test 2: exact time stamp of tc, releases 1 tc
scheduler.update_time(UnixTimestamp::new_only_seconds(100)); scheduler.update_time(UnixTimestamp::new_only_seconds(100));
@ -245,10 +252,13 @@ mod tests {
// test 3, late timestamp, release 1 overdue tc // test 3, late timestamp, release 1 overdue tc
let mut test_closure_2 = |boolvar: bool, store_addr: &StoreAddr| { let mut test_closure_2 = |boolvar: bool, store_addr: &StoreAddr| {
assert_eq!(boolvar, true); assert_eq!(boolvar, true);
assert_eq!(store_addr, &StoreAddr { assert_eq!(
pool_idx: 0, store_addr,
packet_idx: 2, &StoreAddr {
}); pool_idx: 0,
packet_idx: 2,
}
);
i += 1; i += 1;
}; };
@ -287,17 +297,20 @@ mod tests {
let mut i = 0; let mut i = 0;
let mut test_closure = |boolvar: bool, store_addr: &StoreAddr| { let mut test_closure = |boolvar: bool, store_addr: &StoreAddr| {
assert_eq!(boolvar, true); assert_eq!(boolvar, true);
assert_eq!(store_addr, &StoreAddr { assert_eq!(
pool_idx: 0, store_addr,
packet_idx: 1, &StoreAddr {
}); pool_idx: 0,
packet_idx: 1,
}
);
i += 1; i += 1;
}; };
// test 1: too early, no tcs // test 1: too early, no tcs
scheduler.update_time(UnixTimestamp::new_only_seconds(99)); scheduler.update_time(UnixTimestamp::new_only_seconds(99));
scheduler.release_telecommands( &mut test_closure); scheduler.release_telecommands(&mut test_closure);
// test 2: exact time stamp of tc, releases 2 tc // test 2: exact time stamp of tc, releases 2 tc
scheduler.update_time(UnixTimestamp::new_only_seconds(100)); scheduler.update_time(UnixTimestamp::new_only_seconds(100));