aboutsummaryrefslogtreecommitdiff
path: root/quantum/serial_link/tests/frame_router_tests.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/serial_link/tests/frame_router_tests.cpp')
-rw-r--r--quantum/serial_link/tests/frame_router_tests.cpp204
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/*
2The MIT License (MIT)
3
4Copyright (c) 2016 Fred Sundvik
5
6Permission is hereby granted, free of charge, to any person obtaining a copy
7of this software and associated documentation files (the "Software"), to deal
8in the Software without restriction, including without limitation the rights
9to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10copies of the Software, and to permit persons to whom the Software is
11furnished to do so, subject to the following conditions:
12
13The above copyright notice and this permission notice shall be included in all
14copies or substantial portions of the Software.
15
16THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22SOFTWARE.
23*/
24
25#include "gtest/gtest.h"
26#include "gmock/gmock.h"
27#include <array>
28extern "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
34using testing::_;
35using testing::Args;
36using testing::ElementsAreArray;
37
38class 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
87FrameRouter* FrameRouter::Instance = nullptr;
88
89typedef struct {
90 std::array<uint8_t, 4> data;
91 uint8_t extra[16];
92} frame_buffer_t;
93
94extern "C" {
95void send_data(uint8_t link, const uint8_t* data, uint16_t size) { FrameRouter::Instance->send_data(link, data, size); }
96
97void transport_recv_frame(uint8_t from, uint8_t* data, uint16_t size) { FrameRouter::Instance->transport_recv_frame(from, data, size); }
98}
99
100TEST_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
118TEST_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
141TEST_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
155TEST_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
173TEST_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
182TEST_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
191TEST_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}