Commit 2c425e43 authored by Federico Vaga's avatar Federico Vaga

tests: improve testing

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent 4c6d6f25
......@@ -63,14 +63,22 @@ def trtl_msg(request):
sequence. These two values in the last message are equal
"""
msg_list = []
for val in range(1, request.param):
for val in range(request.param):
msg = PyMockTurtle.TrtlMessage()
msg.header.len = 2
msg.payload[0] = val
msg.payload[1] = request.param - 1
msg.payload[0] = val + 1
msg.payload[1] = request.param
msg_list.append(msg)
return msg_list
@pytest.fixture(scope="module")
def trtl_version_exp():
v = PyMockTurtle.TrtlFirmwareVersion()
v.fw_id = 0xBADC0FFE
v.fw_version = 0x1
v.git_version = 0x12345678
return v
# @pytest.fixture(scope="module")
# def trtl_hmq():
......
......@@ -7,9 +7,8 @@ DIRS += config_rom
DIRS += sim-verif
DIRS += hmq-async-recv
DIRS += hmq-async-send
DIRS += hmq-sync
DIRS += hmq-purge
DIRS += rt-frm-ping
DIRS += rt-frm
TRTL ?= ../..
......
......@@ -9,23 +9,23 @@ struct payload {
int main()
{
int cpu, hmq, count;
int cpu, hmq, count, run;
const struct trtl_config_rom *cfgrom = trtl_config_rom_get();
struct trtl_fw_msg msg;
struct trtl_fw_msg msg, msg_s;
struct payload *p;
uint32_t status;
pr_debug("ASYNC MESSAGES SEND\r\n");
pr_debug("TEST for: async send, sync\r\n");
cpu = trtl_get_core_id();
for (hmq = 0; hmq < cfgrom->n_hmq[cpu]; ++hmq) {
mq_map_in_message(TRTL_HMQ, hmq, &msg);
mq_map_out_message(TRTL_HMQ, hmq, &msg_s);
p = msg.payload;
count = 1;
while (1) {
/* Wait incoming message */
status = mq_poll_in_wait(TRTL_HMQ, 1 << hmq, 1000);
for (count = 1, run = 1; run; ++count) {
/* Wait incoming message - 100ms timeout */
status = mq_poll_in_wait(TRTL_HMQ, 1 << hmq, 100000);
if (!status) {
pr_error("\tNO MESSAGE PENDING h:%d, cnt:0x%x\r\n",
hmq, count);
......@@ -36,28 +36,31 @@ int main()
hmq, msg.header->len, p->idx, p->max, count);
/* validate message */
if (msg.header->len != 2 || p->idx != count) {
pr_error("\th: %d, l:%d, d[0]:0x%lx, cnt:0x%x\r\n",
hmq, msg.header->len, p->idx, count);
mq_discard(TRTL_HMQ, hmq);
return -1;
}
if (p->max < count) {
pr_error("\th:%d, l:%d d[1]:0x%lx, cnt:0x%x\r\n",
hmq, msg.header->len, p->max, count);
if (msg.header->len != 2 || p->idx != count || p->max < count) {
pr_error("\th:%d, len:%d, {idx: %ld, max: %ld}, cnt:0x%x\r\n",
hmq, msg.header->len, p->idx, p->max, count);
mq_discard(TRTL_HMQ, hmq);
return -1;
}
/* stop on the last one */
if (p->idx == p->max) {
mq_discard(TRTL_HMQ, hmq);
break;
if (p->idx == p->max)
run = 0; /* stop the loop */
if (msg.header->flags & TRTL_HMQ_HEADER_FLAG_SYNC) {
/* For sync answer test */
pr_debug("SEND MESSAGES SYNC ANSWER\r\n");
mq_claim(TRTL_HMQ, hmq);
memcpy(msg_s.header, msg.header,
sizeof(struct trtl_hmq_header));
msg_s.header->flags &= ~TRTL_HMQ_HEADER_FLAG_SYNC;
msg_s.header->flags |= TRTL_HMQ_HEADER_FLAG_ACK;
memcpy(msg_s.payload, msg.payload, msg.header->len * 4);
mq_send(TRTL_HMQ, hmq);
}
/* goto the next one */
mq_discard(TRTL_HMQ, hmq);
count++;
}
}
......
mainmenu "hmq_sync test configuration"
comment "Project specific configuration"
config FPGA_APPLICATION_ID
int "FPGA application ID"
default 0
help
Help text
config RT_APPLICATION_ID
int "RT application ID"
default 0
help
Help text
# include Mock Turtle's Kconfig
source "Kconfig.mt"
#
# Automatically generated file; DO NOT EDIT.
# config_rom test configuration
#
#
# Project specific configuration
#
CONFIG_FPGA_APPLICATION_ID=0
CONFIG_RT_APPLICATION_ID=0
#
# Mock Turtle configuration
#
#
# Mock Turtle framework configuration
#
# CONFIG_MOCKTURTLE_FRAMEWORK_ENABLE is not set
#
# Mock Turtle library configuration
#
CONFIG_MOCKTURTLE_LIBRARY_PRINT_ENABLE=y
# CONFIG_MOCKTURTLE_LIBRARY_PRINT_DEBUG_ENABLE is not set
CONFIG_MOCKTURTLE_LIBRARY_PRINT_ERROR_ENABLE=y
#include <mockturtle-rt.h>
int main()
{
int cpu, hmq, count;
const struct trtl_config_rom *cfgrom = trtl_config_rom_get();
volatile uint32_t *msg_r, *msg_s;
volatile struct trtl_hmq_header *hdr_r, *hdr_s;
uint32_t status;
pr_debug("SYNC MESSAGES\r\n");
cpu = trtl_get_core_id();
for (hmq = 0; hmq < cfgrom->n_hmq[cpu]; ++hmq)
mq_purge(TRTL_HMQ, hmq);
for (hmq = 0; hmq < cfgrom->n_hmq[cpu]; ++hmq) {
hdr_r = mq_map_in_header(TRTL_HMQ, hmq);
msg_r = mq_map_in_buffer(TRTL_HMQ, hmq);
hdr_s = mq_map_out_header(TRTL_HMQ, hmq);
msg_s = mq_map_out_buffer(TRTL_HMQ, hmq);
count = 1;
while (1) {
/* Wait incoming message */
status = mq_poll_in_wait(TRTL_HMQ, 1 << hmq, 1000);
if (!status) {
pr_error("\tNO MESSAGE PENDING h:%d, cnt:0x%x\r\n",
hmq, count);
return -1;
}
/* validate message */
if (hdr_r->len != 2 || msg_r[0] != count) {
pr_error("\th: %d, l:%d, d[0]:0x%lx, cnt:0x%x\r\n",
hmq, hdr_r->len, msg_r[0], count);
mq_discard(TRTL_HMQ, hmq);
return -1;
}
if (msg_r[1] < count) {
pr_error("\th:%d, l:%d d[1]:0x%lx, cnt:0x%x\r\n",
hmq, hdr_r->len, msg_r[1], count);
mq_discard(TRTL_HMQ, hmq);
return -1;
}
mq_claim(TRTL_HMQ, hmq);
memcpy(hdr_s, hdr_r, sizeof(struct trtl_hmq_header));
memcpy(msg_s, msg_r, (hdr_r->len + 1) * 4);
mq_discard(TRTL_HMQ, hmq);
mq_send(TRTL_HMQ, hmq);
count++;
}
}
return 0;
}
OBJS = rt-frm-ping.o
OBJS += # add other object files that you need
OUTPUT = fw-rt-frm-ping
TRTL ?= ../../../
TRTL_SW = $(TRTL)/software
CFLAGS_OPT = -O0 # disable optimization
include $(TRTL_SW)/firmware/Makefile
/*
* Copyright (C)
* Author:
* License:
*/
#include <mockturtle-framework.h>
/**
* Well, the main :)
*/
static int ping_main()
{
while (1) {
/* Handle all messages incoming from HMQ 0 as actions */
trtl_fw_mq_action_dispatch(TRTL_HMQ, 0);
}
return 0;
}
struct trtl_fw_application app = {
.name = "hellofrm",
.version = {
.rt_id = CONFIG_RT_APPLICATION_ID,
.rt_version = RT_VERSION(0, 1),
.git_version = GIT_VERSION
},
.main = ping_main,
};
OBJS = hmq-sync.o
OBJS = rt-frm.o
OBJS += # add other object files that you need
OUTPUT = fw-hmq-sync
OUTPUT = fw-rt-frm
TRTL ?= ../../../
TRTL_SW = $(TRTL)/software
......
......@@ -18,8 +18,8 @@ CONFIG_RT_APPLICATION_ID=0
#
CONFIG_MOCKTURTLE_FRAMEWORK_ENABLE=y
CONFIG_MOCKTURTLE_FRAMEWORK_DEBUG_ENABLE=y
# CONFIG_MOCKTURTLE_FRAMEWORK_VARIABLE_ENABLE is not set
# CONFIG_MOCKTURTLE_FRAMEWORK_BUFFER_ENABLE is not set
CONFIG_MOCKTURTLE_FRAMEWORK_VARIABLE_ENABLE=y
CONFIG_MOCKTURTLE_FRAMEWORK_BUFFER_ENABLE=y
#
# Mock Turtle library configuration
......
/*
* Copyright (C)
* Author:
* License:
*/
#include <mockturtle-framework.h>
#define BUF1_LEN 4
#define BUF2_LEN 5
static int var1;
static int var2;
static uint32_t buf1[BUF1_LEN];
static uint32_t buf2[BUF2_LEN];
struct trtl_fw_variable variables[] = {
[0] = {
.addr = (void *)&var1,
.mask = 0xFFFFFFFF,
.offset = 0,
.flags = 0,
},
[1] = {
.addr = (void *)&var2,
.mask = 0xFFFFFFFF,
.offset = 0,
.flags = 0,
},
};
struct trtl_fw_buffer buffers[] = {
[0] = {
.buf = buf1,
.len = BUF1_LEN * 4,
},
[1] = {
.buf = buf2,
.len = BUF2_LEN * 4,
},
};
static int frm_init()
{
int i;
var1 = 0x55AA55AA;
var2 = 0xFEDE0786;
for (i = 0; i < BUF1_LEN; ++i)
buf1[i] = i;
for (i = 0; i < BUF2_LEN; ++i)
buf2[i] = i * 2;
return 0;
}
/**
* Well, the main :)
*/
static int frm_main()
{
while (1) {
/* Handle all messages incoming from HMQ 0 as actions */
trtl_fw_mq_action_dispatch(TRTL_HMQ, 0);
}
return 0;
}
struct trtl_fw_application app = {
.name = "testfrm",
.version = {
.rt_id = 0xBADC0FFE,
.rt_version = RT_VERSION(0, 1),
.git_version = 0x12345678,
},
.fpga_id_compat_n = 0,
.variables = variables,
.n_variables = ARRAY_SIZE(variables),
.buffers = buffers,
.n_buffers = ARRAY_SIZE(buffers),
.init = frm_init,
.main = frm_main,
};
......@@ -77,7 +77,7 @@ class TestHmq(object):
sa = hmq.get_stats()
assert sb["message_sent"] + 1 == sa["message_sent"]
time.sleep(0.5)
time.sleep(0.1)
assert ser.in_waiting >= len(self.confirm)
assert self.confirm == ser.read(ser.in_waiting).decode()
......@@ -113,22 +113,26 @@ class TestHmq(object):
sa = hmq.get_stats()
assert sb[hmq]["message_received"] + tot == sa["message_received"]
def test_sync(self, trtl_cpu, trtl_msg, trtl_binary_hmq_sync):
def test_sync(self, trtl_cpu, trtl_msg, trtl_binary_hmq_async_send):
"""It sends the test messages on all available HMQ.
The test is successful when what we read back is the same we sent
"""
trtl_cpu.load_application_file(trtl_binary_hmq_sync)
trtl_cpu.load_application_file(trtl_binary_hmq_async_send)
trtl_cpu.enable()
time.sleep(0.1)
for hmq in trtl_cpu.hmq:
if hmq.idx_hmq != 0:
continue
for msg in trtl_msg:
print(msg.payload[0], msg.payload[1])
sb = hmq.get_stats()
msg_r = hmq.sync_msg(msg)
# the library add automatically this flag, but for the purpose
# of this test assertiong we manually set it
msg.header.flags |= PyMockTurtle.TrtlHmqHeader.TRTL_HMQ_HEADER_FLAG_SYNC
assert msg_r == msg
sa = hmq.get_stats()
assert sb["message_sent"] + 1 == sa["message_sent"]
assert sb["message_received"] + 1 == sa["message_received"]
assert msg_r.header.rt_app_id == msg.header.rt_app_id
assert msg_r.header.msg_id == msg.header.msg_id
assert msg_r.header.len == msg.header.len
assert msg_r.header.sync_id == msg.header.sync_id
assert msg.header.flags == PyMockTurtle.TrtlHmqHeader.TRTL_HMQ_HEADER_FLAG_SYNC
assert msg_r.header.flags == PyMockTurtle.TrtlHmqHeader.TRTL_HMQ_HEADER_FLAG_ACK
for v1, v2 in zip(msg.payload, msg_r.payload):
assert v1 == v2
import os
import pytest
import PyMockTurtle
import random
import time
@pytest.fixture
def trtl_binary_frm_var(trtl_firmware_dir):
def trtl_binary_frm(trtl_firmware_dir):
return os.path.join(trtl_firmware_dir,
"firmware/rt-frm-var/fw-rt-frm-var.bin")
"firmware/rt-frm/fw-rt-frm.bin")
@pytest.fixture
def trtl_binary_frm_ping(trtl_firmware_dir):
return os.path.join(trtl_firmware_dir,
"firmware/rt-frm-ping/fw-rt-frm-ping.bin")
@pytest.fixture
def trtl_binary_frm_version(trtl_binary_frm_ping):
return trtl_binary_frm_ping
class TestFirmwareFramework(object):
def test_var(self, trtl_cpu0, trtl_binary_frm_var):
trtl_cpu0.load_application_file(trtl_binary_frm_var)
trtl_cpu0.enable()
time.sleep(0.1)
def test_var(self, trtl_cpu, trtl_binary_frm):
trtl_cpu.load_application_file(trtl_binary_frm)
trtl_cpu.enable()
var = PyMockTurtle.TrtlFirmwareVariable(trtl_cpu.hmq[0])
assert var[0] == 0x55AA55AA
assert var[1] == 0xFEDE0786
a = random.randint(0, 4096)
b = random.randint(0, 4096)
var[0] = a
var[1] = b
assert a == var[0]
assert b == var[1]
def test_buf(self, trtl_cpu, trtl_binary_frm):
trtl_cpu.load_application_file(trtl_binary_frm)
trtl_cpu.enable()
# TODO implement the Python support
def test_ping(self, trtl_cpu0, trtl_binary_frm_ping):
trtl_cpu0.load_application_file(trtl_binary_frm_ping)
trtl_cpu0.enable()
time.sleep(0.1)
def test_ping(self, trtl_cpu, trtl_binary_frm):
trtl_cpu.load_application_file(trtl_binary_frm)
trtl_cpu.enable()
assert trtl_cpu0.ping() == True
assert trtl_cpu.ping() == True
def test_ver(self, trtl_cpu0, trtl_binary_frm_version):
trtl_cpu0.load_application_file(trtl_binary_frm_version)
trtl_cpu0.enable()
time.sleep(0.1)
def test_ver(self, trtl_cpu, trtl_version_exp, trtl_binary_frm):
trtl_cpu.load_application_file(trtl_binary_frm)
trtl_cpu.enable()
assert trtl_cpu0.ping() == True
assert trtl_cpu.version() == trtl_version_exp
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment