socket_server_mocker/server_mocker/
mod.rs

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
//! # `server_mocker`
//!
//! Mock an IP server for testing application that connect to external server.

pub(crate) mod server_mocker_error;
pub(crate) mod tcp_server_mocker;
pub(crate) mod udp_server_mocker;

use std::net::SocketAddr;
use std::time::Duration;

use crate::server_mocker_instruction::Instruction;
use crate::ServerMockerError;

/// Trait that define the behavior of a network server mocker over an IP layer.
///
/// The mocker is able to receive and send messages to the application that is tested.
///
/// The mocker can be configured to send messages to the tested application depending on the messages received.
///
/// You can later check that the messages sent by the tested application are the ones expected.
pub trait ServerMocker {
    /// Default timeout for the server to wait for a message from the client.
    const DEFAULT_NET_TIMEOUT: Duration = Duration::from_millis(100);

    /// Timeout if no more instruction is available and [`Instruction::StopExchange`] hasn't been sent
    const DEFAULT_THREAD_RECEIVER_TIMEOUT: Duration = Duration::from_secs(100);

    /// Returns the socket address on which the mock server is listening
    fn socket_address(&self) -> SocketAddr;

    /// Returns the port on which the mock server is listening
    ///
    /// Listen only on local interface
    ///
    /// Port should not be used by another listening process
    fn port(&self) -> u16 {
        self.socket_address().port()
    }

    /// Adds a slice of instructions to the server mocker
    ///
    /// The server mocker will execute the instructions in the order they are added
    ///
    /// This function could be called as many times as you want, until the connection is closed (event by the client or the server if received a [`Instruction::StopExchange`] instruction)
    ///
    /// If you push a [`Instruction::SendMessage`] instruction, you must ensure that there is a client connected to the server mocker
    ///
    /// If you push a [`Instruction::ReceiveMessage`] instruction, you must ensure that the client will send a message to the server mocker within the timeout defined in [`ServerMocker::DEFAULT_NET_TIMEOUT`]
    fn add_mock_instructions(
        &self,
        instructions: Vec<Instruction>,
    ) -> Result<(), ServerMockerError>;

    /// Return first message received by the mock server on the messages queue
    ///
    /// If no message is available, wait for [`ServerMocker::DEFAULT_NET_TIMEOUT`] and then return None
    ///
    /// If a message is available, will return the message and remove it from the queue
    fn pop_received_message(&self) -> Option<Vec<u8>>;

    /// Return first [error](ServerMockerError) received by the mock server on the errors queue
    ///
    /// If no error is available, wait for [`ServerMocker::DEFAULT_NET_TIMEOUT`] and then return None
    fn pop_server_error(&self) -> Option<ServerMockerError>;
}