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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use crate::units::{duration_format, Byte, Duration, Rate};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
#[serde(rename_all = "snake_case")]
pub enum Connection {
/// Pause for the specified duration before processing the next op
Sleep {
#[serde(with = "duration_format", rename = "amount_ms")]
amount: Duration,
},
/// Open a bidirectional stream with an identifier
OpenBidirectionalStream { stream_id: u64 },
/// Open a unidirectional stream with an identifier
OpenSendStream { stream_id: u64 },
/// Send a specific amount of data over the stream id
Send { stream_id: u64, bytes: Byte },
/// Finish sending data on the stream
SendFinish { stream_id: u64 },
/// Sets the send rate for a stream
SendRate {
stream_id: u64,
#[serde(flatten)]
rate: Rate,
},
/// Send a specific amount of data over the stream id
Receive { stream_id: u64, bytes: Byte },
/// Receives all of the data on the stream until it is finished
ReceiveAll { stream_id: u64 },
/// Finish receiving data on the stream
ReceiveFinish { stream_id: u64 },
/// Sets the receive rate for a stream
ReceiveRate {
stream_id: u64,
#[serde(flatten)]
rate: Rate,
},
/// Parks the current thread and waits for the checkpoint to be unparked
Park { checkpoint: u64 },
/// Notifies the parked checkpoint that it can continue
Unpark { checkpoint: u64 },
/// Emit a trace event
Trace { trace_id: u64 },
/// Profiles the time it takes to perform the contained operations
Profile {
trace_id: u64,
operations: Vec<Connection>,
},
/// Evaluates the contained operations for the specified value
Iterate {
value: IterateValue,
operations: Vec<Connection>,
#[serde(skip_serializing_if = "Option::is_none")]
trace_id: Option<u64>,
},
/// Perform operations concurrently
Scope { threads: Vec<Vec<Connection>> },
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
#[serde(rename_all = "snake_case")]
pub enum IterateValue {
/// Iterate for the specified duration
Time {
#[serde(with = "duration_format", rename = "amount_ms")]
amount: Duration,
},
/// Iterate for the specified count
Count { amount: u64 },
}
impl IterateValue {
pub(crate) fn is_zero(&self) -> bool {
match self {
Self::Time { amount } => *amount == Duration::ZERO,
Self::Count { amount } => *amount == 0,
}
}
}
impl From<Duration> for IterateValue {
fn from(amount: Duration) -> Self {
Self::Time { amount }
}
}
impl From<u64> for IterateValue {
fn from(amount: u64) -> Self {
Self::Count { amount }
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
#[serde(rename_all = "snake_case")]
pub enum Client {
/// Pause for the specified duration before processing the next op
Sleep {
#[serde(with = "duration_format", rename = "timeout_ms")]
timeout: Duration,
},
/// Open a connection with an identifier
Connect {
server_id: u64,
#[serde(skip_serializing_if = "Option::is_none", default)]
router_id: Option<u64>,
server_connection_id: u64,
client_connection_id: u64,
},
/// Parks the current thread and waits for the checkpoint to be unparked
Park { checkpoint: u64 },
/// Notifies the parked checkpoint that it can continue
Unpark { checkpoint: u64 },
/// Emit a trace event
Trace { trace_id: u64 },
/// Perform operations concurrently
Scope { threads: Vec<Vec<Client>> },
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
#[serde(rename_all = "snake_case")]
pub enum Router {
/// Pause for the specified duration before processing the next op
Sleep {
#[serde(with = "duration_format", rename = "amount_ms")]
amount: Duration,
},
/// Set the number of packets that can be buffered server->client
ServerBufferCount { packet_count: u32 },
/// Set the chance of a server->client packet being dropped
ServerDropRate { packet_count: u32 },
/// Set the chance of a server->client packet being reordered
ServerReorderRate { packet_count: u32 },
/// Set the chance of a server->client packet being corrupted
ServerCorruptRate { packet_count: u32 },
/// Set the amount of delay for server->client packets
ServerDelay {
#[serde(with = "duration_format", rename = "amount_ms")]
amount: Duration,
},
/// Set the amount of jitter for server->client packets
ServerJitter {
#[serde(with = "duration_format", rename = "amount_ms")]
amount: Duration,
},
/// Set the server->client MTU
ServerMtu { mtu: u16 },
/// Set the number of packets that can be buffered server->client
ClientBufferCount { packet_count: u32 },
/// Set the chance of a client->server packet being dropped
ClientDropRate { packet_count: u32 },
/// Set the chance of a client->server packet being reordered
ClientReorderRate { packet_count: u32 },
/// Set the chance of a client->server packet being corrupted
ClientCorruptRate { packet_count: u32 },
/// Set the amount of delay for client->server packets
ClientDelay {
#[serde(with = "duration_format", rename = "amount_ms")]
amount: Duration,
},
/// Set the amount of jitter for client->server packets
ClientJitter {
#[serde(with = "duration_format", rename = "amount_ms")]
amount: Duration,
},
/// Set the client->server MTU
ClientMtu { mtu: u16 },
/// Set the chance of a port being rebound
ClientRebindPortRate { packet_count: u32 },
/// Set the chance of an IP being rebound
ClientRebindAddressRate { packet_count: u32 },
/// Rebinds all of the ports and/or addresses currently being used
RebindAll { ports: bool, addresses: bool },
/// Emit a trace event
Trace { trace_id: u64 },
}