|
| 1 | +use crate::{ |
| 2 | + jsonrpc::{server::RequestHandler, JsonRpcResponse, RequestObject, RpcError}, |
| 3 | + lsps0::model::{Lsps0listProtocolsRequest, Lsps0listProtocolsResponse}, |
| 4 | + util::unwrap_payload_with_peer_id, |
| 5 | +}; |
| 6 | +use async_trait::async_trait; |
| 7 | + |
| 8 | +pub struct Lsps0ListProtocolsHandler { |
| 9 | + pub lsps2_enabled: bool, |
| 10 | +} |
| 11 | + |
| 12 | +#[async_trait] |
| 13 | +impl RequestHandler for Lsps0ListProtocolsHandler { |
| 14 | + async fn handle(&self, payload: &[u8]) -> core::result::Result<Vec<u8>, RpcError> { |
| 15 | + let (payload, _) = unwrap_payload_with_peer_id(payload); |
| 16 | + |
| 17 | + let req: RequestObject<Lsps0listProtocolsRequest> = |
| 18 | + serde_json::from_slice(&payload).unwrap(); |
| 19 | + if let Some(id) = req.id { |
| 20 | + let mut protocols = vec![]; |
| 21 | + if self.lsps2_enabled { |
| 22 | + protocols.push(2); |
| 23 | + } |
| 24 | + let res = Lsps0listProtocolsResponse { protocols }.into_response(id); |
| 25 | + let res_vec = serde_json::to_vec(&res).unwrap(); |
| 26 | + return Ok(res_vec); |
| 27 | + } |
| 28 | + // If request has no ID (notification), return empty Ok result. |
| 29 | + Ok(vec![]) |
| 30 | + } |
| 31 | +} |
| 32 | + |
| 33 | +#[cfg(test)] |
| 34 | +mod test { |
| 35 | + use super::*; |
| 36 | + use crate::{ |
| 37 | + jsonrpc::{JsonRpcRequest, ResponseObject}, |
| 38 | + util::wrap_payload_with_peer_id, |
| 39 | + }; |
| 40 | + use cln_rpc::primitives::PublicKey; |
| 41 | + |
| 42 | + const PUBKEY: [u8; 33] = [ |
| 43 | + 0x02, 0x79, 0xbe, 0x66, 0x7e, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 0xa0, 0x62, 0x95, 0xce, 0x87, |
| 44 | + 0x0b, 0x07, 0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xce, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16, |
| 45 | + 0xf8, 0x17, 0x98, |
| 46 | + ]; |
| 47 | + |
| 48 | + fn create_peer_id() -> PublicKey { |
| 49 | + PublicKey::from_slice(&PUBKEY).expect("Valid pubkey") |
| 50 | + } |
| 51 | + |
| 52 | + fn create_wrapped_request(request: &RequestObject<Lsps0listProtocolsRequest>) -> Vec<u8> { |
| 53 | + let payload = serde_json::to_vec(request).expect("Failed to serialize request"); |
| 54 | + wrap_payload_with_peer_id(&payload, create_peer_id()) |
| 55 | + } |
| 56 | + |
| 57 | + #[tokio::test] |
| 58 | + async fn test_lsps2_disabled_returns_empty_protocols() { |
| 59 | + let handler = Lsps0ListProtocolsHandler { |
| 60 | + lsps2_enabled: false, |
| 61 | + }; |
| 62 | + |
| 63 | + let request = Lsps0listProtocolsRequest {}.into_request(Some("test-id".to_string())); |
| 64 | + let payload = create_wrapped_request(&request); |
| 65 | + |
| 66 | + let result = handler.handle(&payload).await.unwrap(); |
| 67 | + let response: ResponseObject<Lsps0listProtocolsResponse> = |
| 68 | + serde_json::from_slice(&result).unwrap(); |
| 69 | + |
| 70 | + let data = response.into_inner().expect("Should have result data"); |
| 71 | + assert!(data.protocols.is_empty()); |
| 72 | + } |
| 73 | + |
| 74 | + #[tokio::test] |
| 75 | + async fn test_lsps2_enabled_returns_protocol_2() { |
| 76 | + let handler = Lsps0ListProtocolsHandler { |
| 77 | + lsps2_enabled: true, |
| 78 | + }; |
| 79 | + |
| 80 | + let request = Lsps0listProtocolsRequest {}.into_request(Some("test-id".to_string())); |
| 81 | + let payload = create_wrapped_request(&request); |
| 82 | + |
| 83 | + let result = handler.handle(&payload).await.unwrap(); |
| 84 | + let response: ResponseObject<Lsps0listProtocolsResponse> = |
| 85 | + serde_json::from_slice(&result).unwrap(); |
| 86 | + |
| 87 | + let data = response.into_inner().expect("Should have result data"); |
| 88 | + assert_eq!(data.protocols, vec![2]); |
| 89 | + } |
| 90 | +} |
0 commit comments