Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/proc-macro-srv-cli/tests/bidirectional_postcard.rs48
-rw-r--r--crates/proc-macro-srv-cli/tests/common/utils.rs118
-rw-r--r--crates/proc-macro-srv-cli/tests/legacy_json.rs37
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))) => {