From 7fe3c2b7f8b185bbbb6147d99dd64c52538291a2 Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Mon, 16 Feb 2026 21:48:46 +0200 Subject: [PATCH 1/9] cm: updatemanager: do not send removed item status in full unit status Signed-off-by: Oleksandr Grytsov --- src/core/cm/updatemanager/unitstatushandler.cpp | 14 +++++++++++++- src/core/cm/updatemanager/unitstatushandler.hpp | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/core/cm/updatemanager/unitstatushandler.cpp b/src/core/cm/updatemanager/unitstatushandler.cpp index fc7abdde7..e219a67cc 100644 --- a/src/core/cm/updatemanager/unitstatushandler.cpp +++ b/src/core/cm/updatemanager/unitstatushandler.cpp @@ -418,9 +418,21 @@ Error UnitStatusHandler::SetNodesInfo() Error UnitStatusHandler::SetUpdateItemsStatus() { + auto itemsStatuses = MakeUnique(&mAllocator); + + mItemStatusProvider->GetUpdateItemsStatuses(*itemsStatuses); + mUnitStatus.mUpdateItems.EmplaceValue(); - mItemStatusProvider->GetUpdateItemsStatuses(*mUnitStatus.mUpdateItems); + for (const auto& status : *itemsStatuses) { + if (status.mState == ItemStateEnum::eRemoved) { + continue; + } + + if (auto err = mUnitStatus.mUpdateItems->EmplaceBack(status); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + } return ErrorEnum::eNone; } diff --git a/src/core/cm/updatemanager/unitstatushandler.hpp b/src/core/cm/updatemanager/unitstatushandler.hpp index 565ef4591..45f2eee02 100644 --- a/src/core/cm/updatemanager/unitstatushandler.hpp +++ b/src/core/cm/updatemanager/unitstatushandler.hpp @@ -91,7 +91,8 @@ class UnitStatusHandler : private nodeinfoprovider::NodeInfoListenerItf, Error SetUpdateNodeStatus(const String& nodeID, const Error& updateErr); private: - static constexpr auto cAllocatorSize = sizeof(StaticArray); + static constexpr auto cAllocatorSize + = Max(sizeof(StaticArray), sizeof(UpdateItemStatusArray)); // nodeinfoprovider::NodeInfoListenerItf implementation void OnNodeInfoChanged(const UnitNodeInfo& info) override; From a0d848c1eb1195edf58bbb8cf0f0f8598cf4cff4 Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Mon, 16 Feb 2026 21:49:19 +0200 Subject: [PATCH 2/9] cm: launcher: display error log when activating instances fail Signed-off-by: Oleksandr Grytsov --- src/core/cm/launcher/launcher.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/core/cm/launcher/launcher.cpp b/src/core/cm/launcher/launcher.cpp index 56a905310..6466fef6b 100644 --- a/src/core/cm/launcher/launcher.cpp +++ b/src/core/cm/launcher/launcher.cpp @@ -356,7 +356,14 @@ void Launcher::FailActivatingInstances() for (auto& instance : mInstanceManager.GetActiveInstances()) { if (instance->GetStatus().mState == aos::InstanceStateEnum::eActivating && instance->GetStatus().mType != UpdateItemTypeEnum::eComponent) { + const auto& instanceInfo = instance->GetInfo(); + // Keep node ID, because instance still scheduled, but node didn't send activating status. + LOG_ERR() << "Instance failed to activate" << Log::Field("instance", instanceInfo.mInstanceIdent) + << Log::Field("version", instanceInfo.mVersion) + << Log::Field("runtimeID", instanceInfo.mRuntimeID) + << Log::Field("manifestDigest", instanceInfo.mManifestDigest); + instance->SetError(AOS_ERROR_WRAP(ErrorEnum::eTimeout), false); } } From da68b7f19be363e01b5646c4168d88d1fa08e643 Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Tue, 17 Feb 2026 21:02:49 +0200 Subject: [PATCH 3/9] common: types: add update item type to item status Signed-off-by: Oleksandr Grytsov --- src/core/cm/imagemanager/imagemanager.cpp | 33 ++++++++++++------- src/core/cm/imagemanager/imagemanager.hpp | 3 +- src/core/cm/imagemanager/itf/storage.hpp | 1 + .../cm/imagemanager/tests/imagemanager.cpp | 29 ++++++++++++++++ .../cm/updatemanager/desiredstatushandler.cpp | 6 ++-- .../cm/updatemanager/tests/updatemanager.cpp | 30 ++++++++++------- .../cm/updatemanager/unitstatushandler.cpp | 6 ++-- src/core/common/types/unitstatus.hpp | 4 ++- 8 files changed, 83 insertions(+), 29 deletions(-) diff --git a/src/core/cm/imagemanager/imagemanager.cpp b/src/core/cm/imagemanager/imagemanager.cpp index 8fbd39e21..cd0019b18 100644 --- a/src/core/cm/imagemanager/imagemanager.cpp +++ b/src/core/cm/imagemanager/imagemanager.cpp @@ -124,6 +124,7 @@ Error ImageManager::DownloadUpdateItems(const Array& itemsInfo, for (size_t i = 0; i < itemsInfo.Size(); i++) { statuses[i].mItemID = itemsInfo[i].mItemID; + statuses[i].mType = itemsInfo[i].mType; statuses[i].mVersion = itemsInfo[i].mVersion; statuses[i].mState = ItemStateEnum::eDownloading; statuses[i].mError = ErrorEnum::eNone; @@ -213,6 +214,7 @@ Error ImageManager::InstallUpdateItems(const Array& itemsInfo, A for (size_t i = 0; i < itemsInfo.Size(); i++) { statuses[i].mItemID = itemsInfo[i].mItemID; + statuses[i].mType = itemsInfo[i].mType; statuses[i].mVersion = itemsInfo[i].mVersion; statuses[i].mState = ItemStateEnum::eInstalled; statuses[i].mError = ErrorEnum::eNone; @@ -311,6 +313,7 @@ Error ImageManager::GetUpdateItemsStatuses(Array& statuses) UpdateItemStatus status; status.mItemID = item.mItemID; + status.mType = item.mType; status.mVersion = item.mVersion; status.mState = item.mState; status.mError = ErrorEnum::eNone; @@ -635,7 +638,9 @@ Error ImageManager::RemovePendingItems(const Array& storedItems, Array } UpdateItemStatus status; + status.mItemID = storedItem.mItemID; + status.mType = storedItem.mType; status.mVersion = storedItem.mVersion; status.mState = ItemStateEnum::eRemoved; status.mError = ErrorEnum::eNone; @@ -644,7 +649,8 @@ Error ImageManager::RemovePendingItems(const Array& storedItems, Array LOG_ERR() << "Failed to add status to statuses array" << Log::Field(err); } - NotifyItemStatusChanged(storedItem.mItemID, storedItem.mVersion, ItemStateEnum::eRemoved, ErrorEnum::eNone); + NotifyItemStatusChanged( + storedItem.mItemID, storedItem.mType, storedItem.mVersion, ItemStateEnum::eRemoved, ErrorEnum::eNone); } return ErrorEnum::eNone; @@ -730,7 +736,8 @@ Error ImageManager::VerifyStoredItems(const Array& itemsInfo, Ar storedItem.mState = ItemStateEnum::eFailed; } - NotifyItemStatusChanged(storedItem.mItemID, storedItem.mVersion, ItemStateEnum::eFailed, err); + NotifyItemStatusChanged( + storedItem.mItemID, storedItem.mType, storedItem.mVersion, ItemStateEnum::eFailed, err); if (err == ErrorEnum::eCanceled) { return err; @@ -823,7 +830,8 @@ Error ImageManager::ProcessDownloadRequest(const Array& itemsInf } } - NotifyItemStatusChanged(itemInfo.mItemID, itemInfo.mVersion, ItemStateEnum::eDownloading, ErrorEnum::eNone); + NotifyItemStatusChanged( + itemInfo.mItemID, itemInfo.mType, itemInfo.mVersion, ItemStateEnum::eDownloading, ErrorEnum::eNone); auto downloadErr = DownloadItem(itemInfo, certificates, certificateChains); @@ -833,7 +841,7 @@ Error ImageManager::ProcessDownloadRequest(const Array& itemsInf LOG_ERR() << "Failed to update item state" << Log::Field(updateErr); } - NotifyItemStatusChanged(itemInfo.mItemID, itemInfo.mVersion, finalState, downloadErr); + NotifyItemStatusChanged(itemInfo.mItemID, itemInfo.mType, itemInfo.mVersion, finalState, downloadErr); if (!downloadErr.IsNone()) { LOG_ERR() << "Failed to download item" << Log::Field("id", itemInfo.mItemID) @@ -1409,7 +1417,7 @@ void ImageManager::NotifyItemsStatusesChanged(const Array& sta LockGuard lock {mMutex}; for (const auto& status : statuses) { - LOG_DBG() << "Item status changed" << Log::Field("itemID", status.mItemID) + LOG_DBG() << "Item status changed" << Log::Field("id", status.mItemID) << Log::Field("type", status.mType) << Log::Field("version", status.mVersion) << Log::Field("state", ItemState(status.mState)) << Log::Field("error", status.mError); } @@ -1420,13 +1428,14 @@ void ImageManager::NotifyItemsStatusesChanged(const Array& sta } void ImageManager::NotifyItemStatusChanged( - const String& itemID, const String& version, ItemStateEnum state, const Error& error) + const String& itemID, const UpdateItemType& type, const String& version, ItemStateEnum state, const Error& error) { StaticArray status; status.Resize(1); status[0].mItemID = itemID; + status[0].mType = type; status[0].mVersion = version; status[0].mState = state; status[0].mError = error; @@ -1694,7 +1703,8 @@ Error ImageManager::RemoveDifferentVersions(const Array& itemsIn << Log::Field("version", storedItem.mVersion) << Log::Field(err); } - NotifyItemStatusChanged(storedItem.mItemID, storedItem.mVersion, ItemStateEnum::eRemoved, ErrorEnum::eNone); + NotifyItemStatusChanged( + storedItem.mItemID, storedItem.mType, storedItem.mVersion, ItemStateEnum::eRemoved, ErrorEnum::eNone); } } @@ -1734,7 +1744,7 @@ Error ImageManager::VerifyBlobsIntegrity( LOG_ERR() << "Failed to remove invalid item" << Log::Field(removeErr); } - NotifyItemStatusChanged(itemInfo.mItemID, itemInfo.mVersion, ItemStateEnum::eFailed, err); + NotifyItemStatusChanged(itemInfo.mItemID, itemInfo.mType, itemInfo.mVersion, ItemStateEnum::eFailed, err); } } @@ -1759,8 +1769,8 @@ Error ImageManager::SetItemsToInstalled(const Array& itemsInfo, << Log::Field("version", storedIt->mVersion) << Log::Field(err); } - NotifyItemStatusChanged( - storedIt->mItemID, storedIt->mVersion, ItemStateEnum::eInstalled, ErrorEnum::eNone); + NotifyItemStatusChanged(storedIt->mItemID, storedIt->mType, storedIt->mVersion, + ItemStateEnum::eInstalled, ErrorEnum::eNone); } } } @@ -1797,7 +1807,8 @@ Error ImageManager::SetItemsToRemoved(const Array& itemsInfo, co << Log::Field("version", storedItem.mVersion) << Log::Field(err); } - NotifyItemStatusChanged(storedItem.mItemID, storedItem.mVersion, ItemStateEnum::eRemoved, ErrorEnum::eNone); + NotifyItemStatusChanged( + storedItem.mItemID, storedItem.mType, storedItem.mVersion, ItemStateEnum::eRemoved, ErrorEnum::eNone); } } diff --git a/src/core/cm/imagemanager/imagemanager.hpp b/src/core/cm/imagemanager/imagemanager.hpp index eedb4c5d7..13c8afef3 100644 --- a/src/core/cm/imagemanager/imagemanager.hpp +++ b/src/core/cm/imagemanager/imagemanager.hpp @@ -223,7 +223,8 @@ class ImageManager : public ImageManagerItf, public ItemInfoProviderItf, public Error VerifyBlobChecksum(const String& digest, const fs::FileInfo& fileInfo); bool IsBlobUsedByItems(const String& blobDigest, const Array& items); void NotifyItemsStatusesChanged(const Array& statuses); - void NotifyItemStatusChanged(const String& itemID, const String& version, ItemStateEnum state, const Error& error); + void NotifyItemStatusChanged(const String& itemID, const UpdateItemType& type, const String& version, + ItemStateEnum state, const Error& error); void RegisterOutdatedItems(const Array& items); bool StartAction(); void StopAction(); diff --git a/src/core/cm/imagemanager/itf/storage.hpp b/src/core/cm/imagemanager/itf/storage.hpp index 460a9bce9..bb033e80e 100644 --- a/src/core/cm/imagemanager/itf/storage.hpp +++ b/src/core/cm/imagemanager/itf/storage.hpp @@ -17,6 +17,7 @@ namespace aos::cm::imagemanager { */ struct ItemInfo { StaticString mItemID; + UpdateItemType mType; StaticString mVersion; StaticString mIndexDigest; ItemState mState {}; diff --git a/src/core/cm/imagemanager/tests/imagemanager.cpp b/src/core/cm/imagemanager/tests/imagemanager.cpp index 92cd917e6..0ce17fe0b 100644 --- a/src/core/cm/imagemanager/tests/imagemanager.cpp +++ b/src/core/cm/imagemanager/tests/imagemanager.cpp @@ -106,6 +106,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_EmptyList_RemovesPendingItems) EXPECT_CALL(mStorageMock, GetAllItemsInfos(_)).Times(2).WillRepeatedly(Invoke([](Array& items) { ItemInfo pendingItem1; pendingItem1.mItemID = "service1"; + pendingItem1.mType = UpdateItemTypeEnum::eService; pendingItem1.mVersion = "1.0.0"; pendingItem1.mIndexDigest = "sha256:abc123"; pendingItem1.mState = ItemStateEnum::ePending; @@ -113,6 +114,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_EmptyList_RemovesPendingItems) ItemInfo pendingItem2; pendingItem2.mItemID = "service2"; + pendingItem2.mType = UpdateItemTypeEnum::eService; pendingItem2.mVersion = "2.0.0"; pendingItem2.mIndexDigest = "sha256:def456"; pendingItem2.mState = ItemStateEnum::ePending; @@ -120,6 +122,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_EmptyList_RemovesPendingItems) ItemInfo installedItem; installedItem.mItemID = "service3"; + installedItem.mType = UpdateItemTypeEnum::eService; installedItem.mVersion = "3.0.0"; installedItem.mIndexDigest = "sha256:ghi789"; installedItem.mState = ItemStateEnum::eInstalled; @@ -157,10 +160,12 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_EmptyList_RemovesPendingItems) EXPECT_TRUE(err.IsNone()); ASSERT_EQ(statuses.Size(), 2); EXPECT_EQ(statuses[0].mItemID, "service1"); + EXPECT_EQ(statuses[0].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[0].mVersion, "1.0.0"); EXPECT_EQ(statuses[0].mState, ItemStateEnum::eRemoved); EXPECT_TRUE(statuses[0].mError.IsNone()); EXPECT_EQ(statuses[1].mItemID, "service2"); + EXPECT_EQ(statuses[1].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[1].mVersion, "2.0.0"); EXPECT_EQ(statuses[1].mState, ItemStateEnum::eRemoved); EXPECT_TRUE(statuses[1].mError.IsNone()); @@ -177,6 +182,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_Success_NewItem) UpdateItemInfo item; item.mItemID = "service1"; + item.mType = UpdateItemTypeEnum::eService; item.mVersion = "1.0.0"; item.mIndexDigest = "sha256:abc123"; itemsInfo.PushBack(item); @@ -277,6 +283,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_Success_NewItem) EXPECT_TRUE(err.IsNone()); ASSERT_EQ(statuses.Size(), 1); EXPECT_EQ(statuses[0].mItemID, item.mItemID); + EXPECT_EQ(statuses[0].mType, item.mType); EXPECT_EQ(statuses[0].mVersion, item.mVersion); EXPECT_EQ(statuses[0].mState, ItemStateEnum::ePending); EXPECT_EQ(lastState, ItemStateEnum::ePending); @@ -293,6 +300,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_AlreadyInstalled) UpdateItemInfo item; item.mItemID = "service1"; + item.mType = UpdateItemTypeEnum::eService; item.mVersion = "1.0.0"; item.mIndexDigest = "sha256:abc123"; itemsInfo.PushBack(item); @@ -384,6 +392,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_AlreadyInstalled) EXPECT_TRUE(err.IsNone()); ASSERT_EQ(statuses.Size(), 1); EXPECT_EQ(statuses[0].mItemID, item.mItemID); + EXPECT_EQ(statuses[0].mType, item.mType); EXPECT_EQ(statuses[0].mVersion, item.mVersion); EXPECT_EQ(statuses[0].mState, ItemStateEnum::eInstalled); } @@ -397,6 +406,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_BlobsAlreadyExistOnDisk) UpdateItemInfo item; item.mItemID = "service1"; + item.mType = UpdateItemTypeEnum::eService; item.mVersion = "1.0.0"; item.mIndexDigest = "sha256:aabb"; itemsInfo.PushBack(item); @@ -462,6 +472,7 @@ TEST_F(ImageManagerTest, DownloadUpdateItems_BlobsAlreadyExistOnDisk) EXPECT_TRUE(err.IsNone()); ASSERT_EQ(statuses.Size(), 1); EXPECT_EQ(statuses[0].mItemID, item.mItemID); + EXPECT_EQ(statuses[0].mType, item.mType); EXPECT_EQ(statuses[0].mVersion, item.mVersion); EXPECT_EQ(statuses[0].mState, ItemStateEnum::ePending); } @@ -922,6 +933,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_Success) UpdateItemInfo item; item.mItemID = "service1"; + item.mType = UpdateItemTypeEnum::eService; item.mVersion = "1.0.0"; item.mIndexDigest = "sha256:1111"; itemsInfo.PushBack(item); @@ -1003,6 +1015,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_Success) .WillRepeatedly(Invoke([&lastState](const Array& statuses) { ASSERT_EQ(statuses.Size(), 1); EXPECT_EQ(statuses[0].mItemID, "service1"); + EXPECT_EQ(statuses[0].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[0].mVersion, "1.0.0"); lastState = statuses[0].mState; })); @@ -1014,6 +1027,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_Success) EXPECT_TRUE(err.IsNone()); EXPECT_EQ(statuses.Size(), 1); EXPECT_EQ(statuses[0].mItemID, "service1"); + EXPECT_EQ(statuses[0].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[0].mVersion, "1.0.0"); EXPECT_EQ(statuses[0].mState, ItemStateEnum::eInstalled); EXPECT_TRUE(statuses[0].mError.IsNone()); @@ -1029,6 +1043,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_VerifyBlobsIntegrity_IndexNotFound) UpdateItemInfo item; item.mItemID = "service1"; + item.mType = UpdateItemTypeEnum::eService; item.mVersion = "1.0.0"; item.mIndexDigest = "sha256:abc123"; itemsInfo.PushBack(item); @@ -1038,6 +1053,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_VerifyBlobsIntegrity_IndexNotFound) .WillOnce(Invoke([](Array& items) { ItemInfo storedItem; storedItem.mItemID = "service1"; + storedItem.mType = UpdateItemTypeEnum::eService; storedItem.mVersion = "1.0.0"; storedItem.mIndexDigest = "sha256:abc123"; storedItem.mState = ItemStateEnum::ePending; @@ -1048,6 +1064,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_VerifyBlobsIntegrity_IndexNotFound) .WillOnce(Invoke([](Array& items) { ItemInfo storedItem; storedItem.mItemID = "service1"; + storedItem.mType = UpdateItemTypeEnum::eService; storedItem.mVersion = "1.0.0"; storedItem.mIndexDigest = "sha256:abc123"; storedItem.mState = ItemStateEnum::ePending; @@ -1073,6 +1090,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_VerifyBlobsIntegrity_IndexNotFound) EXPECT_TRUE(err.IsNone()); EXPECT_EQ(statuses.Size(), 1); EXPECT_EQ(statuses[0].mItemID, "service1"); + EXPECT_EQ(statuses[0].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[0].mVersion, "1.0.0"); EXPECT_EQ(statuses[0].mState, ItemStateEnum::eFailed); EXPECT_TRUE(!statuses[0].mError.IsNone()); @@ -1085,6 +1103,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_RemoveDifferentVersion) UpdateItemInfo item; item.mItemID = "service1"; + item.mType = UpdateItemTypeEnum::eService; item.mVersion = "2.0.0"; item.mIndexDigest = "sha256:4444"; itemsInfo.PushBack(item); @@ -1094,6 +1113,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_RemoveDifferentVersion) .WillOnce(Invoke([](Array& items) { ItemInfo oldItem; oldItem.mItemID = "service1"; + oldItem.mType = UpdateItemTypeEnum::eService; oldItem.mVersion = "1.0.0"; oldItem.mIndexDigest = "sha256:1111"; oldItem.mState = ItemStateEnum::eInstalled; @@ -1104,6 +1124,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_RemoveDifferentVersion) .WillOnce(Invoke([](Array& items) { ItemInfo newItem; newItem.mItemID = "service1"; + newItem.mType = UpdateItemTypeEnum::eService; newItem.mVersion = "2.0.0"; newItem.mIndexDigest = "sha256:4444"; newItem.mState = ItemStateEnum::ePending; @@ -1114,6 +1135,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_RemoveDifferentVersion) .WillOnce(Invoke([](Array& items) { ItemInfo newItem; newItem.mItemID = "service1"; + newItem.mType = UpdateItemTypeEnum::eService; newItem.mVersion = "2.0.0"; newItem.mIndexDigest = "sha256:4444"; newItem.mState = ItemStateEnum::ePending; @@ -1124,6 +1146,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_RemoveDifferentVersion) .WillOnce(Invoke([](Array& items) { ItemInfo newItem; newItem.mItemID = "service1"; + newItem.mType = UpdateItemTypeEnum::eService; newItem.mVersion = "2.0.0"; newItem.mIndexDigest = "sha256:4444"; newItem.mState = ItemStateEnum::eInstalled; @@ -1203,6 +1226,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_RemoveDifferentVersion) EXPECT_TRUE(err.IsNone()); EXPECT_EQ(statuses.Size(), 1); EXPECT_EQ(statuses[0].mItemID, "service1"); + EXPECT_EQ(statuses[0].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[0].mVersion, "2.0.0"); EXPECT_EQ(statuses[0].mState, ItemStateEnum::eInstalled); EXPECT_TRUE(statuses[0].mError.IsNone()); @@ -1371,6 +1395,7 @@ TEST_F(ImageManagerTest, InstallUpdateItems_SetItemsToRemoved) EXPECT_TRUE(err.IsNone()); EXPECT_EQ(statuses.Size(), 1); EXPECT_EQ(statuses[0].mItemID, "service2"); + EXPECT_EQ(statuses[0].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[0].mVersion, "1.0.0"); EXPECT_EQ(statuses[0].mState, ItemStateEnum::eInstalled); EXPECT_TRUE(statuses[0].mError.IsNone()); @@ -1766,12 +1791,14 @@ TEST_F(ImageManagerTest, GetUpdateItemsStatuses_Success) ItemInfo item1; item1.mItemID = "service1"; + item1.mType = UpdateItemTypeEnum::eService; item1.mVersion = "1.0.0"; item1.mState = ItemStateEnum::eInstalled; items.PushBack(item1); ItemInfo item2; item2.mItemID = "service2"; + item2.mType = UpdateItemTypeEnum::eService; item2.mVersion = "2.0.0"; item2.mState = ItemStateEnum::ePending; items.PushBack(item2); @@ -1785,10 +1812,12 @@ TEST_F(ImageManagerTest, GetUpdateItemsStatuses_Success) ASSERT_EQ(statuses.Size(), 2); EXPECT_EQ(statuses[0].mItemID, "service1"); + EXPECT_EQ(statuses[0].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[0].mVersion, "1.0.0"); EXPECT_EQ(statuses[0].mState, ItemStateEnum::eInstalled); EXPECT_EQ(statuses[1].mItemID, "service2"); + EXPECT_EQ(statuses[1].mType, UpdateItemTypeEnum::eService); EXPECT_EQ(statuses[1].mVersion, "2.0.0"); EXPECT_EQ(statuses[1].mState, ItemStateEnum::ePending); } diff --git a/src/core/cm/updatemanager/desiredstatushandler.cpp b/src/core/cm/updatemanager/desiredstatushandler.cpp index 6286a2b45..7444e2d74 100644 --- a/src/core/cm/updatemanager/desiredstatushandler.cpp +++ b/src/core/cm/updatemanager/desiredstatushandler.cpp @@ -315,7 +315,8 @@ Error DesiredStatusHandler::DownloadUpdateItems() for (const auto& itemStatus : *itemsStatuses) { if (itemStatus.mState == ItemStateEnum::eFailed) { LOG_ERR() << "Failed to download update item" << Log::Field("id", itemStatus.mItemID) - << Log::Field("version", itemStatus.mVersion) << Log::Field(itemStatus.mError); + << Log::Field("type", itemStatus.mType) << Log::Field("version", itemStatus.mVersion) + << Log::Field(itemStatus.mError); } } @@ -440,7 +441,8 @@ Error DesiredStatusHandler::FinalizeUpdate() for (const auto& itemStatus : *itemsStatuses) { if (itemStatus.mState == ItemStateEnum::eFailed) { LOG_ERR() << "Failed to install update item" << Log::Field("id", itemStatus.mItemID) - << Log::Field("version", itemStatus.mVersion) << Log::Field(itemStatus.mError); + << Log::Field("type", itemStatus.mType) << Log::Field("version", itemStatus.mVersion) + << Log::Field(itemStatus.mError); } } diff --git a/src/core/cm/updatemanager/tests/updatemanager.cpp b/src/core/cm/updatemanager/tests/updatemanager.cpp index 464e91799..a0386c67b 100644 --- a/src/core/cm/updatemanager/tests/updatemanager.cpp +++ b/src/core/cm/updatemanager/tests/updatemanager.cpp @@ -102,8 +102,8 @@ void ChangeNodeInfo(UnitStatus& unitStatus, const String& nodeID, const String& SetNodeInfo(*it, nodeID, nodeType, state, isConnected, error); } -void CreateUpdateItemStatus(UnitStatus& unitStatus, const String& itemID, const String& version, - const ItemState& state = ItemStateEnum::eInstalled) +void CreateUpdateItemStatus(UnitStatus& unitStatus, const String& itemID, const UpdateItemType& type, + const String& version, const ItemState& state = ItemStateEnum::eInstalled) { if (!unitStatus.mUpdateItems.HasValue()) { unitStatus.mUpdateItems.EmplaceValue(); @@ -114,6 +114,7 @@ void CreateUpdateItemStatus(UnitStatus& unitStatus, const String& itemID, const auto& itemStatus = unitStatus.mUpdateItems->Back(); itemStatus.mItemID = itemID; + itemStatus.mType = type; itemStatus.mVersion = version; itemStatus.mState = state; } @@ -476,8 +477,8 @@ TEST_F(UpdateManagerTest, SendUnitStatusOnCloudConnect) // Set update items - CreateUpdateItemStatus(*expectedUnitStatus, "item1", "1.0.0"); - CreateUpdateItemStatus(*expectedUnitStatus, "item2", "1.0.0"); + CreateUpdateItemStatus(*expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "1.0.0"); + CreateUpdateItemStatus(*expectedUnitStatus, "item2", UpdateItemTypeEnum::eService, "1.0.0"); EXPECT_CALL(mImageManagerMock, GetUpdateItemsStatuses(_)) .WillOnce(DoAll(SetArgReferee<0>(expectedUnitStatus->mUpdateItems.GetValue()), Return(ErrorEnum::eNone))); @@ -562,8 +563,10 @@ TEST_F(UpdateManagerTest, SendDeltaUnitStatus) expectedUnitStatus->mIsDeltaInfo = true; - CreateUpdateItemStatus(*expectedUnitStatus, "item3", "1.0.0", ItemStateEnum::eInstalling); - CreateUpdateItemStatus(*expectedUnitStatus, "item4", "1.0.0", ItemStateEnum::eInstalling); + CreateUpdateItemStatus( + *expectedUnitStatus, "item3", UpdateItemTypeEnum::eService, "1.0.0", ItemStateEnum::eInstalling); + CreateUpdateItemStatus( + *expectedUnitStatus, "item4", UpdateItemTypeEnum::eService, "1.0.0", ItemStateEnum::eInstalling); // Notify items statuses changed @@ -732,9 +735,12 @@ TEST_F(UpdateManagerTest, ProcessFullDesiredStatus) // Set expected update items status - CreateUpdateItemStatus(*expectedUnitStatus, "item1", "1.0.0", ItemStateEnum::eInstalled); - CreateUpdateItemStatus(*expectedUnitStatus, "item2", "1.0.0", ItemStateEnum::eInstalled); - CreateUpdateItemStatus(*expectedUnitStatus, "item3", "1.0.0", ItemStateEnum::eInstalled); + CreateUpdateItemStatus( + *expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "1.0.0", ItemStateEnum::eInstalled); + CreateUpdateItemStatus( + *expectedUnitStatus, "item2", UpdateItemTypeEnum::eService, "1.0.0", ItemStateEnum::eInstalled); + CreateUpdateItemStatus( + *expectedUnitStatus, "item3", UpdateItemTypeEnum::eService, "1.0.0", ItemStateEnum::eInstalled); // Set expected instances statuses @@ -814,7 +820,8 @@ TEST_F(UpdateManagerTest, CancelCurrentUpdate) // Set desired update items CreateUpdateItemInfo(*desiredStatus, "item1", UpdateItemTypeEnum::eService, "1.0.0"); - CreateUpdateItemStatus(*expectedUnitStatus, "item1", "1.0.0", ItemStateEnum::eInstalled); + CreateUpdateItemStatus( + *expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "1.0.0", ItemStateEnum::eInstalled); // Set desired instances @@ -950,7 +957,8 @@ TEST_F(UpdateManagerTest, ResumeUpdateAfterRestart) mConnectionListener->OnConnect(); EXPECT_EQ(mSenderStub.WaitSendUnitStatus(), *expectedUnitStatus); - CreateUpdateItemStatus(*expectedUnitStatus, "item1", "1.0.0", ItemStateEnum::eInstalled); + CreateUpdateItemStatus( + *expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "1.0.0", ItemStateEnum::eInstalled); CreateInstancesStatuses(*expectedUnitStatus, "item1", "subject1", "1.0.0", 2); // Create launcher run request diff --git a/src/core/cm/updatemanager/unitstatushandler.cpp b/src/core/cm/updatemanager/unitstatushandler.cpp index e219a67cc..4f267bf46 100644 --- a/src/core/cm/updatemanager/unitstatushandler.cpp +++ b/src/core/cm/updatemanager/unitstatushandler.cpp @@ -225,7 +225,7 @@ void UnitStatusHandler::OnItemsStatusesChanged(const Array& st LockGuard lock {mMutex}; for (const auto& status : statuses) { - LOG_DBG() << "Item status changed" << Log::Field("itemID", status.mItemID) + LOG_DBG() << "Item status changed" << Log::Field("id", status.mItemID) << Log::Field("type", status.mType) << Log::Field("version", status.mVersion) << Log::Field("state", status.mState) << Log::Field(status.mError); } @@ -502,8 +502,8 @@ void UnitStatusHandler::LogUnitStatus() if (mUnitStatus.mUpdateItems.HasValue()) { for (const auto& itemStatus : *mUnitStatus.mUpdateItems) { LOG_INF() << "Unit status update item" << Log::Field("id", itemStatus.mItemID) - << Log::Field("version", itemStatus.mVersion) << Log::Field("state", itemStatus.mState) - << Log::Field(itemStatus.mError); + << Log::Field("type", itemStatus.mType) << Log::Field("version", itemStatus.mVersion) + << Log::Field("state", itemStatus.mState) << Log::Field(itemStatus.mError); } } diff --git a/src/core/common/types/unitstatus.hpp b/src/core/common/types/unitstatus.hpp index 874b0b244..089f68766 100644 --- a/src/core/common/types/unitstatus.hpp +++ b/src/core/common/types/unitstatus.hpp @@ -53,6 +53,7 @@ using UnitNodeInfoArray = StaticArray; */ struct UpdateItemStatus { StaticString mItemID; + UpdateItemType mType; StaticString mVersion; ItemState mState; Error mError; @@ -65,7 +66,8 @@ struct UpdateItemStatus { */ bool operator==(const UpdateItemStatus& rhs) const { - return mItemID == rhs.mItemID && mVersion == rhs.mVersion && mState == rhs.mState && mError == rhs.mError; + return mItemID == rhs.mItemID && mType == rhs.mType && mVersion == rhs.mVersion && mState == rhs.mState + && mError == rhs.mError; } /** From 589249ad8f98be06fd385b14136d12d4dfd46c09 Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Tue, 17 Feb 2026 21:46:28 +0200 Subject: [PATCH 4/9] common: types: add update item type to UnitInstancesStatuses Signed-off-by: Oleksandr Grytsov --- .../cm/updatemanager/tests/updatemanager.cpp | 31 ++++++++++++------- .../cm/updatemanager/unitstatushandler.cpp | 4 +-- src/core/common/types/unitstatus.hpp | 7 +++-- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/core/cm/updatemanager/tests/updatemanager.cpp b/src/core/cm/updatemanager/tests/updatemanager.cpp index a0386c67b..a8e5ab802 100644 --- a/src/core/cm/updatemanager/tests/updatemanager.cpp +++ b/src/core/cm/updatemanager/tests/updatemanager.cpp @@ -130,8 +130,9 @@ void ChangeUpdateItemStatus(UnitStatus& unitStatus, const String& itemID, const it->mState = state; } -void CreateInstancesStatuses(UnitStatus& unitStatus, const String& itemID, const String& subjectID, - const String& version, size_t numInstances, const InstanceState& state = InstanceStateEnum::eActive) +void CreateInstancesStatuses(UnitStatus& unitStatus, const String& itemID, const UpdateItemType& type, + const String& subjectID, const String& version, size_t numInstances, + const InstanceState& state = InstanceStateEnum::eActive) { if (!unitStatus.mInstances.HasValue()) { @@ -143,6 +144,7 @@ void CreateInstancesStatuses(UnitStatus& unitStatus, const String& itemID, const auto& instancesStatuses = unitStatus.mInstances->Back(); instancesStatuses.mItemID = itemID; + instancesStatuses.mType = type; instancesStatuses.mSubjectID = subjectID; instancesStatuses.mVersion = version; @@ -288,6 +290,7 @@ void ConvertInstancesStatuses( InstanceStatus status; status.mItemID = unitInstanceStatus.mItemID; + status.mType = unitInstanceStatus.mType; status.mSubjectID = unitInstanceStatus.mSubjectID; status.mVersion = unitInstanceStatus.mVersion; status.mInstance = instanceStatus.mInstance; @@ -479,15 +482,17 @@ TEST_F(UpdateManagerTest, SendUnitStatusOnCloudConnect) CreateUpdateItemStatus(*expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "1.0.0"); CreateUpdateItemStatus(*expectedUnitStatus, "item2", UpdateItemTypeEnum::eService, "1.0.0"); + CreateUpdateItemStatus(*expectedUnitStatus, "item3", UpdateItemTypeEnum::eComponent, "1.0.0"); EXPECT_CALL(mImageManagerMock, GetUpdateItemsStatuses(_)) .WillOnce(DoAll(SetArgReferee<0>(expectedUnitStatus->mUpdateItems.GetValue()), Return(ErrorEnum::eNone))); // Set instances statuses - CreateInstancesStatuses(*expectedUnitStatus, "item1", "subject1", "1.0.0", 2); - CreateInstancesStatuses(*expectedUnitStatus, "item2", "subject1", "1.0.0", 1); - CreateInstancesStatuses(*expectedUnitStatus, "item2", "subject2", "1.0.0", 3); + CreateInstancesStatuses(*expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "subject1", "1.0.0", 2); + CreateInstancesStatuses(*expectedUnitStatus, "item2", UpdateItemTypeEnum::eService, "subject1", "1.0.0", 1); + CreateInstancesStatuses(*expectedUnitStatus, "item2", UpdateItemTypeEnum::eService, "subject2", "1.0.0", 3); + CreateInstancesStatuses(*expectedUnitStatus, "item3", UpdateItemTypeEnum::eComponent, "subject3", "1.0.0", 1); EXPECT_CALL(mLauncherMock, GetInstancesStatuses(_)).WillOnce(Invoke([&](Array& instances) { ConvertInstancesStatuses(expectedUnitStatus->mInstances.GetValue(), instances); @@ -587,8 +592,10 @@ TEST_F(UpdateManagerTest, SendDeltaUnitStatus) expectedUnitStatus->mIsDeltaInfo = true; - CreateInstancesStatuses(*expectedUnitStatus, "item1", "subject1", "1.0.0", 4, InstanceStateEnum::eActivating); - CreateInstancesStatuses(*expectedUnitStatus, "item2", "subject1", "1.0.0", 3, InstanceStateEnum::eActivating); + CreateInstancesStatuses(*expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "subject1", "1.0.0", 4, + InstanceStateEnum::eActivating); + CreateInstancesStatuses(*expectedUnitStatus, "item2", UpdateItemTypeEnum::eService, "subject1", "1.0.0", 3, + InstanceStateEnum::eActivating); auto statuses = std::make_unique>(); @@ -744,9 +751,9 @@ TEST_F(UpdateManagerTest, ProcessFullDesiredStatus) // Set expected instances statuses - CreateInstancesStatuses(*expectedUnitStatus, "item1", "subject1", "1.0.0", 1); - CreateInstancesStatuses(*expectedUnitStatus, "item2", "subject2", "1.0.0", 2); - CreateInstancesStatuses(*expectedUnitStatus, "item3", "subject3", "1.0.0", 3); + CreateInstancesStatuses(*expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "subject1", "1.0.0", 1); + CreateInstancesStatuses(*expectedUnitStatus, "item2", UpdateItemTypeEnum::eService, "subject2", "1.0.0", 2); + CreateInstancesStatuses(*expectedUnitStatus, "item3", UpdateItemTypeEnum::eService, "subject3", "1.0.0", 3); EXPECT_CALL(mNodeHandlerMock, PauseNode(String("node1"))).Times(1); EXPECT_CALL(mNodeHandlerMock, ResumeNode(String("node2"))).Times(1); @@ -875,7 +882,7 @@ TEST_F(UpdateManagerTest, CancelCurrentUpdate) // Set expected instances statuses - CreateInstancesStatuses(*expectedUnitStatus, "item1", "subject1", "1.0.0", 2); + CreateInstancesStatuses(*expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "subject1", "1.0.0", 2); // Create launcher run request @@ -959,7 +966,7 @@ TEST_F(UpdateManagerTest, ResumeUpdateAfterRestart) CreateUpdateItemStatus( *expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "1.0.0", ItemStateEnum::eInstalled); - CreateInstancesStatuses(*expectedUnitStatus, "item1", "subject1", "1.0.0", 2); + CreateInstancesStatuses(*expectedUnitStatus, "item1", UpdateItemTypeEnum::eService, "subject1", "1.0.0", 2); // Create launcher run request diff --git a/src/core/cm/updatemanager/unitstatushandler.cpp b/src/core/cm/updatemanager/unitstatushandler.cpp index 4f267bf46..756cb88f2 100644 --- a/src/core/cm/updatemanager/unitstatushandler.cpp +++ b/src/core/cm/updatemanager/unitstatushandler.cpp @@ -286,7 +286,7 @@ void UnitStatusHandler::OnInstancesStatusesChanged(const Array& }); if (itemIt == mUnitStatus.mInstances->end()) { if (auto err = mUnitStatus.mInstances->EmplaceBack( - status.mItemID, status.mSubjectID, status.mVersion, status.mPreinstalled); + status.mItemID, status.mType, status.mSubjectID, status.mVersion, status.mPreinstalled); !err.IsNone()) { LOG_ERR() << "Failed to emplace instances statuses" << Log::Field(err); return; @@ -454,7 +454,7 @@ Error UnitStatusHandler::SetInstancesStatus() }); if (it == mUnitStatus.mInstances->end()) { if (auto err = mUnitStatus.mInstances->EmplaceBack( - status.mItemID, status.mSubjectID, status.mVersion, status.mPreinstalled); + status.mItemID, status.mType, status.mSubjectID, status.mVersion, status.mPreinstalled); !err.IsNone()) { return AOS_ERROR_WRAP(err); } diff --git a/src/core/common/types/unitstatus.hpp b/src/core/common/types/unitstatus.hpp index 089f68766..43a851016 100644 --- a/src/core/common/types/unitstatus.hpp +++ b/src/core/common/types/unitstatus.hpp @@ -115,6 +115,7 @@ using UnitInstanceStatusArray = StaticArray mItemID; + UpdateItemType mType; StaticString mSubjectID; StaticString mVersion; bool mPreinstalled {}; @@ -133,8 +134,10 @@ struct UnitInstancesStatuses { * @param version update item version. * @param preinstalled preinstalled flag. */ - UnitInstancesStatuses(const String& itemID, const String& subjectID, const String& version, bool preinstalled) + UnitInstancesStatuses(const String& itemID, const UpdateItemType& type, const String& subjectID, + const String& version, bool preinstalled) : mItemID(itemID) + , mType(type) , mSubjectID(subjectID) , mVersion(version) , mPreinstalled(preinstalled) @@ -149,7 +152,7 @@ struct UnitInstancesStatuses { */ bool operator==(const UnitInstancesStatuses& rhs) const { - return mItemID == rhs.mItemID && mSubjectID == rhs.mSubjectID && mVersion == rhs.mVersion + return mItemID == rhs.mItemID && mType == rhs.mType && mSubjectID == rhs.mSubjectID && mVersion == rhs.mVersion && mPreinstalled == rhs.mPreinstalled && mInstances == rhs.mInstances; } From 6747ddfe0fe94b6f26f92e6ad5387c2cbf24df5e Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Thu, 19 Feb 2026 20:21:02 +0200 Subject: [PATCH 5/9] common: tools: change param order in FSPlatformItf::SetUserQuota Signed-off-by: Oleksandr Grytsov --- src/core/cm/storagestate/storagestate.cpp | 6 +++--- src/core/cm/storagestate/tests/storagestate.cpp | 12 ++++++------ src/core/common/tests/mocks/fsmock.hpp | 2 +- src/core/common/tools/fs.hpp | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/core/cm/storagestate/storagestate.cpp b/src/core/cm/storagestate/storagestate.cpp index 4357f97b8..c9f43117b 100644 --- a/src/core/cm/storagestate/storagestate.cpp +++ b/src/core/cm/storagestate/storagestate.cpp @@ -547,7 +547,7 @@ Error StorageState::SetQuotas(const SetupParams& setupParams) if (mStateAndStorageOnSamePartition) { if (auto err = mFSPlatform->SetUserQuota( - mConfig.mStorageDir, setupParams.mStorageQuota + setupParams.mStateQuota, setupParams.mUID); + mConfig.mStorageDir, setupParams.mUID, setupParams.mStorageQuota + setupParams.mStateQuota); !err.IsNone()) { return AOS_ERROR_WRAP(err); } @@ -555,12 +555,12 @@ Error StorageState::SetQuotas(const SetupParams& setupParams) return ErrorEnum::eNone; } - if (auto err = mFSPlatform->SetUserQuota(mConfig.mStateDir, setupParams.mStateQuota, setupParams.mUID); + if (auto err = mFSPlatform->SetUserQuota(mConfig.mStateDir, setupParams.mUID, setupParams.mStateQuota); !err.IsNone()) { return AOS_ERROR_WRAP(err); } - if (auto err = mFSPlatform->SetUserQuota(mConfig.mStorageDir, setupParams.mStorageQuota, setupParams.mUID); + if (auto err = mFSPlatform->SetUserQuota(mConfig.mStorageDir, setupParams.mUID, setupParams.mStorageQuota); !err.IsNone()) { return AOS_ERROR_WRAP(err); } diff --git a/src/core/cm/storagestate/tests/storagestate.cpp b/src/core/cm/storagestate/tests/storagestate.cpp index 9398b5fe8..051620036 100644 --- a/src/core/cm/storagestate/tests/storagestate.cpp +++ b/src/core/cm/storagestate/tests/storagestate.cpp @@ -289,7 +289,7 @@ TEST_F(StorageStateTests, StorageQuotaNotSet) StaticString storagePath, statePath; - EXPECT_CALL(mFSPlatformMock, SetUserQuota(_, setupParams.mStateQuota, setupParams.mUID)).Times(1); + EXPECT_CALL(mFSPlatformMock, SetUserQuota(_, setupParams.mUID, setupParams.mStateQuota)).Times(1); auto err = mStorageState.Init(mConfig, mStorageStub, mSenderMock, mFSPlatformMock, mFSWatcherMock, mCryptoProvider); EXPECT_TRUE(err.IsNone()) << "Failed to initialize storage state: " << tests::utils::ErrorToStr(err); @@ -323,7 +323,7 @@ TEST_F(StorageStateTests, StateQuotaNotSet) err = mStorageState.Start(); EXPECT_TRUE(err.IsNone()) << "Failed to start storage state: " << tests::utils::ErrorToStr(err); - EXPECT_CALL(mFSPlatformMock, SetUserQuota(_, setupParams.mStorageQuota, setupParams.mUID)).Times(1); + EXPECT_CALL(mFSPlatformMock, SetUserQuota(_, setupParams.mUID, setupParams.mStorageQuota)).Times(1); EXPECT_CALL(mSenderMock, SendStateRequest).Times(0); EXPECT_CALL(mFSWatcherMock, Subscribe).Times(0); @@ -382,10 +382,10 @@ TEST_F(StorageStateTests, SetupOnDifferentPartitions) EXPECT_TRUE(err.IsNone()) << "Failed to start storage state: " << tests::utils::ErrorToStr(err); EXPECT_CALL( - mFSPlatformMock, SetUserQuota(String(cStorageDir.c_str()), cSetupParams.mStorageQuota, cSetupParams.mUID)) + mFSPlatformMock, SetUserQuota(String(cStorageDir.c_str()), cSetupParams.mUID, cSetupParams.mStorageQuota)) .WillOnce(Return(ErrorEnum::eNone)); - EXPECT_CALL(mFSPlatformMock, SetUserQuota(String(cStateDir.c_str()), cSetupParams.mStateQuota, cSetupParams.mUID)) + EXPECT_CALL(mFSPlatformMock, SetUserQuota(String(cStateDir.c_str()), cSetupParams.mUID, cSetupParams.mStateQuota)) .WillOnce(Return(ErrorEnum::eNone)); EXPECT_CALL(mSenderMock, SendStateRequest).WillOnce(Return(ErrorEnum::eNone)); @@ -455,8 +455,8 @@ TEST_F(StorageStateTests, SetupSameInstance) if (testParam.mExpectSetQuota) { EXPECT_CALL(mFSPlatformMock, - SetUserQuota(_, testParam.mSetupParams.mStateQuota + testParam.mSetupParams.mStorageQuota, - testParam.mSetupParams.mUID)) + SetUserQuota(_, testParam.mSetupParams.mUID, + testParam.mSetupParams.mStateQuota + testParam.mSetupParams.mStorageQuota)) .WillOnce(Return(ErrorEnum::eNone)); } diff --git a/src/core/common/tests/mocks/fsmock.hpp b/src/core/common/tests/mocks/fsmock.hpp index 0b1fb5ebd..57408ae2d 100644 --- a/src/core/common/tests/mocks/fsmock.hpp +++ b/src/core/common/tests/mocks/fsmock.hpp @@ -22,7 +22,7 @@ class FSPlatformMock : public fs::FSPlatformItf { MOCK_METHOD(RetWithError, GetTotalSize, (const String& dir), (const, override)); MOCK_METHOD(RetWithError, GetDirSize, (const String& dir), (const, override)); MOCK_METHOD(RetWithError, GetAvailableSize, (const String& dir), (const, override)); - MOCK_METHOD(Error, SetUserQuota, (const String& path, size_t quota, size_t uid), (const, override)); + MOCK_METHOD(Error, SetUserQuota, (const String& path, uid_t uid, size_t quota), (const, override)); MOCK_METHOD(Error, ChangeOwner, (const String& path, uint32_t uid, uint32_t gid), (const, override)); MOCK_METHOD(RetWithError>, GetBlockDevice, (const String& path), (const, override)); }; diff --git a/src/core/common/tools/fs.hpp b/src/core/common/tools/fs.hpp index 64505e4e0..15cd37ca0 100644 --- a/src/core/common/tools/fs.hpp +++ b/src/core/common/tools/fs.hpp @@ -72,11 +72,11 @@ class FSPlatformItf { * Sets user quota for the given path. * * @param path path to set quota for. - * @param quota quota size in bytes. * @param uid user ID. + * @param quota quota size in bytes. * @return Error. */ - virtual Error SetUserQuota(const String& path, size_t quota, size_t uid) const = 0; + virtual Error SetUserQuota(const String& path, uid_t uid, size_t quota) const = 0; /** * Changes the owner of a file or directory. From 47b2b4543209ccf301b51bf072b78957b9b075fb Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Thu, 19 Feb 2026 20:22:10 +0200 Subject: [PATCH 6/9] ci: move static analysis at first place Static analysis doesn't require build and could be performed first to fail as soon as any issue detected. Signed-off-by: Oleksandr Grytsov --- .github/workflows/build-test.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-test.yaml b/.github/workflows/build-test.yaml index dbc64b253..9047c54fe 100644 --- a/.github/workflows/build-test.yaml +++ b/.github/workflows/build-test.yaml @@ -41,6 +41,10 @@ jobs: repository: ${{github.event.pull_request.head.repo.full_name}} fetch-depth: 0 + - name: Static analysis + run: | + ./build.sh lint + - name: Install build wrapper uses: SonarSource/sonarqube-scan-action/install-build-wrapper@v6 @@ -56,10 +60,6 @@ jobs: run: | ./build.sh coverage - - name: Static analysis - run: | - ./build.sh lint - - name: Upload codecov report uses: codecov/codecov-action@v4 with: From 037e075dda3fcd75fd655b961e9e93afdf3eae64 Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Fri, 20 Feb 2026 18:22:09 +0200 Subject: [PATCH 7/9] cm: updatemanager: add missing start timer on unit config status change Signed-off-by: Oleksandr Grytsov --- src/core/cm/updatemanager/unitstatushandler.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/cm/updatemanager/unitstatushandler.cpp b/src/core/cm/updatemanager/unitstatushandler.cpp index 756cb88f2..60c197b21 100644 --- a/src/core/cm/updatemanager/unitstatushandler.cpp +++ b/src/core/cm/updatemanager/unitstatushandler.cpp @@ -161,6 +161,8 @@ Error UnitStatusHandler::SetUpdateUnitConfigStatus(const UnitConfigStatus& statu return AOS_ERROR_WRAP(err); } + StartTimer(); + return ErrorEnum::eNone; } From 81ede368a711da78bf70f9e50e9182501ab88fcf Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Fri, 20 Feb 2026 18:22:52 +0200 Subject: [PATCH 8/9] cm: updatemanager: fix triggering delta unit status Fix triggering delta unit status OnInstancesStatusesChanged. We should not trigger delta unit status if not connected to cloud OR if status array is empty. Signed-off-by: Oleksandr Grytsov --- src/core/cm/updatemanager/unitstatushandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/cm/updatemanager/unitstatushandler.cpp b/src/core/cm/updatemanager/unitstatushandler.cpp index 60c197b21..cb5dc4f66 100644 --- a/src/core/cm/updatemanager/unitstatushandler.cpp +++ b/src/core/cm/updatemanager/unitstatushandler.cpp @@ -273,7 +273,7 @@ void UnitStatusHandler::OnInstancesStatusesChanged(const Array& << Log::Field("state", status.mState) << Log::Field(status.mError); } - if (!mCloudConnected && statuses.Size() == 0) { + if (!mCloudConnected || statuses.Size() == 0) { return; } From 6329174d51580d54d0c4acc4f5d54b54119c2e69 Mon Sep 17 00:00:00 2001 From: Oleksandr Grytsov Date: Fri, 20 Feb 2026 18:25:55 +0200 Subject: [PATCH 9/9] cm: unitconfig: get node type to proper select node config Unit config can contain config for specific node type. We should pass node type to FindNodeConfig function. Signed-off-by: Oleksandr Grytsov --- src/core/cm/unitconfig/tests/unitconfig.cpp | 16 +++++++++++----- src/core/cm/unitconfig/unitconfig.cpp | 16 +++++++++++++--- src/core/cm/unitconfig/unitconfig.hpp | 4 +++- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/core/cm/unitconfig/tests/unitconfig.cpp b/src/core/cm/unitconfig/tests/unitconfig.cpp index 94658bbe2..a13662159 100644 --- a/src/core/cm/unitconfig/tests/unitconfig.cpp +++ b/src/core/cm/unitconfig/tests/unitconfig.cpp @@ -83,7 +83,7 @@ class UnitConfigTest : public Test { return config; } - aos::UnitConfig CreateTestUnitConfigWithNodeID(const String& version = "1.0.0", const String& nodeID = "node0") + aos::UnitConfig CreateTestUnitConfigWithNodeID(const String& version = "1.0.0", const String& nodeID = cTestNodeID) { aos::UnitConfig config; config.mVersion = version; @@ -96,10 +96,10 @@ class UnitConfigTest : public Test { return config; } - UnitNodeInfo CreateTestNodeInfo() + UnitNodeInfo CreateTestNodeInfo(const String& nodeID = cTestNodeID) { UnitNodeInfo nodeInfo; - nodeInfo.mNodeID = cTestNodeID; + nodeInfo.mNodeID = nodeID; nodeInfo.mNodeType = cTestNodeType; return nodeInfo; } @@ -257,20 +257,22 @@ TEST_F(UnitConfigTest, CheckUnitConfigValidVersion) { CreateTestConfigFile(cNode0TestUnitConfig); - auto config = CreateTestUnitConfigWithNodeID("1.0.0", cTestNodeID); + auto config = CreateTestUnitConfigWithNodeID("1.0.0"); EXPECT_CALL(mJSONProvider, UnitConfigFromJSON(_, _)) .WillOnce(DoAll(SetArgReferee<1>(config), Return(ErrorEnum::eNone))); ASSERT_TRUE(mUnitConfig.Init({cTestConfigFile}, mNodeInfoProvider, mNodeConfigHandler, mJSONProvider).IsNone()); - auto newUnitConfig = CreateTestUnitConfigWithNodeID("2.0.0", cTestNodeID); + auto newUnitConfig = CreateTestUnitConfigWithNodeID("2.0.0"); StaticArray, cMaxNumNodes> nodeIds; nodeIds.PushBack(cTestNodeID); EXPECT_CALL(mNodeInfoProvider, GetAllNodeIDs(_)) .WillOnce(DoAll(SetArgReferee<0>(nodeIds), Return(ErrorEnum::eNone))); + EXPECT_CALL(mNodeInfoProvider, GetNodeInfo(String(cTestNodeID), _)) + .WillOnce(DoAll(SetArgReferee<1>(CreateTestNodeInfo()), Return(ErrorEnum::eNone))); NodeConfigStatus nodeConfigStatus; nodeConfigStatus.mVersion = "1.0.0"; @@ -459,6 +461,10 @@ TEST_F(UnitConfigTest, CheckUnitConfigMultipleNodes) EXPECT_CALL(mNodeInfoProvider, GetAllNodeIDs(_)) .WillOnce(DoAll(SetArgReferee<0>(nodeIds), Return(ErrorEnum::eNone))); + EXPECT_CALL(mNodeInfoProvider, GetNodeInfo(_, _)) + .WillOnce(DoAll(SetArgReferee<1>(CreateTestNodeInfo("node1")), Return(ErrorEnum::eNone))) + .WillOnce(DoAll(SetArgReferee<1>(CreateTestNodeInfo("node2")), Return(ErrorEnum::eNone))) + .WillOnce(DoAll(SetArgReferee<1>(CreateTestNodeInfo("node3")), Return(ErrorEnum::eNone))); NodeConfigStatus status1, status2, status3; status1.mVersion = "1.0.0"; diff --git a/src/core/cm/unitconfig/unitconfig.cpp b/src/core/cm/unitconfig/unitconfig.cpp index 6b8a07f65..936a3506e 100644 --- a/src/core/cm/unitconfig/unitconfig.cpp +++ b/src/core/cm/unitconfig/unitconfig.cpp @@ -53,7 +53,7 @@ Error UnitConfig::CheckUnitConfig(const aos::UnitConfig& config) { LockGuard lock {mMutex}; - LOG_INF() << "Check unit config" << Log::Field("version", config.mVersion); + LOG_DBG() << "Check unit config" << Log::Field("version", config.mVersion); if (mUnitConfigState != UnitConfigStateEnum::eInstalled) { LOG_WRN() << "Skip unit config version check due to state" << Log::Field("state", mUnitConfigState) @@ -77,8 +77,13 @@ Error UnitConfig::CheckUnitConfig(const aos::UnitConfig& config) if (nodeConfigStatus.mVersion != config.mVersion || !nodeConfigStatus.mError.IsNone()) { auto nodeConfig = MakeUnique(&mAllocator); + auto nodeInfo = MakeUnique(&mAllocator); - if (auto err = FindNodeConfig(id, "", config, *nodeConfig); !err.IsNone()) { + if (auto err = mNodeInfoProvider->GetNodeInfo(id, *nodeInfo); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } + + if (auto err = FindNodeConfig(nodeInfo->mNodeID, nodeInfo->mNodeType, config, *nodeConfig); !err.IsNone()) { return err; } @@ -138,8 +143,13 @@ Error UnitConfig::UpdateUnitConfig(const aos::UnitConfig& unitConfig) for (const auto& id : nodeIds) { auto nodeConfig = MakeUnique(&mAllocator); + auto nodeInfo = MakeUnique(&mAllocator); + + if (auto err = mNodeInfoProvider->GetNodeInfo(id, *nodeInfo); !err.IsNone()) { + return AOS_ERROR_WRAP(err); + } - if (auto err = FindNodeConfig(id, "", unitConfig, *nodeConfig); !err.IsNone()) { + if (auto err = FindNodeConfig(nodeInfo->mNodeID, nodeInfo->mNodeType, unitConfig, *nodeConfig); !err.IsNone()) { return err; } diff --git a/src/core/cm/unitconfig/unitconfig.hpp b/src/core/cm/unitconfig/unitconfig.hpp index 2bd68fcf0..353ed9d5a 100644 --- a/src/core/cm/unitconfig/unitconfig.hpp +++ b/src/core/cm/unitconfig/unitconfig.hpp @@ -100,7 +100,9 @@ class UnitConfig : public UnitConfigItf, public NodeConfigProviderItf, public no Error mUnitConfigError; UnitConfigState mUnitConfigState {UnitConfigStateEnum::eAbsent}; - StaticAllocator) + sizeof(NodeConfig)> mAllocator; + StaticAllocator) + sizeof(NodeConfig) + + sizeof(UnitNodeInfo)> + mAllocator; StaticArray mNodeConfigStatuses;