From bf2609524ca23233e1349c7c21cc44b86da9f514 Mon Sep 17 00:00:00 2001 From: Lucjan Bryndza Date: Thu, 22 Oct 2020 10:34:12 +0200 Subject: [PATCH] [EGD-4075] Use FATFS in the Linux builds (#843) * [EGD-4075] Use FAT fs in the emulator Add script for genrate base phone image * [EGD-4075] Use FreeRTOS-FAT in emulator initial commit * [EGD-4075] Thread local storage fix Fixing thread local storage when running on the Linux platform in the test mode * [EGD-4075] Improve image generation Improve image generation script on the linux platform * [EGD-4075] Fix all test with FAT fs image Fix all tests with fatfs image * [EGD-4075] Fix calculator utility test * [EGD-4075] Image dependencies fix * Remove uneeded comments * Missing headers in CR * [EGD-4075] Fixed whitespaces Co-authored-by: Lucjan Bryndza --- .gitmodules | 2 +- CMakeLists.txt | 14 + generate_fatfs_image.sh | 60 +++ .../tests/CalculatorUtility_tests.cpp | 8 + module-audio/Audio/test/unittest_audio.cpp | 31 +- module-db/tests/unittest.cpp | 8 + module-gui/test/test-catch-text/main.cpp | 8 + module-gui/test/test-catch/test-gui.cpp | 10 +- .../service-desktop/tests/unittest.cpp | 13 +- module-utils/board/linux/log.cpp | 3 +- module-utils/test/test_time_conversion.cpp | 20 + module-utils/test/unittest_duration.cpp | 8 + module-vfs/CMakeLists.txt | 39 +- module-vfs/board/cross/freeRTOS_FAT | 1 - .../cross/free_rtos_custom/portable/vfs.cpp | 50 ++ module-vfs/board/freeRTOS_FAT | 1 + .../include/FreeRTOSFATConfig.h | 0 .../include/ff_image_user_disk.hpp | 14 + .../free_rtos_custom/portable/common.cpp | 12 + .../portable/ff_image_user_disk.cpp | 426 ++++++++++++++++++ .../linux/free_rtos_custom/portable/vfs.cpp | 56 +++ module-vfs/board/linux/vfs.cpp | 256 ----------- module-vfs/targets/Target_Cross.cmake | 31 +- module-vfs/targets/Target_Linux.cmake | 9 +- module-vfs/tests/unittest_vfs.cpp | 52 ++- module-vfs/{board/cross => }/vfs.cpp | 48 +- module-vfs/vfs.hpp | 14 +- test/CMakeLists.txt | 1 + test/mock-freertos-tls.cpp | 22 + test/mock-logs.cpp | 4 +- 30 files changed, 843 insertions(+), 378 deletions(-) create mode 100755 generate_fatfs_image.sh delete mode 160000 module-vfs/board/cross/freeRTOS_FAT create mode 100644 module-vfs/board/cross/free_rtos_custom/portable/vfs.cpp create mode 160000 module-vfs/board/freeRTOS_FAT rename module-vfs/board/{cross => }/free_rtos_custom/include/FreeRTOSFATConfig.h (100%) create mode 100644 module-vfs/board/linux/free_rtos_custom/include/ff_image_user_disk.hpp create mode 100644 module-vfs/board/linux/free_rtos_custom/portable/common.cpp create mode 100644 module-vfs/board/linux/free_rtos_custom/portable/ff_image_user_disk.cpp create mode 100644 module-vfs/board/linux/free_rtos_custom/portable/vfs.cpp delete mode 100644 module-vfs/board/linux/vfs.cpp rename module-vfs/{board/cross => }/vfs.cpp (84%) create mode 100644 test/mock-freertos-tls.cpp diff --git a/.gitmodules b/.gitmodules index d8d237ef915e779076c9776e6075395d6438aa66..b0e25f9831c8b09a7cb684038faa2ee983e6a148 100644 --- a/.gitmodules +++ b/.gitmodules @@ -54,7 +54,7 @@ path = module-utils/magic_enum url = git@github.com:Neargye/magic_enum.git [submodule "module-vfs/board/cross/freeRTOS_FAT"] - path = module-vfs/board/cross/freeRTOS_FAT + path = module-vfs/board/freeRTOS_FAT url = ../Lab-Project-FreeRTOS-FAT.git [submodule "module-utils/tinyexpr"] path = module-utils/tinyexpr diff --git a/CMakeLists.txt b/CMakeLists.txt index ef0fc3a73db45b944cb923f7985e959930a0dd81..ff1389240a193139d34d61c0d69668ce0bdc0e4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -204,6 +204,20 @@ set_source_files_properties(source/main.cpp PROPERTIES COMPILE_DEFINITIONS "${EN target_link_options(${PROJECT_NAME} PUBLIC ${TARGET_LINK_OPTIONS}) if (${PROJECT_TARGET} STREQUAL "TARGET_Linux") + + set(FAT_IMAGE ${CMAKE_PROJECT_NAME}.img) + add_custom_command( + OUTPUT ${FAT_IMAGE} + DEPENDS assets + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate_fatfs_image.sh ${FAT_IMAGE} ${CMAKE_BINARY_DIR} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generate ${FAT_IMAGE}" + ) + add_custom_target( + ${FAT_IMAGE}-target ALL + DEPENDS ${FAT_IMAGE} + ) + add_dependencies(check ${FAT_IMAGE}-target) install(TARGETS ${CMAKE_PROJECT_NAME} DESTINATION "./") endif() diff --git a/generate_fatfs_image.sh b/generate_fatfs_image.sh new file mode 100755 index 0000000000000000000000000000000000000000..edd0fc42110110151752f4d6589b9d2f28f31d04 --- /dev/null +++ b/generate_fatfs_image.sh @@ -0,0 +1,60 @@ +#!/bin/bash -e +# Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +# For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +usage() { +cat << ==usage +Usage: $(basename $0) [image_dir] [assets_root_dir] + image_dir Target disk image + asset_root_dir Asset root directory +==usage +} + +ASSETS_DIR="assets country-codes.db Luts.bin" + +TEST_ITEMS="testfiles" + +if [ $# -ne 2 ]; then + echo "Error! Invalid argument count" + usage + exit -1 +fi +IMAGE_NAME=$(realpath $1) +SRC_DATA=$(realpath $2) + +if [ ! -d "$SRC_DATA" ]; then + echo "Error! asset_root_dir is not a directory" + usage + exit -1 +fi + +truncate -s 16G $IMAGE_NAME +sfdisk $IMAGE_NAME << ==sfdisk +label: dos +label-id: 0x09650eb4 +unit: sectors + +/dev/sda1 : start= 2048, size= 28522496, type=b, bootable +/dev/sda2 : start= 28524544, size= 2097152, type=b +==sfdisk + +PART1="$IMAGE_NAME@@1048576" +PART2="$IMAGE_NAME@@14604566528" +mformat -i "$PART1" -F -T 28522496 -v PUREOS +mformat -i "$PART2" -F -T 2097152 -v RECOVER +mmd -i "$PART1" ::/current +cd "$SRC_DATA" +for i in $ASSETS_DIR; do + mcopy -s -i "$PART1" $i ::/current/ +done +mcopy -s -i "$PART1" user :: +mcopy -s -i "$PART1" .boot.json :: +mcopy -s -i "$PART1" .boot.json.crc32 :: + +# Testing parts of files +for i in $TEST_ITEMS; do + mcopy -s -i "$PART1" $i ::/current +done +mcopy -s -i "$PART1" sys/updates :: + +cd - diff --git a/module-apps/application-calculator/tests/CalculatorUtility_tests.cpp b/module-apps/application-calculator/tests/CalculatorUtility_tests.cpp index 324321e626969de0053d9edd10d2f2efe233a4ef..36e6013f6729ba1bee93d20a473c1fef4cc4b400 100644 --- a/module-apps/application-calculator/tests/CalculatorUtility_tests.cpp +++ b/module-apps/application-calculator/tests/CalculatorUtility_tests.cpp @@ -9,6 +9,14 @@ class vfs vfs; +struct vfs_initializer +{ + vfs_initializer() + { + vfs.Init(); + } +} vfs_initializer; + TEST_CASE("Calculator utilities") { auto calculator = Calculator(); diff --git a/module-audio/Audio/test/unittest_audio.cpp b/module-audio/Audio/test/unittest_audio.cpp index bca63384c30354d2a2e8e4f73dd6640e9bef7f62..0171ac7aa9828b16420d397a6ccd965f9cbfbab7 100644 --- a/module-audio/Audio/test/unittest_audio.cpp +++ b/module-audio/Audio/test/unittest_audio.cpp @@ -19,18 +19,29 @@ class vfs vfs; +struct vfs_initializer +{ + vfs_initializer() + { + vfs.Init(); + } +} vfs_init; + TEST_CASE("Test audio tags") { - std::vector testExtensions = {"flac", "wav", "mp3"}; - for (auto ext : testExtensions) { - auto dec = audio::decoder::Create(("testfiles/audio." + ext).c_str()); - REQUIRE(dec); - auto tags = dec->fetchTags(); - REQUIRE(tags); - REQUIRE(tags->title == ext + " Test track title"); - REQUIRE(tags->artist == ext + " Test artist name"); - REQUIRE(tags->album == ext + " Test album title"); - REQUIRE(tags->year == "2020"); + SECTION(" Encoder tests ") + { + std::vector testExtensions = {"flac", "wav", "mp3"}; + for (auto ext : testExtensions) { + auto dec = audio::decoder::Create(("testfiles/audio." + ext).c_str()); + REQUIRE(dec); + auto tags = dec->fetchTags(); + REQUIRE(tags); + REQUIRE(tags->title == ext + " Test track title"); + REQUIRE(tags->artist == ext + " Test artist name"); + REQUIRE(tags->album == ext + " Test album title"); + REQUIRE(tags->year == "2020"); + } } } diff --git a/module-db/tests/unittest.cpp b/module-db/tests/unittest.cpp index 0db1d2e7bb1a9fd526656dfe1fc8d8886baf908a..6a16b23ba5b08500cfdbcea917f3ef08255ea773 100644 --- a/module-db/tests/unittest.cpp +++ b/module-db/tests/unittest.cpp @@ -18,6 +18,14 @@ class vfs vfs; +struct vfs_initializer +{ + vfs_initializer() + { + vfs.Init(); + } +} vfs_initializer; + TEST_CASE("Create and destroy simple database") { diff --git a/module-gui/test/test-catch-text/main.cpp b/module-gui/test/test-catch-text/main.cpp index e3c1d0e8ee19421063bacadefc40ed1fccd9ba7f..0f1f7d0fdb789a8cac5813158b1354e48094a163 100644 --- a/module-gui/test/test-catch-text/main.cpp +++ b/module-gui/test/test-catch-text/main.cpp @@ -8,3 +8,11 @@ class vfs vfs; // needed for compilation, our vfs is global utils::i18 localize; // needed to load any keymap - these are stored in i18 + +struct vfs_initializer +{ + vfs_initializer() + { + vfs.Init(); + } +} vfs_initializer; diff --git a/module-gui/test/test-catch/test-gui.cpp b/module-gui/test/test-catch/test-gui.cpp index ccb9f5835f5194d385e6b055eda1bbce66da7495..cb8e80c5dffe6a4debfc118cf510961ce693fd19 100644 --- a/module-gui/test/test-catch/test-gui.cpp +++ b/module-gui/test/test-catch/test-gui.cpp @@ -6,6 +6,7 @@ #include "mock/InitializedFontManager.hpp" #define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file +#include #include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include @@ -33,6 +33,14 @@ using namespace std; class vfs vfs; +struct vfs_initializer +{ + vfs_initializer() + { + vfs.Init(); + } +} vfs_init; + TEST_CASE("Test BoundingBox intersect") { gui::BoundingBox result; diff --git a/module-services/service-desktop/tests/unittest.cpp b/module-services/service-desktop/tests/unittest.cpp index 9bb4e1e30e889ba60b28cb1e38442a30e96d5451..c6edc26c9f3435f5f4f45850460d9fa603afcfe8 100644 --- a/module-services/service-desktop/tests/unittest.cpp +++ b/module-services/service-desktop/tests/unittest.cpp @@ -19,11 +19,17 @@ class vfs vfs; +struct vfs_initializer +{ + vfs_initializer() + { + vfs.Init(); + } +} vfs_initializer; + TEST_CASE("System Update Tests") { - ServiceDesktop serviceDesktop; - vfs.Init(); - UpdatePureOS updateOS(&serviceDesktop); + UpdatePureOS updateOS(nullptr); updateos::UpdateError err = updateOS.prepareTempDirForUpdate(); REQUIRE(err == updateos::UpdateError::NoError); @@ -39,7 +45,6 @@ TEST_CASE("System Update Tests") TEST_CASE("Factory Reset Test") { - vfs.Init(); std::string sysdir = purefs::dir::eMMC_disk; sysdir += "/factory-test/sys"; diff --git a/module-utils/board/linux/log.cpp b/module-utils/board/linux/log.cpp index 252a64ebbd4854da6bbdd065500db1f5c5ccbc48..1ff6f9436406360a58179dc2fb9ad58470cc4068 100644 --- a/module-utils/board/linux/log.cpp +++ b/module-utils/board/linux/log.cpp @@ -94,7 +94,8 @@ static void _log_Log( std::cout << loggerBuffer; } -void log_Log(logger_level level, const char *file, int line, const char *function, const char *fmt, ...) +__attribute__((weak)) void log_Log( + logger_level level, const char *file, int line, const char *function, const char *fmt, ...) { va_list args; va_start(args, fmt); diff --git a/module-utils/test/test_time_conversion.cpp b/module-utils/test/test_time_conversion.cpp index 12432345314ea6506bdca08cb9175ffb2bd4c132..0714efe2ac07190c5d9ad4de2541009eb6cf02e4 100644 --- a/module-utils/test/test_time_conversion.cpp +++ b/module-utils/test/test_time_conversion.cpp @@ -4,6 +4,25 @@ #include #include