Skip to content

Commit

Permalink
Added precommit | Added integration tests
Browse files Browse the repository at this point in the history
Signed-off-by: Jakub Delicat <[email protected]>
  • Loading branch information
delihus committed Oct 4, 2024
1 parent 4ee08c7 commit 136eb96
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 20 deletions.
21 changes: 21 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Language: Cpp
BasedOnStyle: Google

AccessModifierOffset: -2
AlignAfterOpenBracket: AlwaysBreak
BraceWrapping:
AfterClass: true
AfterFunction: true
AfterNamespace: true
AfterStruct: true
BreakBeforeBraces: Custom
ColumnLimit: 100
ConstructorInitializerIndentWidth: 0
ContinuationIndentWidth: 2
DerivePointerAlignment: false
PointerAlignment: Middle
ReflowComments: true
IncludeBlocks: Preserve
AlignOperands: true
PenaltyBreakAssignment: 21
PenaltyBreakBeforeFirstCallParameter: 1
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
99 changes: 99 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: check-added-large-files
# mesh files has to be taken into account
args: ["--maxkb=3000"]
- id: check-ast
- id: check-json
# vscode .json files do not follow the standard JSON format
exclude: ^.vscode/
- id: check-merge-conflict
- id: check-symlinks
- id: check-xml
- id: check-yaml
- id: debug-statements
- id: destroyed-symlinks
- id: detect-private-key
- id: end-of-file-fixer
- id: fix-byte-order-marker
- id: name-tests-test
- id: mixed-line-ending
- id: trailing-whitespace

- repo: https://github.com/PyCQA/isort
rev: 5.13.2
hooks:
- id: isort
args: ["--profile", "black"]

- repo: https://github.com/cheshirekow/cmake-format-precommit
rev: v0.6.13
hooks:
- id: cmake-format

- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v18.1.8
hooks:
- id: clang-format

- repo: https://github.com/codespell-project/codespell
rev: v2.3.0
hooks:
- id: codespell
name: codespell
description: Checks for common misspellings in text files.
entry: codespell
args:
[
"--ignore-words-list",
"ned" # north, east, down (NED)
]
exclude_types: [rst, svg]
language: python
types: [text]

- repo: https://github.com/jumanjihouse/pre-commit-hook-yamlfmt
rev: 0.2.3
hooks:
- id: yamlfmt
files: ^.github|./\.yaml
args: [--mapping, '2', --sequence, '4', --offset, '2', --width, '100']

- repo: https://github.com/psf/black
rev: 24.8.0
hooks:
- id: black
args: ["--line-length=99"]

- repo: https://github.com/PyCQA/flake8
rev: 7.1.1
hooks:
- id: flake8
args:
["--ignore=E501,W503"] # ignore too long line and line break before binary operator,
# black checks it

- repo: local
hooks:
- id: ament_copyright
name: ament_copyright
description: Check if copyright notice is available in all files.
stages: [commit]
entry: ament_copyright
language: system

# Docs - RestructuredText hooks
- repo: https://github.com/PyCQA/doc8
rev: v1.1.1
hooks:
- id: doc8
args: ["--max-line-length=100", "--ignore=D001"]
exclude: ^.*\/CHANGELOG\.rst/.*$

- repo: https://github.com/tier4/pre-commit-hooks-ros
rev: v0.10.0
hooks:
- id: prettier-package-xml
- id: sort-package-xml
17 changes: 15 additions & 2 deletions wibotic_connector_can/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.10.2)
cmake_minimum_required(VERSION 3.8)
project(wibotic_connector_can)
# Handle superbuild first option(USE_SUPERBUILD "Whether or not a superbuild
# should be invoked" ON)
Expand Down Expand Up @@ -40,7 +40,8 @@ ament_target_dependencies(wibotic_can_driver ${PACKAGE_DEPENDENCIES})

target_link_libraries(wibotic_can_driver ${UAVCAN_LIB} rt)

add_executable(wibotic_connector_can src/wibotic_can_driver_node.cpp src/main.cpp )
add_executable(wibotic_connector_can src/wibotic_can_driver_node.cpp
src/main.cpp)
target_compile_options(wibotic_connector_can PRIVATE -std=c++17)
target_include_directories(
wibotic_connector_can
Expand All @@ -54,4 +55,16 @@ target_link_libraries(wibotic_connector_can wibotic_can_driver)
install(TARGETS wibotic_connector_can wibotic_can_driver
DESTINATION lib/${PROJECT_NAME})

if(BUILD_TESTING)
find_package(ament_cmake_gmock REQUIRED)
find_package(ros_testing REQUIRED)

# Integration tests
option(TEST_INTEGRATION "Run integration tests" ON)
if(TEST_INTEGRATION)
add_ros_test(test/integration/wibotic_connector_can.test.py)
endif()

endif()

ament_package()
9 changes: 8 additions & 1 deletion wibotic_connector_can/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,16 @@

<author email="[email protected]">Jakub Delicat</author>

<buildtool_depend>ament_cmake</buildtool_depend>

<depend>rclcpp</depend>
<depend>wibotic_msgs</depend>

<buildtool_depend>ament_cmake</buildtool_depend>
<test_depend>ament_cmake_gtest</test_depend>
<test_depend>google-mock</test_depend>
<test_depend>ros_testing</test_depend>

<export>
<build_type>ament_cmake</build_type>
</export>
</package>
32 changes: 15 additions & 17 deletions wibotic_connector_can/src/wibotic_can_driver_node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,23 @@

namespace wibotic_connector_can
{
WiboticCanDriverNode::WiboticCanDriverNode(const std::string& node_name, const rclcpp::NodeOptions& options)
: rclcpp::Node(node_name, options) /*, diagnostic_updater_(std::make_shared<diagnostic_updater::Updater>(this))*/
WiboticCanDriverNode::WiboticCanDriverNode(
const std::string & node_name, const rclcpp::NodeOptions & options)
: rclcpp::Node(node_name, options)
{
RCLCPP_INFO(this->get_logger(), "Constructing node.");
RCLCPP_INFO(this->get_logger(), "Initializing node.");
DeclareParameters();
GetParameters();

CreateWiboticCanDriver();

wibotic_info_pub_ = this->create_publisher<wibotic_msgs::msg::WiboticInfo>("wibotic_info", 10);

wibotic_info_timer_ = this->create_wall_timer(std::chrono::duration<float>(update_time_s_),
std::bind(&WiboticCanDriverNode::WiboticInfoTimerCallback, this));
wibotic_info_timer_ = this->create_wall_timer(
std::chrono::duration<float>(update_time_s_),
std::bind(&WiboticCanDriverNode::WiboticInfoTimerCallback, this));

// // diagnostic_updater_->setHardwareID("Battery");

RCLCPP_INFO(this->get_logger(), "Node constructed successfully.");
RCLCPP_INFO(this->get_logger(), "Node initialized successfully.");
}

void WiboticCanDriverNode::DeclareParameters()
Expand All @@ -53,34 +53,32 @@ void WiboticCanDriverNode::GetParameters()

void WiboticCanDriverNode::CreateWiboticCanDriver()
{
wibotic_can_driver_ = std::make_unique<WiboticCanDriver>(can_iface_name_, uavcan_node_id_, uavcan_node_name_);
wibotic_can_driver_ = std::make_unique<WiboticCanDriver>(
can_iface_name_, uavcan_node_id_, uavcan_node_name_);
wibotic_can_driver_->CreateUavCanNode();
wibotic_can_driver_->CreateWiboticInfoSubscriber();
wibotic_can_driver_->Activate();
}

void WiboticCanDriverNode::WiboticInfoTimerCallback()
{
if (!wibotic_can_driver_)
{
if (!wibotic_can_driver_) {
throw std::runtime_error("Trying to get WiboticInfo message from nonexisting driver.");
}

try
{
try {
const auto update_time_ms = static_cast<std::size_t>(update_time_s_ * 1000);
wibotic_can_driver_->Spin(update_time_ms);
auto wibotic_info = wibotic_can_driver_->GetWiboticInfo();

wibotic_info_pub_->publish(ConvertWiboticInfoToMsg(wibotic_info));
}
catch (const std::runtime_error& e)
{
} catch (const std::runtime_error & e) {
RCLCPP_WARN(this->get_logger(), e.what());
}
}

wibotic_msgs::msg::WiboticInfo WiboticCanDriverNode::ConvertWiboticInfoToMsg(const wibotic::WiBoticInfo& wibotic_info)
wibotic_msgs::msg::WiboticInfo WiboticCanDriverNode::ConvertWiboticInfoToMsg(
const wibotic::WiBoticInfo & wibotic_info)
{
wibotic_msgs::msg::WiboticInfo wibotic_info_msg;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Copyright 2024 Husarion sp. z o.o.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


import unittest

import launch
import launch_testing
import pytest
from launch import LaunchDescription
from launch_ros.actions import Node
from launch_testing_ros import WaitForTopics
from wibotic_msgs.msg import WiboticInfo


@pytest.mark.launch_test
def generate_test_description():

wibotic_connector_can = Node(
package="wibotic_connector_can",
executable="wibotic_connector_can",
)

# Start test after 1s
delay_timer = launch.actions.TimerAction(
period=1.0, actions=[launch_testing.actions.ReadyToTest()]
)

actions = [wibotic_connector_can, delay_timer]

context = {}

return (
LaunchDescription(actions),
context,
)


class TestNodeInitialization(unittest.TestCase):
def test_initialization_log(self, proc_output):
proc_output.assertWaitFor("Node initialized successfully.")


class TestNode(unittest.TestCase):
def test_msg(self):
topic_list = [("/wibotic_info", WiboticInfo)]

with WaitForTopics(topic_list, timeout=4.0) as wait_for_topics:
received_topics_str = ", ".join(wait_for_topics.topics_received())
print("Received messages from the following topics: [" + received_topics_str + "]")


@launch_testing.post_shutdown_test()
class TestProcessOutput(unittest.TestCase):
def test_exit_code(self, proc_info):
# Check that process exits with code 0: no error
launch_testing.asserts.assertExitCodes(proc_info)

0 comments on commit 136eb96

Please sign in to comment.