diff options
author | Florian Klink <flokli@flokli.de> | 2024-03-27T11·11+0100 |
---|---|---|
committer | flokli <flokli@flokli.de> | 2024-03-28T07·02+0000 |
commit | 07a51c7dc9dd37205368eb0653e23e33cc04406f (patch) | |
tree | b328028d3219579ac3c10b558eefa999d2fed262 /tvix/store/src/pathinfoservice/tests/utils.rs | |
parent | 93dc5df957129b48e95c92c5c31bca3da5488208 (diff) |
feat(tvix/store): add rstest-based PathInfoService tests r/7788
This introduces rstest-based tests. We also add fixtures for creating some BlobService / DirectoryService out of thin air. To test a PathInfoService, we don't really care too much about its internal storage - ensuring they work is up to the castore tests. Change-Id: Ia62af076ef9c9fbfcf8b020a781454ad299d972e Reviewed-on: https://cl.tvl.fyi/c/depot/+/11272 Tested-by: BuildkiteCI Reviewed-by: Connor Brewster <cbrewster@hey.com>
Diffstat (limited to 'tvix/store/src/pathinfoservice/tests/utils.rs')
-rw-r--r-- | tvix/store/src/pathinfoservice/tests/utils.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tvix/store/src/pathinfoservice/tests/utils.rs b/tvix/store/src/pathinfoservice/tests/utils.rs new file mode 100644 index 000000000000..31ec57aade73 --- /dev/null +++ b/tvix/store/src/pathinfoservice/tests/utils.rs @@ -0,0 +1,60 @@ +use std::sync::Arc; + +use tonic::transport::{Endpoint, Server, Uri}; + +use crate::{ + pathinfoservice::{GRPCPathInfoService, MemoryPathInfoService, PathInfoService}, + proto::{ + path_info_service_client::PathInfoServiceClient, + path_info_service_server::PathInfoServiceServer, GRPCPathInfoServiceWrapper, + }, + tests::fixtures::{blob_service, directory_service}, +}; + +/// Constructs and returns a gRPC PathInfoService. +/// We also return memory-based {Blob,Directory}Service, +/// as the consumer of this function accepts a 3-tuple. +pub async fn make_grpc_path_info_service_client() -> super::BSDSPS { + let (left, right) = tokio::io::duplex(64); + + let blob_service = blob_service(); + let directory_service = directory_service(); + + // spin up a server, which will only connect once, to the left side. + tokio::spawn({ + let blob_service = blob_service.clone(); + let directory_service = directory_service.clone(); + async move { + let path_info_service: Arc<dyn PathInfoService> = + Arc::from(MemoryPathInfoService::new(blob_service, directory_service)); + + // spin up a new DirectoryService + let mut server = Server::builder(); + let router = server.add_service(PathInfoServiceServer::new( + GRPCPathInfoServiceWrapper::new(path_info_service), + )); + + router + .serve_with_incoming(tokio_stream::once(Ok::<_, std::io::Error>(left))) + .await + } + }); + + // Create a client, connecting to the right side. The URI is unused. + let mut maybe_right = Some(right); + + let path_info_service = Box::new(GRPCPathInfoService::from_client( + PathInfoServiceClient::new( + Endpoint::try_from("http://[::]:50051") + .unwrap() + .connect_with_connector(tower::service_fn(move |_: Uri| { + let right = maybe_right.take().unwrap(); + async move { Ok::<_, std::io::Error>(right) } + })) + .await + .unwrap(), + ), + )); + + (blob_service, directory_service, path_info_service) +} |