diff options
Diffstat (limited to 'quantum/serial_link/tests/frame_router_tests.cpp')
-rw-r--r-- | quantum/serial_link/tests/frame_router_tests.cpp | 204 |
1 files changed, 0 insertions, 204 deletions
diff --git a/quantum/serial_link/tests/frame_router_tests.cpp b/quantum/serial_link/tests/frame_router_tests.cpp deleted file mode 100644 index f76dfb33d..000000000 --- a/quantum/serial_link/tests/frame_router_tests.cpp +++ /dev/null | |||
@@ -1,204 +0,0 @@ | |||
1 | /* | ||
2 | The MIT License (MIT) | ||
3 | |||
4 | Copyright (c) 2016 Fred Sundvik | ||
5 | |||
6 | Permission is hereby granted, free of charge, to any person obtaining a copy | ||
7 | of this software and associated documentation files (the "Software"), to deal | ||
8 | in the Software without restriction, including without limitation the rights | ||
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
10 | copies of the Software, and to permit persons to whom the Software is | ||
11 | furnished to do so, subject to the following conditions: | ||
12 | |||
13 | The above copyright notice and this permission notice shall be included in all | ||
14 | copies or substantial portions of the Software. | ||
15 | |||
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
22 | SOFTWARE. | ||
23 | */ | ||
24 | |||
25 | #include "gtest/gtest.h" | ||
26 | #include "gmock/gmock.h" | ||
27 | #include <array> | ||
28 | extern "C" { | ||
29 | #include "serial_link/protocol/transport.h" | ||
30 | #include "serial_link/protocol/byte_stuffer.h" | ||
31 | #include "serial_link/protocol/frame_router.h" | ||
32 | } | ||
33 | |||
34 | using testing::_; | ||
35 | using testing::Args; | ||
36 | using testing::ElementsAreArray; | ||
37 | |||
38 | class FrameRouter : public testing::Test { | ||
39 | public: | ||
40 | FrameRouter() : current_router_buffer(nullptr) { | ||
41 | Instance = this; | ||
42 | init_byte_stuffer(); | ||
43 | } | ||
44 | |||
45 | ~FrameRouter() { Instance = nullptr; } | ||
46 | |||
47 | void send_data(uint8_t link, const uint8_t* data, uint16_t size) { | ||
48 | auto& buffer = current_router_buffer->send_buffers[link]; | ||
49 | std::copy(data, data + size, std::back_inserter(buffer)); | ||
50 | } | ||
51 | |||
52 | void receive_data(uint8_t link, uint8_t* data, uint16_t size) { | ||
53 | int i; | ||
54 | for (i = 0; i < size; i++) { | ||
55 | byte_stuffer_recv_byte(link, data[i]); | ||
56 | } | ||
57 | } | ||
58 | |||
59 | void activate_router(uint8_t num) { | ||
60 | current_router_buffer = router_buffers + num; | ||
61 | router_set_master(num == 0); | ||
62 | } | ||
63 | |||
64 | void simulate_transport(uint8_t from, uint8_t to) { | ||
65 | activate_router(to); | ||
66 | if (from > to) { | ||
67 | receive_data(DOWN_LINK, router_buffers[from].send_buffers[UP_LINK].data(), router_buffers[from].send_buffers[UP_LINK].size()); | ||
68 | } else if (to > from) { | ||
69 | receive_data(UP_LINK, router_buffers[from].send_buffers[DOWN_LINK].data(), router_buffers[from].send_buffers[DOWN_LINK].size()); | ||
70 | } | ||
71 | } | ||
72 | |||
73 | MOCK_METHOD3(transport_recv_frame, void(uint8_t from, uint8_t* data, uint16_t size)); | ||
74 | |||
75 | std::vector<uint8_t> received_data; | ||
76 | |||
77 | struct router_buffer { | ||
78 | std::vector<uint8_t> send_buffers[2]; | ||
79 | }; | ||
80 | |||
81 | router_buffer router_buffers[8]; | ||
82 | router_buffer* current_router_buffer; | ||
83 | |||
84 | static FrameRouter* Instance; | ||
85 | }; | ||
86 | |||
87 | FrameRouter* FrameRouter::Instance = nullptr; | ||
88 | |||
89 | typedef struct { | ||
90 | std::array<uint8_t, 4> data; | ||
91 | uint8_t extra[16]; | ||
92 | } frame_buffer_t; | ||
93 | |||
94 | extern "C" { | ||
95 | void send_data(uint8_t link, const uint8_t* data, uint16_t size) { FrameRouter::Instance->send_data(link, data, size); } | ||
96 | |||
97 | void transport_recv_frame(uint8_t from, uint8_t* data, uint16_t size) { FrameRouter::Instance->transport_recv_frame(from, data, size); } | ||
98 | } | ||
99 | |||
100 | TEST_F(FrameRouter, master_broadcast_is_received_by_everyone) { | ||
101 | frame_buffer_t data; | ||
102 | data.data = {0xAB, 0x70, 0x55, 0xBB}; | ||
103 | activate_router(0); | ||
104 | router_send_frame(0xFF, (uint8_t*)&data, 4); | ||
105 | EXPECT_GT(router_buffers[0].send_buffers[DOWN_LINK].size(), 0); | ||
106 | EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0); | ||
107 | EXPECT_CALL(*this, transport_recv_frame(0, _, _)).With(Args<1, 2>(ElementsAreArray(data.data))); | ||
108 | simulate_transport(0, 1); | ||
109 | EXPECT_GT(router_buffers[1].send_buffers[DOWN_LINK].size(), 0); | ||
110 | EXPECT_EQ(router_buffers[1].send_buffers[UP_LINK].size(), 0); | ||
111 | |||
112 | EXPECT_CALL(*this, transport_recv_frame(0, _, _)).With(Args<1, 2>(ElementsAreArray(data.data))); | ||
113 | simulate_transport(1, 2); | ||
114 | EXPECT_GT(router_buffers[2].send_buffers[DOWN_LINK].size(), 0); | ||
115 | EXPECT_EQ(router_buffers[2].send_buffers[UP_LINK].size(), 0); | ||
116 | } | ||
117 | |||
118 | TEST_F(FrameRouter, master_send_is_received_by_targets) { | ||
119 | frame_buffer_t data; | ||
120 | data.data = {0xAB, 0x70, 0x55, 0xBB}; | ||
121 | activate_router(0); | ||
122 | router_send_frame((1 << 1) | (1 << 2), (uint8_t*)&data, 4); | ||
123 | EXPECT_GT(router_buffers[0].send_buffers[DOWN_LINK].size(), 0); | ||
124 | EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0); | ||
125 | |||
126 | simulate_transport(0, 1); | ||
127 | EXPECT_GT(router_buffers[1].send_buffers[DOWN_LINK].size(), 0); | ||
128 | EXPECT_EQ(router_buffers[1].send_buffers[UP_LINK].size(), 0); | ||
129 | |||
130 | EXPECT_CALL(*this, transport_recv_frame(0, _, _)).With(Args<1, 2>(ElementsAreArray(data.data))); | ||
131 | simulate_transport(1, 2); | ||
132 | EXPECT_GT(router_buffers[2].send_buffers[DOWN_LINK].size(), 0); | ||
133 | EXPECT_EQ(router_buffers[2].send_buffers[UP_LINK].size(), 0); | ||
134 | |||
135 | EXPECT_CALL(*this, transport_recv_frame(0, _, _)).With(Args<1, 2>(ElementsAreArray(data.data))); | ||
136 | simulate_transport(2, 3); | ||
137 | EXPECT_GT(router_buffers[3].send_buffers[DOWN_LINK].size(), 0); | ||
138 | EXPECT_EQ(router_buffers[3].send_buffers[UP_LINK].size(), 0); | ||
139 | } | ||
140 | |||
141 | TEST_F(FrameRouter, first_link_sends_to_master) { | ||
142 | frame_buffer_t data; | ||
143 | data.data = {0xAB, 0x70, 0x55, 0xBB}; | ||
144 | activate_router(1); | ||
145 | router_send_frame(0, (uint8_t*)&data, 4); | ||
146 | EXPECT_GT(router_buffers[1].send_buffers[UP_LINK].size(), 0); | ||
147 | EXPECT_EQ(router_buffers[1].send_buffers[DOWN_LINK].size(), 0); | ||
148 | |||
149 | EXPECT_CALL(*this, transport_recv_frame(1, _, _)).With(Args<1, 2>(ElementsAreArray(data.data))); | ||
150 | simulate_transport(1, 0); | ||
151 | EXPECT_EQ(router_buffers[0].send_buffers[DOWN_LINK].size(), 0); | ||
152 | EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0); | ||
153 | } | ||
154 | |||
155 | TEST_F(FrameRouter, second_link_sends_to_master) { | ||
156 | frame_buffer_t data; | ||
157 | data.data = {0xAB, 0x70, 0x55, 0xBB}; | ||
158 | activate_router(2); | ||
159 | router_send_frame(0, (uint8_t*)&data, 4); | ||
160 | EXPECT_GT(router_buffers[2].send_buffers[UP_LINK].size(), 0); | ||
161 | EXPECT_EQ(router_buffers[2].send_buffers[DOWN_LINK].size(), 0); | ||
162 | |||
163 | simulate_transport(2, 1); | ||
164 | EXPECT_GT(router_buffers[1].send_buffers[UP_LINK].size(), 0); | ||
165 | EXPECT_EQ(router_buffers[1].send_buffers[DOWN_LINK].size(), 0); | ||
166 | |||
167 | EXPECT_CALL(*this, transport_recv_frame(2, _, _)).With(Args<1, 2>(ElementsAreArray(data.data))); | ||
168 | simulate_transport(1, 0); | ||
169 | EXPECT_EQ(router_buffers[0].send_buffers[DOWN_LINK].size(), 0); | ||
170 | EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0); | ||
171 | } | ||
172 | |||
173 | TEST_F(FrameRouter, master_sends_to_master_does_nothing) { | ||
174 | frame_buffer_t data; | ||
175 | data.data = {0xAB, 0x70, 0x55, 0xBB}; | ||
176 | activate_router(0); | ||
177 | router_send_frame(0, (uint8_t*)&data, 4); | ||
178 | EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0); | ||
179 | EXPECT_EQ(router_buffers[0].send_buffers[DOWN_LINK].size(), 0); | ||
180 | } | ||
181 | |||
182 | TEST_F(FrameRouter, link_sends_to_other_link_does_nothing) { | ||
183 | frame_buffer_t data; | ||
184 | data.data = {0xAB, 0x70, 0x55, 0xBB}; | ||
185 | activate_router(1); | ||
186 | router_send_frame(2, (uint8_t*)&data, 4); | ||
187 | EXPECT_EQ(router_buffers[1].send_buffers[UP_LINK].size(), 0); | ||
188 | EXPECT_EQ(router_buffers[1].send_buffers[DOWN_LINK].size(), 0); | ||
189 | } | ||
190 | |||
191 | TEST_F(FrameRouter, master_receives_on_uplink_does_nothing) { | ||
192 | frame_buffer_t data; | ||
193 | data.data = {0xAB, 0x70, 0x55, 0xBB}; | ||
194 | activate_router(1); | ||
195 | router_send_frame(0, (uint8_t*)&data, 4); | ||
196 | EXPECT_GT(router_buffers[1].send_buffers[UP_LINK].size(), 0); | ||
197 | EXPECT_EQ(router_buffers[1].send_buffers[DOWN_LINK].size(), 0); | ||
198 | |||
199 | EXPECT_CALL(*this, transport_recv_frame(_, _, _)).Times(0); | ||
200 | activate_router(0); | ||
201 | receive_data(UP_LINK, router_buffers[1].send_buffers[UP_LINK].data(), router_buffers[1].send_buffers[UP_LINK].size()); | ||
202 | EXPECT_EQ(router_buffers[0].send_buffers[UP_LINK].size(), 0); | ||
203 | EXPECT_EQ(router_buffers[0].send_buffers[DOWN_LINK].size(), 0); | ||
204 | } | ||