From cf8b59c757cbb029718826617f716bfbaec47a5e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 07:03:31 +0000 Subject: [PATCH 1/2] Initial plan From 815d63dd55688e342ade095a46245fd4e011791f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Mar 2026 07:18:49 +0000 Subject: [PATCH 2/2] Add isSecureDbgSrvUnlocked tests and fix stale GetServURL mock expectations Co-authored-by: KTirumalaSrihari <102281309+KTirumalaSrihari@users.noreply.github.com> --- unittest/deviceutils/device_api_gtest.cpp | 164 +++++++++++++++++++++- 1 file changed, 160 insertions(+), 4 deletions(-) diff --git a/unittest/deviceutils/device_api_gtest.cpp b/unittest/deviceutils/device_api_gtest.cpp index f7918bbd..11b00969 100644 --- a/unittest/deviceutils/device_api_gtest.cpp +++ b/unittest/deviceutils/device_api_gtest.cpp @@ -509,7 +509,7 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessStatered_DebugServices_E //EXPECT_CALL(*g_DeviceUtilsMock, read_RFCProperty(_, _, _, _)).Times(1).WillOnce(Return(1)); ret = system("echo \"BUILD_TYPE=vbn\" > /tmp/device_gtest.prop"); //EXPECT_CALL(*g_DeviceUtilsMock, filePresentCheck(_)).Times(1).WillOnce(Return(1)); - EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(true)); + // Non-PROD builds are always unlocked; isDebugServicesEnabled() is not called ret = system("echo \"https://www.statered.com\" > /tmp/stateredrecovry.conf"); ret = GetServURL(output, sizeof(output)); EXPECT_EQ(strncmp(output,servUrl,strlen(servUrl)),0); @@ -528,7 +528,7 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessStatered_DebugServices_D //EXPECT_CALL(*g_DeviceUtilsMock, read_RFCProperty(_, _, _, _)).Times(1).WillOnce(Return(1)); ret = system("echo \"BUILD_TYPE=vbn\" > /tmp/device_gtest.prop"); //EXPECT_CALL(*g_DeviceUtilsMock, filePresentCheck(_)).Times(1).WillOnce(Return(1)); - EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(false)); + // Non-PROD builds are always unlocked; isDebugServicesEnabled() is not called ret = system("echo \"https://www.statered.com\" > /tmp/stateredrecovry.conf"); ret = GetServURL(output, sizeof(output)); EXPECT_EQ(strncmp(output,servUrl,strlen(servUrl)),0); @@ -548,6 +548,19 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessStatered_Prod_DebugServi ret = system("echo \"BUILD_TYPE=PROD\" > /tmp/device_gtest.prop"); //EXPECT_CALL(*g_DeviceUtilsMock, filePresentCheck(_)).Times(1).WillOnce(Return(1)); EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "test", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Invoke([](const char* model, char *data, int size) { + strncpy(data, "true", size - 1); + data[size - 1] = '\0'; + return 0; + })); ret = system("echo \"https://www.statered.com\" > /tmp/stateredrecovry.conf"); ret = GetServURL(output, sizeof(output)); EXPECT_EQ(strncmp(output,servUrl,strlen(servUrl)),0); @@ -567,6 +580,19 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessStatered_Prod_DebugServi ret = system("echo \"BUILD_TYPE=PROD\" > /tmp/device_gtest.prop"); //EXPECT_CALL(*g_DeviceUtilsMock, filePresentCheck(_)).Times(1).WillOnce(Return(1)); EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(false)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "test", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Invoke([](const char* model, char *data, int size) { + strncpy(data, "true", size - 1); + data[size - 1] = '\0'; + return 0; + })); ret = system("echo \"https://www.statered.com\" > /tmp/stateredrecovry.conf"); ret = system("echo \"https://www.autotool.com\" > /tmp/swupdate.conf"); EXPECT_CALL(*g_DeviceUtilsMock, read_RFCProperty(_, _, _, _)) @@ -594,7 +620,7 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessSwupdate_DebugServices_E EXPECT_CALL(*g_DeviceUtilsMock, filePresentCheck(_)).Times(1).WillOnce(Return(0)); //EXPECT_CALL(*g_DeviceUtilsMock, read_RFCProperty(_, _, _, _)).Times(1).WillOnce(Return(1)); ret = system("echo \"BUILD_TYPE=vbn\" > /tmp/device_gtest.prop"); - EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(true)); + // Non-PROD builds are always unlocked; isDebugServicesEnabled() is not called ret = system("echo \"https://www.rdkautotool.com\" > /tmp/swupdate.conf"); ret=GetServURL(output , sizeof(output)); EXPECT_EQ(strncmp(output , servUrl , strlen(servUrl)),0); @@ -614,7 +640,7 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessSwupdate_DebugServices_D EXPECT_CALL(*g_DeviceUtilsMock, filePresentCheck(_)).Times(1).WillOnce(Return(0)); //EXPECT_CALL(*g_DeviceUtilsMock, read_RFCProperty(_, _, _, _)).Times(1).WillOnce(Return(1)); ret = system("echo \"BUILD_TYPE=vbn\" > /tmp/device_gtest.prop"); - EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(false)); + // Non-PROD builds are always unlocked; isDebugServicesEnabled() is not called ret = system("echo \"https://www.rdkautotool.com\" > /tmp/swupdate.conf"); ret=GetServURL(output , sizeof(output)); EXPECT_EQ(strncmp(output , servUrl , strlen(servUrl)),0); @@ -634,6 +660,19 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessSwupdate_Prod_DebugServi EXPECT_CALL(*g_DeviceUtilsMock, filePresentCheck(_)).Times(1).WillOnce(Return(0)); ret = system("echo \"BUILD_TYPE=PROD\" > /tmp/device_gtest.prop"); EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "test", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Invoke([](const char* model, char *data, int size) { + strncpy(data, "true", size - 1); + data[size - 1] = '\0'; + return 0; + })); ret = system("echo \"https://www.rdkautotool.com\" > /tmp/swupdate.conf"); ret=GetServURL(output , sizeof(output)); EXPECT_EQ(strncmp(output , servUrl , strlen(servUrl)),0); @@ -652,6 +691,19 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessSwupdate_Prod_DebugServi EXPECT_CALL(*g_DeviceUtilsMock, isInStateRed()).Times(1).WillOnce(Return(false)); ret = system("echo \"BUILD_TYPE=PROD\" > /tmp/device_gtest.prop"); EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(false)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "test", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Invoke([](const char* model, char *data, int size) { + strncpy(data, "true", size - 1); + data[size - 1] = '\0'; + return 0; + })); ret = system("echo \"https://www.rdkautotool.com\" > /tmp/swupdate.conf"); EXPECT_CALL(*g_DeviceUtilsMock, read_RFCProperty(_, _, _, _)) .Times(1) @@ -727,3 +779,107 @@ TEST_F(DeviceApiTestFixture,TestName_GetRemoteVers_Fail) char pRemoteInfo[256] = {0}; EXPECT_EQ(GetRemoteVers(pRemoteInfo, sizeof(pRemoteInfo)), 0); } + +// ===== Tests for isSecureDbgSrvUnlocked ===== + +TEST_F(DeviceApiTestFixture, IsSecureDbgSrvUnlocked_NonProdBuild_ReturnsTrue) +{ + // Non-PROD builds are always unlocked; none of the gating mocks are needed + EXPECT_TRUE(isSecureDbgSrvUnlocked(eVBN)); +} + +TEST_F(DeviceApiTestFixture, IsSecureDbgSrvUnlocked_Prod_AllConditionsMet_ReturnsTrue) +{ + // PROD + dbgServices=true + deviceType="test" + labsigned="true" => unlocked + EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "test", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Invoke([](const char* model, char *data, int size) { + strncpy(data, "true", size - 1); + data[size - 1] = '\0'; + return 0; + })); + EXPECT_TRUE(isSecureDbgSrvUnlocked(ePROD)); +} + +TEST_F(DeviceApiTestFixture, IsSecureDbgSrvUnlocked_Prod_DebugServicesDisabled_ReturnsFalse) +{ + // PROD + dbgServices=false => locked even when deviceType and labsigned would otherwise allow it + EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(false)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "test", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Invoke([](const char* model, char *data, int size) { + strncpy(data, "true", size - 1); + data[size - 1] = '\0'; + return 0; + })); + EXPECT_FALSE(isSecureDbgSrvUnlocked(ePROD)); +} + +TEST_F(DeviceApiTestFixture, IsSecureDbgSrvUnlocked_Prod_WrongDeviceType_ReturnsFalse) +{ + // PROD + deviceType!="test" => locked even when dbgServices=true and labsigned=true + EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "prod", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Invoke([](const char* model, char *data, int size) { + strncpy(data, "true", size - 1); + data[size - 1] = '\0'; + return 0; + })); + EXPECT_FALSE(isSecureDbgSrvUnlocked(ePROD)); +} + +TEST_F(DeviceApiTestFixture, IsSecureDbgSrvUnlocked_Prod_LabsignedFalse_ReturnsFalse) +{ + // PROD + labsigned="false" => locked even when dbgServices=true and deviceType="test" + EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "test", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Invoke([](const char* model, char *data, int size) { + strncpy(data, "false", size - 1); + data[size - 1] = '\0'; + return 0; + })); + EXPECT_FALSE(isSecureDbgSrvUnlocked(ePROD)); +} + +TEST_F(DeviceApiTestFixture, IsSecureDbgSrvUnlocked_Prod_LabsignedPropertyFailed_ReturnsFalse) +{ + // PROD + getDevicePropertyData() fails for LABSIGNED_ENABLED => locked + EXPECT_CALL(*g_DeviceUtilsMock, isDebugServicesEnabled()).Times(1).WillOnce(Return(true)); + EXPECT_CALL(*g_DeviceUtilsMock, getDeviceTypeRFC(_, _)) + .Times(1) + .WillOnce(Invoke([](char* deviceType, size_t size) { + strncpy(deviceType, "test", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(_, _, _)) + .Times(1) + .WillOnce(Return(-1)); + EXPECT_FALSE(isSecureDbgSrvUnlocked(ePROD)); +}