1
use crate::common;
2
use libcoap_rs::crypto::pki_rpk::{
3
    KeyDef, KeyType, NonCertVerifying, PkiRpkContext, PkiRpkContextBuilder, ServerPkiRpkCryptoContext,
4
};
5
use libcoap_rs::crypto::ClientCryptoContext;
6
use libcoap_rs::message::CoapMessageCommon;
7
use libcoap_rs::protocol::{CoapMessageCode, CoapResponseCode};
8
use libcoap_rs::session::{CoapClientSession, CoapSessionCommon};
9
use libcoap_rs::CoapContext;
10
use std::path::PathBuf;
11
use std::time::Duration;
12

            
13
// Is used in some test cases, but not in others (causing a compiler warning)
14
#[allow(unused)]
15
13
pub fn dtls_client_server_request_common<KTY: KeyType, FC, FS>(
16
13
    client_key: impl KeyDef<KeyType = KTY> + 'static,
17
13
    server_key: impl KeyDef<KeyType = KTY> + 'static + Send,
18
13
    client_ctx_setup: FC,
19
13
    server_ctx_setup: FS,
20
13
) where
21
13
    FC: FnOnce(PkiRpkContextBuilder<'static, KTY, NonCertVerifying>) -> PkiRpkContext<'static, KTY> + 'static,
22
13
    FS: FnOnce(PkiRpkContextBuilder<'static, KTY, NonCertVerifying>) -> PkiRpkContext<'static, KTY> + Send + 'static,
23
13
    ServerPkiRpkCryptoContext<'static>: From<PkiRpkContext<'static, KTY>>,
24
13
    ClientCryptoContext<'static>: From<PkiRpkContext<'static, KTY>>,
25
13
{
26
13
    let server_address = common::get_unused_server_addr();
27
13
    let client_crypto_ctx = client_ctx_setup(PkiRpkContextBuilder::<'static, KTY, NonCertVerifying>::new(client_key));
28
13
    let server_handle = common::spawn_test_server(move |mut context: CoapContext| {
29
13
        let server_crypto_ctx =
30
13
            server_ctx_setup(PkiRpkContextBuilder::<'static, KTY, NonCertVerifying>::new(server_key));
31
13
        context.set_pki_rpk_context(server_crypto_ctx).unwrap();
32
13
        context.add_endpoint_dtls(server_address).unwrap();
33
13
        #[cfg(feature = "dtls-pki")]
34
13
        context.set_pki_root_ca_paths(Some("./resources/test-keys/ca/ca.crt.pem"), None::<PathBuf>);
35
13
        context
36
13
    });
37
13

            
38
13
    let mut context = CoapContext::new().unwrap();
39
13
    #[cfg(feature = "dtls-pki")]
40
13
    context.set_pki_root_ca_paths(Some("./resources/test-keys/ca/ca.crt.pem"), None::<PathBuf>);
41
13
    let session = CoapClientSession::connect_dtls(&mut context, server_address, client_crypto_ctx).unwrap();
42
13

            
43
13
    let request = common::gen_test_request();
44
13
    let req_handle = session.send_request(request).unwrap();
45
    loop {
46
80
        assert!(context.do_io(Some(Duration::from_secs(10))).expect("error during IO") <= Duration::from_secs(10));
47
80
        for response in session.poll_handle(&req_handle) {
48
13
            assert_eq!(response.code(), CoapMessageCode::Response(CoapResponseCode::Content));
49
13
            assert_eq!(response.data().unwrap().as_ref(), "Hello World!".as_bytes());
50
13
            server_handle.join().expect("Test server crashed with failure.");
51
13
            return;
52
13
        }
53
13
    }
54
13
}