diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..dcd66da5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# Autotools build artifacts +aclocal.m4 +autom4te.cache/ +compile +config.guess +config.h.in +config.sub +configure +depcomp +install-sh +ltmain.sh +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 +missing +INSTALL +Makefile.in diff --git a/unittest/deviceutils/device_api_gtest.cpp b/unittest/deviceutils/device_api_gtest.cpp index f7918bbd..95d49c4d 100644 --- a/unittest/deviceutils/device_api_gtest.cpp +++ b/unittest/deviceutils/device_api_gtest.cpp @@ -35,6 +35,8 @@ using namespace testing; using namespace std; using ::testing::Return; using ::testing::StrEq; +using ::testing::Invoke; +using ::testing::DoAll; //DeviceUtilsMock *g_DeviceApiMock = NULL; @@ -496,6 +498,133 @@ TEST_F(DeviceApiTestFixture, TestName_GetFileContents_Fail) } */ +/* isSecureDbgSrvUnlocked tests: verify the new ePROD gating logic that requires + * isDebugServicesEnabled (RFC), deviceType == "test" (RFC), and LABSIGNED_ENABLED == "true" + * to all be true before unlocking debug services on production builds. + */ + +/* Non-PROD build type: debug services are always unlocked regardless of other conditions */ +TEST_F(DeviceApiTestFixture, TestName_isSecureDbgSrvUnlocked_NonProd_AlwaysUnlocked) +{ + EXPECT_TRUE(isSecureDbgSrvUnlocked(eVBN)); +} + +/* ePROD + labsigned=true + deviceType=test + dbgServices=true → unlocked */ +TEST_F(DeviceApiTestFixture, TestName_isSecureDbgSrvUnlocked_Prod_Labsigned_DeviceTypeTest_DbgEnabled) +{ + 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(StrEq("LABSIGNED_ENABLED"), _, _)) + .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)); +} + +/* ePROD + labsigned=true + deviceType=prod (not "test") → locked */ +TEST_F(DeviceApiTestFixture, TestName_isSecureDbgSrvUnlocked_Prod_Labsigned_DeviceTypeProd_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, "prod", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(StrEq("LABSIGNED_ENABLED"), _, _)) + .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)); +} + +/* ePROD + labsigned=true + deviceType=unknown → locked */ +TEST_F(DeviceApiTestFixture, TestName_isSecureDbgSrvUnlocked_Prod_Labsigned_DeviceTypeUnknown_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, "unknown", size - 1); + deviceType[size - 1] = '\0'; + })); + EXPECT_CALL(*g_DeviceUtilsMock, getDevicePropertyData(StrEq("LABSIGNED_ENABLED"), _, _)) + .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)); +} + +/* ePROD + labsigned=false → locked regardless of deviceType or dbgServices */ +TEST_F(DeviceApiTestFixture, TestName_isSecureDbgSrvUnlocked_Prod_LabsignedFalse_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(StrEq("LABSIGNED_ENABLED"), _, _)) + .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)); +} + +/* ePROD + labsigned=true + deviceType=test + dbgServices=false → locked */ +TEST_F(DeviceApiTestFixture, TestName_isSecureDbgSrvUnlocked_Prod_Labsigned_DeviceTypeTest_DbgDisabled_Locked) +{ + 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(StrEq("LABSIGNED_ENABLED"), _, _)) + .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)); +} + +/* ePROD + getDevicePropertyData fails → locked */ +TEST_F(DeviceApiTestFixture, TestName_isSecureDbgSrvUnlocked_Prod_LabsignedPropertyFails_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(StrEq("LABSIGNED_ENABLED"), _, _)) + .Times(1) + .WillOnce(Return(-1)); + EXPECT_FALSE(isSecureDbgSrvUnlocked(ePROD)); +} + TEST_F(DeviceApiTestFixture, TestName_GetServURL_Nullcheck) { EXPECT_EQ(GetServURL(NULL, 0), 0); @@ -544,10 +673,21 @@ TEST_F(DeviceApiTestFixture, TestName_GetServURL_SuccessStatered_Prod_DebugServi int ret; char servUrl[]="https://www.statered.com"; EXPECT_CALL(*g_DeviceUtilsMock, isInStateRed()).Times(1).WillOnce(Return(true)); - //EXPECT_CALL(*g_DeviceUtilsMock, read_RFCProperty(_, _, _, _)).Times(1).WillOnce(Return(1)); 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(StrEq("LABSIGNED_ENABLED"), _, _)) + .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); @@ -634,6 +774,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(StrEq("LABSIGNED_ENABLED"), _, _)) + .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);