Skip to content

Commit

Permalink
Merge pull request #7 from minayaserrano/google-test-migration
Browse files Browse the repository at this point in the history
Google test migration
  • Loading branch information
minayaserrano authored Oct 21, 2024
2 parents 23bd30a + ab81fd9 commit a0d0882
Show file tree
Hide file tree
Showing 9 changed files with 98 additions and 47 deletions.
2 changes: 2 additions & 0 deletions lib/RoboCaddie/src/RoboCaddie.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

using namespace RoboCaddieUART;

const int RoboCaddie::STOP;

RoboCaddie::RoboCaddie(UART &uart, TimeService &time)
: uart(uart), time(time) {}

Expand Down
10 changes: 8 additions & 2 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

[env:native]
platform = native
test_framework = googletest
test_ignore = test_runner_embedded

[env:nano33ble]
Expand All @@ -18,12 +19,17 @@ board = nano33ble
framework = arduino
; Use arduino framework Unity version instead of Platformio default version
; https://docs.platformio.org/en/stable/advanced/unit-testing/frameworks/custom/examples/custom_unity_library.html
test_framework = custom
build_flags = -DGTEST_OS_NRF52
test_framework = googletest
test_ignore = test_runner_native
extra_scripts = test/wait_for_restart.py

[env:nano33ble-renode]
extends = env:nano33ble
build_flags = -DRENODE_ENVIRONMENT
build_flags = -DGTEST_OS_NRF52 -DRENODE_ENVIRONMENT
; Modify GoogletestTestCaseParser to allow Renode log format
; https://github.com/platformio/platformio-core/blob/master/platformio/test/runners/googletest.py
test_framework = custom
platform_packages =
platformio/tool-renode
test_testing_command =
Expand Down
5 changes: 5 additions & 0 deletions src/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#include <Arduino.h>

void setup() { delay(1000); }

void loop() { delay(1000); }
47 changes: 16 additions & 31 deletions test/RoboCaddie/RoboCaddieTests.h
Original file line number Diff line number Diff line change
@@ -1,31 +1,14 @@
#ifdef UNIT_TEST

void test_robocaddie_is_stopped_on_startup();
void test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP();
void test_robocaddie_sends_a_transmission_every_30_ms();
void test_uart_baud_rate_should_be_115200();

int run_tests() {
UNITY_BEGIN();

RUN_TEST(test_robocaddie_is_stopped_on_startup);
RUN_TEST(
test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP);
RUN_TEST(test_robocaddie_sends_a_transmission_every_30_ms);
RUN_TEST(test_uart_baud_rate_should_be_115200);

return UNITY_END();
}

void test_robocaddie_is_stopped_on_startup() {
TEST(RoboCaddieTest, RoboCaddieIsStoppedOnStartup) {
SpyUART uart;
FakeTimeService time;
RoboCaddie robocaddie(uart, time);

TEST_ASSERT_EQUAL(RoboCaddie::STOP, robocaddie.getStatus());
EXPECT_EQ(RoboCaddie::STOP, robocaddie.getStatus());
}

void test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP() {
TEST(RoboCaddieTest, AStopMessageIsSentToTheMotorWhenRoboCaddieStatusIsSTOP) {
const uint8_t PROTOCOL_MSG2_SOM = 0x04; // PROTOCOL_SOM_NOACK
const uint8_t PROTOCOL_MSG2_CI = 0x01; // Continuity Counter
const uint8_t PROTOCOL_MSG2_LEN = 0x0A; // Len of bytes to follow,
Expand Down Expand Up @@ -61,15 +44,17 @@ void test_a_STOP_message_is_sent_to_the_motor_when_robocaddie_status_is_STOP() {
RoboCaddie robocaddie(uart, time);

// Precondition: no message sent yet on initialization
TEST_ASSERT_NULL(uart.getLastSentMessage().data());
EXPECT_EQ(uart.getLastSentMessage().data(), nullptr);

robocaddie.transmission();

TEST_ASSERT_EQUAL_UINT8_ARRAY(
stop_msg.data(), uart.getLastSentMessage().data(), stop_msg.size());
const auto &lastMessage = uart.getLastSentMessage();
EXPECT_THAT(std::vector<uint8_t>(lastMessage.data(),
lastMessage.data() + lastMessage.size()),
testing::ElementsAreArray(stop_msg));
}

void test_robocaddie_sends_a_transmission_every_30_ms() {
TEST(RoboCaddieTest, RoboCaddieSendsATransmissionEvery30Ms) {
SpyUART uart;
FakeTimeService time;
RoboCaddie robocaddie(uart, time);
Expand All @@ -79,40 +64,40 @@ void test_robocaddie_sends_a_transmission_every_30_ms() {

robocaddie.run();

TEST_ASSERT_EQUAL_UINT64(0, uart.getNumbersOfExecutions());
EXPECT_EQ(0, uart.getNumbersOfExecutions());

time.setCurrentTime(30);
time.setStartTime(0);

robocaddie.run();

TEST_ASSERT_EQUAL_UINT64(1, uart.getNumbersOfExecutions());
EXPECT_EQ(1, uart.getNumbersOfExecutions());

time.setCurrentTime(45);
time.setStartTime(31);

robocaddie.run();

TEST_ASSERT_EQUAL_UINT64(1, uart.getNumbersOfExecutions());
EXPECT_EQ(1, uart.getNumbersOfExecutions());

time.setCurrentTime(62);
time.setStartTime(31);

robocaddie.run();

TEST_ASSERT_EQUAL_UINT64(2, uart.getNumbersOfExecutions());
EXPECT_EQ(2, uart.getNumbersOfExecutions());
}

void test_uart_baud_rate_should_be_115200() {
TEST(RoboCaddieTest, UARTBaudRateShouldBe115200) {
SpyUART uart;
FakeTimeService time;
RoboCaddie robocaddie(uart, time);

TEST_ASSERT_EQUAL_UINT64(0, uart.getBaudRate());
EXPECT_EQ(0, uart.getBaudRate());

robocaddie.init();

TEST_ASSERT_EQUAL_UINT64(115200, uart.getBaudRate());
EXPECT_EQ(115200, uart.getBaudRate());
}

#endif
41 changes: 41 additions & 0 deletions test/test_custom_runner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Modify GoogletestTestCaseParser to allow Renode log format
# https://github.com/platformio/platformio-core/blob/master/platformio/test/runners/googletest.py

import os
import re

from platformio.public import GoogletestTestRunner
from platformio.test.runners.googletest import GoogletestTestCaseParser


class CustomGoogletestTestCaseParser(GoogletestTestCaseParser):
# Examples:
# 12:02:09.8136 [INFO] uart0: [host: 2.12s (+11.59ms)|virt: 1.03s (+0.21ms)] [ RUN ] FooTest.Bar
# ...
# 12:02:09.8136 [INFO] uart0: [host: 2.12s (+11.59ms)|virt: 1.03s (+0.21ms)] [ FAILED ] FooTest.Bar (0 ms)
STATUS__NAME_RE = r".*\[\s+(?P<status>[A-Z]+)\s+\]\s+(?P<name>[^\(\s]+)"

# Examples:
# 12:02:09.8136 [INFO] uart0: [host: 2.12s (+11.59ms)|virt: 1.03s (+0.21ms)] [ RUN ] FooTest.Bar
# 12:02:09.8136 [INFO] uart0: [host: 2.12s (+11.59ms)|virt: 1.03s (+0.21ms)] test/test_gtest/test_main.cpp:26: Failure
# 12:02:09.8136 [INFO] uart0: [host: 2.12s (+11.59ms)|virt: 1.03s (+0.21ms)] Y:\core\examples\unit-testing\googletest\test\test_gtest\test_main.cpp:26: Failure
SOURCE_MESSAGE_RE = r".*(?P<source_file>.+):(?P<source_line>\d+):(?P<message>.*)$"

def _parse_status_and_name(self, line):
result = (None, None)
line = line.strip()
# if not line.startswith("["):
# return result
match = re.search(self.STATUS__NAME_RE, line)
if not match:
return result
return match.group("status"), match.group("name")


class CustomTestRunner(GoogletestTestRunner):
EXTRA_LIB_DEPS = ["google/googletest@^1.15.2"]

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._tc_parser = CustomGoogletestTestCaseParser()
os.environ["GTEST_COLOR"] = "no" # disable ANSI symbols
10 changes: 8 additions & 2 deletions test/test_runner_embedded/Test_Embedded.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

#include <Arduino.h>
#include <RoboCaddie.h>
#include <unity.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "RoboCaddie/RoboCaddieTests.h"

Expand All @@ -15,7 +16,12 @@ REDIRECT_STDOUT_TO(Serial);
void setup() {
delay(2000);

run_tests();
Serial.begin(115200);

::testing::InitGoogleTest();

if (RUN_ALL_TESTS()) {
};
}

void loop() { delay(1000); }
Expand Down
10 changes: 0 additions & 10 deletions test/test_runner_embedded/test_custom_runner.py

This file was deleted.

13 changes: 11 additions & 2 deletions test/test_runner_native/Test_Native.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
#ifdef UNIT_TEST

#include <RoboCaddie.h>
#include <unity.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "RoboCaddie/RoboCaddieTests.h"

int main() { return run_tests(); }
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);

if (RUN_ALL_TESTS()) {
};

// Always return zero-code and allow PlatformIO to parse results
return 0;
}

#endif
7 changes: 7 additions & 0 deletions test/wait_for_restart.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import time

def waiting_for_restart_before_embedding_tests(source, target, env):
time.sleep(2)

Import("env")
env.AddPostAction("upload", waiting_for_restart_before_embedding_tests)

0 comments on commit a0d0882

Please sign in to comment.