ProfinetConnector/profinet_stack/p-net/test/test_cmdev.cpp

409 lines
12 KiB
C++

/*********************************************************************
* _ _ _
* _ __ | |_ _ | | __ _ | |__ ___
* | '__|| __|(_)| | / _` || '_ \ / __|
* | | | |_ _ | || (_| || |_) |\__ \
* |_| \__|(_)|_| \__,_||_.__/ |___/
*
* www.rt-labs.com
* Copyright 2018 rt-labs AB, Sweden.
*
* This software is dual-licensed under GPLv3 and a commercial
* license. See the file LICENSE.md distributed with this software for
* full license information.
********************************************************************/
/**
* @file
* @brief Unit tests of features from the CMDEV state machine.
*
*/
#include "utils_for_testing.h"
#include "mocks.h"
#include "pf_includes.h"
#include <gtest/gtest.h>
class CmdevUnitTest : public PnetUnitTest
{
};
TEST_F (CmdevUnitTest, CmdevCalculateDatadirectionInDescriptor)
{
pf_data_direction_values_t resulting_direction;
int ret;
/* Module with no cyclic data */
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_NO_IO,
PF_DIRECTION_INPUT,
PF_DEV_STATUS_TYPE_IOCS,
&resulting_direction);
EXPECT_EQ (-1, ret);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_NO_IO,
PF_DIRECTION_INPUT,
PF_DEV_STATUS_TYPE_IOPS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_NO_IO,
PF_DIRECTION_OUTPUT,
PF_DEV_STATUS_TYPE_IOCS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_NO_IO,
PF_DIRECTION_OUTPUT,
PF_DEV_STATUS_TYPE_IOPS,
&resulting_direction);
EXPECT_EQ (-1, ret);
/* Input module */
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_INPUT,
PF_DIRECTION_INPUT,
PF_DEV_STATUS_TYPE_IOCS,
&resulting_direction);
EXPECT_EQ (-1, ret);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_INPUT,
PF_DIRECTION_INPUT,
PF_DEV_STATUS_TYPE_IOPS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_INPUT,
PF_DIRECTION_OUTPUT,
PF_DEV_STATUS_TYPE_IOCS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_INPUT,
PF_DIRECTION_OUTPUT,
PF_DEV_STATUS_TYPE_IOPS,
&resulting_direction);
EXPECT_EQ (-1, ret);
/* Output module */
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_OUTPUT,
PF_DIRECTION_INPUT,
PF_DEV_STATUS_TYPE_IOCS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_OUTPUT, resulting_direction);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_OUTPUT,
PF_DIRECTION_INPUT,
PF_DEV_STATUS_TYPE_IOPS,
&resulting_direction);
EXPECT_EQ (-1, ret);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_OUTPUT,
PF_DIRECTION_OUTPUT,
PF_DEV_STATUS_TYPE_IOCS,
&resulting_direction);
EXPECT_EQ (-1, ret);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_OUTPUT,
PF_DIRECTION_OUTPUT,
PF_DEV_STATUS_TYPE_IOPS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_OUTPUT, resulting_direction);
/* Input and output module */
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_IO,
PF_DIRECTION_INPUT,
PF_DEV_STATUS_TYPE_IOCS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_OUTPUT, resulting_direction);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_IO,
PF_DIRECTION_INPUT,
PF_DEV_STATUS_TYPE_IOPS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_IO,
PF_DIRECTION_OUTPUT,
PF_DEV_STATUS_TYPE_IOCS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_INPUT, resulting_direction);
ret = pf_cmdev_calculate_exp_sub_data_descriptor_direction (
PNET_DIR_IO,
PF_DIRECTION_OUTPUT,
PF_DEV_STATUS_TYPE_IOPS,
&resulting_direction);
EXPECT_EQ (0, ret);
EXPECT_EQ (PF_DIRECTION_OUTPUT, resulting_direction);
}
TEST_F (CmdevUnitTest, CmdevCheckZero)
{
int ret;
int ix;
/* Shortest buffer */
uint8_t buffer_1[1] = {0};
ret = pf_cmdev_check_zero (buffer_1, 1);
EXPECT_EQ (0, ret);
for (ix = 1; ix < 0x100; ix++)
{
buffer_1[0] = ix;
ret = pf_cmdev_check_zero (buffer_1, 1);
EXPECT_EQ (-1, ret);
}
/* Small buffer */
uint8_t buffer_5[5] = {0};
ret = pf_cmdev_check_zero (buffer_5, 5);
EXPECT_EQ (0, ret);
for (ix = 1; ix < 0x100; ix++)
{
buffer_5[3] = ix;
ret = pf_cmdev_check_zero (buffer_5, 5);
EXPECT_EQ (-1, ret);
}
/* Buffer size larger than uint8_t */
uint8_t buffer_500[500] = {0};
ret = pf_cmdev_check_zero (buffer_500, 500);
EXPECT_EQ (0, ret);
for (ix = 1; ix < 0x100; ix++)
{
buffer_500[260] = ix;
ret = pf_cmdev_check_zero (buffer_500, 500);
EXPECT_EQ (-1, ret);
}
memset (buffer_500, 0, sizeof (buffer_500));
ret = pf_cmdev_check_zero (buffer_500, 500);
EXPECT_EQ (0, ret);
memset (buffer_500, 9, sizeof (buffer_500));
ret = pf_cmdev_check_zero (buffer_500, 500);
EXPECT_EQ (-1, ret);
/* Pass in length zero */
ret = pf_cmdev_check_zero (buffer_500, 0);
EXPECT_EQ (0, ret);
}
TEST_F (CmdevUnitTest, CmdevCheckVisibleString)
{
int ix;
int ret;
ret = pf_cmdev_check_visible_string ("");
EXPECT_EQ (-1, ret);
ret = pf_cmdev_check_visible_string ("abc");
EXPECT_EQ (0, ret);
/* Short string */
char buffer_20[20] = {0};
ret = pf_cmdev_check_visible_string (buffer_20);
EXPECT_EQ (-1, ret);
buffer_20[0] = "A"[0];
ret = pf_cmdev_check_visible_string (buffer_20);
EXPECT_EQ (0, ret);
memset (buffer_20, "A"[0], sizeof (buffer_20) - 1);
ret = pf_cmdev_check_visible_string (buffer_20);
EXPECT_EQ (0, ret);
/* Test all character values */
for (ix = 0x01; ix <= 0x1F; ix++)
{
buffer_20[10] = ix;
ret = pf_cmdev_check_visible_string (buffer_20);
EXPECT_EQ (-1, ret);
}
for (ix = 0x20; ix <= 0x7E; ix++)
{
buffer_20[10] = ix;
ret = pf_cmdev_check_visible_string (buffer_20);
EXPECT_EQ (0, ret);
}
for (ix = 0x7F; ix <= 0xFF; ix++)
{
buffer_20[10] = ix;
ret = pf_cmdev_check_visible_string (buffer_20);
EXPECT_EQ (-1, ret);
}
/* String length larger than uint8_t */
char buffer_500[500] = {0};
memset (buffer_500, "A"[0], sizeof (buffer_500) - 1);
ret = pf_cmdev_check_visible_string (buffer_500);
EXPECT_EQ (0, ret);
buffer_500[300] = 0x07;
ret = pf_cmdev_check_visible_string (buffer_500);
EXPECT_EQ (-1, ret);
}
TEST_F (CmdevUnitTest, CmdevCheckNoStraddle)
{
uint16_t start_a;
uint16_t length_a;
uint16_t start_b;
uint16_t length_b;
/* x Area A */
/* 0 1 2 3 4 5 6 7 8 9 */
/* x Area B, initial position */
start_a = 0;
length_a = 1;
length_b = 1;
EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
/* Area A */
/* 0 1 2 3 4 5 6 7 8 9 */
/* x Area B, initial position */
start_a = 0;
length_a = 0;
length_b = 1;
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
/* Area A */
/* 0 1 2 3 4 5 6 7 8 9 */
/* Area B, initial position */
start_a = 0;
length_a = 0;
length_b = 0;
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
/* x Area A */
/* 0 1 2 3 4 5 6 7 8 9 */
/* x Area B, initial position */
start_a = 2;
length_a = 1;
length_b = 1;
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 3, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 4, length_b));
/* x x Area A */
/* 0 1 2 3 4 5 6 7 8 9 */
/* x Area B, initial position */
start_a = 2;
length_a = 2;
length_b = 1;
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 3, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 4, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 5, length_b));
/* x x x Area A */
/* 0 1 2 3 4 5 6 7 8 9 */
/* x x Area B, initial position */
start_a = 4;
length_a = 3;
length_b = 2;
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 0, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 1, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 2, length_b));
EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 3, length_b));
EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 4, length_b));
EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 5, length_b));
EXPECT_EQ (-1, pf_cmdev_check_no_straddle (start_a, length_a, 6, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 7, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 8, length_b));
EXPECT_EQ (0, pf_cmdev_check_no_straddle (start_a, length_a, 9, length_b));
/* Values larger than uint8_t */
start_a = 1000;
length_a = 500;
length_b = 300;
for (start_b = 0; start_b <= 700; start_b++)
{
EXPECT_EQ (
0,
pf_cmdev_check_no_straddle (start_a, length_a, start_b, length_b));
EXPECT_EQ (
0,
pf_cmdev_check_no_straddle (start_b, length_b, start_a, length_a));
}
for (start_b = 701; start_b <= 1499; start_b++)
{
EXPECT_EQ (
-1,
pf_cmdev_check_no_straddle (start_a, length_a, start_b, length_b));
EXPECT_EQ (
-1,
pf_cmdev_check_no_straddle (start_b, length_b, start_a, length_a));
}
for (start_b = 1500; start_b < 0xFFFF; start_b++)
{
EXPECT_EQ (
0,
pf_cmdev_check_no_straddle (start_a, length_a, start_b, length_b));
EXPECT_EQ (
0,
pf_cmdev_check_no_straddle (start_b, length_b, start_a, length_a));
}
EXPECT_EQ (
0,
pf_cmdev_check_no_straddle (start_a, length_a, 0xFFFF, length_b));
EXPECT_EQ (
0,
pf_cmdev_check_no_straddle (0xFFFF, length_b, start_a, length_a));
}
TEST_F (CmdevUnitTest, CmdevCheckArType)
{
int ret;
for (uint16_t ar_type = 0; ar_type < 0xFF; ar_type++)
{
ret = pf_cmdev_check_ar_type (ar_type);
if (ar_type == PF_ART_IOCAR_SINGLE)
{
EXPECT_EQ (0, ret);
}
else
{
EXPECT_EQ (-1, ret);
}
}
ret = pf_cmdev_check_ar_type (0xFFFF);
EXPECT_EQ (-1, ret);
}