8seg/center_fw/protocol_test.c
2019-04-16 23:38:46 +09:00

162 lines
4.6 KiB
C

#include <string.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "protocol.h"
#include "8b10b.h"
static int urandom_fd = -1;
static long long n_tests = 0;
struct test_cmd_if {
struct command_if_def cmd_if;
int payload_len[256];
};
struct {
int ncalls;
int last_cmd;
uint8_t last_args[sizeof(((struct proto_rx_st *)0)->argbuf)];
} handler_state;
void handle_command(int command, uint8_t *args) {
handler_state.ncalls++;
handler_state.last_cmd = command;
if (args)
memcpy(handler_state.last_args, args, 8);
}
void send_test_command_single(struct test_cmd_if *cmd_if, struct proto_rx_st *st, int cmd, int address, unsigned char pattern[256]) {
n_tests++;
receive_symbol(st, -K28_1);
receive_symbol(st, cmd);
receive_symbol(st, address);
for (int i=0; i<cmd_if->payload_len[cmd]; i++)
receive_symbol(st, pattern[i]);
}
void send_test_command_bulk(struct test_cmd_if *cmd_if, struct proto_rx_st *st, int cmd, int index, int len, unsigned char pattern[256]) {
n_tests++;
receive_symbol(st, -K28_1);
receive_symbol(st, cmd | PKT_TYPE_BULK_FLAG);
for (int j=0; j<len; j++) {
for (int i=0; i<cmd_if->payload_len[cmd]; i++) {
if (j == index)
receive_symbol(st, pattern[i]);
else
receive_symbol(st, 0xaa);
}
}
}
void test_commands_with_pattern(struct test_cmd_if *cmd_if, unsigned char pattern[256]) {
struct proto_rx_st st;
for (int cmd=0; cmd<cmd_if->cmd_if.packet_type_max; cmd++) {
/* Addresssed tests */
reset_receiver(&st, &cmd_if->cmd_if);
st.address = 23;
handler_state.ncalls = 0;
send_test_command_single(cmd_if, &st, cmd, 23, pattern);
assert(handler_state.ncalls == 1);
assert(handler_state.last_cmd == cmd);
assert(!memcmp(handler_state.last_args, pattern, cmd_if->payload_len[cmd]));
reset_receiver(&st, &cmd_if->cmd_if);
st.address = 23;
handler_state.ncalls = 0;
send_test_command_single(cmd_if, &st, cmd, 5, pattern);
assert(handler_state.ncalls == 0);
reset_receiver(&st, &cmd_if->cmd_if);
st.address = 5;
handler_state.ncalls = 0;
send_test_command_single(cmd_if, &st, cmd, 5, pattern);
assert(handler_state.ncalls == 1);
assert(handler_state.last_cmd == cmd);
assert(!memcmp(handler_state.last_args, pattern, cmd_if->payload_len[cmd]));
/* Bulk test */
reset_receiver(&st, &cmd_if->cmd_if);
st.address = 5;
handler_state.ncalls = 0;
send_test_command_bulk(cmd_if, &st, cmd, 5, 8, pattern);
assert(handler_state.ncalls == 1);
assert(handler_state.last_cmd == cmd);
assert(!memcmp(handler_state.last_args, pattern, cmd_if->payload_len[cmd]));
}
}
void test_commands(struct test_cmd_if *cmd_if) {
unsigned char data[256];
memset(data, 0, sizeof(data));
test_commands_with_pattern(cmd_if, data);
memset(data, 1, sizeof(data));
test_commands_with_pattern(cmd_if, data);
memset(data, 255, sizeof(data));
test_commands_with_pattern(cmd_if, data);
for (int i=0; i<5; i++) {
assert(read(urandom_fd, (char *)data, sizeof(data)) == sizeof(data));
test_commands_with_pattern(cmd_if, data);
}
}
int main(void) {
struct test_cmd_if cmd_if;
urandom_fd = open("/dev/urandom", O_RDONLY);
assert(urandom_fd > 0);
for (int ncmds=1; ncmds<128; ncmds++) {
cmd_if.cmd_if.packet_type_max = ncmds;
/* Case 1 */
for (int i=0; i<ncmds; i++)
cmd_if.payload_len[i] = 0;
test_commands(&cmd_if);
/* Case 2 */
for (int i=0; i<ncmds; i++)
cmd_if.payload_len[i] = 1;
test_commands(&cmd_if);
/* Case 3 */
for (int i=0; i<ncmds; i++)
cmd_if.payload_len[i] = i&1 ? 1 : 0;
test_commands(&cmd_if);
/* Case 4 */
for (int i=0; i<ncmds; i++)
cmd_if.payload_len[i] = i&1 ? 0 : 1;
test_commands(&cmd_if);
/* Case 5 */
for (int i=0; i<ncmds; i++)
cmd_if.payload_len[i] = i&1 ? 1 : 2;
test_commands(&cmd_if);
/* Case 6 */
for (int i=0; i<ncmds; i++)
cmd_if.payload_len[i] = i%8;
test_commands(&cmd_if);
/* Case 7 */
for (int i=0; i<ncmds; i++)
cmd_if.payload_len[i] = 4;
test_commands(&cmd_if);
}
assert(!close(urandom_fd));
printf("Successfully ran %lld tests\n", n_tests);
}