Skip to main content

running_process/broker/protocol_v2/
mod.rs

1//! v2 broker protocol module.
2//!
3//! Houses the prost-generated types for the `running_process.broker.v2`
4//! package — currently the `ServiceDefinition` envelope and the
5//! `HttpServerCapability` optional sub-message introduced in #483.
6//!
7//! v2 runs in parallel with v1 (`super::protocol`) through the broker
8//! v2 rollout; v1's types are FROZEN FOREVER (#228) so all new
9//! capability fields land here instead.
10
11#[allow(missing_docs)]
12mod prost_generated {
13    include!(concat!(env!("OUT_DIR"), "/running_process.broker.v2.rs"));
14}
15
16pub use prost_generated::*;
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21    use prost::Message;
22
23    /// `ServiceDefinition` round-trips with no HTTP capability — the
24    /// optional field is absent on both sides.
25    #[test]
26    fn service_definition_without_http_round_trips() {
27        let original = ServiceDefinition {
28            service_name: "zccache".to_owned(),
29            http_server: None,
30        };
31
32        let bytes = original.encode_to_vec();
33        let decoded = ServiceDefinition::decode(bytes.as_slice())
34            .expect("encoded ServiceDefinition decodes");
35
36        assert_eq!(decoded.service_name, "zccache");
37        assert!(decoded.http_server.is_none());
38    }
39
40    /// `ServiceDefinition` round-trips with an `HttpServerCapability`
41    /// populated — all three fields survive.
42    #[test]
43    fn service_definition_with_http_round_trips() {
44        let original = ServiceDefinition {
45            service_name: "fbuild".to_owned(),
46            http_server: Some(HttpServerCapability {
47                bind_addr: "127.0.0.1".to_owned(),
48                health_path: "/healthz".to_owned(),
49                display_name: "fbuild status".to_owned(),
50            }),
51        };
52
53        let bytes = original.encode_to_vec();
54        let decoded = ServiceDefinition::decode(bytes.as_slice())
55            .expect("encoded ServiceDefinition decodes");
56
57        let cap = decoded
58            .http_server
59            .expect("http_server survives round-trip");
60        assert_eq!(decoded.service_name, "fbuild");
61        assert_eq!(cap.bind_addr, "127.0.0.1");
62        assert_eq!(cap.health_path, "/healthz");
63        assert_eq!(cap.display_name, "fbuild status");
64    }
65
66    /// Empty `HttpServerCapability` survives a round-trip — defaults are
67    /// applied by the loader/consumer, not by the proto encoder.
68    #[test]
69    fn http_server_capability_empty_defaults_survive_round_trip() {
70        let original = ServiceDefinition {
71            service_name: "minimal".to_owned(),
72            http_server: Some(HttpServerCapability::default()),
73        };
74
75        let bytes = original.encode_to_vec();
76        let decoded = ServiceDefinition::decode(bytes.as_slice())
77            .expect("encoded ServiceDefinition decodes");
78
79        let cap = decoded
80            .http_server
81            .expect("http_server survives round-trip");
82        assert!(cap.bind_addr.is_empty());
83        assert!(cap.health_path.is_empty());
84        assert!(cap.display_name.is_empty());
85    }
86
87    /// `BackendHttpReady` carries the daemon's OS-allocated port back to
88    /// the broker; encodes/decodes without loss.
89    #[test]
90    fn backend_http_ready_round_trips() {
91        let original = BackendHttpReady { port: 49_152 };
92
93        let bytes = original.encode_to_vec();
94        let decoded =
95            BackendHttpReady::decode(bytes.as_slice()).expect("BackendHttpReady decodes");
96
97        assert_eq!(decoded.port, 49_152);
98    }
99
100    /// `GetBrokerHttpEndpointRequest` is an empty marker; encoding +
101    /// decoding it produces the same default-constructed message.
102    #[test]
103    fn get_broker_http_endpoint_request_round_trips_empty() {
104        let original = GetBrokerHttpEndpointRequest::default();
105
106        let bytes = original.encode_to_vec();
107        let decoded = GetBrokerHttpEndpointRequest::decode(bytes.as_slice())
108            .expect("GetBrokerHttpEndpointRequest decodes");
109
110        assert_eq!(decoded, GetBrokerHttpEndpointRequest::default());
111    }
112
113    /// `GetBrokerHttpEndpointResponse` round-trips both fields (port + pid).
114    #[test]
115    fn get_broker_http_endpoint_response_round_trips() {
116        let original = GetBrokerHttpEndpointResponse {
117            port: 8765,
118            pid: 12_345,
119        };
120
121        let bytes = original.encode_to_vec();
122        let decoded = GetBrokerHttpEndpointResponse::decode(bytes.as_slice())
123            .expect("GetBrokerHttpEndpointResponse decodes");
124
125        assert_eq!(decoded.port, 8765);
126        assert_eq!(decoded.pid, 12_345);
127    }
128}