1use cfg_if::cfg_if;
2use openssl::error::Error;
3
4openssl_errors::openssl_errors! {
5    library Test("test library") {
6        functions {
7            FOO("function foo");
8            BAR("function bar");
9        }
10
11        reasons {
12            NO_MILK("out of milk");
13            NO_BACON("out of bacon");
14        }
15    }
16}
17
18#[test]
19fn basic() {
20    openssl_errors::put_error!(Test::FOO, Test::NO_MILK);
21
22    let error = Error::get().unwrap();
23    assert_eq!(error.library().unwrap(), "test library");
24    assert_eq!(error.function().unwrap(), "function foo");
25    assert_eq!(error.reason().unwrap(), "out of milk");
26    // Replace Windows `\` separators with `/`
27    assert_eq!(
28        error.file().replace('\\', "/"),
29        "openssl-errors/tests/test.rs"
30    );
31    assert_eq!(error.line(), line!() - 11);
32    cfg_if! {
33        if #[cfg(ossl300)] {
34            // https://github.com/openssl/openssl/issues/12530
35            assert!(error.data().is_none() || error.data() == Some(""));
36        } else {
37            assert_eq!(error.data(), None);
38        }
39    }
40}
41
42#[test]
43fn static_data() {
44    openssl_errors::put_error!(Test::BAR, Test::NO_BACON, "foobar {{}}");
45
46    let error = Error::get().unwrap();
47    assert_eq!(error.library().unwrap(), "test library");
48    assert_eq!(error.function().unwrap(), "function bar");
49    assert_eq!(error.reason().unwrap(), "out of bacon");
50    // Replace Windows `\` separators with `/`
51    assert_eq!(
52        error.file().replace('\\', "/"),
53        "openssl-errors/tests/test.rs"
54    );
55    assert_eq!(error.line(), line!() - 11);
56    assert_eq!(error.data(), Some("foobar {}"));
57}
58
59#[test]
60fn dynamic_data() {
61    openssl_errors::put_error!(Test::BAR, Test::NO_MILK, "hello {}", "world");
62
63    let error = Error::get().unwrap();
64    assert_eq!(error.library().unwrap(), "test library");
65    assert_eq!(error.function().unwrap(), "function bar");
66    assert_eq!(error.reason().unwrap(), "out of milk");
67    // Replace Windows `\` separators with `/`
68    assert_eq!(
69        error.file().replace('\\', "/"),
70        "openssl-errors/tests/test.rs"
71    );
72    assert_eq!(error.line(), line!() - 11);
73    assert_eq!(error.data(), Some("hello world"));
74}
75
76#[test]
77fn deferred_error_render() {
78    openssl_errors::put_error!(Test::BAR, Test::NO_MILK);
79
80    let error = Error::get().unwrap();
81
82    for _ in 0..100 {
83        openssl_errors::put_error!(Test::FOO, Test::NO_BACON);
84    }
85
86    assert_eq!(error.function().unwrap(), "function bar");
87    // Replace Windows `\` separators with `/`
88    assert_eq!(
89        error.file().replace('\\', "/"),
90        "openssl-errors/tests/test.rs"
91    );
92
93    // clear out the stack for other tests on the same thread
94    while Error::get().is_some() {}
95}
96