Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion test/packs/ARM/RteTest_DFP/0.2.0/ARM.RteTest_DFP.pdsc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<package schemaVersion="1.3" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="PACK.xsd">
<name>RteTest_DFP</name>
<description>RTE test of DFP pack, extraction from ARM.CMSIS</description>
<description overview="Doc/overview.md">RTE test of DFP pack, extraction from ARM.CMSIS</description>
<vendor>ARM</vendor>
<license>Doc/license.txt</license>
<url>http://www.keil.com/pack/</url>
Expand Down
5 changes: 5 additions & 0 deletions test/packs/ARM/RteTest_DFP/0.2.0/Doc/overview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Introduction

This pack contains:

Test components and device descriptions
4 changes: 2 additions & 2 deletions tools/projmgr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ include(FetchContent)
FetchContent_Declare(
rpc-interface
DOWNLOAD_EXTRACT_TIMESTAMP ON
URL https://github.com/Open-CMSIS-Pack/csolution-rpc/releases/download/v0.0.7/csolution-rpc.zip
URL_HASH SHA256=ad004d41e10862eb5b153b509a0e3edde09d0cb69595c96c908bf1f5ab1e65f8
URL https://github.com/Open-CMSIS-Pack/csolution-rpc/releases/download/v0.0.8/csolution-rpc.zip
URL_HASH SHA256=e347a98b6130c64d942d360ad31ca49899f3bf3113d40d9c460d6cd8f4c07b11
)
FetchContent_MakeAvailable(rpc-interface)

Expand Down
3 changes: 2 additions & 1 deletion tools/projmgr/include/ProjMgrRpcServerData.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class RteComponentInstance;
class RteComponentAggregate;
class RteComponentGroup;
class RteDevice;
class RteDeviceItem;
class RteBoard;
class RteItem;
class RteModel;
Expand All @@ -43,7 +44,7 @@ class RpcDataCollector {
void CollectBoardList(RpcArgs::BoardList& boardList, const std::string& namePattern, const std::string& vendor) const;
void CollectBoardInfo(RpcArgs::BoardInfo& boardInfo, const std::string& id) const;

RpcArgs::Device FromRteDevice(RteDevice* rteDevice, bool bIncludeProperties) const;
RpcArgs::Device FromRteDevice(RteDeviceItem* rteDevice, bool bIncludeProperties) const;
RpcArgs::Board FromRteBoard(RteBoard* rteBoard, bool bIncludeProperties) const;

RpcArgs::Component FromRteComponent(const RteComponent* rteComponent) const;
Expand Down
30 changes: 29 additions & 1 deletion tools/projmgr/src/ProjMgrRpcServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ class RpcHandler : public RpcMethods {
RpcArgs::SuccessResult Resolve(const string& context) override;
RpcArgs::SuccessResult LoadPacks(void) override;
RpcArgs::SuccessResult LoadSolution(const string& solution, const string& activeTarget) override;
RpcArgs::ContextInfo GetContextInfo(const string& context) override;
RpcArgs::UsedItems GetUsedItems(const string& context) override;
RpcArgs::PacksInfo GetPacksInfo(const string& context, const bool& all) override;
RpcArgs::SuccessResult SelectPack(const string& context, const RpcArgs::PackReference& pack) override;
Expand Down Expand Up @@ -361,13 +362,39 @@ RpcArgs::SuccessResult RpcHandler::SelectPack(const string& context, const RpcAr
return result;
}

RpcArgs::ContextInfo RpcHandler::GetContextInfo(const string& context) {
RpcArgs::ContextInfo contextInfo;
RpcDataCollector dc(GetActiveTarget(context));
contextInfo.success = true;
dc.CollectUsedComponents(contextInfo.components);
// get all references, even if they are not selected , because it is useful for client to remove them from files
contextInfo.packs = GetPackReferences(context);

auto& contextItem = GetContext(context);
contextInfo.variables = contextItem.variables;
contextInfo.attributes = contextItem.targetAttributes;
contextInfo.pname = contextItem.deviceItem.pname;

if(contextItem.rteDevice) {
contextInfo.device = dc.FromRteDevice(contextItem.rteDevice, true);
} else {
contextInfo.device.id = contextItem.device;
contextInfo.success = false;
contextInfo.message = "No device is found";
}
if(contextItem.rteBoard) {
contextInfo.board = dc.FromRteBoard(contextItem.rteBoard, true);
}
return contextInfo;
}

RpcArgs::UsedItems RpcHandler::GetUsedItems(const string& context) {
RpcArgs::UsedItems usedItems;
usedItems.success = true;
RpcDataCollector dc(GetActiveTarget(context));
dc.CollectUsedComponents(usedItems.components);
// get all references, even if they are not selected , because it is useful for client to remove them from files
usedItems.packs = GetPackReferences(context);
usedItems.success = true;
return usedItems;
}

Expand All @@ -383,6 +410,7 @@ PackReferenceVector RpcHandler::CollectPackReferences(const string& context) {
auto contextItem = GetContext(context);
for(const auto& packItem : contextItem.packRequirements) {
const auto packId = RtePackage::ComposePackageID(packItem.pack.vendor, packItem.pack.name, packItem.pack.version);

RpcArgs::PackReference packRef;
packRef.pack = packItem.selectedBy;
packRef.resolvedPack = packId;
Expand Down
2 changes: 1 addition & 1 deletion tools/projmgr/src/ProjMgrRpcServerData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ std::set<std::string> RpcDataCollector::GetUsedPacks() const {
return key_set(usedPacks);
}

RpcArgs::Device RpcDataCollector::FromRteDevice( RteDevice* rteDevice, bool bIncludeProperties) const {
RpcArgs::Device RpcDataCollector::FromRteDevice( RteDeviceItem* rteDevice, bool bIncludeProperties) const {
RpcArgs::Device d;
d.id = rteDevice->GetVendorName() + RteConstants::SUFFIX_CVENDOR + rteDevice->GetName();
d.family = rteDevice->GetEffectiveAttribute("Dfamily");
Expand Down
168 changes: 168 additions & 0 deletions tools/projmgr/test/src/ProjMgrRpcTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,172 @@ TEST_F(ProjMgrRpcTests, RpcSelectBundle) {
EXPECT_EQ(responses[6]["error"]["message"], "UnknownCclass: component class not found");
}

TEST_F(ProjMgrRpcTests, RpcGetContextInfoSingleCoreDevice) {
string context = "project+CM0";
vector<string> contextList = {
context
};

auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "CM0", contextList);
requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }}));

const auto& responses = RunRpcMethods(requests);

EXPECT_TRUE(responses[2]["result"]["success"]);
auto components = responses[2]["result"]["components"];
auto packs = responses[2]["result"]["packs"];
EXPECT_EQ(packs.size(), 2);
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP");
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0");
EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup");
EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3");

map<string, string> vars = responses[2]["result"]["variables"];
EXPECT_EQ(vars["BuildType"], "");
EXPECT_EQ(vars["Compiler"], "AC6");
EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0");
EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/");
EXPECT_EQ(vars["Pname"], "");
EXPECT_EQ(vars["Project"], "project");
EXPECT_EQ(vars["Solution"], "solution");
EXPECT_EQ(vars["TargetType"], "CM0");

EXPECT_FALSE(responses[2]["result"].contains("board"));
EXPECT_EQ(responses[2]["result"]["pname"], "");

auto d0 = responses[2]["result"]["device"];
EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0");
EXPECT_EQ(d0["family"], "RteTest ARM Cortex M");
EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0");
EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0");
EXPECT_EQ(d0["processors"].size(), 1);
EXPECT_EQ(d0["processors"][0]["name"], "");
EXPECT_EQ(d0["memories"].size(), 2);
EXPECT_TRUE(d0.contains("description"));

map<string, string> attrs = responses[2]["result"]["attributes"];
EXPECT_EQ(attrs["Tcompiler"], "ARMCC");
EXPECT_EQ(attrs["Toptions"], "AC6");
EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0");
EXPECT_EQ(attrs["Dcore"], "Cortex-M0");
EXPECT_EQ(attrs["Dfpu"], "NO_FPU");
EXPECT_EQ(attrs["Pname"], "");
}

TEST_F(ProjMgrRpcTests, RpcGetContextInfoMultiCoreDevice) {
string context = "project+CM0_Dual";
vector<string> contextList = {
context
};

auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "CM0_Dual", contextList);
requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }}));

const auto& responses = RunRpcMethods(requests);

EXPECT_TRUE(responses[2]["result"]["success"]);
auto components = responses[2]["result"]["components"];
auto packs = responses[2]["result"]["packs"];
EXPECT_EQ(packs.size(), 2);
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP");
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0");
EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup");
EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3");

map<string, string> vars = responses[2]["result"]["variables"];
EXPECT_EQ(vars["BuildType"], "");
EXPECT_EQ(vars["Compiler"], "AC6");
EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0_Dual");
EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/");
EXPECT_EQ(vars["Pname"], "cm0_core0");
EXPECT_EQ(vars["Project"], "project");
EXPECT_EQ(vars["Solution"], "solution");
EXPECT_EQ(vars["TargetType"], "CM0_Dual");

EXPECT_FALSE(responses[2]["result"].contains("board"));
EXPECT_EQ(responses[2]["result"]["pname"], "cm0_core0");

auto d0 = responses[2]["result"]["device"];
EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0_Dual");
EXPECT_EQ(d0["family"], "RteTest ARM Cortex M");
EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0");
EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0");
EXPECT_EQ(d0["processors"].size(), 2);
EXPECT_EQ(d0["processors"][0]["name"], "cm0_core0");
EXPECT_EQ(d0["memories"].size(), 4);
EXPECT_TRUE(d0.contains("description"));

map<string, string> attrs = responses[2]["result"]["attributes"];
EXPECT_EQ(attrs["Tcompiler"], "ARMCC");
EXPECT_EQ(attrs["Toptions"], "AC6");
EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0_Dual");
EXPECT_EQ(attrs["Dcore"], "Cortex-M0");
EXPECT_EQ(attrs["Dfpu"], "NO_FPU");
EXPECT_EQ(attrs["Pname"], "cm0_core0");
}


TEST_F(ProjMgrRpcTests, RpcGetContextInfoBoard) {
string context = "project+TestBoard";
vector<string> contextList = {
context
};

auto requests = CreateLoadRequests("/Examples/solution.csolution.yml", "TestBoard", contextList);
requests += FormatRequest(3, "GetContextInfo", json({{ "context", context }}));

const auto& responses = RunRpcMethods(requests);

EXPECT_TRUE(responses[2]["result"]["success"]);
auto components = responses[2]["result"]["components"];
auto packs = responses[2]["result"]["packs"];
EXPECT_EQ(packs.size(), 2);
EXPECT_EQ(packs[0]["pack"], "ARM::RteTest_DFP");
EXPECT_EQ(packs[0]["resolvedPack"], "ARM::RteTest_DFP@0.2.0");
EXPECT_EQ(components[0]["id"], "Device:Startup&RteTest Startup");
EXPECT_EQ(components[0]["resolvedComponent"]["id"], "ARM::Device:Startup&RteTest Startup@2.0.3");

map<string, string> vars = responses[2]["result"]["variables"];
EXPECT_EQ(vars["BuildType"], "");
EXPECT_EQ(vars["Compiler"], "AC6");
EXPECT_EQ(vars["Dname"], "RteTest_ARMCM0_Dual");
EXPECT_EQ(vars["Dpack"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/");
EXPECT_EQ(vars["Pname"], "cm0_core0");
EXPECT_EQ(vars["Project"], "project");
EXPECT_EQ(vars["Solution"], "solution");
EXPECT_EQ(vars["TargetType"], "TestBoard");

EXPECT_EQ(responses[2]["result"]["pname"], "cm0_core0");
auto d0 = responses[2]["result"]["device"];
EXPECT_EQ(d0["id"], "ARM::RteTest_ARMCM0_Dual");
EXPECT_EQ(d0["family"], "RteTest ARM Cortex M");
EXPECT_EQ(d0["subFamily"], "RteTest ARM Cortex M0");
EXPECT_EQ(d0["pack"], "ARM::RteTest_DFP@0.2.0");
EXPECT_EQ(d0["processors"].size(), 2);
EXPECT_EQ(d0["processors"][0]["name"], "cm0_core0");
EXPECT_EQ(d0["memories"].size(), 4);
EXPECT_TRUE(d0.contains("description"));

auto b1 = responses[2]["result"]["board"];
EXPECT_EQ(b1["id"], "Keil::RteTest Dummy board:1.2.3");
EXPECT_EQ(b1["pack"], "ARM::RteTest_DFP@0.2.0");
EXPECT_EQ(b1["description"], "uVision Simulator");
auto devices = b1["devices"];
EXPECT_EQ(devices.size(), 1);
EXPECT_FALSE(b1.contains("memories"));
auto d1 = devices[0];
EXPECT_EQ(d1["id"], "ARM::RteTest_ARMCM0_Dual");
EXPECT_EQ(d1["processors"].size(), 2);
EXPECT_EQ(d1["processors"][0]["name"], "cm0_core0");

map<string, string> attrs = responses[2]["result"]["attributes"];
EXPECT_EQ(attrs["Tcompiler"], "ARMCC");
EXPECT_EQ(attrs["Toptions"], "AC6");
EXPECT_EQ(attrs["Dname"], "RteTest_ARMCM0_Dual");
EXPECT_EQ(attrs["Dcore"], "Cortex-M0");
EXPECT_EQ(attrs["Dfpu"], "NO_FPU");
EXPECT_EQ(attrs["Pname"], "cm0_core0");
}

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

EXPECT_EQ(pack["id"], "ARM::RteTest_DFP@0.2.0");
EXPECT_EQ(pack["doc"], testcmsispack_folder + "/ARM/RteTest_DFP/0.2.0/Doc/overview.md");

auto& refs = pack["references"];
EXPECT_EQ(refs.size(), 1);

Expand Down
Loading