aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/tests/platform/version_test.rs
blob: 49fc34a23387bc00aecc61be2f8d24a00768cd5a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//! ref: composer/tests/Composer/Test/Platform/VersionTest.php

use shirabe::platform::version::Version;
use shirabe_semver::VersionParser;

fn provide_openssl_versions() -> Vec<(&'static str, &'static str, bool, Option<&'static str>)> {
    vec![
        // Generated
        ("1.2.3", "1.2.3.0", false, None),
        ("1.2.3-beta3", "1.2.3.0-beta3", false, None),
        ("1.2.3-beta3-dev", "1.2.3.0-beta3-dev", false, None),
        ("1.2.3-beta3-fips", "1.2.3.0-beta3", true, None),
        ("1.2.3-beta3-fips-dev", "1.2.3.0-beta3-dev", true, None),
        ("1.2.3-dev", "1.2.3.0-dev", false, None),
        ("1.2.3-fips", "1.2.3.0", true, None),
        ("1.2.3-fips-beta3", "1.2.3.0-beta3", true, None),
        ("1.2.3-fips-beta3-dev", "1.2.3.0-beta3-dev", true, None),
        ("1.2.3-fips-dev", "1.2.3.0-dev", true, None),
        ("1.2.3-pre2", "1.2.3.0-alpha2", false, None),
        ("1.2.3-pre2-dev", "1.2.3.0-alpha2-dev", false, None),
        ("1.2.3-pre2-fips", "1.2.3.0-alpha2", true, None),
        ("1.2.3-pre2-fips-dev", "1.2.3.0-alpha2-dev", true, None),
        ("1.2.3a", "1.2.3.1", false, None),
        ("1.2.3a-beta3", "1.2.3.1-beta3", false, None),
        ("1.2.3a-beta3-dev", "1.2.3.1-beta3-dev", false, None),
        ("1.2.3a-dev", "1.2.3.1-dev", false, None),
        ("1.2.3a-dev-fips", "1.2.3.1-dev", true, None),
        ("1.2.3a-fips", "1.2.3.1", true, None),
        ("1.2.3a-fips-beta3", "1.2.3.1-beta3", true, None),
        ("1.2.3a-fips-dev", "1.2.3.1-dev", true, None),
        ("1.2.3beta3", "1.2.3.0-beta3", false, None),
        ("1.2.3beta3-dev", "1.2.3.0-beta3-dev", false, None),
        ("1.2.3zh", "1.2.3.34", false, None),
        ("1.2.3zh-dev", "1.2.3.34-dev", false, None),
        ("1.2.3zh-fips", "1.2.3.34", true, None),
        ("1.2.3zh-fips-dev", "1.2.3.34-dev", true, None),
        // Additional cases
        (
            "1.2.3zh-fips-rc3",
            "1.2.3.34-rc3",
            true,
            Some("1.2.3.34-RC3"),
        ),
        ("1.2.3zh-alpha10-fips", "1.2.3.34-alpha10", true, None),
        ("1.1.1l (Schannel)", "1.1.1.12", false, None),
        // Check that alphabetical patch levels overflow correctly
        ("1.2.3", "1.2.3.0", false, None),
        ("1.2.3a", "1.2.3.1", false, None),
        ("1.2.3z", "1.2.3.26", false, None),
        ("1.2.3za", "1.2.3.27", false, None),
        ("1.2.3zy", "1.2.3.51", false, None),
        ("1.2.3zz", "1.2.3.52", false, None),
        // 3.x
        ("3.0.0", "3.0.0", false, Some("3.0.0.0")),
        ("3.2.4-dev", "3.2.4-dev", false, Some("3.2.4.0-dev")),
    ]
}

#[test]
fn test_parse_openssl_versions() {
    for (input, parsed_version, fips_expected, normalized_version) in provide_openssl_versions() {
        let mut is_fips = false;
        assert_eq!(
            Some(parsed_version.to_string()),
            Version::parse_openssl(input, &mut is_fips)
        );
        assert_eq!(fips_expected, is_fips);

        let normalized_version = normalized_version.unwrap_or(parsed_version);
        assert_eq!(
            normalized_version,
            VersionParser.normalize(parsed_version, None).unwrap()
        );
    }
}

#[test]
fn test_parse_libjpeg_version() {
    let cases = [
        ("9", "9.0"),
        ("9a", "9.1"),
        ("9b", "9.2"),
        // Never seen in the wild, just for overflow correctness
        ("9za", "9.27"),
    ];

    for (input, parsed_version) in cases {
        assert_eq!(
            Some(parsed_version.to_string()),
            Version::parse_libjpeg(input)
        );
    }
}

#[test]
fn test_parse_zoneinfo_version() {
    let cases = [
        ("2019c", "2019.3"),
        ("2020a", "2020.1"),
        // Never happened so far but fixate overflow behavior
        ("2020za", "2020.27"),
    ];

    for (input, parsed_version) in cases {
        assert_eq!(
            Some(parsed_version.to_string()),
            Version::parse_zoneinfo_version(input)
        );
    }
}