Skip to content

Commit

Permalink
🧱 (date_of_test): Handle epoch format for date_of_test
Browse files Browse the repository at this point in the history
  • Loading branch information
YannLocatelli committed Sep 20, 2022
1 parent 120e127 commit 8e3a094
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 15 deletions.
3 changes: 3 additions & 0 deletions libs/SerialNumberKit/include/SerialNumberFormater.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ class SerialNumberFormater
void setMCUID(std::span<uint8_t> serial_number, uint32_t offset, uint8_t number_of_digits);

private:
void setDateOfTestFromYYMMDD(std::span<char> content, std::span<uint8_t> date_of_test) const;
void setDateOfTestFromEpoch(std::span<char> content, std::span<uint8_t> date_of_test) const;

interface::MCU &_mcu;
const Config _config;
};
Expand Down
31 changes: 30 additions & 1 deletion libs/SerialNumberKit/source/SerialNumberFormater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,19 @@ auto SerialNumberFormater::setDateOfTest(std::span<uint8_t> partial_serial_numbe
date_of_test.fill('X');

if (auto file = FileManagerKit::File {_config.date_of_test_path}; file.is_open()) {
file.read(date_of_test);
auto file_content = std::array<char, 16> {};

file.read(file_content);

// ? epoch is 10 characters long, so the file size is at least 8 bytes
if (auto format_is_epoch = file.size() > 8; format_is_epoch) {
setDateOfTestFromEpoch(file_content, date_of_test);
}
// ? some robot still use the format YYMMDD
if (auto format_is_YYMMDD = file.size() <= 8; format_is_YYMMDD) {
setDateOfTestFromYYMMDD(file_content, date_of_test);
}

file.close();
}

Expand All @@ -33,6 +45,23 @@ auto SerialNumberFormater::setDateOfTest(std::span<uint8_t> partial_serial_numbe
return std::size(date_of_test);
}

void SerialNumberFormater::setDateOfTestFromYYMMDD(std::span<char> content, std::span<uint8_t> date_of_test) const
{
std::copy(content.begin(), content.begin() + std::size(date_of_test), date_of_test.begin());
}

void SerialNumberFormater::setDateOfTestFromEpoch(std::span<char> content, std::span<uint8_t> date_of_test) const
{
std::time_t epoch = std::atoll(content.data());
std::array<char, 8> epoch_c_array {};

struct tm local_time;
localtime_r(&epoch, &local_time);
std::strftime(epoch_c_array.data(), std::size(epoch_c_array), "%y%m", &local_time);

std::copy(epoch_c_array.begin(), epoch_c_array.begin() + std::size(date_of_test), date_of_test.begin());
}

void SerialNumberFormater::setMCUID(std::span<uint8_t> partial_serial_number, uint32_t offset, uint8_t number_of_digits)
{
constexpr auto MAX_MCU_ID_DIGITS = 24;
Expand Down
42 changes: 30 additions & 12 deletions libs/SerialNumberKit/tests/SerialNumberFormater_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ class SerialNumberFormaterTest : public ::testing::Test
void SetUp() override
{
std::ofstream dot_stream {config.date_of_test_path, std::ios::binary};
dot_stream << current_date_of_test_str;
dot_stream << current_date_of_test_epoch_str;
dot_stream.close();
}

void TearDown() override { std::filesystem::remove(config.date_of_test_path); }

std::string current_date_of_test_str = "220619\n";
std::string current_date_of_test_epoch_str = "1663086252\n"; // Tuesday, September 13, 2022 4:24:12 PM

mock::MCU mock_mcu;
SerialNumberFormater::Config config {.date_of_test_path = "/tmp/date_of_test"};
Expand All @@ -54,6 +54,24 @@ TEST_F(SerialNumberFormaterTest, setPrefix)

TEST_F(SerialNumberFormaterTest, setDateOfTest)
{
auto expected_serial_number = std::array<uint8_t, 32> {"LK-2209"};
auto actual_serial_number = std::array<uint8_t, 32> {"LK-"};

auto prefix_size = std::size("LK-") - sizeof('\0');

auto actual_prefix_number_size = serial_number_formater.setDateOfTest(actual_serial_number, prefix_size);
EXPECT_EQ(actual_serial_number, expected_serial_number);
EXPECT_EQ(actual_prefix_number_size, std::size("2209") - sizeof('\0'));
}

TEST_F(SerialNumberFormaterTest, setDateOfTestYYMMDD)
{
std::string current_date_of_test_YYMMDD_str = "220619\n";

std::ofstream dot_stream {config.date_of_test_path, std::ios::binary};
dot_stream << current_date_of_test_YYMMDD_str;
dot_stream.close();

auto expected_serial_number = std::array<uint8_t, 32> {"LK-2206"};
auto actual_serial_number = std::array<uint8_t, 32> {"LK-"};

Expand Down Expand Up @@ -83,36 +101,36 @@ TEST_F(SerialNumberFormaterTest, setMCUID)
auto expected_serial_number = std::array<uint8_t, 32> {};
auto actual_serial_number = std::array<uint8_t, 32> {};

auto prefix_plus_date_of_test_size = std::size("LK-2206") - sizeof('\0');
auto prefix_plus_date_of_test_size = std::size("LK-2209") - sizeof('\0');
auto number_of_digits = 0;

EXPECT_CALL(mock_mcu, getID).WillRepeatedly(Return(mcu_id_returned));

actual_serial_number = std::array<uint8_t, 32> {"LK-2206"};
actual_serial_number = std::array<uint8_t, 32> {"LK-2209"};
number_of_digits = 10;
expected_serial_number = std::array<uint8_t, 32> {"LK-22062A2B2C2D3A"};
expected_serial_number = std::array<uint8_t, 32> {"LK-22092A2B2C2D3A"};
serial_number_formater.setMCUID(actual_serial_number, prefix_plus_date_of_test_size, number_of_digits);
EXPECT_EQ(actual_serial_number, expected_serial_number);

actual_serial_number = std::array<uint8_t, 32> {"LK-2206"};
actual_serial_number = std::array<uint8_t, 32> {"LK-2209"};
number_of_digits = 19;
expected_serial_number = std::array<uint8_t, 32> {"LK-22062A2B2C2D3A3B3C3D4A4"};
expected_serial_number = std::array<uint8_t, 32> {"LK-22092A2B2C2D3A3B3C3D4A4"};
serial_number_formater.setMCUID(actual_serial_number, prefix_plus_date_of_test_size, number_of_digits);
EXPECT_EQ(actual_serial_number, expected_serial_number);

actual_serial_number = std::array<uint8_t, 32> {"LK-2206"};
actual_serial_number = std::array<uint8_t, 32> {"LK-2209"};
number_of_digits = 24;
expected_serial_number = std::array<uint8_t, 32> {"LK-22062A2B2C2D3A3B3C3D4A4B4C4D"};
expected_serial_number = std::array<uint8_t, 32> {"LK-22092A2B2C2D3A3B3C3D4A4B4C4D"};
serial_number_formater.setMCUID(actual_serial_number, prefix_plus_date_of_test_size, number_of_digits);
EXPECT_EQ(actual_serial_number, expected_serial_number);
}

TEST_F(SerialNumberFormaterTest, setMCUIDExceedingNumberOfDigits)
{
auto expected_serial_number = std::array<uint8_t, 32> {"LK-22062A2B2C2D3A3B3C3D4A4B4C4D"};
auto actual_serial_number = std::array<uint8_t, 32> {"LK-2206"};
auto expected_serial_number = std::array<uint8_t, 32> {"LK-22092A2B2C2D3A3B3C3D4A4B4C4D"};
auto actual_serial_number = std::array<uint8_t, 32> {"LK-2209"};

auto prefix_plus_date_of_test_size = std::size("LK-2206") - sizeof('\0');
auto prefix_plus_date_of_test_size = std::size("LK-2209") - sizeof('\0');

EXPECT_CALL(mock_mcu, getID).WillRepeatedly(Return(mcu_id_returned));

Expand Down
4 changes: 2 additions & 2 deletions libs/SerialNumberKit/tests/SerialNumberKit_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ TEST_F(SerialNumberKitTest, initialization)

TEST_F(SerialNumberKitTest, getSerialNumber)
{
auto expected_serial_number = std::array<uint8_t, 32> {"LK-22062A2B2C2D3A3B3C3D4A4B4C4D"};
auto expected_serial_number = std::array<uint8_t, 32> {"LK-22092A2B2C2D3A3B3C3D4A4B4C4D"};

EXPECT_CALL(mock_mcu, getID).WillOnce(Return(mcu_id_returned));

Expand All @@ -46,7 +46,7 @@ TEST_F(SerialNumberKitTest, getSerialNumber)

TEST_F(SerialNumberKitTest, getShortSerialNumber)
{
auto expected_serial_number = std::array<uint8_t, 16> {"LK-22062A2B2C2D"};
auto expected_serial_number = std::array<uint8_t, 16> {"LK-22092A2B2C2D"};

EXPECT_CALL(mock_mcu, getID).WillOnce(Return(mcu_id_returned));

Expand Down

0 comments on commit 8e3a094

Please sign in to comment.