Skip to content
Snippets Groups Projects
OneM2M_Functions.ttcn 19.11 KiB
/**
 *  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/OneM2M_Functions.ttcn $
 *              $Id: OneM2M_Functions.ttcn 99 2016-06-09 15:04:43Z reinaortega $
 *  @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_AdditionalTypes all;
	
	
	group configFunctions {
		/**
			@desc 
		*/
		function f_cf01Up() runs on M2M {
    			
			// Variables
    			
			// Map
			map(self:mcaPort, system:mcaPort);
			map(self:acPort, system:acPort);
			activate(a_default());
    			
			// Connect
    						
			//Initialze the IUT
    						
		} // end f_cf01Up
    	
	}//end group configFunctions
	
	group preambleFunctions {

		function f_preamble_registerAe(in template (value) AccessControlOperations p_allowedOperations := int63) runs on M2M return integer{//c_CRUDNDi
		
			var RequestPrimitive v_request;
			var M2MResponsePrimitive v_response;
			var integer v_aeAuxIndex := -1;
			var integer v_acpAuxIndex := -1;
		
			if(PX_ACP_SUPPORT){
				v_acpAuxIndex := f_createAccessControlPolicyAux(p_allowedOperations := p_allowedOperations);
			}
			
			if(v_acpAuxIndex != -1) {
				vc_resourcesIndexToBeDeleted := {v_acpAuxIndex};
				v_request := valueof(m_createAeAux({f_getResourceId(vc_resourcesList[v_acpAuxIndex].resource)}));
				
				//TODO Test, to be removed
				v_request.to_ := f_addPrefix(f_getResourceAddress());
				
				mcaPort.send(m_request(v_request));
				//mcaPort.send(m_request(m_createAeAux(p_name, {PX_URI_CSE & PX_CSE_NAME & "/" & c_acpAuxName})));
			} else {
				mcaPort.send(m_request(m_createAeAux()));
			}
			tc_ac.start;
			alt {
				[] mcaPort.receive(mw_responseOK) -> value v_response {
					tc_ac.stop;
					log("Preamble: Application registered successfuly");
					if(ischosen(v_response.responsePrimitive_.primitiveContent.any_1[0].AE_optional)) {
						vc_aeAux := v_response.responsePrimitive_.primitiveContent.any_1[0].AE_optional;
						
						v_aeAuxIndex := f_setResource(v_response.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_responseKO) {
					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_preamble_prepareCSE(in template ListOfM2MID p_allowedAEs, in template (value) AccessControlOperations p_allowedOperations := int63) runs on M2M return integer{//c_CRUDNDi
		
			var M2MResponsePrimitive v_response;
			var integer v_cseBaseAuxIndex := -1;
			var integer v_acpAuxIndex := -1;
			var ServiceSubscribedAppRule v_serviceSubscribedAppRule;

			v_serviceSubscribedAppRule.applicableCredIDs := {"None"};
			v_serviceSubscribedAppRule.allowedApp_IDs := {PX_APP_ID};
			v_serviceSubscribedAppRule.allowedAEs := valueof(p_allowedAEs);
			
			mcaPort.send(m_request(m_createCSEBase(v_serviceSubscribedAppRule)));
		
			tc_ac.start;
			alt {
				[] mcaPort.receive(mw_response(int2001)) -> value v_response{
					tc_ac.stop;
					v_cseBaseAuxIndex := f_setResource(v_response.responsePrimitive_.primitiveContent);
					vc_resourcesIndexToBeDeleted := vc_resourcesIndexToBeDeleted & {v_cseBaseAuxIndex};
				}
				[] mcaPort.receive(mw_responseKO) {
					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_cseBaseAuxIndex;
		
		}
	
	}//end group preambleFunctions
	
	group postambleFunctions {

		function f_postamble_deleteResources() runs on M2M {
			var integer i;
			var XSD.ID v_resourceAddress;
			var M2MResponsePrimitive v_response;
			var RequestPrimitive v_request;
			
			if (PX_RUN_POSTAMBLE) {
				
				for(i := 0; i < lengthof(vc_resourcesIndexToBeDeleted); i := i + 1) {
					
					v_resourceAddress := f_getResourceAddress(lengthof(vc_resourcesIndexToBeDeleted)-1 - i);
					
					v_request := valueof(m_deleteRequest(v_resourceAddress));
					
					if(PX_FROM_IS_AE_ID){
						if(ischosen(vc_resourcesList[i].resource.any_1[0].AccessControlPolicy_optional)) {
							v_request.from_ := PX_AE_ID_STEM;
						} else {
							v_request.from_ := vc_aeAux.aE_ID;
						}
					}
					mcaPort.send(m_request(v_request));
					
					tc_ac.start;
					alt {
						[] mcaPort.receive(mw_responseOK) {
							tc_ac.stop;
							log("Postamble: AE Resource deleted");
						}
						[] mcaPort.receive(mw_responseKO) {
							tc_ac.stop;
							log("Postamble: Error while deleting resource");
						}
						[] tc_ac.timeout {
							log("Postamble: No answer while deleting resource");
						}	
					}	
				}
			}
						
			f_postamble_default();
		}
			
		function f_postamble_default() runs on M2M {
	
			unmap(self:mcaPort, system:mcaPort); 
			unmap(self:acPort, system:acPort);
			//stop;
		}		
		
	}//end group postambleFunctions
	
	group altstepFunctions {

		/**
		  * @desc	Default altstep
		  */
		 altstep a_default() runs on M2M {
			
			[] mcaPort.receive {
				log("a_default: WARNING: Unexpected message received");
				repeat;
			}
			[] 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
	
	group getSetFunctions {

		function f_getCreateRequestPrimitive(in ResourceType p_resourceType, in template (omit) AccessControlOperations p_allowedOperations, template RequestPrimitive p_request, integer p_parentIndex) runs on M2M return RequestPrimitive {
		
			p_request.from_ := f_getOriginator(p_parentIndex);
            
			p_request.to_ := f_addPrefix(f_getResourceAddress(p_parentIndex));
            
			//p_request.name := p_name;
		
			if (p_resourceType == int1) {//AccessControlPolicy
			
			} 
			if (p_resourceType == int9) {//group
				p_request.primitiveContent.any_1[0].Group_optional.memberIDs := {f_getResourceAddress(p_parentIndex)};
			}
		
			if (p_resourceType == int15) {//pollingChannel
				p_request.from_ := vc_aeAux.aE_ID;
			} 
			
			if (p_resourceType == int23) {//subscription
				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 & "/" & c_aeAuxName};
				}*/
			}
		
			return valueof(p_request);
		}
	
		function f_getUpdateRequestPrimitive(in ResourceType p_resourceType, integer p_resourceIndex, template RequestPrimitive p_request) runs on M2M return RequestPrimitive {
		
			p_request.from_ := f_getOriginator(p_resourceIndex);
            
			p_request.to_ := f_addPrefix(f_getResourceAddress(p_resourceIndex));
			
			//p_request.name := p_name;
		
			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);
		}

		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";
  
		}
		
		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";
  
		}
		
		function f_getOriginator(integer  p_targetResourceIndex := -1) runs on M2M return XSD.AnyURI {
			
			if(p_targetResourceIndex == -1) {
				return PX_AE_ID_STEM;
			}	
			
			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_AE_ID_STEM;
			}
		}
		
		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;
		
		}
		
		function f_getResourceAddress(integer  p_targetResourceIndex := -1) runs on M2M 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 "";
					} else {
						return "";
					}
				} else {
					if(p_targetResourceIndex == -1) {
						return "";
					} else {
						return "";
					}	
				}				
			} else {
				return "";
			}
			
		}
		function f_setResource(PrimitiveContent p_resource, integer  p_parentIndex := -1) runs on M2M 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;
					
		}
				
	}//end group getSetFunctions
	
	group helpingFunctions {

		function f_createResource(in ResourceType p_resourceType, template RequestPrimitive p_requestPrimitive, integer p_parentIndex := -1) runs on M2M return integer {
		
			var M2MResponsePrimitive v_response;
			var RequestPrimitive v_request;
			var XSD.ID v_resourceId;
			var integer v_resourceIndex := -1;
			
			v_request := f_getCreateRequestPrimitive(p_resourceType, omit, p_requestPrimitive, p_parentIndex);
		
			mcaPort.send(m_request(v_request));
			tc_ac.start;
			alt {
				[] mcaPort.receive(mw_responseOK) -> value v_response {
					tc_ac.stop;
					setverdict(pass, "f_createResource: Resource type " & int2str(enum2int(p_resourceType)) & " created successfuly");
					v_resourceIndex := f_setResource(v_response.responsePrimitive_.primitiveContent, p_parentIndex);
				}
				[] mcaPort.receive(mw_responseKO) {
					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;
	
		}
	
		function f_createAccessControlPolicyAux(in template (value) XSD.String p_acpName := "MyAcp", in template (value) AccessControlOperations p_allowedOperations := int63) runs on M2M return integer{
			var RequestPrimitive v_request;
			var M2MResponsePrimitive v_response;
			var integer v_acpAuxIndex := -1;
			
			v_request := valueof(m_createAcpAux(p_acpName := p_acpName, p_allowedOperations := p_allowedOperations));
			
			v_request.to_ := f_addPrefix(f_getResourceAddress());
			
			mcaPort.send(m_request(v_request));
			tc_ac.start;
			alt {
				[] mcaPort.receive(mw_responseOK) -> value v_response {
					tc_ac.stop;
					setverdict(pass, "f_createAccessControlPolicy: Resource type " & int2str(1) & " created successfuly");
					v_acpAuxIndex := f_setResource(v_response.responsePrimitive_.primitiveContent);
					vc_acpAux := v_response.responsePrimitive_.primitiveContent.any_1[0].AccessControlPolicy_optional;//TODO To be removed
				}
				[] mcaPort.receive(mw_responseKO) {
					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;

		}
			
			
		function f_createContainerResourceAux (XSD.ID p_parentResourceAddress, integer p_parentIndex := -1) runs on M2M return integer {
		
			var M2MResponsePrimitive v_response;
			var RequestPrimitive v_request;
			var integer v_acpAuxIndex := -1;
			var integer v_containerResourceIndex := -1;
			
			v_acpAuxIndex := f_createAccessControlPolicyAux(p_acpName := "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_createResource(int3, v_request, p_parentIndex);
			
			return v_containerResourceIndex;		
	
		}
		
		function f_updateAcpAuxResource (XSD.ID p_acpAddress, in template (value) AccessControlOperations p_allowedOperations) runs on M2M {
			var RequestPrimitive v_request;
			
			v_request := valueof(m_updateAcpBase);
			
			v_request.to_ := f_addPrefix(p_acpAddress);
			v_request.primitiveContent.any_1[0].AccessControlPolicy_optional.privileges.accessControlRule_list := {
				{
					accessControlOriginators := PX_ACOR, //{"admin:admin"}
					accessControlOperations := valueof(p_allowedOperations),
					accessControlContexts_list := omit
				}
			};
						
			mcaPort.send(m_request(v_request));
			tc_ac.start;
			alt {
				[] mcaPort.receive(mw_responseOK)  {
					tc_ac.stop;
					setverdict(pass, "f_updateAcpAuxResource: " & p_acpAddress & " resource updated successfuly");
				}
				[] mcaPort.receive(mw_responseKO) {
					tc_ac.stop;
					setverdict(fail, "f_updateAcpAuxResource: Error while updating " & p_acpAddress & " resource");
				}
				[] tc_ac.timeout {
					setverdict(inconc, "f_updateAcpAuxResource: No answer while updating " & p_acpAddress & " resource" );
				}
			}		
		}
		
		function f_sendAcPrimitive(in charstring event, in charstring data) runs on M2M {

			var charstring v_data := "" & data; // clear encoding rules (ttwb issue ?)
			acPort.send(AcRequestPrimitive:{event, {charstring := v_data}});
			
		}


	}//end group helpingFunctions	


	

		

	

		

		

	

	
}  // end of module