components/test/
multi_alarm_test.rs

1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5use core::mem::MaybeUninit;
6
7use capsules_core::test::random_alarm::TestRandomAlarm;
8use capsules_core::virtualizers::virtual_alarm::{MuxAlarm, VirtualMuxAlarm};
9use kernel::component::Component;
10use kernel::hil::time::{self, Alarm};
11
12#[macro_export]
13macro_rules! multi_alarm_test_component_buf {
14    ($A:ty $(,)?) => {{
15        use capsules_core::test::random_alarm::TestRandomAlarm;
16        use capsules_core::virtualizers::virtual_alarm::VirtualMuxAlarm;
17
18        let buf00 = kernel::static_buf!(VirtualMuxAlarm<'static, $A>);
19        let buf01 = kernel::static_buf!(TestRandomAlarm<'static, VirtualMuxAlarm<'static, $A>>);
20        let buf10 = kernel::static_buf!(VirtualMuxAlarm<'static, $A>);
21        let buf11 = kernel::static_buf!(TestRandomAlarm<'static, VirtualMuxAlarm<'static, $A>>);
22        let buf20 = kernel::static_buf!(VirtualMuxAlarm<'static, $A>);
23        let buf21 = kernel::static_buf!(TestRandomAlarm<'static, VirtualMuxAlarm<'static, $A>>);
24
25        ((buf00, buf01)(buf10, buf11)(buf20, buf21))
26    };};
27}
28
29pub struct MultiAlarmTestComponent<A: 'static + time::Alarm<'static>> {
30    mux: &'static MuxAlarm<'static, A>,
31}
32
33impl<A: 'static + time::Alarm<'static>> MultiAlarmTestComponent<A> {
34    pub fn new(mux: &'static MuxAlarm<'static, A>) -> Self {
35        Self { mux }
36    }
37}
38
39impl<A: 'static + time::Alarm<'static>> Component for MultiAlarmTestComponent<A> {
40    type StaticInput = (
41        (
42            &'static mut MaybeUninit<VirtualMuxAlarm<'static, A>>,
43            &'static mut MaybeUninit<TestRandomAlarm<'static, VirtualMuxAlarm<'static, A>>>,
44        ),
45        (
46            &'static mut MaybeUninit<VirtualMuxAlarm<'static, A>>,
47            &'static mut MaybeUninit<TestRandomAlarm<'static, VirtualMuxAlarm<'static, A>>>,
48        ),
49        (
50            &'static mut MaybeUninit<VirtualMuxAlarm<'static, A>>,
51            &'static mut MaybeUninit<TestRandomAlarm<'static, VirtualMuxAlarm<'static, A>>>,
52        ),
53    );
54    type Output = MultiAlarmTestRunner<A>;
55
56    fn finalize(self, static_buffer: Self::StaticInput) -> Self::Output {
57        let (buf0, buf1, buf2) = static_buffer;
58
59        let virtual_alarm0 = buf0.0.write(VirtualMuxAlarm::new(self.mux));
60        virtual_alarm0.setup();
61
62        let test0 = buf0
63            .1
64            .write(TestRandomAlarm::new(virtual_alarm0, 19, 'A', true));
65        virtual_alarm0.set_alarm_client(test0);
66
67        let virtual_alarm1 = buf1.0.write(VirtualMuxAlarm::new(self.mux));
68        virtual_alarm1.setup();
69
70        let test1 = buf1
71            .1
72            .write(TestRandomAlarm::new(virtual_alarm1, 37, 'B', true));
73        virtual_alarm1.set_alarm_client(test1);
74
75        let virtual_alarm2 = buf2.0.write(VirtualMuxAlarm::new(self.mux));
76        virtual_alarm2.setup();
77
78        let test2 = buf2
79            .1
80            .write(TestRandomAlarm::new(virtual_alarm2, 89, 'C', true));
81        virtual_alarm2.set_alarm_client(test2);
82
83        MultiAlarmTestRunner {
84            tests: [test0, test1, test2],
85        }
86    }
87}
88
89pub struct MultiAlarmTestRunner<A: 'static + time::Alarm<'static>> {
90    tests: [&'static TestRandomAlarm<'static, VirtualMuxAlarm<'static, A>>; 3],
91}
92
93impl<A: 'static + time::Alarm<'static>> MultiAlarmTestRunner<A> {
94    pub fn run(&self) {
95        self.tests[0].run();
96        self.tests[1].run();
97        self.tests[2].run();
98    }
99}