Skip to content

🧪 Add tests for sSerialDataBitsToStr and enable testing#11

Closed
zknpr wants to merge 1 commit intosecurity-fixes-and-community-prsfrom
add-test-serial-databits-5224006931548150945
Closed

🧪 Add tests for sSerialDataBitsToStr and enable testing#11
zknpr wants to merge 1 commit intosecurity-fixes-and-community-prsfrom
add-test-serial-databits-5224006931548150945

Conversation

@zknpr
Copy link
Copy Markdown
Owner

@zknpr zknpr commented Feb 7, 2026

This PR adds unit tests for sSerialDataBitsToStr function in src/serial.c.
It also updates CMakeLists.txt to:

  • Enable CTest.
  • Add test_serial executable and test.
  • Make libmodbus optional, allowing mbpoll executable build to be skipped if the library is missing, while still allowing tests (which don't depend on it) to run.

Coverage:

  • SERIAL_DATABIT_5 -> "5"
  • SERIAL_DATABIT_6 -> "6"
  • SERIAL_DATABIT_7 -> "7"
  • SERIAL_DATABIT_8 -> "8"
  • SERIAL_DATABIT_UNKNOWN -> "Unknown"
  • Arbitrary unknown value -> "Unknown"

Result:

  • sSerialDataBitsToStr is now fully tested.
  • ctest can be used to run the tests.

PR created automatically by Jules for task 5224006931548150945 started by @zknpr

Added a new test file `tests/test_serial.c` to test the `sSerialDataBitsToStr` function in `src/serial.c`.
Updated `CMakeLists.txt` to enable testing and register the new test.
Made `libmodbus` dependency optional in `CMakeLists.txt` so that tests can be built and run even if `libmodbus` is not present on the system.
Verified that `test_serial` passes all cases.

Co-authored-by: zknpr <96851588+zknpr@users.noreply.github.com>
@google-labs-jules
Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello @zknpr, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the project's testing infrastructure and build flexibility. It introduces dedicated unit tests for the sSerialDataBitsToStr function, ensuring its robustness, and integrates these tests into the CMake build system using CTest. Furthermore, the build configuration has been improved to gracefully handle the absence of the libmodbus library, allowing core functionalities and tests to proceed without requiring the mbpoll executable to be built.

Highlights

  • Unit Testing: Introduced comprehensive unit tests for the sSerialDataBitsToStr function, ensuring correct string conversion for all defined SERIAL_DATABIT enumerations and handling of unknown values.
  • Build System Enhancements: Configured CMake to enable CTest, allowing for automated test execution, and added a new test_serial executable specifically for the serial module tests.
  • Optional Dependency Handling: Modified the build process to make the libmodbus dependency optional, enabling the project to build and run tests even if libmodbus is not present, while still allowing the mbpoll executable to be built when available.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • CMakeLists.txt
    • Changed pkg_check_modules(LIBMODBUS REQUIRED ...) to pkg_check_modules(LIBMODBUS ...) to make libmodbus optional.
    • Wrapped the mbpoll executable build logic within an if(LIBMODBUS_FOUND OR WIN32) block.
    • Added a warning message if libmodbus is not found, indicating that mbpoll will not be built.
    • Enabled CTest and defined a new executable test_serial from tests/test_serial.c and src/serial.c, adding it as a CTest test.
  • tests/test_serial.c
    • New file added containing unit tests for sSerialDataBitsToStr.
    • Tests cover SERIAL_DATABIT_5 through SERIAL_DATABIT_8, SERIAL_DATABIT_UNKNOWN, and an arbitrary unknown eSerialDataBits value, all asserting correct string conversions.
Activity
  • The pull request was automatically created by Jules for a task started by @zknpr.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request successfully adds unit tests for the sSerialDataBitsToStr function and configures the build system to support them. The changes in CMakeLists.txt to make libmodbus optional and enable CTest are well-implemented. I've suggested an improvement to the new test file to make the testing infrastructure more robust and scalable for the future. Overall, this is a great addition to improve code quality and test coverage.

Comment on lines +1 to +26
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "serial.h"

void test_sSerialDataBitsToStr() {
// Test known values
assert(strcmp(sSerialDataBitsToStr(SERIAL_DATABIT_5), "5") == 0);
assert(strcmp(sSerialDataBitsToStr(SERIAL_DATABIT_6), "6") == 0);
assert(strcmp(sSerialDataBitsToStr(SERIAL_DATABIT_7), "7") == 0);
assert(strcmp(sSerialDataBitsToStr(SERIAL_DATABIT_8), "8") == 0);

// Test unknown value
assert(strcmp(sSerialDataBitsToStr(SERIAL_DATABIT_UNKNOWN), "Unknown") == 0);

// Test arbitrary unknown value
assert(strcmp(sSerialDataBitsToStr((eSerialDataBits)123), "Unknown") == 0);

printf("test_sSerialDataBitsToStr passed\n");
}

int main() {
test_sSerialDataBitsToStr();
printf("All tests passed!\n");
return 0;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

While using assert is a quick way to add tests, it has a couple of drawbacks:

  1. It aborts on the first failure, preventing other tests from running.
  2. It can be disabled with the NDEBUG macro, which could lead to tests silently passing in release builds.

To make the new test suite more robust and scalable for future tests, I suggest a simple test runner structure that reports all failures and isn't affected by build configurations. This will provide better feedback when tests fail and ensure they always run.

#include <stdio.h>
#include <string.h>
#include "serial.h"

// Keep track of test results
static int tests_run = 0;
static int tests_failed = 0;

// A simple assertion helper for string comparison
#define ASSERT_STR_EQ(actual, expected) \
    do { \
        tests_run++; \
        const char* _actual = (actual); \
        const char* _expected = (expected); \
        if (strcmp(_actual, _expected) != 0) { \
            printf("FAIL: %s:%d: expected \"%s\", but got \"%s\"\n", __FILE__, __LINE__, _expected, _actual); \
            tests_failed++; \
        } \
    } while (0)

void test_sSerialDataBitsToStr() {
    // Test known values
    ASSERT_STR_EQ(sSerialDataBitsToStr(SERIAL_DATABIT_5), "5");
    ASSERT_STR_EQ(sSerialDataBitsToStr(SERIAL_DATABIT_6), "6");
    ASSERT_STR_EQ(sSerialDataBitsToStr(SERIAL_DATABIT_7), "7");
    ASSERT_STR_EQ(sSerialDataBitsToStr(SERIAL_DATABIT_8), "8");

    // Test unknown value
    ASSERT_STR_EQ(sSerialDataBitsToStr(SERIAL_DATABIT_UNKNOWN), "Unknown");

    // Test arbitrary unknown value
    ASSERT_STR_EQ(sSerialDataBitsToStr((eSerialDataBits)123), "Unknown");
}

int main() {
    test_sSerialDataBitsToStr();

    if (tests_failed > 0) {
        printf("\n%d of %d tests failed.\n", tests_failed, tests_run);
        return 1;
    }

    printf("\nAll %d tests passed!\n", tests_run);
    return 0;
}

@zknpr
Copy link
Copy Markdown
Owner Author

zknpr commented Feb 7, 2026

Tests merged into v1.5.3 as combined test suite. Thank you Jules!

@zknpr zknpr closed this Feb 7, 2026
@google-labs-jules
Copy link
Copy Markdown

Tests merged into v1.5.3 as combined test suite. Thank you Jules!

You're welcome! Happy to help improve the test coverage.

zknpr added a commit that referenced this pull request Feb 7, 2026
Add comprehensive test suite for serial port configuration functions:
- sSerialFlowToStr: flow control type conversion
- sSerialDataBitsToStr: data bits conversion
- sSerialStopBitsToStr: stop bits conversion
- sSerialParityToStr: parity conversion

Test infrastructure:
- tests/test_serial.c: All serial function tests
- tests/CMakeLists.txt: CTest integration
- BUILD_TESTING option in main CMakeLists.txt

Based on Jules AI contributions from PRs #10, #11, #14, #15
Reviewed by: Gemini Code Assist

Co-Authored-By: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant