3ece32bbf9
This creates test scenarios (using the DirectoryService trait) that we want all DirectoryService implementations to pass. Some of these tests are ported from proto::tests::grpc_directoryservice, which tested this on the gRPC interface (rather than the trait), some others ensure certain behaviour for which we only recently introduced general checking logic (through ClosureValidator). We also borrow some code related to setting up a gRPC DirectoryService client (connecting to a server exposing a in-memory DiretoryService) from castore::utils, this will be deleted once it's all ported over. Change-Id: I6810215a76101f908e2aaecafa803c70d85bc552 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11247 Reviewed-by: raitobezarius <tvl@lahfa.xyz> Autosubmit: flokli <flokli@flokli.de> Reviewed-by: Connor Brewster <cbrewster@hey.com> Tested-by: BuildkiteCI
61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
use std::sync::PoisonError;
|
|
use thiserror::Error;
|
|
use tokio::task::JoinError;
|
|
use tonic::Status;
|
|
|
|
/// Errors related to communication with the store.
|
|
#[derive(Debug, Error, PartialEq)]
|
|
pub enum Error {
|
|
#[error("invalid request: {0}")]
|
|
InvalidRequest(String),
|
|
|
|
#[error("internal storage error: {0}")]
|
|
StorageError(String),
|
|
}
|
|
|
|
impl<T> From<PoisonError<T>> for Error {
|
|
fn from(value: PoisonError<T>) -> Self {
|
|
Error::StorageError(value.to_string())
|
|
}
|
|
}
|
|
|
|
impl From<JoinError> for Error {
|
|
fn from(value: JoinError) -> Self {
|
|
Error::StorageError(value.to_string())
|
|
}
|
|
}
|
|
|
|
impl From<Error> for Status {
|
|
fn from(value: Error) -> Self {
|
|
match value {
|
|
Error::InvalidRequest(msg) => Status::invalid_argument(msg),
|
|
Error::StorageError(msg) => Status::data_loss(format!("storage error: {}", msg)),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<crate::tonic::Error> for Error {
|
|
fn from(value: crate::tonic::Error) -> Self {
|
|
Self::StorageError(value.to_string())
|
|
}
|
|
}
|
|
|
|
impl From<std::io::Error> for Error {
|
|
fn from(value: std::io::Error) -> Self {
|
|
if value.kind() == std::io::ErrorKind::InvalidInput {
|
|
Error::InvalidRequest(value.to_string())
|
|
} else {
|
|
Error::StorageError(value.to_string())
|
|
}
|
|
}
|
|
}
|
|
|
|
// TODO: this should probably go somewhere else?
|
|
impl From<Error> for std::io::Error {
|
|
fn from(value: Error) -> Self {
|
|
match value {
|
|
Error::InvalidRequest(msg) => Self::new(std::io::ErrorKind::InvalidInput, msg),
|
|
Error::StorageError(msg) => Self::new(std::io::ErrorKind::Other, msg),
|
|
}
|
|
}
|
|
}
|