Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/proc-macro-srv-cli/tests/bidirectional_postcard.rs | 48 | ||||
| -rw-r--r-- | crates/proc-macro-srv-cli/tests/common/utils.rs | 118 | ||||
| -rw-r--r-- | crates/proc-macro-srv-cli/tests/legacy_json.rs | 37 |
3 files changed, 67 insertions, 136 deletions
diff --git a/crates/proc-macro-srv-cli/tests/bidirectional_postcard.rs b/crates/proc-macro-srv-cli/tests/bidirectional_postcard.rs index 08e44bad37..33ca1d791d 100644 --- a/crates/proc-macro-srv-cli/tests/bidirectional_postcard.rs +++ b/crates/proc-macro-srv-cli/tests/bidirectional_postcard.rs @@ -4,7 +4,9 @@ mod common { pub(crate) mod utils; } -use common::utils::{create_empty_token_tree, proc_macro_test_dylib_path, request, with_server}; +use common::utils::{ + create_empty_token_tree, proc_macro_test_dylib_path, request_bidirectional, with_server, +}; use expect_test::expect; use proc_macro_api::{ ProtocolFormat::BidirectionalPostcardPrototype, @@ -20,7 +22,7 @@ use proc_macro_api::{ fn test_bidi_version_check_bidirectional() { with_server(BidirectionalPostcardPrototype, |writer, reader| { let response = - request(writer, reader, Request::ApiVersionCheck {}, Some(&reject_subrequests)).into(); + request_bidirectional(writer, reader, Request::ApiVersionCheck {}, reject_subrequests); match response { Response::ApiVersionCheck(version) => { @@ -35,9 +37,12 @@ fn test_bidi_version_check_bidirectional() { fn test_bidi_list_macros() { with_server(BidirectionalPostcardPrototype, |writer, reader| { let dylib_path = proc_macro_test_dylib_path(); - let response = - request(writer, reader, Request::ListMacros { dylib_path }, Some(&reject_subrequests)) - .into(); + let response = request_bidirectional( + writer, + reader, + Request::ListMacros { dylib_path }, + &reject_subrequests, + ); let Response::ListMacros(Ok(macros)) = response else { panic!("expected successful ListMacros response"); @@ -72,13 +77,12 @@ fn test_bidi_list_macros() { #[test] fn test_bidi_list_macros_invalid_path() { with_server(BidirectionalPostcardPrototype, |writer, reader| { - let response = request( + let response = request_bidirectional( writer, reader, Request::ListMacros { dylib_path: "/nonexistent/path/to/dylib.so".into() }, - Some(&reject_subrequests), - ) - .into(); + reject_subrequests, + ); match response { Response::ListMacros(Err(e)) => assert!( @@ -95,7 +99,7 @@ fn test_bidi_set_config() { with_server(BidirectionalPostcardPrototype, |writer, reader| { let config = ServerConfig { span_mode: SpanMode::Id }; let response = - request(writer, reader, Request::SetConfig(config), Some(&reject_subrequests)).into(); + request_bidirectional(writer, reader, Request::SetConfig(config), reject_subrequests); match response { Response::SetConfig(returned_config) => { @@ -111,7 +115,7 @@ fn test_bidi_set_config_rust_analyzer_mode() { with_server(BidirectionalPostcardPrototype, |writer, reader| { let config = ServerConfig { span_mode: SpanMode::RustAnalyzer }; let response = - request(writer, reader, Request::SetConfig(config), Some(&reject_subrequests)).into(); + request_bidirectional(writer, reader, Request::SetConfig(config), reject_subrequests); match response { Response::SetConfig(returned_config) => { @@ -144,7 +148,7 @@ fn test_bidi_expand_macro_panic() { }, })); - let response = request(writer, reader, request1, Some(&reject_subrequests)).into(); + let response = request_bidirectional(writer, reader, request1, reject_subrequests); match response { Response::ExpandMacro(Err(PanicMessage(msg))) => { @@ -161,25 +165,23 @@ fn test_bidi_basic_call_flow() { let dylib_path = proc_macro_test_dylib_path(); let response1 = - request(writer, reader, Request::ApiVersionCheck {}, Some(&reject_subrequests)).into(); + request_bidirectional(writer, reader, Request::ApiVersionCheck {}, reject_subrequests); assert!(matches!(response1, Response::ApiVersionCheck(_))); - let response2 = request( + let response2 = request_bidirectional( writer, reader, Request::SetConfig(ServerConfig { span_mode: SpanMode::Id }), - Some(&reject_subrequests), - ) - .into(); + reject_subrequests, + ); assert!(matches!(response2, Response::SetConfig(_))); - let response3 = request( + let response3 = request_bidirectional( writer, reader, Request::ListMacros { dylib_path: dylib_path.clone() }, - Some(&reject_subrequests), - ) - .into(); + reject_subrequests, + ); assert!(matches!(response3, Response::ListMacros(Ok(_)))); }); } @@ -190,7 +192,7 @@ fn test_bidi_expand_nonexistent_macro() { let dylib_path = proc_macro_test_dylib_path(); let version_response = - request(writer, reader, Request::ApiVersionCheck {}, Some(&reject_subrequests)).into(); + request_bidirectional(writer, reader, Request::ApiVersionCheck {}, reject_subrequests); let Response::ApiVersionCheck(version) = version_response else { panic!("expected version check response"); }; @@ -211,7 +213,7 @@ fn test_bidi_expand_nonexistent_macro() { }, })); - let response = request(writer, reader, expand_request, Some(&reject_subrequests)).into(); + let response = request_bidirectional(writer, reader, expand_request, reject_subrequests); match response { Response::ExpandMacro(Err(PanicMessage(msg))) => { diff --git a/crates/proc-macro-srv-cli/tests/common/utils.rs b/crates/proc-macro-srv-cli/tests/common/utils.rs index 63b3a74aa4..85c394734b 100644 --- a/crates/proc-macro-srv-cli/tests/common/utils.rs +++ b/crates/proc-macro-srv-cli/tests/common/utils.rs @@ -198,21 +198,22 @@ trait TestProtocol { type Request; type Response; - fn send(&self, writer: &mut dyn Write, req: Self::Request); - fn drive(&self, reader: &mut dyn BufRead, writer: &mut dyn Write) -> Self::Response; + fn request(&self, writer: &mut dyn Write, req: Self::Request); + fn receive(&self, reader: &mut dyn BufRead, writer: &mut dyn Write) -> Self::Response; } +#[allow(dead_code)] struct JsonLegacy; impl TestProtocol for JsonLegacy { type Request = Request; type Response = Response; - fn send(&self, writer: &mut dyn Write, req: Request) { + fn request(&self, writer: &mut dyn Write, req: Request) { req.write::<JsonProtocol>(writer).expect("failed to write request"); } - fn drive(&self, reader: &mut dyn BufRead, _writer: &mut dyn Write) -> Response { + fn receive(&self, reader: &mut dyn BufRead, _writer: &mut dyn Write) -> Response { let mut buf = String::new(); Response::read::<JsonProtocol>(reader, &mut buf) .expect("failed to read response") @@ -220,6 +221,7 @@ impl TestProtocol for JsonLegacy { } } +#[allow(dead_code)] struct PostcardBidirectional<F> where F: Fn(SubRequest) -> Result<SubResponse, ServerError>, @@ -234,12 +236,12 @@ where type Request = BiRequest; type Response = BiResponse; - fn send(&self, writer: &mut dyn Write, req: BiRequest) { + fn request(&self, writer: &mut dyn Write, req: BiRequest) { let msg = BidirectionalMessage::Request(req); msg.write::<PostcardProtocol>(writer).expect("failed to write request"); } - fn drive(&self, reader: &mut dyn BufRead, writer: &mut dyn Write) -> BiResponse { + fn receive(&self, reader: &mut dyn BufRead, writer: &mut dyn Write) -> BiResponse { let mut buf = Vec::new(); loop { @@ -260,98 +262,28 @@ where } } -pub(crate) fn request( +#[allow(dead_code)] +pub(crate) fn request_legacy( writer: &mut dyn Write, reader: &mut dyn BufRead, - request: impl Into<AutoRequest>, - callback: Option<&dyn Fn(SubRequest) -> Result<SubResponse, ServerError>>, -) -> AutoResponse { - let protocol = match callback { - None => AutoProtocol::Legacy(JsonLegacy), - Some(cb) => AutoProtocol::Bidirectional(PostcardBidirectional { callback: cb }), - }; - - protocol.send(writer, request.into()); - protocol.drive(reader, writer) -} - -enum AutoProtocol<F> -where - F: Fn(SubRequest) -> Result<SubResponse, ServerError>, -{ - Legacy(JsonLegacy), - Bidirectional(PostcardBidirectional<F>), + request: Request, +) -> Response { + let protocol = JsonLegacy; + protocol.request(writer, request); + protocol.receive(reader, writer) } -impl<F> TestProtocol for AutoProtocol<F> +#[allow(dead_code)] +pub(crate) fn request_bidirectional<F>( + writer: &mut dyn Write, + reader: &mut dyn BufRead, + request: BiRequest, + callback: F, +) -> BiResponse where F: Fn(SubRequest) -> Result<SubResponse, ServerError>, { - type Request = AutoRequest; - type Response = AutoResponse; - - fn send(&self, writer: &mut dyn Write, req: AutoRequest) { - match (self, req) { - (AutoProtocol::Legacy(p), AutoRequest::Legacy(r)) => { - p.send(writer, r); - } - (AutoProtocol::Bidirectional(p), AutoRequest::Bidirectional(r)) => { - p.send(writer, r); - } - (AutoProtocol::Legacy(_), AutoRequest::Bidirectional(_)) => { - panic!("bidirectional request used with legacy protocol"); - } - (AutoProtocol::Bidirectional(_), AutoRequest::Legacy(_)) => { - panic!("legacy request used with bidirectional protocol"); - } - } - } - - fn drive(&self, reader: &mut dyn BufRead, writer: &mut dyn Write) -> AutoResponse { - match self { - AutoProtocol::Legacy(p) => AutoResponse::Legacy(p.drive(reader, writer)), - AutoProtocol::Bidirectional(p) => AutoResponse::Bidirectional(p.drive(reader, writer)), - } - } -} - -pub(crate) enum AutoRequest { - Legacy(Request), - Bidirectional(BiRequest), -} - -#[derive(Debug)] -pub(crate) enum AutoResponse { - Legacy(Response), - Bidirectional(BiResponse), -} - -impl From<Request> for AutoRequest { - fn from(req: Request) -> AutoRequest { - AutoRequest::Legacy(req) - } -} - -impl From<BiRequest> for AutoRequest { - fn from(req: BiRequest) -> AutoRequest { - AutoRequest::Bidirectional(req) - } -} - -impl From<AutoResponse> for Response { - fn from(res: AutoResponse) -> Response { - match res { - AutoResponse::Legacy(res) => res, - _ => panic!("Should be legacy response"), - } - } -} - -impl From<AutoResponse> for BiResponse { - fn from(res: AutoResponse) -> BiResponse { - match res { - AutoResponse::Bidirectional(res) => res, - _ => panic!("Should be bidirectional response"), - } - } + let protocol = PostcardBidirectional { callback }; + protocol.request(writer, request); + protocol.receive(reader, writer) } diff --git a/crates/proc-macro-srv-cli/tests/legacy_json.rs b/crates/proc-macro-srv-cli/tests/legacy_json.rs index 8daee7b2bc..c0dbfd1679 100644 --- a/crates/proc-macro-srv-cli/tests/legacy_json.rs +++ b/crates/proc-macro-srv-cli/tests/legacy_json.rs @@ -9,7 +9,9 @@ mod common { pub(crate) mod utils; } -use common::utils::{create_empty_token_tree, proc_macro_test_dylib_path, request, with_server}; +use common::utils::{ + create_empty_token_tree, proc_macro_test_dylib_path, request_legacy, with_server, +}; use expect_test::expect; use proc_macro_api::{ ProtocolFormat::JsonLegacy, @@ -23,7 +25,7 @@ use proc_macro_api::{ #[test] fn test_version_check() { with_server(JsonLegacy, |writer, reader| { - let response = request(writer, reader, Request::ApiVersionCheck {}, None).into(); + let response = request_legacy(writer, reader, Request::ApiVersionCheck {}); match response { Response::ApiVersionCheck(version) => { @@ -38,7 +40,7 @@ fn test_version_check() { fn test_list_macros() { with_server(JsonLegacy, |writer, reader| { let dylib_path = proc_macro_test_dylib_path(); - let response = request(writer, reader, Request::ListMacros { dylib_path }, None).into(); + let response = request_legacy(writer, reader, Request::ListMacros { dylib_path }); let Response::ListMacros(Ok(macros)) = response else { panic!("expected successful ListMacros response"); @@ -73,13 +75,11 @@ fn test_list_macros() { #[test] fn test_list_macros_invalid_path() { with_server(JsonLegacy, |writer, reader| { - let response = request( + let response = request_legacy( writer, reader, Request::ListMacros { dylib_path: "/nonexistent/path/to/dylib.so".into() }, - None, - ) - .into(); + ); match response { Response::ListMacros(Err(e)) => assert!( @@ -95,7 +95,7 @@ fn test_list_macros_invalid_path() { fn test_set_config() { with_server(JsonLegacy, |writer, reader| { let config = ServerConfig { span_mode: SpanMode::Id }; - let response = request(writer, reader, Request::SetConfig(config), None).into(); + let response = request_legacy(writer, reader, Request::SetConfig(config)); match response { Response::SetConfig(returned_config) => { @@ -110,7 +110,7 @@ fn test_set_config() { fn test_set_config_rust_analyzer_mode() { with_server(JsonLegacy, |writer, reader| { let config = ServerConfig { span_mode: SpanMode::RustAnalyzer }; - let response = request(writer, reader, Request::SetConfig(config), None).into(); + let response = request_legacy(writer, reader, Request::SetConfig(config)); match response { Response::SetConfig(returned_config) => { @@ -126,7 +126,7 @@ fn test_expand_macro_panic() { with_server(JsonLegacy, |writer, reader| { let dylib_path = proc_macro_test_dylib_path(); - let version_response = request(writer, reader, Request::ApiVersionCheck {}, None).into(); + let version_response = request_legacy(writer, reader, Request::ApiVersionCheck {}); let Response::ApiVersionCheck(version) = version_response else { panic!("expected version check response"); }; @@ -152,7 +152,7 @@ fn test_expand_macro_panic() { }, })); - let response = request(writer, reader, expand_request, None).into(); + let response = request_legacy(writer, reader, expand_request); match response { Response::ExpandMacro(Err(PanicMessage(msg))) => { @@ -171,21 +171,18 @@ fn test_basic_call_flow() { with_server(JsonLegacy, |writer, reader| { let dylib_path = proc_macro_test_dylib_path(); - let response1 = request(writer, reader, Request::ApiVersionCheck {}, None).into(); + let response1 = request_legacy(writer, reader, Request::ApiVersionCheck {}); assert!(matches!(response1, Response::ApiVersionCheck(_))); - let response2 = request( + let response2 = request_legacy( writer, reader, Request::SetConfig(ServerConfig { span_mode: SpanMode::Id }), - None, - ) - .into(); + ); assert!(matches!(response2, Response::SetConfig(_))); let response3 = - request(writer, reader, Request::ListMacros { dylib_path: dylib_path.clone() }, None) - .into(); + request_legacy(writer, reader, Request::ListMacros { dylib_path: dylib_path.clone() }); assert!(matches!(response3, Response::ListMacros(Ok(_)))); }); } @@ -195,7 +192,7 @@ fn test_expand_nonexistent_macro() { with_server(JsonLegacy, |writer, reader| { let dylib_path = proc_macro_test_dylib_path(); - let version_response = request(writer, reader, Request::ApiVersionCheck {}, None).into(); + let version_response = request_legacy(writer, reader, Request::ApiVersionCheck {}); let Response::ApiVersionCheck(version) = version_response else { panic!("expected version check response"); }; @@ -221,7 +218,7 @@ fn test_expand_nonexistent_macro() { }, })); - let response = request(writer, reader, expand_request, None).into(); + let response = request_legacy(writer, reader, expand_request); match response { Response::ExpandMacro(Err(PanicMessage(msg))) => { |