ckb-network-alert 0.101.3

The alert protocol implementation
Documentation
use crate::notifier::Notifier;
use ckb_notify::NotifyService;
use ckb_types::{packed, prelude::*};

fn build_alert(
    id: u32,
    cancel: u32,
    min_ver: Option<&str>,
    max_ver: Option<&str>,
    notice_until: u64,
) -> packed::Alert {
    let raw = packed::RawAlert::new_builder()
        .id(id.pack())
        .cancel(cancel.pack())
        .min_version(min_ver.pack())
        .max_version(max_ver.pack())
        .notice_until(notice_until.pack())
        .build();
    packed::Alert::new_builder().raw(raw).build()
}

fn new_notifier(version: &str) -> Notifier {
    let notify_controller = NotifyService::new(Default::default()).start(Some("test"));
    Notifier::new(version.into(), notify_controller)
}

#[test]
fn test_notice_alerts_by_version() {
    let mut notifier = new_notifier("0.9.0");
    let alert1 = build_alert(1, 0, None, Some("0.10.0"), 0);
    let alert2 = build_alert(2, 0, Some("0.10.0"), None, 0);
    notifier.add(&alert1);
    notifier.add(&alert2);
    assert_eq!(notifier.received_alerts().len(), 2);
    assert_eq!(notifier.noticed_alerts().len(), 1);
    assert_eq!(
        notifier.noticed_alerts()[0].raw().id().as_slice(),
        &1u32.to_le_bytes()[..]
    );
}

#[test]
fn test_received_alerts() {
    let mut notifier = new_notifier("0.1.0");
    let alert1 = build_alert(1, 0, Some("0.1.0"), Some("0.2.0"), 0);
    let dup_alert1 = build_alert(1, 0, None, None, 0);
    notifier.add(&alert1);
    assert!(notifier.has_received(1));
    notifier.add(&dup_alert1);
    assert_eq!(notifier.received_alerts().len(), 1);
    assert_eq!(
        notifier.received_alerts()[0].calc_alert_hash(),
        alert1.calc_alert_hash()
    );
}

#[test]
fn test_cancel_alert() {
    let mut notifier = new_notifier("0.1.0");
    let alert1 = build_alert(1, 0, Some("0.1.0"), Some("0.2.0"), 0);
    let cancel_alert1 = build_alert(2, 1, None, None, 0);
    notifier.add(&alert1);
    assert!(notifier.has_received(1));
    notifier.add(&cancel_alert1);
    assert!(notifier.has_received(1));
    assert!(notifier.has_received(2));
    assert_eq!(notifier.received_alerts().len(), 1);
    assert_eq!(notifier.noticed_alerts().len(), 1);
    assert_eq!(
        notifier.received_alerts()[0].calc_alert_hash(),
        cancel_alert1.calc_alert_hash()
    );
}

#[test]
fn test_clear_expired_alerts() {
    let mut notifier = new_notifier("0.1.0");
    let notice_until = 1_561_084_974_000;
    let before_expired_time = notice_until - 1000;
    let after_expired_time = notice_until + 1000;
    let alert1 = build_alert(1, 0, None, None, notice_until);
    notifier.add(&alert1);
    notifier.clear_expired_alerts(before_expired_time);
    assert!(notifier.has_received(1));
    assert_eq!(notifier.received_alerts().len(), 1);
    assert_eq!(notifier.noticed_alerts().len(), 1);
    notifier.clear_expired_alerts(after_expired_time);
    assert!(!notifier.has_received(1));
    assert_eq!(notifier.received_alerts().len(), 0);
    assert_eq!(notifier.noticed_alerts().len(), 0);
}