Skip to content

Commit b98ee81

Browse files
grasci-armedrioukCopilot
authored
[csolution rpc]: Add method to report context info (#1396) (#2337)
* [csolution rpc]: Add method to report context info * Initial implementation and test * Update tools/projmgr/test/src/ProjMgrRpcTests.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update tools/projmgr/src/ProjMgrRpcServer.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Implementation, test and RPC version upgrade, * Add test file * make lint happy --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Evgueni Driouk <edriouk@arm.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 7d46457 commit b98ee81

7 files changed

Lines changed: 208 additions & 6 deletions

File tree

test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<package schemaVersion="1.3" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="PACK.xsd">
44
<name>RteTest_DFP</name>
5-
<description>RTE test of DFP pack, extraction from ARM.CMSIS</description>
5+
<description overview="Doc/overview.md">RTE test of DFP pack, extraction from ARM.CMSIS</description>
66
<vendor>ARM</vendor>
77
<license>Doc/license.txt</license>
88
<url>http://www.keil.com/pack/</url>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Introduction
2+
3+
This pack contains:
4+
5+
Test components and device descriptions

tools/projmgr/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ include(FetchContent)
2424
FetchContent_Declare(
2525
rpc-interface
2626
DOWNLOAD_EXTRACT_TIMESTAMP ON
27-
URL https://github.com/Open-CMSIS-Pack/csolution-rpc/releases/download/v0.0.7/csolution-rpc.zip
28-
URL_HASH SHA256=ad004d41e10862eb5b153b509a0e3edde09d0cb69595c96c908bf1f5ab1e65f8
27+
URL https://github.com/Open-CMSIS-Pack/csolution-rpc/releases/download/v0.0.8/csolution-rpc.zip
28+
URL_HASH SHA256=e347a98b6130c64d942d360ad31ca49899f3bf3113d40d9c460d6cd8f4c07b11
2929
)
3030
FetchContent_MakeAvailable(rpc-interface)
3131

tools/projmgr/include/ProjMgrRpcServerData.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class RteComponentInstance;
2323
class RteComponentAggregate;
2424
class RteComponentGroup;
2525
class RteDevice;
26+
class RteDeviceItem;
2627
class RteBoard;
2728
class RteItem;
2829
class RteModel;
@@ -43,7 +44,7 @@ class RpcDataCollector {
4344
void CollectBoardList(RpcArgs::BoardList& boardList, const std::string& namePattern, const std::string& vendor) const;
4445
void CollectBoardInfo(RpcArgs::BoardInfo& boardInfo, const std::string& id) const;
4546

46-
RpcArgs::Device FromRteDevice(RteDevice* rteDevice, bool bIncludeProperties) const;
47+
RpcArgs::Device FromRteDevice(RteDeviceItem* rteDevice, bool bIncludeProperties) const;
4748
RpcArgs::Board FromRteBoard(RteBoard* rteBoard, bool bIncludeProperties) const;
4849

4950
RpcArgs::Component FromRteComponent(const RteComponent* rteComponent) const;

tools/projmgr/src/ProjMgrRpcServer.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class RpcHandler : public RpcMethods {
8383
RpcArgs::SuccessResult Resolve(const string& context) override;
8484
RpcArgs::SuccessResult LoadPacks(void) override;
8585
RpcArgs::SuccessResult LoadSolution(const string& solution, const string& activeTarget) override;
86+
RpcArgs::ContextInfo GetContextInfo(const string& context) override;
8687
RpcArgs::UsedItems GetUsedItems(const string& context) override;
8788
RpcArgs::PacksInfo GetPacksInfo(const string& context, const bool& all) override;
8889
RpcArgs::SuccessResult SelectPack(const string& context, const RpcArgs::PackReference& pack) override;
@@ -361,13 +362,39 @@ RpcArgs::SuccessResult RpcHandler::SelectPack(const string& context, const RpcAr
361362
return result;
362363
}
363364

365+
RpcArgs::ContextInfo RpcHandler::GetContextInfo(const string& context) {
366+
RpcArgs::ContextInfo contextInfo;
367+
RpcDataCollector dc(GetActiveTarget(context));
368+
contextInfo.success = true;
369+
dc.CollectUsedComponents(contextInfo.components);
370+
// get all references, even if they are not selected , because it is useful for client to remove them from files
371+
contextInfo.packs = GetPackReferences(context);
372+
373+
auto& contextItem = GetContext(context);
374+
contextInfo.variables = contextItem.variables;
375+
contextInfo.attributes = contextItem.targetAttributes;
376+
contextInfo.pname = contextItem.deviceItem.pname;
377+
378+
if(contextItem.rteDevice) {
379+
contextInfo.device = dc.FromRteDevice(contextItem.rteDevice, true);
380+
} else {
381+
contextInfo.device.id = contextItem.device;
382+
contextInfo.success = false;
383+
contextInfo.message = "No device is found";
384+
}
385+
if(contextItem.rteBoard) {
386+
contextInfo.board = dc.FromRteBoard(contextItem.rteBoard, true);
387+
}
388+
return contextInfo;
389+
}
390+
364391
RpcArgs::UsedItems RpcHandler::GetUsedItems(const string& context) {
365392
RpcArgs::UsedItems usedItems;
366-
usedItems.success = true;
367393
RpcDataCollector dc(GetActiveTarget(context));
368394
dc.CollectUsedComponents(usedItems.components);
369395
// get all references, even if they are not selected , because it is useful for client to remove them from files
370396
usedItems.packs = GetPackReferences(context);
397+
usedItems.success = true;
371398
return usedItems;
372399
}
373400

@@ -383,6 +410,7 @@ PackReferenceVector RpcHandler::CollectPackReferences(const string& context) {
383410
auto contextItem = GetContext(context);
384411
for(const auto& packItem : contextItem.packRequirements) {
385412
const auto packId = RtePackage::ComposePackageID(packItem.pack.vendor, packItem.pack.name, packItem.pack.version);
413+
386414
RpcArgs::PackReference packRef;
387415
packRef.pack = packItem.selectedBy;
388416
packRef.resolvedPack = packId;

tools/projmgr/src/ProjMgrRpcServerData.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ std::set<std::string> RpcDataCollector::GetUsedPacks() const {
155155
return key_set(usedPacks);
156156
}
157157

158-
RpcArgs::Device RpcDataCollector::FromRteDevice( RteDevice* rteDevice, bool bIncludeProperties) const {
158+
RpcArgs::Device RpcDataCollector::FromRteDevice( RteDeviceItem* rteDevice, bool bIncludeProperties) const {
159159
RpcArgs::Device d;
160160
d.id = rteDevice->GetVendorName() + RteConstants::SUFFIX_CVENDOR + rteDevice->GetName();
161161
d.family = rteDevice->GetEffectiveAttribute("Dfamily");

tools/projmgr/test/src/ProjMgrRpcTests.cpp

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,172 @@ TEST_F(ProjMgrRpcTests, RpcSelectBundle) {
695695
EXPECT_EQ(responses[6]["error"]["message"], "UnknownCclass: component class not found");
696696
}
697697

698+
TEST_F(ProjMgrRpcTests, RpcGetContextInfoSingleCoreDevice) {
699+
string context = "project+CM0";
700+
vector<string> contextList = {
701+
context
702+
};
703+
704+
auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "CM0", contextList);
705+
requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }}));
706+
707+
const auto& responses = RunRpcMethods(requests);
708+
709+
EXPECT_TRUE(responses[2]["result"]["success"]);
710+
auto components = responses[2]["result"]["components"];
711+
auto packs = responses[2]["result"]["packs"];
712+
EXPECT_EQ(packs.size(), 2);
713+
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP");
714+
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0");
715+
EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup");
716+
EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3");
717+
718+
map<string, string> vars = responses[2]["result"]["variables"];
719+
EXPECT_EQ(vars["BuildType"], "");
720+
EXPECT_EQ(vars["Compiler"], "AC6");
721+
EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0");
722+
EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/");
723+
EXPECT_EQ(vars["Pname"], "");
724+
EXPECT_EQ(vars["Project"], "project");
725+
EXPECT_EQ(vars["Solution"], "solution");
726+
EXPECT_EQ(vars["TargetType"], "CM0");
727+
728+
EXPECT_FALSE(responses[2]["result"].contains("board"));
729+
EXPECT_EQ(responses[2]["result"]["pname"], "");
730+
731+
auto d0 = responses[2]["result"]["device"];
732+
EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0");
733+
EXPECT_EQ(d0["family"], "RteTest ARM Cortex M");
734+
EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0");
735+
EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0");
736+
EXPECT_EQ(d0["processors"].size(), 1);
737+
EXPECT_EQ(d0["processors"][0]["name"], "");
738+
EXPECT_EQ(d0["memories"].size(), 2);
739+
EXPECT_TRUE(d0.contains("description"));
740+
741+
map<string, string> attrs = responses[2]["result"]["attributes"];
742+
EXPECT_EQ(attrs["Tcompiler"], "ARMCC");
743+
EXPECT_EQ(attrs["Toptions"], "AC6");
744+
EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0");
745+
EXPECT_EQ(attrs["Dcore"], "Cortex-M0");
746+
EXPECT_EQ(attrs["Dfpu"], "NO_FPU");
747+
EXPECT_EQ(attrs["Pname"], "");
748+
}
749+
750+
TEST_F(ProjMgrRpcTests, RpcGetContextInfoMultiCoreDevice) {
751+
string context = "project+CM0_Dual";
752+
vector<string> contextList = {
753+
context
754+
};
755+
756+
auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "CM0_Dual", contextList);
757+
requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }}));
758+
759+
const auto& responses = RunRpcMethods(requests);
760+
761+
EXPECT_TRUE(responses[2]["result"]["success"]);
762+
auto components = responses[2]["result"]["components"];
763+
auto packs = responses[2]["result"]["packs"];
764+
EXPECT_EQ(packs.size(), 2);
765+
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP");
766+
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0");
767+
EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup");
768+
EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3");
769+
770+
map<string, string> vars = responses[2]["result"]["variables"];
771+
EXPECT_EQ(vars["BuildType"], "");
772+
EXPECT_EQ(vars["Compiler"], "AC6");
773+
EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0_Dual");
774+
EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/");
775+
EXPECT_EQ(vars["Pname"], "cm0_core0");
776+
EXPECT_EQ(vars["Project"], "project");
777+
EXPECT_EQ(vars["Solution"], "solution");
778+
EXPECT_EQ(vars["TargetType"], "CM0_Dual");
779+
780+
EXPECT_FALSE(responses[2]["result"].contains("board"));
781+
EXPECT_EQ(responses[2]["result"]["pname"], "cm0_core0");
782+
783+
auto d0 = responses[2]["result"]["device"];
784+
EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0_Dual");
785+
EXPECT_EQ(d0["family"], "RteTest ARM Cortex M");
786+
EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0");
787+
EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0");
788+
EXPECT_EQ(d0["processors"].size(), 2);
789+
EXPECT_EQ(d0["processors"][0]["name"], "cm0_core0");
790+
EXPECT_EQ(d0["memories"].size(), 4);
791+
EXPECT_TRUE(d0.contains("description"));
792+
793+
map<string, string> attrs = responses[2]["result"]["attributes"];
794+
EXPECT_EQ(attrs["Tcompiler"], "ARMCC");
795+
EXPECT_EQ(attrs["Toptions"], "AC6");
796+
EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0_Dual");
797+
EXPECT_EQ(attrs["Dcore"], "Cortex-M0");
798+
EXPECT_EQ(attrs["Dfpu"], "NO_FPU");
799+
EXPECT_EQ(attrs["Pname"], "cm0_core0");
800+
}
801+
802+
803+
TEST_F(ProjMgrRpcTests, RpcGetContextInfoBoard) {
804+
string context = "project+TestBoard";
805+
vector<string> contextList = {
806+
context
807+
};
808+
809+
auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "TestBoard", contextList);
810+
requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }}));
811+
812+
const auto& responses = RunRpcMethods(requests);
813+
814+
EXPECT_TRUE(responses[2]["result"]["success"]);
815+
auto components = responses[2]["result"]["components"];
816+
auto packs = responses[2]["result"]["packs"];
817+
EXPECT_EQ(packs.size(), 2);
818+
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP");
819+
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0");
820+
EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup");
821+
EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3");
822+
823+
map<string, string> vars = responses[2]["result"]["variables"];
824+
EXPECT_EQ(vars["BuildType"], "");
825+
EXPECT_EQ(vars["Compiler"], "AC6");
826+
EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0_Dual");
827+
EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/");
828+
EXPECT_EQ(vars["Pname"], "cm0_core0");
829+
EXPECT_EQ(vars["Project"], "project");
830+
EXPECT_EQ(vars["Solution"], "solution");
831+
EXPECT_EQ(vars["TargetType"], "TestBoard");
832+
833+
EXPECT_EQ(responses[2]["result"]["pname"], "cm0_core0");
834+
auto d0 = responses[2]["result"]["device"];
835+
EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0_Dual");
836+
EXPECT_EQ(d0["family"], "RteTest ARM Cortex M");
837+
EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0");
838+
EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0");
839+
EXPECT_EQ(d0["processors"].size(), 2);
840+
EXPECT_EQ(d0["processors"][0]["name"], "cm0_core0");
841+
EXPECT_EQ(d0["memories"].size(), 4);
842+
EXPECT_TRUE(d0.contains("description"));
843+
844+
auto b1 = responses[2]["result"]["board"];
845+
EXPECT_EQ(b1["id"], "Keil::RteTest Dummy board:1.2.3");
846+
EXPECT_EQ(b1["pack"], "ARM::RteTest_DFP@0.2.0");
847+
EXPECT_EQ(b1["description"], "uVision Simulator");
848+
auto devices = b1["devices"];
849+
EXPECT_EQ(devices.size(), 1);
850+
EXPECT_FALSE(b1.contains("memories"));
851+
auto d1 = devices[0];
852+
EXPECT_EQ(d1["id"], "ARM::RteTest_ARMCM0_Dual");
853+
EXPECT_EQ(d1["processors"].size(), 2);
854+
EXPECT_EQ(d1["processors"][0]["name"], "cm0_core0");
855+
856+
map<string, string> attrs = responses[2]["result"]["attributes"];
857+
EXPECT_EQ(attrs["Tcompiler"], "ARMCC");
858+
EXPECT_EQ(attrs["Toptions"], "AC6");
859+
EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0_Dual");
860+
EXPECT_EQ(attrs["Dcore"], "Cortex-M0");
861+
EXPECT_EQ(attrs["Dfpu"], "NO_FPU");
862+
EXPECT_EQ(attrs["Pname"], "cm0_core0");
863+
}
698864

699865
TEST_F(ProjMgrRpcTests, RpcGetUsedItems) {
700866
string context = "selectable+CM0";
@@ -779,6 +945,8 @@ TEST_F(ProjMgrRpcTests, RpcGetPacksInfoSimple) {
779945
auto& pack = packInfos[1];
780946

781947
EXPECT_EQ(pack["id"], "ARM::RteTest_DFP@0.2.0");
948+
EXPECT_EQ(pack["doc"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/Doc/overview.md");
949+
782950
auto& refs = pack["references"];
783951
EXPECT_EQ(refs.size(), 1);
784952

0 commit comments

Comments
 (0)