wlan_telemetry/processors/
iface.rs

1// Copyright 2025 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::util::cobalt_logger::log_cobalt_batch;
6use fidl_fuchsia_metrics::{MetricEvent, MetricEventLoggerProxy, MetricEventPayload};
7
8use wlan_legacy_metrics_registry as metrics;
9
10pub struct IfaceLogger {
11    cobalt_proxy: MetricEventLoggerProxy,
12}
13
14impl IfaceLogger {
15    pub fn new(cobalt_proxy: MetricEventLoggerProxy) -> Self {
16        Self { cobalt_proxy }
17    }
18
19    pub async fn handle_iface_creation_failure(&self) {
20        let metric_events = vec![MetricEvent {
21            metric_id: metrics::INTERFACE_CREATION_FAILURE_METRIC_ID,
22            event_codes: vec![],
23            payload: MetricEventPayload::Count(1),
24        }];
25        log_cobalt_batch!(self.cobalt_proxy, &metric_events, "handle_iface_creation_failure");
26    }
27
28    pub async fn handle_iface_destruction_failure(&self) {
29        let metric_events = vec![MetricEvent {
30            metric_id: metrics::INTERFACE_DESTRUCTION_FAILURE_METRIC_ID,
31            event_codes: vec![],
32            payload: MetricEventPayload::Count(1),
33        }];
34        log_cobalt_batch!(self.cobalt_proxy, &metric_events, "handle_iface_destruction_failure");
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41    use crate::testing::{setup_test, TestHelper};
42    use futures::task::Poll;
43    use std::pin::pin;
44
45    fn run_handle_iface_creation_failure(test_helper: &mut TestHelper, iface_logger: &IfaceLogger) {
46        let mut test_fut = pin!(iface_logger.handle_iface_creation_failure());
47        assert_eq!(
48            test_helper.run_until_stalled_drain_cobalt_events(&mut test_fut),
49            Poll::Ready(())
50        );
51    }
52
53    fn run_handle_iface_destruction_failure(
54        test_helper: &mut TestHelper,
55        iface_logger: &IfaceLogger,
56    ) {
57        let mut test_fut = pin!(iface_logger.handle_iface_destruction_failure());
58        assert_eq!(
59            test_helper.run_until_stalled_drain_cobalt_events(&mut test_fut),
60            Poll::Ready(())
61        );
62    }
63
64    #[fuchsia::test]
65    fn test_handle_iface_creation_failure() {
66        let mut test_helper = setup_test();
67        let iface_logger = IfaceLogger::new(test_helper.cobalt_proxy.clone());
68
69        run_handle_iface_creation_failure(&mut test_helper, &iface_logger);
70
71        let metrics = test_helper.get_logged_metrics(metrics::INTERFACE_CREATION_FAILURE_METRIC_ID);
72        assert_eq!(metrics.len(), 1);
73        assert_eq!(metrics[0].payload, MetricEventPayload::Count(1));
74    }
75
76    #[fuchsia::test]
77    fn test_handle_iface_event() {
78        let mut test_helper = setup_test();
79        let iface_logger = IfaceLogger::new(test_helper.cobalt_proxy.clone());
80
81        run_handle_iface_destruction_failure(&mut test_helper, &iface_logger);
82
83        let metrics =
84            test_helper.get_logged_metrics(metrics::INTERFACE_DESTRUCTION_FAILURE_METRIC_ID);
85        assert_eq!(metrics.len(), 1);
86        assert_eq!(metrics[0].payload, MetricEventPayload::Count(1));
87    }
88}