Skip to content

Commit 200189a

Browse files
[packchk] no error message if ../etc/PACK.xsd not found #786 (#576) (#946)
added: - Schema Validation Test changed: - Xerxes continues checking after first error (do not treat everything as critical) - added test cases for schema check Co-authored-by: Thorsten de Buhr <[email protected]>
1 parent 73dda22 commit 200189a

File tree

9 files changed

+227
-20
lines changed

9 files changed

+227
-20
lines changed

libs/xmlschemachecker/src/XmlErrorHandler.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@
88
#include "XmlErrorHandler.h"
99
#include "xercesc/util/XMLString.hpp"
1010
#include <xercesc/sax/SAXParseException.hpp>
11+
#include "ErrLog.h"
1112

1213
using namespace std;
1314
using namespace XERCES_CPP_NAMESPACE;
1415

16+
1517
void XmlErrorHandler::error(const SAXParseException &exc)
1618
{
1719
char* file = xercesc::XMLString::transcode(exc.getSystemId());
1820
char* msg = xercesc::XMLString::transcode(exc.getMessage());
19-
cerr << "Error at file " << file
20-
<< ", line " << exc.getLineNumber()
21-
<< ", column " << exc.getColumnNumber()
22-
<< ": " << msg << endl;
21+
ErrLog::Get()->SetFileName(file);
22+
LogMsg("M511", MSG(msg), exc.getLineNumber());
23+
ErrLog::Get()->SetFileName("");
2324
xercesc::XMLString::release(&file);
2425
xercesc::XMLString::release(&msg);
2526
}
@@ -28,10 +29,9 @@ void XmlErrorHandler::warning(const SAXParseException &exc)
2829
{
2930
char* file = xercesc::XMLString::transcode(exc.getSystemId());
3031
char* msg = xercesc::XMLString::transcode(exc.getMessage());
31-
cerr << "Warning at file " << file
32-
<< ", line " << exc.getLineNumber()
33-
<< ", column " << exc.getColumnNumber()
34-
<< ": " << msg << endl;
32+
ErrLog::Get()->SetFileName(file);
33+
LogMsg("M510", MSG(msg), exc.getLineNumber());
34+
ErrLog::Get()->SetFileName("");
3535
xercesc::XMLString::release(&file);
3636
xercesc::XMLString::release(&msg);
3737
}
@@ -40,10 +40,9 @@ void XmlErrorHandler::fatalError(const SAXParseException &exc)
4040
{
4141
char* file = xercesc::XMLString::transcode(exc.getSystemId());
4242
char* msg = xercesc::XMLString::transcode(exc.getMessage());
43-
cerr << "Fatal Error at file " << file
44-
<< ", line " << exc.getLineNumber()
45-
<< ", column " << exc.getColumnNumber()
46-
<< ": " << msg << endl;
43+
ErrLog::Get()->SetFileName(file);
44+
LogMsg("M511", MSG(msg), exc.getLineNumber());
45+
ErrLog::Get()->SetFileName("");
4746
xercesc::XMLString::release(&file);
4847
xercesc::XMLString::release(&msg);
4948
}

libs/xmlschemachecker/src/XmlValidator.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
#include "xercesc/sax/ErrorHandler.hpp"
1414
#include "xercesc/sax/SAXParseException.hpp"
1515

16+
#include <sstream>
17+
#include "ErrLog.h"
18+
1619
using namespace std;
1720
using namespace XERCES_CPP_NAMESPACE;
1821

@@ -26,7 +29,7 @@ XmlValidator::XmlValidator()
2629
m_domParser->setValidationScheme(XercesDOMParser::Val_Always);
2730
m_domParser->setDoNamespaces(true);
2831
m_domParser->setDoSchema(true);
29-
m_domParser->setValidationConstraintFatal(true);
32+
m_domParser->setValidationConstraintFatal(false); // report all errors
3033
m_domParser->setValidationSchemaFullChecking(true);
3134
}
3235

@@ -45,22 +48,33 @@ XmlValidator::~XmlValidator()
4548
*/
4649
bool XmlValidator::Validate(const string& xmlFile, const string& schemaFile)
4750
{
51+
LogMsg("M084");
52+
4853
try {
4954
m_domParser->setExternalNoNamespaceSchemaLocation(schemaFile.c_str());
5055
m_domParser->parse(xmlFile.c_str());
5156

52-
if (m_domParser->getErrorCount() == 0) {
57+
auto errCnt = m_domParser->getErrorCount();
58+
59+
LogMsg("M016");
60+
LogMsg("M024", ERR(errCnt));
61+
62+
if (errCnt == 0) {
5363
return true;
5464
} else {
5565
return false;
5666
}
5767
}
5868
catch (const XMLException& e) {
59-
cerr << "Exception: " << e.getMessage() << endl;
69+
stringstream ss;
70+
ss << "Exception: " << e.getMessage();
71+
LogMsg("M511", MSG(ss.str()));
6072
return false;
6173
}
6274
catch (const SAXException& e) {
63-
cerr << "Exception: " << e.getMessage() << endl;
75+
stringstream ss;
76+
ss << "Exception: " << e.getMessage() << endl;
77+
LogMsg("M511", MSG(ss.str()));
6478
return false;
6579
}
66-
}
80+
}

tools/packchk/src/CreateModel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ bool CreateModel::AddPdsc(const string& pdscFile, bool bSkipCheckForOtherPdsc /*
118118

119119
if(m_validatePdsc) {
120120
if(!XmlChecker::Validate(pdscFile, m_schemaFile)) {
121-
return false;
121+
; // continue checking
122122
}
123123
}
124124

tools/packchk/src/PackChk_Msgs.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const MsgTable PackChk::msgTable = {
1313
{ "M021", { MsgLevel::LEVEL_TEXT, CRLF_NO,"" } },
1414
{ "M022", { MsgLevel::LEVEL_TEXT, CRLF_B, "Found %ERR% Error(s) and %WARN% Warning(s)." } },
1515
{ "M023", { MsgLevel::LEVEL_TEXT, CRLF_B, "\nPhase%CHECK%" } },
16+
{ "M024", { MsgLevel::LEVEL_TEXT, CRLF_B, "Xerxes schema check: Found %ERR% Error(s)." } },
1617

1718
// 50... Info Messages (INFO = verbose)
1819
{ "M050", { MsgLevel::LEVEL_INFO, CRLF_B, "" } },
@@ -49,7 +50,7 @@ const MsgTable PackChk::msgTable = {
4950
{ "M081", { MsgLevel::LEVEL_PROGRESS, CRLF_B, "Checking File category '%CAT%' for '%COMP%' dependency: '%PATH%'" } },
5051
{ "M082", { MsgLevel::LEVEL_PROGRESS, CRLF_B, "Checking defined Condition: '%COND%'" } },
5152
{ "M083", { MsgLevel::LEVEL_PROGRESS, CRLF_B, "Checking used Condition: '%COND%'" } },
52-
{ "M084", { MsgLevel::LEVEL_INFO, CRLF_B, "" } },
53+
{ "M084", { MsgLevel::LEVEL_INFO, CRLF_B, "Xerxes schema check" } },
5354
{ "M085", { MsgLevel::LEVEL_PROGRESS, CRLF_B, "Checking if Component has Condition: 'Cclass=%CCLASS%, Cgroup=%CGROUP%, Csub=%CSUB%, Cversion=%CVER%'" } },
5455
{ "M086", { MsgLevel::LEVEL_PROGRESS, CRLF_B, "Checking if File has Version: '%PATH%'" } },
5556
{ "M087", { MsgLevel::LEVEL_PROGRESS, CRLF_B, "Checking if Component declared as '%TYPE%' has reference to a device: 'Cclass=%CCLASS%, Cgroup=%CGROUP%, Cversion=%CVER%'" } },
@@ -223,6 +224,9 @@ const MsgTable PackChk::msgTable = {
223224
{ "M504", { MsgLevel::LEVEL_TEXT, CRLF_B, "RTE Model reports: MISSING: -- %SPACE%%NAME%" } },
224225
{ "M505", { MsgLevel::LEVEL_ERROR, CRLF_B, "RTE Model reports: %MSG%" } },
225226
{ "M506", { MsgLevel::LEVEL_WARNING, CRLF_B, "RTE Model reports: %MSG%" } },
227+
228+
{ "M510", { MsgLevel::LEVEL_WARNING, CRLF_B, "Xerxes reports: %MSG%" } },
229+
{ "M511", { MsgLevel::LEVEL_ERROR, CRLF_B, "Xerxes reports: %MSG%" } },
226230
};
227231

228232
const MsgTableStrict PackChk::msgStrictTable = {

tools/packchk/src/PackOptions.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ using namespace std;
1919
* @brief class constructor
2020
*/
2121
CPackOptions::CPackOptions() :
22-
m_bIgnoreOtherPdscFiles(false)
22+
m_bIgnoreOtherPdscFiles(false),
23+
m_bDisableValidation(false)
2324
{
2425
}
2526

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
//header 1
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// tests1.c
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<package schemaVersion="1.4" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="PACK.xsd">
4+
<vendor>TestVendor</vendor>
5+
<url>http://www.testurl.com/pack/</url>
6+
<name>SchemaValidation</name>
7+
<descripton>Schema Validation</descripton>
8+
9+
<releases>
10+
<release version="0.0.1" date="2021-09-06">>
11+
Initial release of SchemaValidation.
12+
</release>
13+
</releases>
14+
15+
<keywords>
16+
<keyword>SchemaValidation</keyword>
17+
</keywords>
18+
19+
<conditions>
20+
<condition id="Test_Condition">
21+
<description>Test Device</description>
22+
<require Dvendor="ARM:82"/>
23+
</condition>
24+
<conditon id="False_Condition">
25+
<description>Test Device</description>
26+
<require Dvendor="ARM:82"/>
27+
</conditon>
28+
</conditions>
29+
30+
<components>
31+
<component Cclass="TestClass" Cgroup="TestGlobal" Cversion="1.0.0" condition="Test_Condition">
32+
<description>TestGlobal</description>
33+
<files>
34+
<file category="source" name="Files/test1.c"/>
35+
<file category="TestGlobal" name="Files/header1.h"/>
36+
</files>
37+
</component>
38+
</components>
39+
40+
</package>

tools/packchk/test/integtests/src/PackChkIntegTests.cpp

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,59 @@ class PackChkIntegTests : public ::testing::Test {
1616
public:
1717
void SetUp() override;
1818
void TearDown() override;
19+
20+
string GetPackXsd();
21+
void CheckCopyPackXsd();
22+
void DeletePackXsd();
1923
};
2024

2125
void PackChkIntegTests::SetUp() {
26+
CheckCopyPackXsd();
2227
}
2328

2429
void PackChkIntegTests::TearDown() {
2530
ErrLog::Get()->ClearLogMessages();
2631
}
2732

33+
string PackChkIntegTests::GetPackXsd() {
34+
const string schemaDestDir = string(PROJMGRUNITTESTS_BIN_PATH) + "/../etc";
35+
const string schemaFileName = schemaDestDir + "/PACK.xsd";
36+
37+
return schemaFileName;
38+
}
39+
40+
void PackChkIntegTests::CheckCopyPackXsd() {
41+
error_code ec;
42+
43+
const string schemaDestDir = string(PROJMGRUNITTESTS_BIN_PATH) + "/../etc";
44+
const string schemaFileName = GetPackXsd();
45+
46+
if (RteFsUtils::Exists(schemaFileName)) {
47+
return;
48+
}
49+
50+
// Copy Pack.xsd
51+
const string packXsd = string(PACKXSD_FOLDER) + "/PACK.xsd";
52+
if (RteFsUtils::Exists(schemaDestDir)) {
53+
RteFsUtils::RemoveDir(schemaDestDir);
54+
}
55+
RteFsUtils::CreateDirectories(schemaDestDir);
56+
fs::copy(fs::path(packXsd), fs::path(schemaFileName), ec);
57+
}
58+
59+
void PackChkIntegTests::DeletePackXsd() {
60+
const string schemaFileName = GetPackXsd();
61+
62+
if (!RteFsUtils::Exists(schemaFileName)) {
63+
return;
64+
}
65+
66+
// Delete Pack.xsd
67+
RteFsUtils::RemoveFile(schemaFileName);
68+
ASSERT_FALSE(RteFsUtils::Exists(schemaFileName));
69+
}
70+
71+
2872
// Validate packchk when no .pdsc file found
2973
TEST_F(PackChkIntegTests, FileNotAVailable) {
3074
const char* argv[2];
@@ -674,3 +718,106 @@ TEST_F(PackChkIntegTests, CheckDuplicateFlashAlgo) {
674718
FAIL() << "error: missing message M348 or M369";
675719
}
676720
}
721+
722+
// Test schema validation
723+
TEST_F(PackChkIntegTests, CheckSchemaValidation) {
724+
const char* argv[3];
725+
726+
const string& pdscFile = PackChkIntegTestEnv::localtestdata_dir +
727+
"/SchemaValidation/TestVendor.SchemaValidation.pdsc";
728+
ASSERT_TRUE(RteFsUtils::Exists(pdscFile));
729+
730+
argv[0] = (char*)"";
731+
argv[1] = (char*)pdscFile.c_str();
732+
733+
PackChk packChk;
734+
EXPECT_EQ(1, packChk.Check(2, argv, nullptr));
735+
736+
auto errMsgs = ErrLog::Get()->GetLogMessages();
737+
int M510_foundCnt = 0;
738+
int M511_foundCnt = 0;
739+
int M306_foundCnt = 0;
740+
741+
for (const string& msg : errMsgs) {
742+
size_t s;
743+
if ((s = msg.find("M306")) != string::npos) {
744+
M306_foundCnt++; // follows one M511: <descripton>
745+
}
746+
else if ((s = msg.find("M510")) != string::npos) {
747+
M510_foundCnt++;
748+
}
749+
else if ((s = msg.find("M511")) != string::npos) {
750+
M511_foundCnt++;
751+
}
752+
}
753+
754+
if (M510_foundCnt != 0 || M511_foundCnt != 6 || M306_foundCnt != 1) {
755+
FAIL() << "error: missing message M510, M511 or M306";
756+
}
757+
}
758+
759+
TEST_F(PackChkIntegTests, CheckPackXsdNotFound) {
760+
const char* argv[2];
761+
762+
const string& pdscFile = PackChkIntegTestEnv::localtestdata_dir +
763+
"/SchemaValidation/TestVendor.SchemaValidation.pdsc";
764+
ASSERT_TRUE(RteFsUtils::Exists(pdscFile));
765+
766+
DeletePackXsd();
767+
768+
argv[0] = (char*)"";
769+
argv[1] = (char*)pdscFile.c_str();
770+
771+
PackChk packChk;
772+
EXPECT_EQ(1, packChk.Check(2, argv, nullptr));
773+
774+
auto errMsgs = ErrLog::Get()->GetLogMessages();
775+
int M218_foundCnt = 0;
776+
777+
for (const string& msg : errMsgs) {
778+
size_t s;
779+
if ((s = msg.find("M218")) != string::npos) {
780+
M218_foundCnt++; // follows one M511: <descripton>
781+
}
782+
}
783+
784+
if (M218_foundCnt != 1) {
785+
FAIL() << "error: missing message M218";
786+
}
787+
}
788+
789+
TEST_F(PackChkIntegTests, CheckPackNamedXsdNotFound) {
790+
const char* argv[4];
791+
792+
const string& pdscFile = PackChkIntegTestEnv::localtestdata_dir +
793+
"/SchemaValidation/TestVendor.SchemaValidation.pdsc";
794+
ASSERT_TRUE(RteFsUtils::Exists(pdscFile));
795+
796+
DeletePackXsd();
797+
798+
const string schemaFileName = GetPackXsd();
799+
800+
argv[0] = (char*)"";
801+
argv[1] = (char*)pdscFile.c_str();
802+
argv[2] = (char*)"--xsd";
803+
argv[3] = (char*)schemaFileName.c_str();
804+
805+
PackChk packChk;
806+
EXPECT_EQ(1, packChk.Check(4, argv, nullptr));
807+
808+
auto errMsgs = ErrLog::Get()->GetLogMessages();
809+
int M218_foundCnt = 0;
810+
811+
for (const string& msg : errMsgs) {
812+
size_t s;
813+
if ((s = msg.find("M218")) != string::npos) {
814+
M218_foundCnt++; // follows one M511: <descripton>
815+
}
816+
}
817+
818+
if (M218_foundCnt != 1) {
819+
FAIL() << "error: missing message M218";
820+
}
821+
}
822+
823+

0 commit comments

Comments
 (0)