Skip to content

chore: Only end() active interfaces #142

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
24 changes: 17 additions & 7 deletions src/Notecard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,16 +288,26 @@ void Notecard::deleteResponse(J *rsp) const
/**************************************************************************/
void Notecard::end(void)
{
// Clear Communication Interfaces
NoteSetFnI2C(0, 0, nullptr, nullptr, nullptr);
NoteSetFnSerial(nullptr, nullptr, nullptr, nullptr);
// Clear I2C Interface
i2cTransmitFn i2c_is_set = nullptr;
NoteGetFnI2C(nullptr, nullptr, nullptr, &i2c_is_set, nullptr);
if (i2c_is_set) {
// Delete Singletons
noteI2c = make_note_i2c(nullptr);
NoteSetFnI2C(0, 0, nullptr, nullptr, nullptr);
}

// Clear Serial Interface
serialTransmitFn serial_is_set = nullptr;
NoteGetFnSerial(nullptr, &serial_is_set, nullptr, nullptr);
if (serial_is_set) {
// Delete Singletons
noteSerial = make_note_serial(nullptr);
NoteSetFnSerial(nullptr, nullptr, nullptr, nullptr);
}

// Clear Platform Callbacks
platformInit(false);

// Delete Singletons
noteI2c = make_note_i2c(nullptr);
noteSerial = make_note_serial(nullptr);
}

/**************************************************************************/
Expand Down
108 changes: 100 additions & 8 deletions test/Notecard.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1372,7 +1372,46 @@ int test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_w
return result;
}

int test_notecard_end_clears_all_i2c_interface_function_pointers()
int test_notecard_end_does_not_call_wire_end_when_the_i2c_interface_has_not_been_instantiated()
{
int result;

// Arrange
////////////

Notecard notecard;
NoteSerial_Mock mockSerial;
noteSetFnSerial_Parameters.reset();
twoWireEnd_Parameters.reset();
notecard.begin(&mockSerial);
noteGetFnI2C_Parameters.reset();
noteGetFnSerial_Parameters.reset();
make_note_i2c_Parameters.reset();

// Action
///////////

notecard.end();

// Assert
///////////

if (!make_note_i2c_Parameters.invoked)
{
result = 0;
}
else
{
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl;
std::cout << "\ttwoWireEnd_Parameters.invoked == " << !!twoWireEnd_Parameters.invoked << ", 0 (false)" << std::endl;
std::cout << "[";
}

return result;
}

int test_notecard_end_clears_all_i2c_interface_function_pointers_when_the_i2c_interface_has_been_instantiated()
{
int result;

Expand All @@ -1383,6 +1422,9 @@ int test_notecard_end_clears_all_i2c_interface_function_pointers()
NoteI2c_Mock mockI2c;
noteSetFnI2C_Parameters.reset();
notecard.begin(&mockI2c);
noteGetFnSerial_Parameters.reset();
noteGetFnI2C_Parameters.reset();
noteGetFnI2C_Parameters.transmitFn_result = reinterpret_cast<i2cTransmitFn>(0x1);

// Action
///////////
Expand Down Expand Up @@ -1411,7 +1453,46 @@ int test_notecard_end_clears_all_i2c_interface_function_pointers()
return result;
}

int test_notecard_end_clears_all_serial_interface_function_pointers()
int test_notecard_end_does_not_call_serial_end_when_the_serial_interface_has_not_been_instantiated()
{
int result;

// Arrange
////////////

Notecard notecard;
NoteSerial_Mock mockI2c;
noteSetFnDefault_Parameters.reset();
notecard.begin(&mockI2c);
hardwareSerialEnd_Parameters.reset();
noteGetFnI2C_Parameters.reset();
noteGetFnSerial_Parameters.reset();
make_note_serial_Parameters.reset();

// Action
///////////

notecard.end();

// Assert
///////////

if (!make_note_serial_Parameters.invoked)
{
result = 0;
}
else
{
result = static_cast<int>('n' + 'o' + 't' + 'e' + 'c' + 'a' + 'r' + 'd');
std::cout << "\33[31mFAILED\33[0m] " << __FILE__ << ":" << __LINE__ << std::endl;
std::cout << "\thardwareSerialEnd_Parameters.invoked == " << !!hardwareSerialEnd_Parameters.invoked << ", EXPECTED: 0 (false)" << std::endl;
std::cout << "[";
}

return result;
}

int test_notecard_end_clears_all_serial_interface_function_pointers_when_the_serial_interface_has_been_instantiated()
{
int result;

Expand All @@ -1422,6 +1503,9 @@ int test_notecard_end_clears_all_serial_interface_function_pointers()
NoteSerial_Mock mockSerial; // Instantiate NoteSerial (mocked)
noteSetFnDefault_Parameters.reset();
notecard.begin(&mockSerial);
noteGetFnI2C_Parameters.reset();
noteGetFnSerial_Parameters.reset();
noteGetFnSerial_Parameters.transmitFn_result = reinterpret_cast<serialTransmitFn>(0x1);

// Action
///////////
Expand Down Expand Up @@ -1493,7 +1577,7 @@ int test_notecard_end_clears_all_platform_interface_function_pointers()
return result;
}

int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory()
int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory_when_the_i2c_interface_has_been_instantiated()
{
int result;

Expand All @@ -1505,6 +1589,9 @@ int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memor
make_note_i2c_Parameters.reset();
make_note_i2c_Parameters.i2c_parameters = &Wire;
notecard.begin(&mockI2c);
noteGetFnSerial_Parameters.reset();
noteGetFnI2C_Parameters.reset();
noteGetFnI2C_Parameters.transmitFn_result = reinterpret_cast<i2cTransmitFn>(0x1);

// Action
////////////
Expand All @@ -1529,7 +1616,7 @@ int test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memor
return result;
}

int test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory()
int test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory_when_the_serial_interface_has_been_instantiated()
{
int result;

Expand All @@ -1541,6 +1628,9 @@ int test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated
make_note_serial_Parameters.reset();
make_note_serial_Parameters.serial_parameters = &Serial;
notecard.begin(&mockSerial);
noteGetFnI2C_Parameters.reset();
noteGetFnSerial_Parameters.reset();
noteGetFnSerial_Parameters.transmitFn_result = reinterpret_cast<serialTransmitFn>(0x1);

// Action
////////////
Expand Down Expand Up @@ -4828,11 +4918,13 @@ int main(void)
{test_notecard_begin_serial_sets_serial_available_function_pointer_to_nullptr_when_interface_has_not_been_instantiated, "test_notecard_begin_serial_sets_serial_available_function_pointer_to_nullptr_when_interface_has_not_been_instantiated"},
{test_notecard_begin_serial_shares_a_serial_receive_function_pointer, "test_notecard_begin_serial_shares_a_serial_receive_function_pointer"},
{test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_when_interface_has_not_been_instantiated, "test_notecard_begin_serial_sets_serial_receive_function_pointer_to_nullptr_when_interface_has_not_been_instantiated"},
{test_notecard_end_clears_all_i2c_interface_function_pointers, "test_notecard_end_clears_all_i2c_interface_function_pointers"},
{test_notecard_end_clears_all_serial_interface_function_pointers, "test_notecard_end_clears_all_serial_interface_function_pointers"},
{test_notecard_end_clears_all_i2c_interface_function_pointers_when_the_i2c_interface_has_been_instantiated, "test_notecard_end_clears_all_i2c_interface_function_pointers_when_the_i2c_interface_has_been_instantiated"},
{test_notecard_end_does_not_call_wire_end_when_the_i2c_interface_has_not_been_instantiated, "test_notecard_end_does_not_call_wire_end_when_the_i2c_interface_has_not_been_instantiated"},
{test_notecard_end_does_not_call_serial_end_when_the_serial_interface_has_not_been_instantiated, "test_notecard_end_does_not_call_serial_end_when_the_serial_interface_has_not_been_instantiated"},
{test_notecard_end_clears_all_serial_interface_function_pointers_when_the_serial_interface_has_been_instantiated, "test_notecard_end_clears_all_serial_interface_function_pointers_when_the_serial_interface_has_been_instantiated"},
{test_notecard_end_clears_all_platform_interface_function_pointers, "test_notecard_end_clears_all_platform_interface_function_pointers"},
{test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory, "test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory"},
{test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory, "test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory"},
{test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory_when_the_i2c_interface_has_been_instantiated, "test_notecard_end_provides_nullptr_to_make_note_i2c_to_free_associated_memory_when_the_i2c_interface_has_been_instantiated"},
{test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory_when_the_serial_interface_has_been_instantiated, "test_notecard_end_invokes_make_note_serial_nullptr_method_to_free_associated_memory_when_the_serial_interface_has_been_instantiated"},
{test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer, "test_notecard_setDebugOutputStream_shares_a_debug_log_function_pointer"},
{test_notecard_setDebugOutputStream_clears_the_debug_log_function_pointer_when_nullptr_is_provided, "test_notecard_setDebugOutputStream_clears_the_debug_log_function_pointer_when_nullptr_is_provided"},
{test_notecard_clearDebugOutputStream_clears_the_debug_log_function_pointer, "test_notecard_clearDebugOutputStream_clears_the_debug_log_function_pointer"},
Expand Down
61 changes: 61 additions & 0 deletions test/mock/mock-note-c-note.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ JAddIntToObject_Parameters jAddIntToObject_Parameters;
NoteDebug_Parameters noteDebug_Parameters;
NoteDebugSyncStatus_Parameters noteDebugSyncStatus_Parameters;
NoteDeleteResponse_Parameters noteDeleteResponse_Parameters;
NoteGetFnI2C_Parameters noteGetFnI2C_Parameters;
NoteGetFnSerial_Parameters noteGetFnSerial_Parameters;
NoteNewCommand_Parameters noteNewCommand_Parameters;
NoteNewRequest_Parameters noteNewRequest_Parameters;
NoteRequest_Parameters noteRequest_Parameters;
Expand Down Expand Up @@ -97,6 +99,65 @@ NoteDebugSyncStatus(
return noteDebugSyncStatus_Parameters.result;
}

void NoteGetFnI2C(uint32_t *notecardAddr, uint32_t *maxTransmitSize,
i2cResetFn *resetFn, i2cTransmitFn *transmitFn,
i2cReceiveFn *receiveFn
) {
// Record invocation(s)
++noteGetFnI2C_Parameters.invoked;

// Stash parameter(s)
noteGetFnI2C_Parameters.notecardAddr = notecardAddr;
noteGetFnI2C_Parameters.maxTransmitSize = maxTransmitSize;
noteGetFnI2C_Parameters.resetFn = resetFn;
noteGetFnI2C_Parameters.transmitFn = transmitFn;
noteGetFnI2C_Parameters.receiveFn = receiveFn;

// Return user-supplied result
if (notecardAddr) {
*notecardAddr = noteGetFnI2C_Parameters.notecardAddr_result;
}
if (maxTransmitSize) {
*maxTransmitSize = noteGetFnI2C_Parameters.maxTransmitSize_result;
}
if (resetFn) {
*resetFn = noteGetFnI2C_Parameters.resetFn_result;
}
if (transmitFn) {
*transmitFn = noteGetFnI2C_Parameters.transmitFn_result;
}
if (receiveFn) {
*receiveFn = noteGetFnI2C_Parameters.receiveFn_result;
}
}

void NoteGetFnSerial(serialResetFn *resetFn, serialTransmitFn *transmitFn,
serialAvailableFn *availFn, serialReceiveFn *receiveFn
) {
// Record invocation(s)
++noteGetFnSerial_Parameters.invoked;

// Stash parameter(s)
noteGetFnSerial_Parameters.resetFn = resetFn;
noteGetFnSerial_Parameters.transmitFn = transmitFn;
noteGetFnSerial_Parameters.availFn = availFn;
noteGetFnSerial_Parameters.receiveFn = receiveFn;

// Return user-supplied result
if (resetFn) {
*resetFn = noteGetFnSerial_Parameters.resetFn_result;
}
if (transmitFn) {
*transmitFn = noteGetFnSerial_Parameters.transmitFn_result;
}
if (availFn) {
*availFn = noteGetFnSerial_Parameters.availFn_result;
}
if (receiveFn) {
*receiveFn = noteGetFnSerial_Parameters.receiveFn_result;
}
}

J *
NoteNewCommand(
const char * request_
Expand Down
87 changes: 87 additions & 0 deletions test/mock/mock-parameters.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef MOCK_PARAMETERS_HPP
#define MOCK_PARAMETERS_HPP

#include <cstdint>
#include <string>
#include <vector>

Expand Down Expand Up @@ -111,6 +112,90 @@ struct NoteDeleteResponse_Parameters {
J *response;
};

struct NoteGetFnI2C_Parameters {
NoteGetFnI2C_Parameters(
void
) :
invoked(0),
notecardAddr(nullptr),
maxTransmitSize(nullptr),
resetFn(nullptr),
transmitFn(nullptr),
receiveFn(nullptr),
notecardAddr_result(0),
maxTransmitSize_result(0),
resetFn_result(nullptr),
transmitFn_result(nullptr),
receiveFn_result(nullptr)
{ }
void
reset (
void
) {
invoked = 0;
notecardAddr = nullptr;
maxTransmitSize = nullptr;
resetFn = nullptr;
transmitFn = nullptr;
receiveFn = nullptr;
notecardAddr_result = 0;
maxTransmitSize_result = 0;
resetFn_result = nullptr;
transmitFn_result = nullptr;
receiveFn_result = nullptr;
}
size_t invoked;
uint32_t * notecardAddr;
uint32_t * maxTransmitSize;
i2cResetFn * resetFn;
i2cTransmitFn * transmitFn;
i2cReceiveFn * receiveFn;
uint32_t notecardAddr_result;
uint32_t maxTransmitSize_result;
i2cResetFn resetFn_result;
i2cTransmitFn transmitFn_result;
i2cReceiveFn receiveFn_result;
};

struct NoteGetFnSerial_Parameters {
NoteGetFnSerial_Parameters(
void
) :
invoked(0),
resetFn(nullptr),
transmitFn(nullptr),
availFn(nullptr),
receiveFn(nullptr),
resetFn_result(nullptr),
transmitFn_result(nullptr),
availFn_result(nullptr),
receiveFn_result(nullptr)
{ }
void
reset (
void
) {
invoked = 0;
resetFn = nullptr;
transmitFn = nullptr;
availFn = nullptr;
receiveFn = nullptr;
resetFn_result = nullptr;
transmitFn_result = nullptr;
availFn_result = nullptr;
receiveFn_result = nullptr;
}
size_t invoked;
serialResetFn * resetFn;
serialTransmitFn * transmitFn;
serialAvailableFn * availFn;
serialReceiveFn * receiveFn;
serialResetFn resetFn_result;
serialTransmitFn transmitFn_result;
serialAvailableFn availFn_result;
serialReceiveFn receiveFn_result;
};

struct NoteNewCommand_Parameters {
NoteNewCommand_Parameters(
void
Expand Down Expand Up @@ -457,6 +542,8 @@ extern JAddIntToObject_Parameters jAddIntToObject_Parameters;
extern NoteDebug_Parameters noteDebug_Parameters;
extern NoteDebugSyncStatus_Parameters noteDebugSyncStatus_Parameters;
extern NoteDeleteResponse_Parameters noteDeleteResponse_Parameters;
extern NoteGetFnI2C_Parameters noteGetFnI2C_Parameters;
extern NoteGetFnSerial_Parameters noteGetFnSerial_Parameters;
extern NoteNewCommand_Parameters noteNewCommand_Parameters;
extern NoteNewRequest_Parameters noteNewRequest_Parameters;
extern NoteRequest_Parameters noteRequest_Parameters;
Expand Down
Loading