#[derive(Clone, Copy, PartialEq, Eq)]
pub(super) enum RuntimeMetricSampleError {
RequestInFlight,
DeadlineExceeded,
ReplyClosed,
}
#[cfg(test)]
mod tests {
use super::RuntimeMetricSampleError;
use super::super::counts::RuntimeMetricCounts;
const VALUES: [usize; 5] = [0, 1, 17, usize::MAX - 1, usize::MAX];
const WAIT_VALUES: [Option<usize>; 6] = [
None, Some(0), Some(1), Some(17), Some(usize::MAX - 1), Some(usize::MAX),
];
const ERRORS: [RuntimeMetricSampleError; 3] = [
RuntimeMetricSampleError::RequestInFlight,
RuntimeMetricSampleError::DeadlineExceeded,
RuntimeMetricSampleError::ReplyClosed,
];
#[test]
fn test_error_variants_and_exact_equality() {
for (index, error) in ERRORS.iter().enumerate() {
let observed = match error {
RuntimeMetricSampleError::RequestInFlight => 0,
RuntimeMetricSampleError::DeadlineExceeded => 1,
RuntimeMetricSampleError::ReplyClosed => 2,
};
assert_eq!(observed, index);
for (other_index, other) in ERRORS.iter().enumerate() {
assert_eq!(error == other, index == other_index);
assert_eq!(error != other, index != other_index);
}
}
}
#[test]
fn test_result_branches_preserve_counts_and_errors() {
for len in VALUES {
for wait_len in WAIT_VALUES {
let result: Result<RuntimeMetricCounts, RuntimeMetricSampleError> =
Ok(RuntimeMetricCounts::new(len, wait_len));
match result {
Ok(counts) => assert_eq!((counts.len(), counts.wait_len()), (len, wait_len)),
Err(_) => panic!("成功数字不得变成错误"),
}
}
}
for error in ERRORS {
let result: Result<RuntimeMetricCounts, RuntimeMetricSampleError> = Err(error);
match result {
Err(returned) => assert!(returned == error, "错误类别不得被替换"),
Ok(_) => panic!("错误不得提供伪造的成功读数"),
}
}
}
#[test]
fn test_copy_clone_preserve_original_results() {
for error in ERRORS {
let original = error;
let copied = original;
let mut cloned = Clone::clone(&original);
assert!(copied == original && cloned == original);
cloned = match error {
RuntimeMetricSampleError::RequestInFlight => RuntimeMetricSampleError::ReplyClosed,
RuntimeMetricSampleError::DeadlineExceeded => RuntimeMetricSampleError::RequestInFlight,
RuntimeMetricSampleError::ReplyClosed => RuntimeMetricSampleError::DeadlineExceeded,
};
assert!(cloned != original && copied == error && original == error);
let escaped = { let local = original; local };
assert!(escaped == error);
let original: Result<RuntimeMetricCounts, RuntimeMetricSampleError> = Err(error);
let copied = original;
let mut cloned = Clone::clone(&original);
assert!(copied == original && cloned == original);
cloned = Ok(RuntimeMetricCounts::new(0, None));
assert!(cloned != original && copied == original);
let escaped = { let local = original; local };
for result in [original, copied, escaped] {
match result {
Err(returned) => assert!(returned == error),
Ok(_) => panic!("复制不得改变失败分支"),
}
}
}
for len in VALUES {
for wait_len in WAIT_VALUES {
let original: Result<RuntimeMetricCounts, RuntimeMetricSampleError> =
Ok(RuntimeMetricCounts::new(len, wait_len));
let copied = original;
let cloned = Clone::clone(&original);
assert!(copied == original && cloned == original);
let mut replaced = copied;
assert!(replaced == original);
replaced = Err(RuntimeMetricSampleError::RequestInFlight);
assert!(replaced != original && copied == original);
let escaped = { let local = original; local };
for result in [original, copied, cloned, escaped] {
match result {
Ok(counts) => assert_eq!((counts.len(), counts.wait_len()), (len, wait_len)),
Err(_) => panic!("复制不得改变成功分支"),
}
}
}
}
}
#[test]
fn test_pure_error_and_result_traits_and_no_drop() {
fn require_traits<T: Copy + Clone + PartialEq + Eq + Send + Sync + 'static>() {}
require_traits::<RuntimeMetricSampleError>();
require_traits::<Result<RuntimeMetricCounts, RuntimeMetricSampleError>>();
assert!(!std::mem::needs_drop::<RuntimeMetricSampleError>());
assert!(!std::mem::needs_drop::<Result<RuntimeMetricCounts, RuntimeMetricSampleError>>());
assert!(matches!(ERRORS[0], RuntimeMetricSampleError::RequestInFlight));
assert!(matches!(ERRORS[1], RuntimeMetricSampleError::DeadlineExceeded));
assert!(matches!(ERRORS[2], RuntimeMetricSampleError::ReplyClosed));
}
}