Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
812ad0d
Test : Run mull and identify mutants covering tests for isobus_shortc…
Pissaro007 Aug 14, 2026
1031daa
Test : Fix workflow to include new Mull config file
Pissaro007 Aug 14, 2026
ac34811
Test : Re run to confirm mull and coverage analysis for isobus_shortc…
Pissaro007 Aug 14, 2026
534b9e4
Test : Rerun to prevent AddressClaimTest.AddressClaim_PartneredClaim …
Pissaro007 Aug 14, 2026
a90e040
ci(mull): add Aider workflow for ISB line 67 mutant
Pissaro007 Aug 14, 2026
b8f6d60
fix(mull): provide logger API context to Aider for ISB mutant 67
Pissaro007 Aug 14, 2026
23bad93
Test : Rerun to prevent test unit execution error
Pissaro007 Aug 14, 2026
7d361e8
Test : Rerun #2
Pissaro007 Aug 14, 2026
65b74fa
test(address-claim): stabilize partnered claim synchronization
Pissaro007 Aug 14, 2026
d281993
Test : rerun #3 after AddressClaimTest.AddressClaim_PartneredClaim mo…
Pissaro007 Aug 14, 2026
d17555e
fix(mull): require logger header in Aider mutant 67 patch
Pissaro007 Aug 14, 2026
88a175a
test(isb): kill line 67 state logging mutant
Pissaro007 Aug 14, 2026
4063c6b
ci(mull): add Aider workflow for ISB line 140 mutant
Pissaro007 Aug 14, 2026
fcc30a1
fix(mull): trigger periodic transmission for ISB mutant 140
Pissaro007 Aug 14, 2026
8dfb972
fix(mull): prevent private constant access for ISB mutant 140
Pissaro007 Aug 14, 2026
cc6a95f
fix(mull): explicitly trigger second ISB transmission
Pissaro007 Aug 14, 2026
4bef6f5
test(isb): kill line 140 transition counter mutant
Pissaro007 Aug 14, 2026
fad9870
ci(mull): add Aider workflow for ISB line 197 mutant
Pissaro007 Aug 14, 2026
6e81884
test(isb): kill line 197 received state logging mutant
Pissaro007 Aug 14, 2026
b249ee8
chore(mull): exclude ISB mutation workflows from integration
Pissaro007 Aug 14, 2026
53e09f6
Delete .github/workflows/mull-single-source-file-and-identify-coverin…
Pissaro007 Aug 14, 2026
79dfc4f
Delete .github/workflows/mull-single-source-file-and-identify-coverin…
Pissaro007 Aug 14, 2026
95ddc28
style(tests): apply clang-format to mutation test changes
Pissaro007 Aug 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion test/address_claim_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,27 @@ TEST_F(AddressClaimTest, AddressClaim_PartneredClaim)
const isobus::NAMEFilter filterFirst(NAME::NAMEParameters::FunctionCode, static_cast<std::uint8_t>(NAME::Function::CabClimateControl));
auto secondPartneredFirstEcu = CANNetworkManager::CANNetwork.create_partnered_control_function(1, { filterFirst });

time_source.update_for_ms(500);
constexpr std::uint32_t maximumWaitTime_ms = 1500;
constexpr std::uint32_t pollingPeriod_ms = 10;

for (std::uint32_t elapsedTime_ms = 0;
elapsedTime_ms < maximumWaitTime_ms;
elapsedTime_ms += pollingPeriod_ms)
{
time_source.update_for_ms(pollingPeriod_ms);
CANNetworkManager::CANNetwork.update();

if (firstInternalECU->get_address_valid() &&
secondInternalECU2->get_address_valid() &&
firstPartneredSecondECU->get_address_valid() &&
secondPartneredFirstEcu->get_address_valid())
{
break;
}

std::this_thread::sleep_for(std::chrono::milliseconds(1));
}

EXPECT_TRUE(firstInternalECU->get_address_valid());
EXPECT_TRUE(secondInternalECU2->get_address_valid());
EXPECT_TRUE(firstPartneredSecondECU->get_address_valid());
Expand Down
54 changes: 54 additions & 0 deletions test/isb_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "isobus/hardware_integration/can_hardware_interface.hpp"
#include "isobus/hardware_integration/virtual_can_plugin.hpp"
#include "isobus/isobus/can_network_manager.hpp"
#include "isobus/isobus/can_stack_logger.hpp"
#include "isobus/isobus/isobus_shortcut_button_interface.hpp"
#include "isobus/utility/system_timing.hpp"

Expand Down Expand Up @@ -76,6 +77,21 @@ TEST_F(IsobusShortcutButtonTest, ShortcutButtonRxTests)
EXPECT_EQ(ShortcutButtonInterface::StopAllImplementOperationsState::PermitAllImplementsToOperationOn, interfaceUnderTest.get_state());

// Send increased, incorrect transition count
// Set up test logger to verify ERROR log is emitted when transitioning to StopImplementOperations
class TestLogger : public isobus::CANStackLogger
{
public:
isobus::CANStackLogger::LoggingLevel lastLogLevel = isobus::CANStackLogger::LoggingLevel::Info;
void sink_CAN_stack_log(isobus::CANStackLogger::LoggingLevel level, const std::string &) override
{
lastLogLevel = level;
}
};
TestLogger testLogger;
auto originalLogLevel = isobus::CANStackLogger::get_log_level();
isobus::CANStackLogger::set_log_level(isobus::CANStackLogger::LoggingLevel::Debug);
isobus::CANStackLogger::set_can_stack_logger_sink(&testLogger);

testFrame.identifier = 0x18FD0274;
testFrame.data[0] = 0xFF;
testFrame.data[1] = 0xFF;
Expand All @@ -89,6 +105,12 @@ TEST_F(IsobusShortcutButtonTest, ShortcutButtonRxTests)
CANNetworkManager::CANNetwork.update();
EXPECT_EQ(ShortcutButtonInterface::StopAllImplementOperationsState::StopImplementOperations, interfaceUnderTest.get_state());

// Verify ERROR log was emitted (mutant would log INFO instead)
EXPECT_EQ(isobus::CANStackLogger::LoggingLevel::Error, testLogger.lastLogLevel);

isobus::CANStackLogger::set_can_stack_logger_sink(nullptr);
isobus::CANStackLogger::set_log_level(originalLogLevel);

// Test reset of state as counter is back to normal
testFrame.identifier = 0x18FD0274;
testFrame.data[0] = 0xFF;
Expand Down Expand Up @@ -228,11 +250,29 @@ TEST_F(IsobusShortcutButtonTest, ShortcutButtonTxTests)
interfaceUnderTest.initialize();
EXPECT_EQ(ShortcutButtonInterface::StopAllImplementOperationsState::PermitAllImplementsToOperationOn, interfaceUnderTest.get_state());

// Set up test logger to verify ERROR log is emitted when setting StopImplementOperations
class TestLogger : public isobus::CANStackLogger
{
public:
isobus::CANStackLogger::LoggingLevel lastLogLevel = isobus::CANStackLogger::LoggingLevel::Info;
void sink_CAN_stack_log(isobus::CANStackLogger::LoggingLevel level, const std::string &) override
{
lastLogLevel = level;
}
};
TestLogger testLogger;
auto originalLogLevel = isobus::CANStackLogger::get_log_level();
isobus::CANStackLogger::set_log_level(isobus::CANStackLogger::LoggingLevel::Debug);
isobus::CANStackLogger::set_can_stack_logger_sink(&testLogger);

interfaceUnderTest.set_stop_all_implement_operations_state(ShortcutButtonInterface::StopAllImplementOperationsState::StopImplementOperations);
interfaceUnderTest.update();
time_source.update_for_ms(5);
EXPECT_TRUE(serverPlugin.read_frame(testFrame));

// Verify ERROR log was emitted (mutant would log INFO instead)
EXPECT_EQ(isobus::CANStackLogger::LoggingLevel::Error, testLogger.lastLogLevel);

ASSERT_TRUE(testFrame.isExtendedFrame);
ASSERT_EQ(testFrame.dataLength, 8);
EXPECT_EQ(CANIdentifier(testFrame.identifier).get_parameter_group_number(), 0xFD02);
Expand All @@ -247,6 +287,20 @@ TEST_F(IsobusShortcutButtonTest, ShortcutButtonTxTests)

EXPECT_EQ(ShortcutButtonInterface::StopAllImplementOperationsState::StopImplementOperations, interfaceUnderTest.get_state());

// Trigger a second transmission by changing state to Permit
interfaceUnderTest.set_stop_all_implement_operations_state(ShortcutButtonInterface::StopAllImplementOperationsState::PermitAllImplementsToOperationOn);
interfaceUnderTest.update();
time_source.update_for_ms(5);

ASSERT_TRUE(serverPlugin.read_frame(testFrame));

EXPECT_EQ(testFrame.data[6], 0x01);
EXPECT_EQ(testFrame.data[7], 0xFD);
EXPECT_EQ(ShortcutButtonInterface::StopAllImplementOperationsState::PermitAllImplementsToOperationOn, interfaceUnderTest.get_state());

isobus::CANStackLogger::set_can_stack_logger_sink(nullptr);
isobus::CANStackLogger::set_log_level(originalLogLevel);

CANHardwareInterface::stop();
CANNetworkManager::CANNetwork.deactivate_control_function(internalECU);
}
Loading