ic-logging 0.24.17

Bounded application logs with explicit retention and scan limits
Documentation
use super::*;

#[test]
fn budget_stop_does_not_skip_the_unemitted_utf8_candidate() {
    let log = history();
    let first = export(&log, Filter::default(), request(None), 8).unwrap();
    assert_eq!(first.body, "2: 🙂\n");
    assert_eq!(first.emitted, 1);
    assert_eq!(first.scanned, 2);
    assert_eq!(first.next_before, Some(2));
    let second = export(&log, Filter::default(), request(first.next_before), 8).unwrap();
    assert_eq!(second.body, "1: é\n");
    assert_eq!(second.next_before, Some(1));
    let last = export(&log, Filter::default(), request(second.next_before), 8).unwrap();
    assert_eq!(last.body, "0: a\n");
    assert_eq!(last.next_before, None);
}

#[test]
fn oversized_first_row_returns_a_typed_error_instead_of_a_retry_loop() {
    let log = history();
    for max_bytes in [0, 7] {
        assert_eq!(
            export(&log, Filter::default(), request(None), max_bytes),
            Err(ExportError::EntryTooLarge {
                sequence: 2,
                required_bytes: 8,
                max_bytes,
            })
        );
    }
    assert_eq!(log.checkpoint().next_sequence(), Some(3));
}

#[test]
fn empty_filtered_scans_use_the_engine_continuation() {
    let log = history();
    let filter = Filter {
        min_level: Some(Level::Error),
        ..Filter::default()
    };
    let mut before = None;
    for expected in [Some(2), Some(1), None] {
        let mut request = request(before);
        request.max_scanned = NonZeroUsize::new(1).unwrap();
        let page = export(&log, filter, request, 0).unwrap();
        assert_eq!(page.body, "");
        assert_eq!(page.emitted, 0);
        assert_eq!(page.scanned, 1);
        assert_eq!(page.next_before, expected);
        before = page.next_before;
    }
}

#[test]
fn count_and_scan_limits_still_apply_with_a_large_body_budget() {
    let log = history();
    for (results, scanned) in [(1, 3), (3, 1)] {
        let mut request = request(None);
        request.max_results = NonZeroUsize::new(results).unwrap();
        request.max_scanned = NonZeroUsize::new(scanned).unwrap();
        let page = export(&log, Filter::default(), request, 128).unwrap();
        assert_eq!(page.body, "2: 🙂\n");
        assert_eq!(page.emitted, 1);
        assert_eq!(page.scanned, 1);
        assert_eq!(page.next_before, Some(2));
    }
}