From 1afaf4c0ee09aa40970e00100473b95fccadda4a Mon Sep 17 00:00:00 2001 From: Ruud Overeem <overeem@astron.nl> Date: Fri, 27 Apr 2007 14:47:31 +0000 Subject: [PATCH] BugID: 982 Extended tGSAservice with tests for the PVSSInfo class and made it more robust by delteing leftovers from the previous test (if any) before starting the new tests. --- MAC/GCF/_PAL/SAL/src/GCF_PVSSInfo.cc | 432 +++++++++++++++------------ MAC/GCF/_PAL/SAL/test/tGSAService.cc | 31 +- 2 files changed, 263 insertions(+), 200 deletions(-) diff --git a/MAC/GCF/_PAL/SAL/src/GCF_PVSSInfo.cc b/MAC/GCF/_PAL/SAL/src/GCF_PVSSInfo.cc index 122f401a1d3..9e2d9c5a7ab 100644 --- a/MAC/GCF/_PAL/SAL/src/GCF_PVSSInfo.cc +++ b/MAC/GCF/_PAL/SAL/src/GCF_PVSSInfo.cc @@ -33,19 +33,17 @@ #include <DpContainer.hxx> #include <DpIdentification.hxx> -namespace LOFAR -{ - namespace GCF - { +namespace LOFAR { + namespace GCF { using namespace Common; - namespace PAL - { -string GCFPVSSInfo::_sysName = ""; -string GCFPVSSInfo::_projName = ""; -int8 GCFPVSSInfo::_lastSysNr = 0; + namespace PAL { + +string GCFPVSSInfo::_sysName = ""; +string GCFPVSSInfo::_projName = ""; +int8 GCFPVSSInfo::_lastSysNr = 0; timeval GCFPVSSInfo::_lastTimestamp = {0, 0}; -uint8 GCFPVSSInfo::_lastManNum = 0; -uint8 GCFPVSSInfo::_lastManType = 0; +uint8 GCFPVSSInfo::_lastManNum = 0; +uint8 GCFPVSSInfo::_lastManType = 0; TMACValueType macValueTypes[] = { @@ -101,6 +99,9 @@ TMACValueType macValueTypes[] = NO_LPT, // DPELEMENT_DYNBLOBARRAY, }; +// +// propExists(dpeName) +// bool GCFPVSSInfo::propExists(const string& dpeName) { DpIdentifier dpId; @@ -110,248 +111,283 @@ bool GCFPVSSInfo::propExists(const string& dpeName) if (Manager::getId(dpePvssName, dpId) == PVSS_FALSE) { return false; } - else { - return true; - } + + return true; } +// +// typeExists (typeName) +// bool GCFPVSSInfo::typeExists (const string& dpTypeName) { - CharString pvssTypeName(dpTypeName.c_str()); - DpTypeId dpTypeId; - return (Manager::getTypeId(pvssTypeName, dpTypeId) == PVSS_TRUE); + CharString pvssTypeName(dpTypeName.c_str()); + DpTypeId dpTypeId; + return (Manager::getTypeId(pvssTypeName, dpTypeId) == PVSS_TRUE); } +// +// getMACTypeId (dpeName) +// TMACValueType GCFPVSSInfo::getMACTypeId (const string& dpeName) { - vector<string> splittedDpeName = StringUtil::split(dpeName, ':'); - // first find out whether there is a system name specified or not - int8 sysNr = getSysId(dpeName); - CharString pvssDpeName(dpeName.c_str()); - if (sysNr == 0) { - sysNr = GCFPVSSInfo::getLocalSystemId(); - } - - DpElementType dpElType; - TMACValueType type(NO_LPT); - DpIdentifier dpId; - if (Manager::getId(pvssDpeName, dpId) == PVSS_TRUE) { - if (Manager::getTypeContainerPtr(sysNr)->getElementType(dpId, dpElType) == DpTypeContOK) { - type = macValueTypes[dpElType]; - } - } - return type; + // first find out whether there is a system name specified or not + vector<string> splittedDpeName = StringUtil::split(dpeName, ':'); + int8 sysNr = getSysId(dpeName); + if (sysNr == 0) { + sysNr = GCFPVSSInfo::getLocalSystemId(); + } + + DpElementType dpElType; + DpIdentifier dpId; + CharString pvssDpeName(dpeName.c_str()); + if ((Manager::getId(pvssDpeName, dpId) == PVSS_TRUE) && + (Manager::getTypeContainerPtr(sysNr)->getElementType(dpId, dpElType) == DpTypeContOK)) { + return(macValueTypes[dpElType]); + } + } + return (NO_LPT); } +// +// getLocalSystemName() +// const string& GCFPVSSInfo::getLocalSystemName() { - if (_sysName.length() == 0) { - CharString sysName; - if (Manager::getSystemName(Resources::getSystem(), sysName) == PVSS_TRUE) { - _sysName += (const char*) sysName; - } - } - return _sysName; + if (_sysName.length() == 0) { + CharString sysName; + if (Manager::getSystemName(Resources::getSystem(), sysName) == PVSS_TRUE) { + _sysName += (const char*) sysName; + } + } + return (_sysName); } +// +// getLocalSystemId() +// int8 GCFPVSSInfo::getLocalSystemId() { - return Resources::getSystem(); + return (Resources::getSystem()); } +// +// getSystemName(sysnr) +// const string GCFPVSSInfo::getSystemName(int8 sysnr) { - CharString sysName; - if (Manager::getSystemName(sysnr, sysName) == PVSS_TRUE) { - return (const char*) sysName; - } - return ""; + CharString sysName; + if (Manager::getSystemName(sysnr, sysName) == PVSS_TRUE) { + return ((const char*) sysName); + } + return (""); } +// +// getProjectName() +// const string& GCFPVSSInfo::getProjectName() { - if (_projName.length() == 0) { - CharString projName = Resources::getProjectName(); - _projName += (const char*) projName; - } - return _projName; + if (_projName.length() == 0) { + CharString projName = Resources::getProjectName(); + _projName += (const char*) projName; + } + return (_projName); } +// +// getSysId(name) +// int8 GCFPVSSInfo::getSysId(const string& name) { - string::size_type index = name.find(':'); - if (index == string::npos) { - index = name.length(); - } - CharString sysName(name.c_str(), index); - SystemNumType sysNr; - // workaround - start - DpIdentifier dpId; - Manager::getId(sysName + ":", dpId); - sysNr = dpId.getSystem(); - // workaround - end - /* - DpIdentificationResult res; - if ((res = Manager::getDpIdentificationPtr()->getSystemId((const char*)sysName, sysNr)) != DpIdentOK) { - LOG_ERROR(formatString( - "PVSS could not find system nr for '%s', error %d", - (const char*) sysName, - res)); - sysNr = 0; - }*/ - return sysNr; + string::size_type index = name.find(':'); + if (index == string::npos) { + index = name.length(); + } + CharString sysName(name.c_str(), index); + SystemNumType sysNr; + // workaround - start + DpIdentifier dpId; + Manager::getId(sysName + ":", dpId); + sysNr = dpId.getSystem(); + // workaround - end + /* + DpIdentificationResult res; + if ((res = Manager::getDpIdentificationPtr()->getSystemId((const char*)sysName, sysNr)) != DpIdentOK) { + LOG_ERROR(formatString("PVSS could not find system nr for '%s', error %d", + (const char*) sysName, res)); + sysNr = 0; + }*/ + return (sysNr); } +// +// getOwnManNum() +// uint8 GCFPVSSInfo::getOwnManNum() { - return Resources::getManNum(); + return (Resources::getManNum()); } +// +// getAllProperties(typeFilter, dpFilter, &foundProps) +// void GCFPVSSInfo::getAllProperties(const string& typeFilter, const string& dpFilter, vector<string>& foundProperties) { - foundProperties.clear(); - DpIdentification::TypeIdNamePair* typeArray(0); - DpIdentification::DpIdNamePair* dpIdArray(0); - PVSSlong howManyTypes, howManyDpIds; - - // get all DP types which meats with a "typeFilter" - Manager::getDpIdentificationPtr()->getSortedTypeNames(typeFilter.c_str(), typeArray, - howManyTypes, PVSS_FALSE); - - list<TPropertyInfo> propInfos; - string dpeName; - for (PVSSlong i = 0; i < howManyTypes; i++) { - // Get all DP's for each type - Manager::getDpIdentificationPtr()->getSortedDpIdNames(dpFilter.c_str(), dpIdArray, - howManyDpIds, PVSS_FALSE, - typeArray[i].id); - - for (PVSSlong j = 0; j < howManyDpIds; j++) { - if (j == 0) { - // get type structure (type elements) of the current DPT only once for - // all found DP's - getTypeStruct((const char*) typeArray[i].text.getText(), propInfos); - } - for (list<TPropertyInfo>::iterator iter = propInfos.begin(); - iter != propInfos.end(); iter++) { - // concatenate DP name and element name to a DPE. - dpeName = formatString ("%s.%s", (const char *)dpIdArray[j].id.toString(), - iter->propName.c_str()); - - LOG_TRACE_FLOW(formatString("Found DPE: %s", dpeName.c_str())); - foundProperties.push_back(dpeName); - } - } - if (dpIdArray) { - delete [] dpIdArray; + foundProperties.clear(); + DpIdentification::TypeIdNamePair* typeArray(0); + DpIdentification::DpIdNamePair* dpIdArray(0); + PVSSlong howManyTypes, howManyDpIds; + + // get all DP types which meet with a "typeFilter" + Manager::getDpIdentificationPtr()-> + getSortedTypeNames(typeFilter.c_str(), typeArray, howManyTypes, PVSS_FALSE); + + list<TPropertyInfo> propInfos; + string dpeName; + for (PVSSlong i = 0; i < howManyTypes; i++) { + // Get all DP's for each type + Manager::getDpIdentificationPtr()-> + getSortedDpIdNames(dpFilter.c_str(), dpIdArray, howManyDpIds, + PVSS_FALSE, typeArray[i].id); + + for (PVSSlong j = 0; j < howManyDpIds; j++) { + if (j == 0) { + // get type structure (type elements) of the current DPT only once for + // all found DP's + getTypeStruct((const char*) typeArray[i].text.getText(), propInfos); + } + for (list<TPropertyInfo>::iterator iter = propInfos.begin(); + iter != propInfos.end(); iter++) { + // concatenate DP name and element name to a DPE. + dpeName = formatString ("%s.%s", (const char *)dpIdArray[j].id.toString(), + iter->propName.c_str()); + + LOG_TRACE_FLOW(formatString("Found DPE: %s", dpeName.c_str())); + foundProperties.push_back(dpeName); + } + } + if (dpIdArray) { + delete [] dpIdArray; + } + dpIdArray = 0; + } + if (typeArray) { + delete [] typeArray; } - dpIdArray = 0; - } - if (typeArray) { - delete [] typeArray; - } } +// +// getAllTypes(typeFilter, &foundTypes) +// void GCFPVSSInfo::getAllTypes(const string& typeFilter, vector<string>& foundTypes) { - foundTypes.clear(); - DpIdentification::TypeIdNamePair* typeArray(0); - PVSSlong howManyTypes; - - // get all DP types which meats with a "typeFilter" - Manager::getDpIdentificationPtr()->getSortedTypeNames(typeFilter.c_str(), typeArray, howManyTypes, PVSS_FALSE); - - for (PVSSlong i = 0; i < howManyTypes; i++) { - LOG_TRACE_FLOW(formatString("Found type: %s", (const char *)typeArray[i].text.getText())); - foundTypes.push_back((const char *)typeArray[i].text.getText()); - } - if (typeArray) { - delete [] typeArray; - } + foundTypes.clear(); + DpIdentification::TypeIdNamePair* typeArray(0); + PVSSlong howManyTypes; + + // get all DP types which meats with a "typeFilter" + Manager::getDpIdentificationPtr()-> + getSortedTypeNames(typeFilter.c_str(), typeArray, howManyTypes, PVSS_FALSE); + + for (PVSSlong i = 0; i < howManyTypes; i++) { + LOG_TRACE_FLOW(formatString("Found type: %s", (const char *)typeArray[i].text.getText())); + foundTypes.push_back((const char *)typeArray[i].text.getText()); + } + if (typeArray) { + delete [] typeArray; + } } // forward declaration void buildTypeStructTree(const string path, const DpType* pType, const DpElementId elId, list<TPropertyInfo>& propInfos); -TGCFResult GCFPVSSInfo::getTypeStruct(const string& typeName, list<TPropertyInfo>& propInfos, int8 sysNr) +// +// getTypeStruct(typename, &propInfo, sysnr) +// +TGCFResult GCFPVSSInfo::getTypeStruct(const string& typeName, + list<TPropertyInfo>& propInfos, + int8 sysNr) { - TGCFResult result(GCF_NO_ERROR); - propInfos.clear(); - - CharString pvssTypeName = typeName.c_str(); - DpTypeId typeId; - DpType* pType; - if (Manager::getTypeId(pvssTypeName, typeId, sysNr) == PVSS_FALSE) { - string sysName = getSystemName(sysNr); - LOG_ERROR(formatString("PVSS could not find type %s on system %s", + TGCFResult result(GCF_NO_ERROR); + propInfos.clear(); + + CharString pvssTypeName = typeName.c_str(); + DpTypeId typeId; + DpType* pType; + if (Manager::getTypeId(pvssTypeName, typeId, sysNr) == PVSS_FALSE) { + string sysName = getSystemName(sysNr); + LOG_ERROR(formatString("PVSS could not find type %s on system %s", typeName.c_str(), sysName.c_str())); - result = GCF_PVSS_ERROR; - } - else if ((pType = Manager::getTypeContainerPtr(sysNr)->getTypePtr(typeId)) == 0) { - LOG_ERROR(formatString("PVSS internal error on type information (%s:%s)", - getSystemName(sysNr).c_str(), typeName.c_str())); - result = GCF_PVSS_ERROR; - } - else - { - DpElementId elId = pType->getRootElement(); - string path; - buildTypeStructTree(path, pType, elId, propInfos); - } - - return result; + return(GCF_PVSS_ERROR); + } + + if ((pType = Manager::getTypeContainerPtr(sysNr)->getTypePtr(typeId)) == 0) { + LOG_ERROR(formatString("PVSS internal error on type information (%s:%s)", + getSystemName(sysNr).c_str(), typeName.c_str())); + return (GCF_PVSS_ERROR); + } + + DpElementId elId = pType->getRootElement(); + string path; + buildTypeStructTree(path, pType, elId, propInfos); + return (GCF_NO_ERROR); } -void buildTypeStructTree(const string path, - const DpType* pType, - const DpElementId elId, - list<TPropertyInfo>& propInfos) +// +// buildTypeStructTree(path, dpType, dpElement, &propInfo) +// +void buildTypeStructTree(const string path, + const DpType* pType, + const DpElementId elId, + list<TPropertyInfo>& propInfos) { - string propName = path; - DpElementType elType = pType->getTypeNodePtr(elId)->getElementType(); - if (elId != pType->getRootElement()) { - char* elName; - Manager::getDpIdentificationPtr()->getElementName(pType->getName(), elId, elName); - if (elType != DPELEMENT_TYPEREFERENCE) { - if (propName.length() > 0) { - propName += '.'; - } - propName += elName; - } - delete [] elName; - } - if (elType != DPELEMENT_RECORD && elType != DPELEMENT_TYPEREFERENCE) { - if (macValueTypes[elType] != NO_LPT) { - if (Common::isValidPropName(propName.c_str())) { - TPropertyInfo propInfo; - propInfo.propName = propName; - propInfo.type = macValueTypes[elType]; - propInfos.push_back(propInfo); - } - else { - LOG_WARN(formatString ( - "Property name %s meets not the name convention! Not add!!!", - propName.c_str())); - } - } - else { - LOG_ERROR(formatString( - "TypeElement type %d (see DpElementType.hxx) is unknown to GCF (%s). Not add!!!", - elType, propName.c_str())); - } - } - else { - DynPtrArrayIndex nrOfChilds = pType->getSonNumber(elId); - DpElementId childElId; - for (DynPtrArrayIndex i = 0; i < nrOfChilds; i++) { - childElId = pType->getSon(elId, i); - buildTypeStructTree(propName, pType, childElId, propInfos); - } - } + string propName = path; + DpElementType elType = pType->getTypeNodePtr(elId)->getElementType(); + if (elId != pType->getRootElement()) { + char* elName; + Manager::getDpIdentificationPtr()->getElementName(pType->getName(), elId, elName); + if (elType != DPELEMENT_TYPEREFERENCE) { + if (propName.length() > 0) { + propName += '.'; + } + propName += elName; + } + delete [] elName; + } + + if (elType != DPELEMENT_RECORD && elType != DPELEMENT_TYPEREFERENCE) { + if (macValueTypes[elType] != NO_LPT) { + if (Common::isValidPropName(propName.c_str())) { + TPropertyInfo propInfo; + propInfo.propName = propName; + propInfo.type = macValueTypes[elType]; + propInfos.push_back(propInfo); + } + else { + LOG_WARN(formatString ( + "Property name %s meets not the name convention! Not add!!!", + propName.c_str())); + } + } + else { + LOG_ERROR(formatString( + "TypeElement type %d (see DpElementType.hxx) is unknown to GCF (%s). Not add!!!", + elType, propName.c_str())); + } + } + else { + DynPtrArrayIndex nrOfChilds = pType->getSonNumber(elId); + DpElementId childElId; + for (DynPtrArrayIndex i = 0; i < nrOfChilds; i++) { + childElId = pType->getSon(elId, i); + buildTypeStructTree(propName, pType, childElId, propInfos); + } + } } + } // namespace PAL } // namespace GCF } // namespace LOFAR diff --git a/MAC/GCF/_PAL/SAL/test/tGSAService.cc b/MAC/GCF/_PAL/SAL/test/tGSAService.cc index 782a14a7ea2..4793b367e9d 100644 --- a/MAC/GCF/_PAL/SAL/test/tGSAService.cc +++ b/MAC/GCF/_PAL/SAL/test/tGSAService.cc @@ -70,11 +70,38 @@ GCFEvent::TResult tGSAService::initial(GCFEvent& e, GCFPortInterface& /*p*/) case F_ENTRY: break; - case F_INIT: + case F_INIT: { LOG_DEBUG("Creating a Service Class"); _pService = new Service(); + + // test PVSSInfo class + int8 sysID; + string sysName; + LOG_DEBUG_STR("LocalSystemName: " << GCFPVSSInfo::getLocalSystemName()); + LOG_DEBUG_STR("LocalSystemID : " << (sysID = GCFPVSSInfo::getLocalSystemId())); + LOG_DEBUG_STR("ProjectName : " << GCFPVSSInfo::getProjectName()); + LOG_DEBUG_STR("SystemName(" << sysID << ") : " << (sysName = GCFPVSSInfo::getSystemName(sysID))); + LOG_DEBUG_STR("SystemID(" << sysName << ") : " << GCFPVSSInfo::getSysId(sysName)); + LOG_DEBUG_STR("Own Man Num : " << GCFPVSSInfo::getOwnManNum()); + LOG_DEBUG_STR("Last Evt ManNum: " << GCFPVSSInfo::getLastEventManNum()); + LOG_DEBUG_STR("typeExist(ExampleDP_Bit): " << (GCFPVSSInfo::typeExists("ExampleDP_Bit") ? "Yes" : "no")); + LOG_DEBUG_STR("typeExist(IsErNiet): " << (GCFPVSSInfo::typeExists("IsErNiet") ? "Yes" : "no")); + LOG_DEBUG_STR("propExist(testBit): " << (GCFPVSSInfo::propExists("testBit") ? "Yes" : "no")); + LOG_DEBUG_STR("propExist(IsErNiet): " << (GCFPVSSInfo::propExists("IsErNiet") ? "Yes" : "no")); + + if (GCFPVSSInfo::propExists("testBit")) { + _pService->dpDelete("testBit"); + } + if (GCFPVSSInfo::propExists("testInt")) { + _pService->dpDelete("testInt"); + } + itsTimerPort->setTimer(1.0); + } + break; + + case F_TIMER: TRAN(tGSAService::test1); - break; + break; default: status = GCFEvent::NOT_HANDLED; -- GitLab