drivers: stepper: shell: Add test for stepper shell

Adds a basic test suite for the stepper shell commands.

Signed-off-by: Fabian Blatz <fabianblatz@gmail.com>
This commit is contained in:
Fabian Blatz 2024-09-15 18:38:05 +02:00 committed by Fabio Baltieri
commit 7e2337a1b7
5 changed files with 221 additions and 0 deletions

View file

@ -0,0 +1,8 @@
# SPDX-License-Identifier: Apache-2.0
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(can_shell)
FILE(GLOB app_sources src/*.c)
target_sources(app PRIVATE ${app_sources})

View file

@ -0,0 +1,12 @@
/*
* Copyright (c) 2024 Fabian Blatz <fabianblatz@gmail.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
/{
fake_stepper: fake_stepper {
compatible = "zephyr,fake-stepper";
status = "okay";
};
};

View file

@ -0,0 +1,7 @@
CONFIG_SHELL=y
CONFIG_SHELL_BACKEND_SERIAL=n
CONFIG_SHELL_BACKEND_DUMMY=y
CONFIG_STEPPER=y
CONFIG_STEPPER_SHELL=y
CONFIG_ZTEST=y
CONFIG_ZTEST_STACK_SIZE=1536

View file

@ -0,0 +1,177 @@
/*
* Copyright (c) 2024 Fabian Blatz <fabianblatz@gmail.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <string.h>
#include <zephyr/drivers/stepper.h>
#include <zephyr/drivers/stepper/stepper_fake.h>
#include <zephyr/fff.h>
#include <zephyr/shell/shell.h>
#include <zephyr/shell/shell_dummy.h>
#include <zephyr/ztest.h>
#include <zephyr/sys/util.h>
#define FAKE_STEPPER_NAME DEVICE_DT_NAME(DT_NODELABEL(fake_stepper))
/* Global variables */
static const struct device *const fake_stepper_dev = DEVICE_DT_GET(DT_NODELABEL(fake_stepper));
DEFINE_FFF_GLOBALS;
#define ASSERT_STEPPER_FUNC_CALLED(stepper_fake_func, retval) \
zassert_ok(retval, "failed to execute shell command (err %d)", retval); \
zassert_equal(stepper_fake_func.call_count, 1, \
STRINGIFY(stepper_fake_func) " function not called"); \
zassert_equal(stepper_fake_func.arg0_val, fake_stepper_dev, "wrong device pointer")
static void *stepper_shell_setup(void)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
/* Wait for the initialization of the shell dummy backend. */
WAIT_FOR(shell_ready(sh), 20000, k_msleep(1));
zassert_true(shell_ready(sh), "timed out waiting for dummy shell backend");
return NULL;
}
ZTEST_SUITE(stepper_shell, NULL, stepper_shell_setup, NULL, NULL, NULL);
ZTEST(stepper_shell, test_stepper_enable)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper enable " FAKE_STEPPER_NAME " on");
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_enable_fake, err);
zassert_equal(fake_stepper_enable_fake.arg1_val, true, "wrong enable value");
RESET_FAKE(fake_stepper_enable);
err = shell_execute_cmd(sh, "stepper enable " FAKE_STEPPER_NAME " off");
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_enable_fake, err);
zassert_equal(fake_stepper_enable_fake.arg1_val, false, "wrong enable value");
}
ZTEST(stepper_shell, test_stepper_move)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper move " FAKE_STEPPER_NAME " 1000");
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_move_fake, err);
zassert_equal(fake_stepper_move_fake.arg1_val, 1000, "wrong microsteps value");
#ifdef CONFIG_STEPPER_SHELL_ASYNC
zassert_not_null(fake_stepper_move_fake.arg2_val, "async poll signal not be null");
#else
zassert_is_null(fake_stepper_move_fake.arg2_val, "async poll signal is null");
#endif /* CONFIG_STEPPER_SHELL_ASYNC */
}
ZTEST(stepper_shell, test_stepper_set_max_velocity)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper set_max_velocity " FAKE_STEPPER_NAME " 200");
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_set_max_velocity_fake, err);
zassert_equal(fake_stepper_set_max_velocity_fake.arg1_val, 200, "wrong velocity value");
}
ZTEST(stepper_shell, test_stepper_set_micro_step_res)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper set_micro_step_res " FAKE_STEPPER_NAME " 64");
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_set_micro_step_res_fake, err);
zassert_equal(fake_stepper_set_micro_step_res_fake.arg1_val, 64,
"wrong micro steps resolution value");
}
ZTEST(stepper_shell, test_stepper_set_micro_step_res_invalid_value)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper set_micro_step_res " FAKE_STEPPER_NAME " 111");
zassert_not_equal(err, 0, " executed set_micro_step_res with invalid micro steps value");
}
ZTEST(stepper_shell, test_stepper_get_micro_step_res)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper get_micro_step_res " FAKE_STEPPER_NAME);
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_get_micro_step_res_fake, err);
}
ZTEST(stepper_shell, test_stepper_set_actual_position)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper set_actual_position " FAKE_STEPPER_NAME " 100");
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_set_actual_position_fake, err);
zassert_equal(fake_stepper_set_actual_position_fake.arg1_val, 100,
"wrong actual position value");
}
ZTEST(stepper_shell, test_stepper_get_actual_position)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper get_actual_position " FAKE_STEPPER_NAME);
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_get_actual_position_fake, err);
}
ZTEST(stepper_shell, test_stepper_set_target_position)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper set_target_position " FAKE_STEPPER_NAME " 200");
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_set_target_position_fake, err);
zassert_equal(fake_stepper_set_target_position_fake.arg1_val, 200,
"wrong target position value");
#ifdef CONFIG_STEPPER_SHELL_ASYNC
zassert_not_null(fake_stepper_set_target_position_fake.arg2_val,
"async poll signal not be null");
#else
zassert_is_null(fake_stepper_set_target_position_fake.arg2_val,
"async poll signal is null");
#endif /* CONFIG_STEPPER_SHELL_ASYNC */
}
ZTEST(stepper_shell, test_stepper_enable_constant_velocity_mode)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper enable_constant_velocity_mode " FAKE_STEPPER_NAME
" positive 200");
ASSERT_STEPPER_FUNC_CALLED(fake_stepper_enable_constant_velocity_mode_fake, err);
zassert_equal(fake_stepper_enable_constant_velocity_mode_fake.arg1_val,
STEPPER_DIRECTION_POSITIVE, "wrong direction value");
zassert_equal(fake_stepper_enable_constant_velocity_mode_fake.arg2_val, 200,
"wrong velocity value");
}
ZTEST(stepper_shell, test_stepper_enable_constant_velocity_mode_invalid_direction)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper enable_constant_velocity_mode " FAKE_STEPPER_NAME
" foo 200");
zassert_not_equal(err, 0,
" executed enable_constant_velocity_mode with invalid direction value");
}
ZTEST(stepper_shell, test_stepper_info)
{
const struct shell *sh = shell_backend_dummy_get_ptr();
int err = shell_execute_cmd(sh, "stepper info " FAKE_STEPPER_NAME);
zassert_ok(err, "failed to execute shell command (err %d)", err);
zassert_equal(fake_stepper_is_moving_fake.call_count, 1, "is_moving function not called");
zassert_equal(fake_stepper_get_actual_position_fake.call_count, 1,
"get_actual_position function not called");
zassert_equal(fake_stepper_get_micro_step_res_fake.call_count, 1,
"get_micro_step_res function not called");
}

View file

@ -0,0 +1,17 @@
common:
tags:
- drivers
- stepper
- shell
tests:
drivers.stepper.shell:
integration_platforms:
- native_sim
- native_sim/native/64
drivers.stepper.shell_async:
integration_platforms:
- native_sim
- native_sim/native/64
extra_configs:
- CONFIG_STEPPER_SHELL_ASYNC=y