cedarling 0.0.65

The Cedarling: a high-performance local authorization service powered by the Rust Cedar Engine.
Documentation
// This software is available under the Apache-2.0 license.
// See https://www.apache.org/licenses/LICENSE-2.0.txt for full text.
//
// Copyright (c) 2024, Gluu, Inc.

//! The tests contained here are the examples in the [Token Status List IETF draft v10](https://www.ietf.org/archive/id/draft-ietf-oauth-status-list-10.html#name-test-vectors-for-status-lis).
//!
//! In the event that there is a new RFC, the tests in the module should be checked and
//! updated if necessary.

use super::*;

const CASES_8BIT: [(usize, u8); 256] = [
    (233_478, 0),
    (52_451, 1),
    (576_778, 2),
    (513_575, 3),
    (468_106, 4),
    (292_632, 5),
    (214_947, 6),
    (182_323, 7),
    (884_834, 8),
    (66_653, 9),
    (62_489, 10),
    (196_493, 11),
    (458_517, 12),
    (487_925, 13),
    (55_649, 14),
    (416_992, 15),
    (879_796, 16),
    (462_297, 17),
    (942_059, 18),
    (583_408, 19),
    (13_628, 20),
    (334_829, 21),
    (886_286, 22),
    (713_557, 23),
    (582_738, 24),
    (326_064, 25),
    (451_545, 26),
    (705_889, 27),
    (214_350, 28),
    (194_502, 29),
    (796_765, 30),
    (202_828, 31),
    (752_834, 32),
    (721_327, 33),
    (554_740, 34),
    (91_122, 35),
    (963_483, 36),
    (261_779, 37),
    (793_844, 38),
    (165_255, 39),
    (614_839, 40),
    (758_403, 41),
    (403_258, 42),
    (145_867, 43),
    (96_100, 44),
    (477_937, 45),
    (606_890, 46),
    (167_335, 47),
    (488_197, 48),
    (211_815, 49),
    (797_182, 50),
    (582_952, 51),
    (950_870, 52),
    (765_108, 53),
    (341_110, 54),
    (776_325, 55),
    (745_056, 56),
    (439_368, 57),
    (559_893, 58),
    (149_741, 59),
    (358_903, 60),
    (513_405, 61),
    (342_679, 62),
    (969_429, 63),
    (795_775, 64),
    (566_121, 65),
    (460_566, 66),
    (680_070, 67),
    (117_310, 68),
    (480_348, 69),
    (67_319, 70),
    (661_552, 71),
    (841_303, 72),
    (561_493, 73),
    (138_807, 74),
    (442_463, 75),
    (659_927, 76),
    (445_910, 77),
    (1_046_963, 78),
    (829_700, 79),
    (962_282, 80),
    (299_623, 81),
    (555_493, 82),
    (292_826, 83),
    (517_215, 84),
    (551_009, 85),
    (898_490, 86),
    (837_603, 87),
    (759_161, 88),
    (459_948, 89),
    (290_102, 90),
    (1_034_977, 91),
    (190_650, 92),
    (98_810, 93),
    (229_950, 94),
    (320_531, 95),
    (335_506, 96),
    (885_333, 97),
    (133_227, 98),
    (806_915, 99),
    (800_313, 100),
    (981_571, 101),
    (527_253, 102),
    (24_077, 103),
    (240_232, 104),
    (559_572, 105),
    (713_399, 106),
    (233_941, 107),
    (615_514, 108),
    (911_768, 109),
    (331_680, 110),
    (951_527, 111),
    (6805, 112),
    (552_366, 113),
    (374_660, 114),
    (223_159, 115),
    (625_884, 116),
    (417_146, 117),
    (320_527, 118),
    (784_154, 119),
    (338_792, 120),
    (1199, 121),
    (679_804, 122),
    (1_024_680, 123),
    (40_845, 124),
    (234_603, 125),
    (761_225, 126),
    (644_903, 127),
    (502_167, 128),
    (121_477, 129),
    (505_144, 130),
    (165_165, 131),
    (179_628, 132),
    (1_019_195, 133),
    (145_149, 134),
    (263_738, 135),
    (269_256, 136),
    (996_739, 137),
    (346_296, 138),
    (555_864, 139),
    (887_384, 140),
    (444_173, 141),
    (421_844, 142),
    (653_716, 143),
    (836_747, 144),
    (783_119, 145),
    (918_762, 146),
    (946_835, 147),
    (253_764, 148),
    (519_895, 149),
    (471_224, 150),
    (134_272, 151),
    (709_016, 152),
    (44_112, 153),
    (482_585, 154),
    (461_829, 155),
    (15_080, 156),
    (148_883, 157),
    (123_467, 158),
    (480_125, 159),
    (141_348, 160),
    (65_877, 161),
    (692_958, 162),
    (148_598, 163),
    (499_131, 164),
    (584_009, 165),
    (1_017_987, 166),
    (449_287, 167),
    (277_478, 168),
    (991_262, 169),
    (509_602, 170),
    (991_896, 171),
    (853_666, 172),
    (399_318, 173),
    (197_815, 174),
    (203_278, 175),
    (903_979, 176),
    (743_015, 177),
    (888_308, 178),
    (862_143, 179),
    (979_421, 180),
    (113_605, 181),
    (206_397, 182),
    (127_113, 183),
    (844_358, 184),
    (711_569, 185),
    (229_153, 186),
    (521_470, 187),
    (401_793, 188),
    (398_896, 189),
    (940_810, 190),
    (293_983, 191),
    (884_749, 192),
    (384_802, 193),
    (584_151, 194),
    (970_201, 195),
    (523_882, 196),
    (158_093, 197),
    (929_312, 198),
    (205_329, 199),
    (106_091, 200),
    (30_949, 201),
    (195_586, 202),
    (495_723, 203),
    (348_779, 204),
    (852_312, 205),
    (1_018_463, 206),
    (1_009_481, 207),
    (448_260, 208),
    (841_042, 209),
    (122_967, 210),
    (345_269, 211),
    (794_764, 212),
    (4520, 213),
    (818_773, 214),
    (556_171, 215),
    (954_221, 216),
    (598_210, 217),
    (887_110, 218),
    (1_020_623, 219),
    (324_632, 220),
    (398_244, 221),
    (622_241, 222),
    (456_551, 223),
    (122_648, 224),
    (127_837, 225),
    (657_676, 226),
    (119_884, 227),
    (105_156, 228),
    (999_897, 229),
    (330_160, 230),
    (119_285, 231),
    (168_005, 232),
    (389_703, 233),
    (143_699, 234),
    (142_524, 235),
    (493_258, 236),
    (846_778, 237),
    (251_420, 238),
    (516_351, 239),
    (83_344, 240),
    (171_931, 241),
    (879_178, 242),
    (663_475, 243),
    (546_865, 244),
    (428_362, 245),
    (658_891, 246),
    (500_560, 247),
    (557_034, 248),
    (830_023, 249),
    (274_471, 250),
    (629_139, 251),
    (958_869, 252),
    (663_071, 253),
    (152_133, 254),
    (19_535, 255),
];

#[test]
fn test_get_status_1_bit() {
    let status_list_src = "eNrt3AENwCAMAEGogklACtKQPg9LugC9k_ACvreiogEAAKkeCQAAAAAAAAAAAAAAAAAAAIBylgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG9IAAAAAAAAAPwsJAAAAAAAAAAAAAAAvhsSAAAAAAAAAAAA7KpLAAAAAAAAAAAAAAAAAAAAAJsLCQAAAAAAAAAAADjelAAAAAAAAAAAKjDMAQAAAACAZC8L2AEb";

    let status_list = StatusList::parse(status_list_src, 1).unwrap();

    let cases = [
        (0, 1),
        (1993, 1),
        (25_460, 1),
        (159_495, 1),
        (495_669, 1),
        (554_353, 1),
        (645_645, 1),
        (723_232, 1),
        (854_545, 1),
        (934_534, 1),
        (1_000_345, 1),
    ];

    for (idx, expected_status) in cases {
        let got_status = status_list
            .get_status(idx)
            .unwrap_or_else(|_| panic!("failed to get status for idx: {idx}"));
        assert_eq!(
            got_status,
            expected_status.into(),
            "assertion failed for idx: {idx}"
        );
    }
}

#[test]
fn test_get_status_2_bit() {
    let status_list_src = "eNrt2zENACEQAEEuoaBABP5VIO01fCjIHTMStt9ovGVIAAAAAABAbiEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB5WwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAID0ugQAAAAAAAAAAAAAAAAAQG12SgAAAAAAAAAAAAAAAAAAAAAAAAAAAOCSIQEAAAAAAAAAAAAAAAAAAAAAAAD8ExIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwJEuAQAAAAAAAAAAAAAAAAAAAAAAAMB9SwIAAAAAAAAAAAAAAAAAAACoYUoAAAAAAAAAAAAAAEBqH81gAQw";

    let status_list = StatusList::parse(status_list_src, 2).unwrap();

    let cases = [
        (0, 1),
        (1993, 2),
        (25_460, 1),
        (159_495, 3),
        (495_669, 1),
        (554_353, 1),
        (645_645, 2),
        (723_232, 1),
        (854_545, 1),
        (934_534, 2),
        (1_000_345, 3),
    ];

    for (idx, expected_status) in cases {
        let got_status = status_list
            .get_status(idx)
            .unwrap_or_else(|_| panic!("failed to get status for idx: {idx}"));
        assert_eq!(
            got_status,
            expected_status.into(),
            "assertion failed for idx: {idx}"
        );
    }
}

#[test]
fn test_get_status_4_bit() {
    let status_list_src = "eNrt0EENgDAQADAIHwImkIIEJEwCUpCEBBQRHOy35Li1EjoOQGabAgAAAAAAAAAAAAAAAAAAACC1SQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABADrsCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoxaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIoCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACArpwKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhqVkAzlwIAAAAAiGVRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABx3AoAgLpVAQAAAAAAAAAAAAAAwM89rwMAAAAAAAAAAAjsA9xMBMA";

    let status_list = StatusList::parse(status_list_src, 4).unwrap();

    let cases = [
        (0, 1),
        (1993, 2),
        (35_460, 3),
        (459_495, 4),
        (595_669, 5),
        (754_353, 6),
        (845_645, 7),
        (923_232, 8),
        (924_445, 9),
        (934_534, 10),
        (1_004_534, 11),
        (1_000_345, 12),
        (1_030_203, 13),
        (1_030_204, 14),
        (1_030_205, 15),
    ];

    for (idx, expected_status) in cases {
        let got_status = status_list
            .get_status(idx)
            .unwrap_or_else(|_| panic!("failed to get status for idx: {idx}"));
        assert_eq!(
            got_status,
            expected_status.into(),
            "assertion failed for idx: {idx}"
        );
    }
}

#[test]
fn test_get_status_8_bit() {
    let status_list_src = "eNrt0WOQM2kYhtGsbdu2bdu2bdu2bdu2bdu2jVnU1my-SWYm6U5enFPVf7ue97orFYAo7CQBAACQuuckAABStqUEAAAAAAAAtN6wEgAE71QJAAAAAIrwhwQAAAAAAdtAAgAAAAAAACLwkAQAAAAAAAAAAACUaFcJAACAeJwkAQAAAAAAAABQvL4kAAAAWmJwCQAAAAAAAAjAwBIAAAB06ywJoDKQBARpfgkAAAAAAAAAAAAAAAAAAACo50sJAAAAAAAAAOiRcSQAAAAAgAJNKgEAAG23mgQAAAAAAECw3pUAQvegBAAAAAAAAADduE4CAAAAyjSvBAAQiw8koHjvSABAb-wlARCONyVoxtMSZOd0CQAAAOjWDRKQmLckAAAAAACysLYEQGcnSAAAAAAQooUlAABI15kSAIH5RAIgLB9LABC4_SUgGZNIAABAmM6RoLbTJIASzCIBAEAhfpcAAAAAAABquk8CAAAAAAAAaJl9SvvzBOICAFWmkIBgfSgBAAAANOgrCQAAAAAAAADStK8EAAC03gASAAAAAAAAAADFWFUCAAAAMjOaBEADHpYAQjCIBADduFwCAAAAAGitMSSI3BUSAECOHpAA6IHrJQAAAAAAsjeVBAAAKRpVAorWvwQAAAAAAAAAkKRtJAAAAAAAgCbcLAF0bXUJAAAAoF02kYDg7CYBAAAAAEB6NpQAAAAAAAAAAAAAAEr1uQQAAF06VgIAAAAAAAAAqDaeBAAQqgMkAAAAAABogQMlAAAAAAAa87MEAAAQiwslAAAAAAAAAAAAAAAAMrOyBAAAiekv-hcsY0Sgne6QAAAAAAAgaUtJAAAAAAAAAAAAAAAAAAAAAAAAAADwt-07vjVkAAAAgDy8KgFAUEaSAAAAAJL3vgQAWdhcAgAAoBHDSUDo1pQAAACI2o4SAABZm14CALoyuwQAAPznGQkgZwdLAAAQukclAAAAAAAAAAAAgKbMKgEAAAAAAAAAAAAAAAAAAECftpYAAAAAAAAAAAAACnaXBAAAAADk7iMJAAAAAAAAAABqe00CAnGbBBG4TAIAgFDdKgFAXCaWAAAAAAAAAAAAAAAAAKAJQwR72XbGAQAAAKAhh0sAAAAAAABQgO8kAAAAAAAAAAAAACAaM0kAAAC5W0QCAIJ3mAQAxGwxCQAA6nhSAsjZBRIAANEbWQIAAAAAaJE3JACAwA0qAUBIVpKAlphbAiAPp0iQnKEkAAAAAAAgBP1KAAAAdOl4CQAAAAAAAPjLZBIAAG10RtrPm8_CAEBMTpYAAAAAAIjQYBL8z5QSAAAAAEDYPpUAACAsj0gAAADQkHMlAAjHDxIA0Lg9JQAAgHDsLQEAAABAQS6WAAAAgLjNFs2l_RgLAIAEfCEBlGZZCQAAaIHjJACgtlskAAAozb0SAAAAVFtfAgAAAAAAAAAAAAAAAAAAAAAAAKDDtxIAAAAAVZaTAKB5W0kAANCAsSUgJ0tL0GqHSNBbL0gAZflRAgCARG0kQXNmlgCABiwkAQAAAEB25pIAAAAAAAAAAAAAoFh9SwAAAAAAADWNmOSrpjFsEoaRgDKcF9Q1dxsEAAAAAAAAAAAAAAAAgPZ6SQIAAAAAAAAAgChMLgEAAAAAAAAAqZlQAsK2qQQAAAAAAAD06XUJAAAAqG9bCQAAgLD9IgEAAAAAAAAAAAAAAAAAAEBNe0gAAAAAAAAAAEBPHSEBAAAAlOZtCYA4fS8B0GFRCQAo0gISAOTgNwmC840EAAAAAAAAAAAAAAAAAAAAUJydJfjXPBIAAAAAAAAAAAAAAABk6WwJAAAAAAAAAAAAAAAAqG8UCQAAgPpOlAAAIA83SQAANWwc9HUjGAgAAAAAAACAusaSAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHKVBACQjxklAAAAAAAAAKBHxpQAAAAAACBME0lAdlaUAACyt7sEAAAA0Nl0EgAAAAAAAAAAAABA-8wgAQAAAAAAAKU4SgKgUtlBAgAAAAAAAAAAgMCMLwEE51kJICdzSgCJGl2CsE0tAQAA0L11JQAAAAAAAAjUOhIAAAAAAAAAAAAAAGTqeQkAAAAAAAAAAAAAKM8SEjTrJwkAAAAAAACocqQEULgVJAAAACjDUxJUKgtKAAAAqbpRAgCA0n0mAQAAAABAGzwmAUCTLpUAAAAAAAAAAEjZNRIAAAAAAAAAAAAAAAAAAAAA8I-vJaAlhpQAAAAAAHrvzjJ-OqCuuVlLAojP8BJAr70sQZVDJYAgXS0BAAAAAAAAAAAAtMnyEgAAAAAAFONKCQAAAAAAAADorc0kAAAAAAAAgDqOlgAAAAAAAAAAAADIwv0SAAAAAAAAAAAAAADBuV0CIFVDSwAAAABAAI6RAAAAAGIwrQSEZAsJAABouRclAAAAAKDDrxIAAAA0bkkJgFiMKwEAAAAAAHQyhwRk7h4JAAAAAAAAAAAgatdKAACUYj0JAAAAAAAAAAAAQnORBLTFJRIAAAAAkIaDJAAAAJryngQAAAAAAAAAAAA98oQEAAAAAAAAAEC2zpcgWY9LQKL2kwAgGK9IAAAAAPHaRQIAAAAAAAAAAADIxyoSAAAAAAAAAAAAAADQFotLAECz_gQ1PX-B";

    let status_list = StatusList::parse(status_list_src, 8).unwrap();

    for (idx, expected_status) in CASES_8BIT {
        let got_status = status_list
            .get_status(idx)
            .unwrap_or_else(|_| panic!("failed to get status for idx: {idx}"));
        assert_eq!(
            got_status,
            expected_status.into(),
            "assertion failed for idx: {idx}"
        );
    }
}