1 /// These tests are intended to provide coverage and
2 /// check panic-safety of relatively unused values.
3 use super::codec::Codec;
4 use super::enums::*;
5 
get8<T: Codec>(enum_value: &T) -> u86 fn get8<T: Codec>(enum_value: &T) -> u8 {
7     let enc = enum_value.get_encoding();
8     assert_eq!(enc.len(), 1);
9     enc[0]
10 }
11 
get16<T: Codec>(enum_value: &T) -> u1612 fn get16<T: Codec>(enum_value: &T) -> u16 {
13     let enc = enum_value.get_encoding();
14     assert_eq!(enc.len(), 2);
15     (enc[0] as u16 >> 8) | (enc[1] as u16)
16 }
17 
test_enum16<T: Codec>(first: T, last: T)18 fn test_enum16<T: Codec>(first: T, last: T) {
19     let first_v = get16(&first);
20     let last_v = get16(&last);
21 
22     for val in first_v..last_v + 1 {
23         let mut buf = Vec::new();
24         val.encode(&mut buf);
25         assert_eq!(buf.len(), 2);
26 
27         let t = T::read_bytes(&buf).unwrap();
28         assert_eq!(val, get16(&t));
29     }
30 }
31 
test_enum8<T: Codec>(first: T, last: T)32 fn test_enum8<T: Codec>(first: T, last: T) {
33     let first_v = get8(&first);
34     let last_v = get8(&last);
35 
36     for val in first_v..last_v + 1 {
37         let mut buf = Vec::new();
38         val.encode(&mut buf);
39         assert_eq!(buf.len(), 1);
40 
41         let t = T::read_bytes(&buf).unwrap();
42         assert_eq!(val, get8(&t));
43     }
44 }
45 
46 #[test]
test_enums()47 fn test_enums() {
48     test_enum16::<ProtocolVersion>(ProtocolVersion::SSLv2, ProtocolVersion::TLSv1_3);
49     test_enum8::<HashAlgorithm>(HashAlgorithm::NONE, HashAlgorithm::SHA512);
50     test_enum8::<SignatureAlgorithm>(SignatureAlgorithm::Anonymous, SignatureAlgorithm::ECDSA);
51     test_enum8::<ClientCertificateType>(
52         ClientCertificateType::RSASign,
53         ClientCertificateType::ECDSAFixedECDH,
54     );
55     test_enum8::<Compression>(Compression::Null, Compression::LSZ);
56     test_enum8::<ContentType>(ContentType::ChangeCipherSpec, ContentType::Heartbeat);
57     test_enum8::<HandshakeType>(HandshakeType::HelloRequest, HandshakeType::MessageHash);
58     test_enum8::<AlertLevel>(AlertLevel::Warning, AlertLevel::Fatal);
59     test_enum8::<AlertDescription>(
60         AlertDescription::CloseNotify,
61         AlertDescription::NoApplicationProtocol,
62     );
63     test_enum8::<HeartbeatMessageType>(
64         HeartbeatMessageType::Request,
65         HeartbeatMessageType::Response,
66     );
67     test_enum16::<ExtensionType>(ExtensionType::ServerName, ExtensionType::RenegotiationInfo);
68     test_enum8::<ServerNameType>(ServerNameType::HostName, ServerNameType::HostName);
69     test_enum16::<NamedCurve>(
70         NamedCurve::sect163k1,
71         NamedCurve::arbitrary_explicit_char2_curves,
72     );
73     test_enum16::<NamedGroup>(NamedGroup::secp256r1, NamedGroup::FFDHE8192);
74     test_enum16::<CipherSuite>(
75         CipherSuite::TLS_NULL_WITH_NULL_NULL,
76         CipherSuite::SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA,
77     );
78     test_enum8::<ECPointFormat>(
79         ECPointFormat::Uncompressed,
80         ECPointFormat::ANSIX962CompressedChar2,
81     );
82     test_enum8::<HeartbeatMode>(
83         HeartbeatMode::PeerAllowedToSend,
84         HeartbeatMode::PeerNotAllowedToSend,
85     );
86     test_enum8::<ECCurveType>(ECCurveType::ExplicitPrime, ECCurveType::NamedCurve);
87     test_enum16::<SignatureScheme>(SignatureScheme::RSA_PKCS1_SHA1, SignatureScheme::ED448);
88     test_enum8::<PSKKeyExchangeMode>(PSKKeyExchangeMode::PSK_KE, PSKKeyExchangeMode::PSK_DHE_KE);
89     test_enum8::<KeyUpdateRequest>(
90         KeyUpdateRequest::UpdateNotRequested,
91         KeyUpdateRequest::UpdateRequested,
92     );
93     test_enum8::<CertificateStatusType>(CertificateStatusType::OCSP, CertificateStatusType::OCSP);
94 }
95 
96 #[test]
test_string_macro()97 fn test_string_macro() {
98     let suite = CipherSuite::TLS13_AES_256_GCM_SHA384;
99     let s = suite.as_str().unwrap();
100     assert_eq!(s, "TLS13_AES_256_GCM_SHA384")
101 }
102