diff --git a/.github/workflows/L2-tests.yml b/.github/workflows/L2-tests.yml index b0ed9e5e..3994c3f5 100755 --- a/.github/workflows/L2-tests.yml +++ b/.github/workflows/L2-tests.yml @@ -88,7 +88,7 @@ jobs: with: repository: rdkcentral/entservices-testframework path: entservices-testframework - ref: develop + ref: RDKEMW-4719_upto_date_validation token: ${{ secrets.RDKCM_RDKE }} - name: Checkout googletest @@ -127,11 +127,12 @@ jobs: - name: Apply patches Thunder run: | - cd $GITHUB_WORKSPACE/Thunder + cd $GITHUB_WORKSPACE/Thunder patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/Use_Legact_Alt_Based_On_ThunderTools_R4.4.3.patch patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/error_code_R4_4.patch patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/1004-Add-support-for-project-dir.patch patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/RDKEMW-733-Add-ENTOS-IDS.patch + patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/FirmwareUpdate_UptoDate.patch cd - - name: Build Thunder run: > diff --git a/FirmwareUpdate/FirmwareUpdateImplementation.cpp b/FirmwareUpdate/FirmwareUpdateImplementation.cpp index 103b498a..4d6eec7d 100644 --- a/FirmwareUpdate/FirmwareUpdateImplementation.cpp +++ b/FirmwareUpdate/FirmwareUpdateImplementation.cpp @@ -669,39 +669,13 @@ namespace WPEFramework { string dri = (firmwareType == "DRI") ? "yes" : "no"; string name = firmwareFilepath.substr(firmwareFilepath.find_last_of("/\\") + 1); string path = firmwareFilepath.substr(0, firmwareFilepath.find_last_of("/\\") + 1); - - string currentFlashedImage = readProperty("/version.txt","imagename", ":") ; - SWUPDATEINFO("currentFlashedImage : %s",currentFlashedImage.c_str()); - std::string fileWithoutExtension =""; - // Find the position of the last '.' - size_t dotPos = name.find_last_of('.'); - if (dotPos != std::string::npos) { - // Extract substring before the '.' - fileWithoutExtension = name.substr(0, dotPos); - } else { - // If no '.' is found, use the original string - fileWithoutExtension = name; - } - - if (fileWithoutExtension == currentFlashedImage) - { - - SWUPDATEERR("FW version of the active image and the image to be upgraded are the same. No upgrade required."); - isFlashingInProgress = false; // Reset the flag if exiting early - snprintf(fwdls.status, sizeof(fwdls.status), "Status|No upgrade needed\n"); - snprintf(fwdls.FwUpdateState, sizeof(fwdls.FwUpdateState), "FwUpdateState|No upgrade needed\n"); - snprintf(fwdls.failureReason, sizeof(fwdls.failureReason), "FailureReason|No upgrade needed\n"); - updateFWDownloadStatus(&fwdls, dri.c_str(),initiated_type); - dispatchAndUpdateEvent(_VALIDATION_FAILED,_FIRMWARE_UPTODATE); - return ; - } if(std::string(proto) == "usb") { if (!copyFileToDirectory(upgrade_file.c_str(), USB_TMP_COPY)) { SWUPDATEERR("File copy operation failed.\n"); - dispatchAndUpdateEvent(_VALIDATION_FAILED,""); + dispatchAndUpdateEvent(_VALIDATION_FAILED,_FIRMWARE_NOT_FOUND); isFlashingInProgress = false; // Reset the flag if exiting early snprintf(fwdls.status, sizeof(fwdls.status), "Status|Failure\n"); snprintf(fwdls.FwUpdateState, sizeof(fwdls.FwUpdateState), "FwUpdateState|Failed\n"); @@ -737,7 +711,6 @@ namespace WPEFramework { if(firmwareFilepath == "") { SWUPDATEERR("firmwareFilepath is empty"); - dispatchAndUpdateEvent(_VALIDATION_FAILED,_FIRMWARE_NOT_FOUND); snprintf(fwdls.status, sizeof(fwdls.status), "Status|Failure\n"); snprintf(fwdls.FwUpdateState, sizeof(fwdls.FwUpdateState), "FwUpdateState|Failed\n"); snprintf(fwdls.failureReason, sizeof(fwdls.failureReason), "FailureReason|firmwareFilepath is empty\n"); @@ -748,7 +721,6 @@ namespace WPEFramework { else if (!(Utils::fileExists(firmwareFilepath.c_str()))) { SWUPDATEERR("firmwareFile is not present %s",firmwareFilepath.c_str()); SWUPDATEERR("Local image Download Failed"); //Existing marker - dispatchAndUpdateEvent(_VALIDATION_FAILED,_FIRMWARE_NOT_FOUND); snprintf(fwdls.status, sizeof(fwdls.status), "Status|Failure\n"); snprintf(fwdls.FwUpdateState, sizeof(fwdls.FwUpdateState), "FwUpdateState|Failed\n"); snprintf(fwdls.failureReason, sizeof(fwdls.failureReason), "FailureReason|firmwareFile is not present\n"); @@ -760,7 +732,6 @@ namespace WPEFramework { if(firmwareType !=""){ if (firmwareType != "PCI" && firmwareType != "DRI") { SWUPDATEERR("firmwareType must be either 'PCI' or 'DRI'."); - dispatchAndUpdateEvent(_VALIDATION_FAILED,""); snprintf(fwdls.status, sizeof(fwdls.status), "Status|Failure\n"); snprintf(fwdls.FwUpdateState, sizeof(fwdls.FwUpdateState), "FwUpdateState|Failed\n"); snprintf(fwdls.failureReason, sizeof(fwdls.failureReason), "FailureReason|firmwareType must be either 'PCI' or 'DRI'.\n"); @@ -772,7 +743,6 @@ namespace WPEFramework { else { SWUPDATEERR("firmwareType is empty"); - dispatchAndUpdateEvent(_VALIDATION_FAILED,""); snprintf(fwdls.status, sizeof(fwdls.status), "Status|Failure\n"); snprintf(fwdls.FwUpdateState, sizeof(fwdls.FwUpdateState), "FwUpdateState|Failed\n"); snprintf(fwdls.failureReason, sizeof(fwdls.failureReason), "FailureReason|firmwareType is empty\n"); @@ -781,6 +751,35 @@ namespace WPEFramework { return status; } + string name = firmwareFilepath.substr(firmwareFilepath.find_last_of("/\\") + 1); + string path = firmwareFilepath.substr(0, firmwareFilepath.find_last_of("/\\") + 1); + + string currentFlashedImage = readProperty("/version.txt","imagename", ":") ; + SWUPDATEINFO("currentFlashedImage : %s",currentFlashedImage.c_str()); + std::string fileWithoutExtension =""; + // Find the position of the last '.' + size_t dotPos = name.find_last_of('.'); + if (dotPos != std::string::npos) { + // Extract substring before the '.' + fileWithoutExtension = name.substr(0, dotPos); + } else { + // If no '.' is found, use the original string + fileWithoutExtension = name; + } + + if (fileWithoutExtension == currentFlashedImage) + { + + SWUPDATEERR("FW version of the active image and the image to be upgraded are the same. No upgrade required. imagename : %s" ,name.c_str()); + snprintf(fwdls.status, sizeof(fwdls.status), "Status|No upgrade needed\n"); + snprintf(fwdls.FwUpdateState, sizeof(fwdls.FwUpdateState), "FwUpdateState|No upgrade needed\n"); + snprintf(fwdls.failureReason, sizeof(fwdls.failureReason), "FailureReason|No upgrade needed\n"); + updateFWDownloadStatus(&fwdls, dri.c_str(),initiated_type.c_str()); + status = Core::ERROR_FIRMWAREUPDATE_UPTODATE; + return status; + } + + // Ensure only one flashing operation happens at a time bool expected = false; if (!isFlashingInProgress.compare_exchange_strong(expected, true)) { @@ -1353,11 +1352,7 @@ bool copyFileToDirectory(const char *source_file, const char *destination_dir) { // Extract file name from the source file path const char *file_name = strrchr(source_file, '/'); - if (!file_name) { - SWUPDATEERR("Invalid source file path: %s\n", source_file); - return false; - } - file_name++; // Skip the '/' character + file_name = file_name ? file_name + 1 : source_file; // Construct the destination file path std::string dest_file_path = std::string(destination_dir) + "/" + file_name; @@ -1385,12 +1380,16 @@ bool copyFileToDirectory(const char *source_file, const char *destination_dir) { return false; } + if (src.peek() == std::ifstream::traits_type::eof()) { + SWUPDATEINFO("Source file is empty. Copying as empty file.\n"); + } + // Copy the file content dest << src.rdbuf(); - // Check if the copy was successful - if (!src || !dest) { - SWUPDATEERR("Error: File copy failed.\n"); + // Check for actual I/O errors (ignore EOF) + if (src.bad() || dest.bad()) { + SWUPDATEERR("Error: File copy failed due to I/O error.\n"); return false; } diff --git a/Tests/L2Tests/tests/FirmwareUpdate_L2Test.cpp b/Tests/L2Tests/tests/FirmwareUpdate_L2Test.cpp index 18c10474..ffb995e1 100755 --- a/Tests/L2Tests/tests/FirmwareUpdate_L2Test.cpp +++ b/Tests/L2Tests/tests/FirmwareUpdate_L2Test.cpp @@ -90,17 +90,7 @@ TEST_F(FirmwareUpdateTest,EmptyFirmwareFilepath) params["firmwareType"] = "PCI"; status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "updateFirmware", params, result); - JsonObject params1; - JsonObject result1; - status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "getUpdateState", params1, result1); - EXPECT_EQ(Core::ERROR_NONE, status); - - if (result1.HasLabel("state")) { - EXPECT_STREQ("VALIDATION_FAILED", result1["state"].String().c_str()); - } - if (result1.HasLabel("substate")) { - EXPECT_STREQ("FIRMWARE_NOT_FOUND", result1["substate"].String().c_str()); - } + EXPECT_NE(status,Core::ERROR_NONE); } TEST_F(FirmwareUpdateTest,EmptyFirmwareType) @@ -116,18 +106,7 @@ TEST_F(FirmwareUpdateTest,EmptyFirmwareType) params["firmwareFilepath"] = "/tmp/ELTE11MWR_MIDDLEWARE_DEV_default_20241122145614.bin"; params["firmwareType"] = ""; status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "updateFirmware", params, result); - - JsonObject params1; - JsonObject result1; - status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "getUpdateState", params1, result1); - EXPECT_EQ(Core::ERROR_NONE, status); - - if (result1.HasLabel("state")) { - EXPECT_STREQ("VALIDATION_FAILED", result1["state"].String().c_str()); - } - if (result1.HasLabel("substate")) { - EXPECT_STREQ("NOT_APPLICABLE", result1["substate"].String().c_str()); - } + EXPECT_NE(status,Core::ERROR_NONE); } } @@ -143,19 +122,12 @@ TEST_F(FirmwareUpdateTest,InvalidFirmwareType) params["firmwareFilepath"] = "/tmp/ELTE11MWR_MIDDLEWARE_DEV_default_20241122145614.bin"; params["firmwareType"] = "ABC"; status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "updateFirmware", params, result); + EXPECT_NE(status,Core::ERROR_NONE); - JsonObject params1; JsonObject result1; status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "getUpdateState", params1, result1); EXPECT_EQ(Core::ERROR_NONE, status); - - if (result1.HasLabel("state")) { - EXPECT_STREQ("VALIDATION_FAILED", result1["state"].String().c_str()); - } - if (result1.HasLabel("substate")) { - EXPECT_STREQ("NOT_APPLICABLE", result1["substate"].String().c_str()); - } } } @@ -173,18 +145,7 @@ TEST_F(FirmwareUpdateTest,FirmwareFilepath_not_exist) if (std::remove(filePath) == 0) { std::cout << "File removed successfully.\n"; status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "updateFirmware", params, result); - - JsonObject params1; - JsonObject result1; - status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "getUpdateState", params1, result1); - EXPECT_EQ(Core::ERROR_NONE, status); - - if (result1.HasLabel("state")) { - EXPECT_STREQ("VALIDATION_FAILED", result1["state"].String().c_str()); - } - if (result1.HasLabel("substate")) { - EXPECT_STREQ("FIRMWARE_NOT_FOUND", result1["substate"].String().c_str()); - } + EXPECT_NE(status,Core::ERROR_NONE); } } @@ -206,8 +167,7 @@ TEST_F(FirmwareUpdateTest,FirmwareUptoDateValidatation) params["firmwareFilepath"] = "/tmp/ELTE11MWR_MIDDLEWARE_DEV_default_20241122145614.bin"; params["firmwareType"] = "PCI"; status = InvokeServiceMethod("org.rdk.FirmwareUpdate", "updateFirmware", params, result); - EXPECT_EQ(Core::ERROR_NONE, status); - sleep(5); + EXPECT_NE(status,Core::ERROR_NONE); } } diff --git a/build_dependencies.sh b/build_dependencies.sh index 65c5637a..4270c311 100644 --- a/build_dependencies.sh +++ b/build_dependencies.sh @@ -33,7 +33,7 @@ git clone --branch R4.4.1 https://github.com/rdkcentral/Thunder.git git clone --branch main https://github.com/rdkcentral/entservices-apis.git -git clone https://$GITHUB_TOKEN@github.com/rdkcentral/entservices-testframework.git +git clone --branch RDKEMW-4719_upto_date_validation https://$GITHUB_TOKEN@github.com/rdkcentral/entservices-testframework.git ############################ # Build Thunder-Tools @@ -63,6 +63,7 @@ patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/Use_Legact_Alt_B patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/error_code_R4_4.patch patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/1004-Add-support-for-project-dir.patch patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/RDKEMW-733-Add-ENTOS-IDS.patch +patch -p1 < $GITHUB_WORKSPACE/entservices-testframework/patches/FirmwareUpdate_UptoDate.patch cd - cmake -G Ninja -S Thunder -B build/Thunder \ @@ -170,4 +171,4 @@ echo "========================================================================== cd ../../ cp -r /usr/include/gstreamer-1.0/gst /usr/include/glib-2.0/* /usr/lib/x86_64-linux-gnu/glib-2.0/include/* /usr/local/include/trower-base64/base64.h . -ls -la ${GITHUB_WORKSPACE} \ No newline at end of file +ls -la ${GITHUB_WORKSPACE}