/** * Copyright Notification * No part of this document may be reproduced, in an electronic retrieval system or otherwise, except as authorized by written permission. * The copyright and the foregoing restriction extend to reproduction in all media. * © 2016, oneM2M Partners Type 1 (ARIB, ATIS, CCSA, ETSI, TIA, TSDSI, TTA, TTC). * All rights reserved. * * @author ETSI * @version $URL: https://forge.etsi.org/svn/oneM2M/trunk/ttcn/LibOneM2M/OneM2M_Functions.ttcn $ * $Id: OneM2M_Functions.ttcn 187 2016-11-29 05:28:52Z berge $ * @desc Module containing functions for oneM2M * */ module OneM2M_Functions { import from LibCommon_Time {modulepar all;} import from XSD all; import from OneM2M_Templates all; import from OneM2M_Types all;//{type XSD.ID}; import from OneM2M_TypesAndValues all; import from OneM2M_TestSystem all; import from OneM2M_Pixits all; import from OneM2M_Pics all; // import from OneM2M_AdditionalTypes all; group configFunctions { /** @desc Ports mapping and default behaviour activation for Config 1 */ function f_cf01Up() runs on CseTester { // Variables // Map map(self:mcaPort, system:mcaPort); map(self:acPort, system:acPort); activate(a_default()); activate(a_cse_cf01()); // Connect //Initialze the IUT } // end f_cf01Up function f_cf02Up() runs on CseTester { // Variables // Map map(self:mcaPort, system:mcaPort); map(self:mccPort, system:mccPort); map(self:acPort, system:acPort); activate(a_default()); activate(a_cse_cf02()); // Connect //Initialze the IUT } // end f_cf02Up function f_cf03Up() runs on CseTester { // Variables // Map map(self:mcaPort, system:mcaPort); map(self:acPort, system:acPort); activate(a_default()); activate(a_cse_cf01()); // Connect //Initialze the IUT } // end f_cf03Up /** * @desc Ports unmapping * @verdict */ function f_cf01Down() runs on CseTester { unmap(self:mcaPort, system:mcaPort); unmap(self:acPort, system:acPort); //stop; } function f_cf02Down() runs on CseTester { unmap(self:mcaPort, system:mcaPort); unmap(self:mccPort, system:mccPort); unmap(self:acPort, system:acPort); //stop; } }//end group configFunctions group cseFunctions { group preambleFunctions { /** * @desc Creation of auxiliar resources ACP for correct execution of the test case * @param p_allowedOperations Allowed operations for the auxiliar AE resource * @return Internal ACP resource index * @verdict */ function f_cse_preamble_createAcpAux(in template (value) XSD.String p_acpName := c_acpAuxName, in template (value) AccessControlOperations p_allowedOperations := int63) runs on CseTester return integer {//c_CRUDNDi return f_cse_createAccessControlPolicyAux(p_acpName, p_allowedOperations); } /** * @desc Creation of auxiliar resources ACP and AE for correct execution of the test case * @param p_allowedOperations Allowed operations for the auxiliar AE resource * @return Internal AE resource index * @verdict */ function f_cse_preamble_registerAe(template (omit) AcpType p_accessControlPolicyIDs := omit, in template (omit) PoaList p_poaList := omit) runs on CseTester return integer {//c_CRUDNDi var RequestPrimitive v_request; var MsgIn v_response; var integer v_aeAuxIndex := -1; v_request := valueof(m_createAeAux(p_accessControlPolicyIDs, p_poaList)); v_request.to_ := f_getResourceAddress(); mcaPort.send(m_request(v_request)); tc_ac.start; alt { [] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) -> value v_response { tc_ac.stop; log("Preamble: Application registered successfuly"); if(ischosen(v_response.primitive.responsePrimitive.primitiveContent.any_1[0].AE_optional)) { vc_aeAux := v_response.primitive.responsePrimitive.primitiveContent.any_1[0].AE_optional; f_checkAttributesToBeSaved(int2, v_request, v_response.primitive.responsePrimitive); v_aeAuxIndex := f_setResource(v_response.primitive.responsePrimitive.primitiveContent); vc_resourcesIndexToBeDeleted := vc_resourcesIndexToBeDeleted & {v_aeAuxIndex}; if(ispresent(vc_aeAux.aE_ID)){ f_sendAcPrimitive("AE-ID_changed", oct2char(unichar2oct(vc_aeAux.aE_ID))); } else { f_sendAcPrimitive("AE-ID_changed", "0"); } }; } [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { tc_ac.stop; setverdict(inconc, "Preamble: Error while registering application"); stop; } [] mcaPort.receive { tc_ac.stop; setverdict(inconc, "Preamble: Unexpected message received"); stop; } [] tc_ac.timeout { setverdict(inconc, "Preamble: No answer while registering resource"); stop; } } return v_aeAuxIndex; } /** * @desc Creation of auxiliar resources ACP and AE for correct execution of the test case * @param p_allowedOperations Allowed operations for the auxiliar AE resource * @return Internal AE resource index * @verdict */ function f_cse_preamble_registerAeWithId(XSD.ID p_appId, in template (value) AccessControlOperations p_allowedOperations := int63) runs on CseTester return integer {//c_CRUDNDi var RequestPrimitive v_request; var MsgIn v_response; var integer v_aeAuxIndex := -1; var integer v_acpAuxIndex := -1; if(PICS_ACP_SUPPORT){ v_acpAuxIndex := f_cse_createAccessControlPolicyAux(p_allowedOperations := p_allowedOperations); vc_acpAuxIndex := v_acpAuxIndex; } if(v_acpAuxIndex != -1) { vc_resourcesIndexToBeDeleted := {v_acpAuxIndex}; v_request := valueof(m_createAe(p_appId, {f_getResourceId(vc_resourcesList[v_acpAuxIndex].resource)}, -)); //TODO Test, to be removed v_request.to_ := f_getResourceAddress(); mcaPort.send(m_request(v_request)); //mcaPort.send(m_request(m_createAeAux(p_name, {PX_URI_CSE & PX_CSE_NAME & "/" & PX_ACPAUX_NAME}))); } else { mcaPort.send(m_request(m_createAe(p_appId))); } tc_ac.start; alt { [] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) -> value v_response { tc_ac.stop; log("Preamble: Application registered successfuly"); if(ischosen(v_response.primitive.responsePrimitive.primitiveContent.any_1[0].AE_optional)) { vc_aeAux := v_response.primitive.responsePrimitive.primitiveContent.any_1[0].AE_optional; v_aeAuxIndex := f_setResource(v_response.primitive.responsePrimitive.primitiveContent); vc_resourcesIndexToBeDeleted := vc_resourcesIndexToBeDeleted & {v_aeAuxIndex}; if(ispresent(vc_aeAux.aE_ID)){ f_sendAcPrimitive("AE-ID_changed", oct2char(unichar2oct(vc_aeAux.aE_ID))); } else { f_sendAcPrimitive("AE-ID_changed", "0"); } } } [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { tc_ac.stop; setverdict(inconc, "Preamble: Error while registering application"); stop; } [] mcaPort.receive { tc_ac.stop; setverdict(inconc, "Preamble: Unexpected message received"); stop; } [] tc_ac.timeout { setverdict(inconc, "Preamble: No answer while registering resource"); stop; } } return v_aeAuxIndex; } //Added by @Naum function f_cse_preamble_createServiceSubscribedAppRule(in template ListOfM2MID p_allowedAEs := {""}, in template (value) AccessControlOperations p_allowedOperations := int63) runs on CseTester return integer {//c_CRUDNDi var MsgIn v_response; var integer v_serviceSubscribedAppRuleIndex := -1; var RequestPrimitive v_request; v_serviceSubscribedAppRuleIndex := f_cse_createResource(int19, m_createServiceSubscribedAppRule({"None"}, {PX_APP_ID}, valueof(p_allowedAEs))); return v_serviceSubscribedAppRuleIndex; } function f_cse_preamble_subscriptionVerification(out CseTester p_notifyHandler,in integer p_aeIndex, inout integer p_ae2Index, inout template RequestPrimitive p_createRequestPrimitive,in ResourceType p_resourceType ) runs on CseTester { if(p_resourceType == int23){ p_notifyHandler := CseTester.create("NotifyHandler") alive; p_ae2Index := f_cse_createResource(int2, m_createAe(PX_APP_ID, -, PX_AE_ID_STEM, "MyAe2", {"http://" & PX_TESTER_ADDRESS & "/"}), -1); // AE2 is registred if(ischosen(p_createRequestPrimitive.primitiveContent.any_1[0].Subscription_optional)){ //this condition is necessary for Subscription TCs where notification URI is set in m_createSubscriptionAdvanced p_createRequestPrimitive.primitiveContent.any_1[0].Subscription_optional.notificationURI := {f_getResourceAddress(p_ae2Index)}; } p_notifyHandler.start(f_subscriptionVerificationHandler(f_getResourceAddress(p_aeIndex))); } } }//end group preambleFunctions group postambleFunctions { /** * @desc Deletion of all resources created during the test case execution. IUT gets clean and ready for next execution * @verdict */ function f_cse_postamble_deleteResources() runs on CseTester { var integer i; var XSD.ID v_resourceAddress; var MsgIn v_response; var RequestPrimitive v_request; if (PX_RUN_POSTAMBLE) { for(i := lengthof(vc_resourcesIndexToBeDeleted) -1; i >=0; i := i - 1) { v_resourceAddress := f_getResourceAddress(vc_resourcesIndexToBeDeleted[i]); v_request := valueof(m_deleteRequest(v_resourceAddress)); if(PX_FROM_IS_AE_ID){ if(ischosen(vc_resourcesList[vc_resourcesIndexToBeDeleted[i]].resource.any_1[0].AE_optional)) { v_request.from_ := vc_resourcesList[vc_resourcesIndexToBeDeleted[i]].resource.any_1[0].AE_optional.aE_ID; } } mcaPort.send(m_request(v_request)); tc_ac.start; alt { [] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) { tc_ac.stop; log("Postamble: AE Resource deleted"); } [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { tc_ac.stop; log("Postamble: Error while deleting resource"); } [] tc_ac.timeout { log("Postamble: No answer while deleting resource"); } } } } f_cse_postamble_default(); } /** * @desc Default postamble * @verdict */ function f_cse_postamble_default() runs on CseTester { } function f_is_component_done(in CseTester p_notifyHandler) runs on CseTester { tc_ac.start(10.0); alt { [] p_notifyHandler.done { tc_ac.stop; } [] tc_ac.timeout { setverdict(inconc, testcasename() & ": Notify verification not received"); } } } //end f_is_component_done }//end group postambleFunctions group helpingFunctions { /** * @desc Creation of a resource * @param p_resourceType Resource type of the resource to be created * @param p_requestPrimitive Template request primitive * @param p_parentIndex Internal resource index which indicates the parent of the resource to be created * @return Internal resource index of the created resource * @verdict */ function f_cse_createResource(in ResourceType p_resourceType, template RequestPrimitive p_requestPrimitive := m_create, integer p_parentIndex := -1) runs on CseTester return integer { var MsgIn v_response; var RequestPrimitive v_request; var XSD.ID v_resourceId; var integer v_resourceIndex := -1; v_request := f_getCreateRequestPrimitive(p_resourceType, p_requestPrimitive, p_parentIndex); mcaPort.send(m_request(v_request)); tc_ac.start; alt { [] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) -> value v_response { tc_ac.stop; setverdict(pass, "f_createResource: Resource type " & int2str(enum2int(p_resourceType)) & " created successfuly"); f_checkAttributesToBeSaved(p_resourceType, v_request, v_response.primitive.responsePrimitive); v_resourceIndex := f_setResource(v_response.primitive.responsePrimitive.primitiveContent, p_parentIndex); if(match(int2, p_resourceType) or match(-1, p_parentIndex)) {//If created resource is an AE or created under CSEBase, it needs to be added to the resourceToBeDeleted list vc_resourcesIndexToBeDeleted := vc_resourcesIndexToBeDeleted & {v_resourceIndex}; } } [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { tc_ac.stop; setverdict(inconc, "f_createResource: Error while creating resource type " & int2str(enum2int(p_resourceType))); } [] mcaPort.receive { tc_ac.stop; setverdict(inconc, "f_createResource: Unexpected message received"); } [] tc_ac.timeout { setverdict(inconc, "f_createResource: No answer while creating resource type " & int2str(enum2int(p_resourceType))); } } return v_resourceIndex; } /** * @desc Creation of the auxiliar ACP resource * @param p_acpName ACP name * @param p_allowedOperations Allowed operations * @return Internal resource index of the created auxiliar ACP resource * @verdict */ function f_cse_createAccessControlPolicyAux(in template (value) XSD.String p_acpName := c_acpAuxName, in template (value) AccessControlOperations p_allowedOperations := int63) runs on CseTester return integer{ var RequestPrimitive v_request; var MsgIn v_response; var integer v_acpAuxIndex := -1; v_request := valueof(m_createAcpAux(p_acpName := p_acpName, p_allowedOperations := p_allowedOperations)); v_request.to_ := f_getResourceAddress(); mcaPort.send(m_request(v_request)); tc_ac.start; alt { [] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) -> value v_response { tc_ac.stop; setverdict(pass, "f_createAccessControlPolicy: Resource type " & int2str(1) & " created successfuly"); v_acpAuxIndex := f_setResource(v_response.primitive.responsePrimitive.primitiveContent); vc_acpAuxIndex := v_acpAuxIndex; vc_resourcesIndexToBeDeleted := vc_resourcesIndexToBeDeleted & {v_acpAuxIndex}; } [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { tc_ac.stop; setverdict(inconc, "f_createAccessControlPolicy: Error while creating resource type " & int2str(1)); } [] mcaPort.receive { tc_ac.stop; setverdict(inconc, "f_createAccessControlPolicy: Unexpected message received"); } [] tc_ac.timeout { setverdict(inconc, "f_createAccessControlPolicy: No answer while creating resource type " & int2str(1)); } } return v_acpAuxIndex; } /** * @desc Creation of the auxiliar Container resource * @param p_parentIndex Internal resource index which indicates the parent of the Container resource to be created * @return Internal resource index of the created Container resource * @verdict */ function f_cse_createContainerResourceAux (integer p_parentIndex := -1) runs on CseTester return integer { var MsgIn v_response; var RequestPrimitive v_request; var integer v_acpAuxIndex := -1; var integer v_containerResourceIndex := -1; v_acpAuxIndex := f_cse_createAccessControlPolicyAux(p_acpName := c_acpAuxName);//"MyAcp_2" v_request := valueof(m_createContainerBase); v_request.primitiveContent.any_1[0].Container_optional.accessControlPolicyIDs := {f_getResourceId(vc_resourcesList[v_acpAuxIndex].resource)}; v_request.primitiveContent.any_1[0].Container_optional.resourceName := "MyContainerAux"; v_containerResourceIndex := f_cse_createResource(int3, v_request, p_parentIndex); return v_containerResourceIndex; } /** * @desc * @param p_requestPrimitive * @verdict */ function f_cse_updateResource(in RequestPrimitive p_requestPrimitive) runs on CseTester { var MsgIn v_response; mcaPort.send(m_request(p_requestPrimitive)); tc_ac.start; alt { [] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) -> value v_response { tc_ac.stop; setverdict(pass, testcasename() & ": Attribute of resource updated successfuly"); } [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) -> value v_response { tc_ac.stop; setverdict(fail, testcasename() & ": Error while updating resource"); } [] mcaPort.receive{ tc_ac.stop; setverdict(fail, testcasename() & ": Error, unexpected message received"); } [] tc_ac.timeout { setverdict(inconc, testcasename() & ": No answer while updating resource"); } } }// end f_cse_updateResource /** * @desc Update of the auxiliar ACP resource * @param p_allowedOperations New allowed operations * @verdict */ function f_cse_updateAcpAuxResource (in template (value) AccessControlOperations p_allowedOperations) runs on CseTester { var RequestPrimitive v_request; v_request := valueof(m_updateAcpBase); v_request.to_ := f_getResourceAddress(vc_acpAuxIndex); v_request.primitiveContent.any_1[0].AccessControlPolicy_optional.privileges.accessControlRule_list := { { accessControlOriginators := PX_ACOR, //{"admin:admin"} accessControlOperations := valueof(p_allowedOperations), accessControlContexts_list := {}, accessControlAuthenticationFlag := omit, accessControlObjectDetails_list := {} } }; mcaPort.send(m_request(v_request)); tc_ac.start; alt { [] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) { tc_ac.stop; setverdict(pass, "f_updateAcpAuxResource: " & v_request.to_ & " resource updated successfuly"); } [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { tc_ac.stop; setverdict(fail, "f_updateAcpAuxResource: Error while updating " & v_request.to_ & " resource"); } [] tc_ac.timeout { setverdict(inconc, "f_updateAcpAuxResource: No answer while updating " & v_request.to_ & " resource" ); } } } function f_subscriptionVerificationHandler(in XSD.ID p_creator, in ResponseStatusCode v_responseStatusCode := int2001) runs on CseTester { // Local variables var MsgIn v_response; var ResponsePrimitive v_responsePrimitive; var template Notification v_notificationRequest := mw_contentNotificationBase; var PrimitiveContent v_notificationResponse; // TODO Need to see if this parameter is required however there is a problem if it s omitted during the verification map(self:mcaPort, system:mcaPort); map(self:acPort, system:acPort); v_notificationResponse.any_1 := {{Notification := valueof(mw_contentNotificationAllOmit)}}; v_notificationRequest.verificationRequest := true; v_notificationRequest.creator := p_creator; //v_notificationRequest.subscriptionReference := "I Don't know which URI is expected"; // TODO mandatory parameter v_responsePrimitive := valueof(m_responseNotification(v_responseStatusCode,v_notificationResponse));//TODO No PrimitiveContent is expected if(v_responseStatusCode != int2001){ v_responsePrimitive.primitiveContent := omit; } tc_ac.start; alt { [] mcaPort.receive(mw_request(mw_notify(v_notificationRequest))) -> value v_response { tc_ac.stop; setverdict(pass, testcasename() & ": Notification received"); //mcaPort.send(m_response(p_responsePrimitive)); } [] mcaPort.receive(mw_request(mw_notify(mw_contentNotification(?)))) -> value v_response { tc_ac.stop; setverdict(fail, testcasename() & ": Notification received but verificationRequest isn't set to TRUE"); } [] mcaPort.receive{ tc_ac.stop; setverdict(fail, testcasename() & ": Error, unexpected message received"); } [] tc_ac.timeout { setverdict(inconc, testcasename() & ": No notification received"); } } mcaPort.send(m_response(v_responsePrimitive)); // TODO have to be deleted unmap(self:mcaPort, system:mcaPort); unmap(self:acPort, system:acPort); } //end f_subscriptionVerificationHandler function f_checkAttributesToBeSaved (ResourceType p_resourceType, RequestPrimitive p_request, inout ResponsePrimitive p_response) { if(p_resourceType == int2) { if(not(ispresent(p_response.primitiveContent.any_1[0].AE_optional.resourceName))) { p_response.primitiveContent.any_1[0].AE_optional.resourceName := p_request.primitiveContent.any_1[0].AE_optional.resourceName; } } if(p_resourceType == int3) { if(not(ispresent(p_response.primitiveContent.any_1[0].Container_optional.resourceName))) { p_response.primitiveContent.any_1[0].Container_optional.resourceName := p_request.primitiveContent.any_1[0].Container_optional.resourceName; } } if(p_resourceType == int1) { if(not(ispresent(p_response.primitiveContent.any_1[0].AccessControlPolicy_optional.resourceName))) { p_response.primitiveContent.any_1[0].AccessControlPolicy_optional.resourceName := p_request.primitiveContent.any_1[0].AccessControlPolicy_optional.resourceName; } } if(p_resourceType == int2) { if(not(ispresent(p_response.primitiveContent.any_1[0].AE_optional.resourceName))) { p_response.primitiveContent.any_1[0].AE_optional.resourceName := p_request.primitiveContent.any_1[0].AE_optional.resourceName; } } } function f_check_notificationContent(in RequestPrimitive p_requestPrimitive, template PrimitiveContent p_primitiveContent) runs on CseTester return boolean{ // Local variables var boolean v_matchResult := false; var integer i; var integer v_numberOfAggregatedNotification; if (ischosen(p_primitiveContent.any_1[0].AE_optional)){ if(ischosen(p_requestPrimitive.primitiveContent.any_1[0].Notification.notificationEvent.representation.resource)) { v_matchResult := match(p_requestPrimitive.primitiveContent.any_1[0].Notification.notificationEvent.representation.resource.AE_optional, p_primitiveContent.any_1[0].AE_optional) } else if(ischosen(p_requestPrimitive.primitiveContent.any_1[0].Notification.notificationEvent.representation.responsePrimitive)) { v_matchResult :=match(p_requestPrimitive.primitiveContent.any_1[0].Notification.notificationEvent.representation.responsePrimitive.primitiveContent.any_1[0].AE_optional, p_primitiveContent.any_1[0].AE_optional) } else if (ischosen(p_requestPrimitive.primitiveContent.any_1[0].AggregatedNotification)) { v_matchResult := true; v_numberOfAggregatedNotification := lengthof(p_requestPrimitive.primitiveContent.any_1[0].AggregatedNotification.notification_list); for(i := 0; i< v_numberOfAggregatedNotification; i := i + 1){ if(ischosen(p_requestPrimitive.primitiveContent.any_1[0].AggregatedNotification.notification_list[i].notificationEvent.representation.resource)) { if(not (match(p_requestPrimitive.primitiveContent.any_1[0].AggregatedNotification.notification_list[i].notificationEvent.representation.resource.AE_optional, p_primitiveContent.any_1[0].AE_optional))){ v_matchResult := false; } } else if(ischosen(p_requestPrimitive.primitiveContent.any_1[0].AggregatedNotification.notification_list[i].notificationEvent.representation.responsePrimitive)) { if(not (match(p_requestPrimitive.primitiveContent.any_1[0].AggregatedNotification.notification_list[i].notificationEvent.representation.responsePrimitive.primitiveContent.any_1[0].AE_optional, p_primitiveContent.any_1[0].AE_optional))){ v_matchResult := false; } } } if (i == 0){ v_matchResult := false; } } } if (ischosen(p_primitiveContent.any_1[0].Container_optional)){ if(ischosen(p_requestPrimitive.primitiveContent.any_1[0].Notification.notificationEvent.representation.resource)) { v_matchResult := match(p_requestPrimitive.primitiveContent.any_1[0].Notification.notificationEvent.representation.resource.Container_optional, p_primitiveContent.any_1[0].Container_optional) } else if(ischosen(p_requestPrimitive.primitiveContent.any_1[0].Notification.notificationEvent.representation.responsePrimitive)) { v_matchResult := match(p_requestPrimitive.primitiveContent.any_1[0].Notification.notificationEvent.representation.responsePrimitive.primitiveContent.any_1[0].Container_optional, p_primitiveContent.any_1[0].Container_optional) } } return v_matchResult; } //end f_check_notificationContent function f_cse_notifyProcedure(template PrimitiveContent p_primitiveContent) runs on CseTester { // Local variables var MsgIn v_response; map(self:mcaPort, system:mcaPort); map(self:acPort, system:acPort); tc_ac.start; alt { [] mcaPort.receive(mw_request(mw_notify(mw_contentNotification(?)))) -> value v_response { tc_ac.stop; if(f_check_notificationContent(v_response.primitive.requestPrimitive, p_primitiveContent)){ setverdict(pass, testcasename() & ": Notification received"); mcaPort.send(m_response(valueof(m_responseNotification(int2001)))); } else{ setverdict(fail, testcasename() & ": Notification received but the content doesn't match"); } } [] mcaPort.receive{ tc_ac.stop; setverdict(fail, testcasename() & ": Error, unexpected message received"); } [] tc_ac.timeout { setverdict(inconc, testcasename() & ": No notification received"); } } unmap(self:mcaPort, system:mcaPort); unmap(self:acPort, system:acPort); } //end f_cse_notifyProcedure }//end group helpingFunctions group altstepFunctions { /** * @desc Cse altstep for config 01 */ altstep a_cse_cf01() runs on CseTester { [] mcaPort.receive { log("a_default: WARNING: Unexpected message received"); repeat; } } /** * @desc Cse altstep for config 02 */ altstep a_cse_cf02() runs on CseTester { [] mcaPort.receive { log("a_default: WARNING: Unexpected message received"); repeat; } [] mccPort.receive { log("a_default: WARNING: Unexpected message received"); repeat; } } }//end group altstepFunctions }//end cseFunctions group aeFunctions { group altstepFunctions { /** * @desc Ae altstep */ altstep a_ae_default() runs on AeTester { [] mcaPort.receive { log("a_default: WARNING: Unexpected message received"); repeat; } } }//end group altstepFunctions }//end of aeFunctions group getSetFunctions { /** * @desc Creation of a CREATE request primitive from a template request primitive * @param p_resourceType Type of resource to be created * @param p_request Template request primitive * @param p_parentIndex Internal resource index which indicates the parent of the resource to be created * @return Created CREATE request primitive * @verdict */ function f_getCreateRequestPrimitive(in ResourceType p_resourceType, template RequestPrimitive p_request := m_create, integer p_parentIndex) runs on CseTester return RequestPrimitive { var integer p_locresourceIndex := p_parentIndex; var template ListOfURIs v_defaultListOfURIs := {"Not Initialized"}; p_request.from_ := f_getOriginator(p_parentIndex); p_request.to_ := f_getResourceAddress(p_parentIndex); if (p_resourceType == int1) {//AccessControlPolicy } if (p_resourceType == int9) {//group if(match(valueof(p_request.primitiveContent.any_1[0].Group_optional.memberIDs), v_defaultListOfURIs )){ p_request.primitiveContent.any_1[0].Group_optional.memberIDs := {f_getResourceAddress(p_parentIndex)}; } } if(p_resourceType == int3){//container //when a container is created by hosting cse for storing location information, the container is seen as a location container if(PX_IS_LOC_CONTAINER){ p_request.primitiveContent.any_1[0].Container_optional.locationID := f_getResourceId(vc_resourcesList[p_locresourceIndex].resource);//resourceID of the locationPolicy } } if (p_resourceType == int15) {//pollingChannel if(ischosen(vc_resourcesList[p_parentIndex].resource.any_1[0].AE_optional)) { p_request.from_ := vc_resourcesList[p_parentIndex].resource.any_1[0].AE_optional.aE_ID; } } if (p_resourceType == int18) {//schedule } if (p_resourceType == int23) {//subscription if(match(valueof(p_request.primitiveContent.any_1[0].Subscription_optional.notificationURI), v_defaultListOfURIs )){ p_request.primitiveContent.any_1[0].Subscription_optional.notificationURI := {f_getResourceAddress(p_parentIndex)}; } /*if(PX_FROM_IS_AE_ID) { if(PX_UNSTRUCTURED){ p_request.primitiveContent.any_1[0].Subscription_optional.notificationURI := {vc_aeAux.aE_ID}; } else { p_request.primitiveContent.any_1[0].Subscription_optional.notificationURI := {PX_CSE_ID & "/" & vc_aeAux.aE_ID}; } } else { p_request.primitiveContent.any_1[0].Subscription_optional.notificationURI := {"/" & PX_CSE_NAME & "/" & PX_AEAUX_NAME};//c_aeAuxName }*/ } return valueof(p_request); } /** * @desc Creation of an UPDATE request primitive from a template request primitive * @param p_resourceType Type of resource to be created * @param p_resourceIndex Internal resource index which indicates the resource to be updated * @param p_request Template request primitive * @return Created UPDATE request primitive * @verdict */ function f_getUpdateRequestPrimitive(in ResourceType p_resourceType, integer p_resourceIndex, template RequestPrimitive p_request) runs on CseTester return RequestPrimitive { p_request.from_ := f_getOriginator(p_resourceIndex); p_request.to_ := f_getResourceAddress(p_resourceIndex); if (p_resourceType == int3) {//Container //TODO } if (p_resourceType == int9) {//group //TODO } if (p_resourceType == int18) {//schedule //TODO } if (p_resourceType == int15) {//pollingChannel //TODO } if (p_resourceType == int23) {//subscription //TODO } return valueof(p_request); } /** * @desc Extraction from a primitiveContent field the resourceID attribute * @param p_contentResource primitiveContent field * @return resourceID attribute * @verdict */ function f_getResourceId(PrimitiveContent p_contentResource) return XSD.ID { if(ischosen(p_contentResource.any_1[0].AccessControlPolicy_optional)) { return p_contentResource.any_1[0].AccessControlPolicy_optional.resourceID; } if(ischosen(p_contentResource.any_1[0].Container_optional)) { return p_contentResource.any_1[0].Container_optional.resourceID; } if(ischosen(p_contentResource.any_1[0].Schedule_optional)) { return p_contentResource.any_1[0].Schedule_optional.resourceID; } if(ischosen(p_contentResource.any_1[0].PollingChannel_optional)) { return p_contentResource.any_1[0].PollingChannel_optional.resourceID; } if(ischosen(p_contentResource.any_1[0].Subscription_optional)) { return p_contentResource.any_1[0].Subscription_optional.resourceID; } if(ischosen(p_contentResource.any_1[0].Group_optional)) { return p_contentResource.any_1[0].Group_optional.resourceID; } if(ischosen(p_contentResource.any_1[0].AE_optional)) { return p_contentResource.any_1[0].AE_optional.resourceID; } return "1"; } /** * @desc Extraction from a primitiveContent field the resourceName attribute * @param p_contentResource primitiveContent field * @return resourceName attribute * @verdict */ function f_getResourceName(PrimitiveContent p_contentResource) return XSD.ID { if(ischosen(p_contentResource.any_1[0].AccessControlPolicy_optional)) { return p_contentResource.any_1[0].AccessControlPolicy_optional.resourceName; } if(ischosen(p_contentResource.any_1[0].Container_optional)) { return p_contentResource.any_1[0].Container_optional.resourceName; } if(ischosen(p_contentResource.any_1[0].Schedule_optional)) { return p_contentResource.any_1[0].Schedule_optional.resourceName; } if(ischosen(p_contentResource.any_1[0].PollingChannel_optional)) { return p_contentResource.any_1[0].PollingChannel_optional.resourceName; } if(ischosen(p_contentResource.any_1[0].Subscription_optional)) { return p_contentResource.any_1[0].Subscription_optional.resourceName; } if(ischosen(p_contentResource.any_1[0].Group_optional)) { return p_contentResource.any_1[0].Group_optional.resourceName; } if(ischosen(p_contentResource.any_1[0].AE_optional)) { return p_contentResource.any_1[0].AE_optional.resourceName; } return "1"; } /** * @desc Resolution of the originator field (from) for a given resource * @param p_targetResourceIndex Internal resource index of the given resource * @return Originator for a given resource * @verdict */ function f_getOriginator(integer p_targetResourceIndex := -1) runs on CseTester return XSD.AnyURI { if(p_targetResourceIndex == -1) { return PX_SUPER_USER; } if(PX_FROM_IS_AE_ID) { if(ischosen(vc_resourcesList[p_targetResourceIndex].resource.any_1[0].AE_optional)) { return vc_resourcesList[p_targetResourceIndex].resource.any_1[0].AE_optional.aE_ID; } else { return f_getOriginator(vc_resourcesList[p_targetResourceIndex].parentIndex); } } else { return PX_SUPER_USER; } } /** * @desc Return of a index of a specific attribute from an attributeList by attributeName * @param p_attributeList Target attributeList * @param p_attributeName attributeName to be searched * @return Index of the attribute in the attributeList * @verdict */ function f_getAttribute(in AttributeList p_attributeList, in XSD.NCName p_attributeName) return integer { var integer i; var Attribute v_attribute := {-, -}; for (i:=0; i < lengthof(p_attributeList); i := i + 1){ if(p_attributeList[i] == p_attributeName){ return i; } } return -1; } /** * @desc Resolution of the resource address field (to) for a given resource depending on addressing and hierarchical format * @param p_targetResourceIndex Internal resource index of the given resource * @return Resource address for the given resource * @verdict */ function f_getResourceAddress(integer p_targetResourceIndex := -1) runs on CseTester return XSD.ID { var XSD.ID v_resourceAddress; if(PX_ADDRESSING_FORMAT == e_cseRelative) { if(PX_UNSTRUCTURED) { if(p_targetResourceIndex == -1) { return ""; } else { return f_getResourceId(vc_resourcesList[p_targetResourceIndex].resource); } } else { if(p_targetResourceIndex == -1) { return PX_CSE_NAME; } else { v_resourceAddress := f_getResourceAddress(vc_resourcesList[p_targetResourceIndex].parentIndex) & "/" & f_getResourceName(vc_resourcesList[p_targetResourceIndex].resource); return v_resourceAddress; } } } else if (PX_ADDRESSING_FORMAT == e_spRelative) { if(PX_UNSTRUCTURED) { if(p_targetResourceIndex == -1) { return "/" & PX_CSE_ID; } else { v_resourceAddress := f_getResourceAddress() & "/" & f_getResourceId(vc_resourcesList[p_targetResourceIndex].resource); return v_resourceAddress; } } else { if(p_targetResourceIndex == -1) { return "/" & PX_CSE_ID & "/" & PX_CSE_NAME; } else { v_resourceAddress := f_getResourceAddress(vc_resourcesList[p_targetResourceIndex].parentIndex) & "/" & f_getResourceName(vc_resourcesList[p_targetResourceIndex].resource); return v_resourceAddress; } } } else if (PX_ADDRESSING_FORMAT == e_absolute) { if(PX_UNSTRUCTURED) { if(p_targetResourceIndex == -1) { return "//" &"SpId" & "/" & PX_CSE_ID; } else { v_resourceAddress := f_getResourceAddress() & "/" & f_getResourceId(vc_resourcesList[p_targetResourceIndex].resource); return v_resourceAddress; } } else { if(p_targetResourceIndex == -1) { return "//" &"SpId" & "/" & PX_CSE_ID & "/" & PX_CSE_NAME; } else { v_resourceAddress := f_getResourceAddress(vc_resourcesList[p_targetResourceIndex].parentIndex) & "/" & f_getResourceName(vc_resourcesList[p_targetResourceIndex].resource); return v_resourceAddress; } } } else { return ""; } } /** * @desc Saving of a resource and its parent index in the internal resource list * @param p_resource Resource to be saved * @param p_parentIndex Parent index of resource to be saved * @return Internal resource index of the saved resource * @verdict */ function f_setResource(PrimitiveContent p_resource, integer p_parentIndex := -1) runs on Tester return integer { if(isbound(vc_resourcesList)) { vc_resourcesList[lengthof(vc_resourcesList)] := {p_parentIndex, p_resource}; } else { vc_resourcesList[0] := {p_parentIndex, p_resource}; } return lengthof(vc_resourcesList)-1; } /** * @desc Set Acpid into the requestPrimitive * @param p_requestPrimitive RequestPrimitive to be modified * @param p_accessControlPolicyIDs AcpId to be set * @return * @verdict */ function f_setAcpId(template RequestPrimitive p_requestPrimitive, template AcpType p_accessControlPolicyIDs) runs on CseTester return RequestPrimitive{ if (ischosen(p_requestPrimitive.primitiveContent.any_1[0].AE_optional)){ p_requestPrimitive.primitiveContent.any_1[0].AE_optional.accessControlPolicyIDs := p_accessControlPolicyIDs; } else if (ischosen(p_requestPrimitive.primitiveContent.any_1[0].Container_optional)){ p_requestPrimitive.primitiveContent.any_1[0].Container_optional.accessControlPolicyIDs := p_accessControlPolicyIDs; } else if (ischosen(p_requestPrimitive.primitiveContent.any_1[0].Group_optional)){ p_requestPrimitive.primitiveContent.any_1[0].Group_optional.accessControlPolicyIDs := p_accessControlPolicyIDs; } else if (ischosen(p_requestPrimitive.primitiveContent.any_1[0].ServiceSubscribedAppRule_optional)){ p_requestPrimitive.primitiveContent.any_1[0].ServiceSubscribedAppRule_optional.accessControlPolicyIDs := p_accessControlPolicyIDs; } else if (ischosen(p_requestPrimitive.primitiveContent.any_1[0].Subscription_optional)){ p_requestPrimitive.primitiveContent.any_1[0].Subscription_optional.accessControlPolicyIDs := p_accessControlPolicyIDs; } else if (ischosen(p_requestPrimitive.primitiveContent.any_1[0].LocationPolicy_optional)){ p_requestPrimitive.primitiveContent.any_1[0].LocationPolicy_optional.accessControlPolicyIDs := p_accessControlPolicyIDs; } return valueof(p_requestPrimitive); } }//end group getSetFunctions group commonFunctions { /** * @desc Sending of an Adapter Control primitive * @param event Action to be performed by TA * @param data Corresponding information for the correct execution of the given action * @verdict */ function f_sendAcPrimitive(in charstring event, in charstring data) runs on Tester { var charstring v_data := "" & data; // clear encoding rules (ttwb issue ?) acPort.send(AcRequestPrimitive:{event, {charstring := v_data}}); } group altstepFunctions { /** * @desc Default altstep */ altstep a_default() runs on Tester { [] tc_wait.timeout { setverdict(inconc,"a_default: ERROR: Timeout while awaiting reaction of the IUT prior to Upper Tester action"); } [] tc_ac.timeout { setverdict(inconc,"a_default: ERROR: Timeout while awaiting the reception of a message"); } } }//end group altstepFunctions }//end of commonFunctions } // end of module