components/test/
multi_alarm_test.rs1use 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}