use ordered_float::NotNan;
use crate::types::SinglePrefix;
use super::*;
type P = SinglePrefix;
type T = ();
#[test]
fn test_exchange_leader() {
let r = RouterId::from(0);
let n = RouterId::from(1);
let x = RouterId::from(2);
let area = OspfArea::BACKBONE;
let mut process = LocalOspfProcess::new(r);
let (changed, events) = process
.handle_neighborhood_change::<P, T>(LocalNeighborhoodChange::AddNeighbor {
neighbor: n,
area,
weight: 100.0,
})
.unwrap();
assert!(changed);
assert_eq!(
events,
vec![Event::Ospf {
p: (),
src: r,
dst: n,
area,
e: OspfEvent::DatabaseDescription {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 1,
age: 0
}]
},
}]
);
let event = OspfEvent::DatabaseDescription {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: n,
target: None,
seq: 1,
age: 0,
}],
};
let (changed, events) = process.handle_event::<P, T>(n, area, event).unwrap();
assert!(!changed);
assert_eq!(
events,
vec![Event::Ospf {
p: (),
src: r,
dst: n,
area,
e: OspfEvent::LinkStateRequest {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: n,
target: None,
seq: 1,
age: 0
}]
},
}]
);
let (changed, events) = process
.handle_neighborhood_change::<P, T>(LocalNeighborhoodChange::AddNeighbor {
neighbor: x,
area,
weight: 100.0,
})
.unwrap();
assert!(changed);
assert_eq!(
events,
vec![Event::Ospf {
p: (),
src: r,
dst: x,
area,
e: OspfEvent::DatabaseDescription {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 2,
age: 0
}]
},
}]
);
let event = OspfEvent::LinkStateRequest {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 1,
age: 0,
}],
};
let (changed, events) = process.handle_event::<P, T>(n, area, event).unwrap();
assert!(!changed);
assert_eq!(
events,
vec![Event::Ospf {
p: (),
src: r,
dst: n,
area,
e: OspfEvent::LinkStateUpdate {
lsa_list: vec![Lsa {
header: LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 1,
age: 0
},
data: LsaData::Router(vec![RouterLsaLink {
link_type: LinkType::PointToPoint,
target: n,
weight: NotNan::new(100.0).unwrap()
}])
}],
ack: false
},
}]
);
let event = OspfEvent::LinkStateUpdate {
lsa_list: vec![Lsa {
header: LsaHeader {
lsa_type: LsaType::Router,
router: n,
target: None,
seq: 1,
age: 0,
},
data: LsaData::Router(vec![
RouterLsaLink {
link_type: LinkType::PointToPoint,
target: r,
weight: NotNan::new(100.0).unwrap(),
},
RouterLsaLink {
link_type: LinkType::PointToPoint,
target: x,
weight: NotNan::new(1000.0).unwrap(),
},
]),
}],
ack: false,
};
let (changed, events) = process.handle_event::<P, T>(n, area, event).unwrap();
assert!(changed);
assert_eq!(
events,
vec![Event::Ospf {
p: (),
src: r,
dst: n,
area,
e: OspfEvent::LinkStateUpdate {
lsa_list: vec![Lsa {
header: LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 2,
age: 0
},
data: LsaData::Router(vec![
RouterLsaLink {
link_type: LinkType::PointToPoint,
target: n,
weight: NotNan::new(100.0).unwrap()
},
RouterLsaLink {
link_type: LinkType::PointToPoint,
target: x,
weight: NotNan::new(100.0).unwrap()
}
])
}],
ack: false
},
}]
)
}
#[test]
fn test_exchange_follower() {
let r = RouterId::from(2);
let n = RouterId::from(1);
let x = RouterId::from(0);
let area = OspfArea::BACKBONE;
let mut process = LocalOspfProcess::new(r);
let (changed, events) = process
.handle_neighborhood_change::<P, T>(LocalNeighborhoodChange::AddNeighbor {
neighbor: n,
area,
weight: 100.0,
})
.unwrap();
assert!(changed);
assert_eq!(events, vec![]);
let event = OspfEvent::DatabaseDescription {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: n,
target: None,
seq: 1,
age: 0,
}],
};
let (changed, events) = process.handle_event::<P, T>(n, area, event).unwrap();
assert!(!changed);
assert_eq!(
events,
vec![
Event::Ospf {
p: (),
src: r,
dst: n,
area,
e: OspfEvent::DatabaseDescription {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 1,
age: 0
}]
},
},
Event::Ospf {
p: (),
src: r,
dst: n,
area,
e: OspfEvent::LinkStateRequest {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: n,
target: None,
seq: 1,
age: 0
}]
},
}
]
);
let (changed, events) = process
.handle_neighborhood_change::<P, T>(LocalNeighborhoodChange::AddNeighbor {
neighbor: x,
area,
weight: 100.0,
})
.unwrap();
assert!(changed);
assert_eq!(events, vec![]);
let event = OspfEvent::LinkStateRequest {
headers: vec![LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 1,
age: 0,
}],
};
let (changed, events) = process.handle_event::<P, T>(n, area, event).unwrap();
assert!(!changed);
assert_eq!(
events,
vec![Event::Ospf {
p: (),
src: r,
dst: n,
area,
e: OspfEvent::LinkStateUpdate {
lsa_list: vec![Lsa {
header: LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 1,
age: 0
},
data: LsaData::Router(vec![RouterLsaLink {
link_type: LinkType::PointToPoint,
target: n,
weight: NotNan::new(100.0).unwrap()
}])
}],
ack: false
},
}]
);
let event = OspfEvent::LinkStateUpdate {
lsa_list: vec![Lsa {
header: LsaHeader {
lsa_type: LsaType::Router,
router: n,
target: None,
seq: 1,
age: 0,
},
data: LsaData::Router(vec![
RouterLsaLink {
link_type: LinkType::PointToPoint,
target: r,
weight: NotNan::new(100.0).unwrap(),
},
RouterLsaLink {
link_type: LinkType::PointToPoint,
target: x,
weight: NotNan::new(1000.0).unwrap(),
},
]),
}],
ack: false,
};
let (changed, events) = process.handle_event::<P, T>(n, area, event).unwrap();
assert!(changed);
assert_eq!(
events,
vec![Event::Ospf {
p: (),
src: r,
dst: n,
area,
e: OspfEvent::LinkStateUpdate {
lsa_list: vec![Lsa {
header: LsaHeader {
lsa_type: LsaType::Router,
router: r,
target: None,
seq: 2,
age: 0
},
data: LsaData::Router(vec![
RouterLsaLink {
link_type: LinkType::PointToPoint,
target: n,
weight: NotNan::new(100.0).unwrap()
},
RouterLsaLink {
link_type: LinkType::PointToPoint,
target: x,
weight: NotNan::new(100.0).unwrap()
}
])
}],
ack: false
},
}]
)
}