Skip to content
Snippets Groups Projects
OneM2M_Functions.ttcn 65.07 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/LibOneM2M/OneM2M_Functions.ttcn $
 *              $Id: OneM2M_Functions.ttcn 229 2017-03-16 08:00:30Z 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_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
			vc_config := e_cf01;	
			
			// 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
			vc_config := e_cf02;
				
			// 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
		
		/**
		 * @desc Ports mapping and default behaviour activation for Config 03
		 */
		function f_cf03Up() runs on AeTester {
		
			// Variables
			vc_config := e_cf03;
			
			// Map
			map(self:mcaPort, system:mcaPort);
			map(self:acPort, system:acPort);
			activate(a_default());
			activate(a_ae_cf03());
		
			// Connect
					
			//Initialze the IUT
					
		} // end f_cf03Up

		/**
		 * @desc Ports unmapping
		 * @verdict 
		 */
		function f_cfCseTesterDown() runs on CseTester {
		
			if(vc_config == e_cf01) {
				f_cf01Down()
			} else if (vc_config == e_cf02){
				f_cf02Down()
			} 
		}
		/**
		 * @desc Ports unmapping
		 * @verdict 
		 */
		function f_cfAeTesterDown() runs on AeTester {
		
			if(vc_config == e_cf03) {
				f_cf03Down()
			} 
		}			
		/**
		 * @desc Ports unmapping
		 * @verdict 
		 */
		function f_cf01Down() runs on CseTester {
		
			unmap(self:mcaPort, system:mcaPort);
			unmap(self:acPort, system:acPort);
			stop;
		}	
		/**
		 * @desc Ports unmapping
		 * @verdict 
		 */
		function f_cf02Down() runs on CseTester {
		
			unmap(self:mcaPort, system:mcaPort);
			unmap(self:mccPort, system:mccPort);
			unmap(self:acPort, system:acPort);
			stop;
		}		
		/**
		 * @desc Ports unmapping for Config 03
		 */
		function f_cf03Down() runs on AeTester {
			
			unmap(self:mcaPort, system:mcaPort);
			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(__SCOPE__&":INFO: 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;
					}
				}	
				
				f_checkCseTesterStatus();
				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(__SCOPE__&": INFO: 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;
					}
				}	
				
				f_checkCseTesterStatus();
				return v_aeAuxIndex;
			
			}
			
			//Added by @Naum
			function f_cse_preamble_createServiceSubscribedAppRule(in template ListOfM2MID p_allowedAEs := {""}) runs on CseTester return integer {//c_CRUDNDi
			
				var integer v_serviceSubscribedAppRuleIndex := -1;
	
				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 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));
						
						//Not needed any longer: PX_SUPER_USER should be able to do all operations
//						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;
//							}
//						}
						
						f_cse_deleteResource(v_request);
						
					}
				}
							
				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 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)));
					}
				}	
				
				f_checkCseTesterStatus();
				
				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");
						f_checkAttributesToBeSaved(int1, v_request, v_response.primitive.responsePrimitive);
						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));
					}
				}	
				
				f_checkCseTesterStatus();
			
				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 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");
					}
				}	
				
				f_checkCseTesterStatus();
				
			}// end f_cse_updateResource
			
			/**
			 * @desc 
			 * @param p_requestPrimitive
			 * @verdict 
			 */
			function f_cse_deleteResource(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)) {
						tc_ac.stop;
						log(__SCOPE__&"INFO: Resource" & p_requestPrimitive.to_ & " deleted");
					}
					[] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) {
						tc_ac.stop;
						log(__SCOPE__&"INFO: Error while deleting resource " & p_requestPrimitive.to_);
					}
					[] tc_ac.timeout {
						log(__SCOPE__&"INFO: No answer while deleting resource " & p_requestPrimitive.to_);
					}	
				}	
				
			}// end f_cse_deleteResource
			
			/**
			 * @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.from_ := f_getOriginator(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" );
					}
				}		
				
				f_checkCseTesterStatus();
			}   
			
		function f_subscriptionVerificationHandler(in XSD.ID p_creator, in ResponseStatusCode p_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(m_contentNotification_allOmit)}};
	
			v_notificationRequest.verificationRequest := true;
			//v_notificationRequest.creator := p_creator; TODO To check what address format is to be expected
			//Some participants use SP relative UNSTRUCTURED
			//v_notificationRequest.subscriptionReference := "I Don't know which URI is expected"; // TODO mandatory parameter 
			v_responsePrimitive := valueof(m_responseNotification(p_responseStatusCode,v_notificationResponse));//TODO No PrimitiveContent is expected
	
			if(p_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(v_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) {
			select (p_resourceType) {
				case (int1) {
					if(isvalue(p_response.primitiveContent.any_1[0].AccessControlPolicy_optional) and
							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;
					}
				}
				case (int2) {
					if(isvalue(p_response.primitiveContent.any_1[0].AE_optional) and
							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;
					}
				}
				case (int3) {
					if(isvalue(p_response.primitiveContent.any_1[0].Container_optional) and
							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;
					}
				}
				case (int15) {
					if (isvalue(p_response.primitiveContent.any_1[0].PollingChannel_optional) and
							not(ispresent(p_response.primitiveContent.any_1[0].PollingChannel_optional.resourceName))) {
						p_response.primitiveContent.any_1[0].PollingChannel_optional.resourceName :=  p_request.primitiveContent.any_1[0].PollingChannel_optional.resourceName;
					}
				}
				case (int18) {
					if (isvalue(p_response.primitiveContent.any_1[0].Schedule_optional) and
							not(ispresent(p_response.primitiveContent.any_1[0].Schedule_optional.resourceName))) {
						p_response.primitiveContent.any_1[0].Schedule_optional.resourceName :=  p_request.primitiveContent.any_1[0].Schedule_optional.resourceName;
					}
				}
				case (int23) {
					if (isvalue(p_response.primitiveContent.any_1[0].Subscription_optional) and
							not(ispresent(p_response.primitiveContent.any_1[0].Subscription_optional.resourceName))) {
						p_response.primitiveContent.any_1[0].Subscription_optional.resourceName :=  p_request.primitiveContent.any_1[0].Subscription_optional.resourceName;
					}
				}
				case (int9) {
					if (isvalue(p_response.primitiveContent.any_1[0].Group_optional) and
							not(ispresent(p_response.primitiveContent.any_1[0].Group_optional.resourceName))) {
						p_response.primitiveContent.any_1[0].Group_optional.resourceName :=  p_request.primitiveContent.any_1[0].Group_optional.resourceName;
					}
				}
				case else {
					log(__SCOPE__&":WARNING: Resource Type "&int2str(enum2int(p_resourceType))&" not implemented");
					if (not PX_DISABLE_STOP_ON_ERROR) {
						testcase.stop;
					}
				}
			}

			// TODO test that if the resource name is returned is the same resource name as used in the create message
		}

		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 CseAltstepFunctions {
			 
			/**
			  * @desc	Cse altstep for config 01
			  */
			 altstep a_cse_cf01() runs on CseTester {
		
				[] mcaPort.receive {
					log(__SCOPE__&": WARNING: Unexpected message received");
					repeat;
				}
			 }			
			 
			/**
			  * @desc	Cse altstep for config 02
			  */
			 altstep a_cse_cf02() runs on CseTester {
			
				[] mcaPort.receive {
					log(__SCOPE__&": WARNING: Unexpected message received");
					repeat;
				}
				[] mccPort.receive {
					log(__SCOPE__&": WARNING: Unexpected message received");
					repeat;
				}
			 }	

		}//end group altstepFunctions	
		
	}//end cseFunctions
	
	group AeFunctions {
		
		group preambleFunctions {
		
			/**
			 * @desc	Waits for AE registration request and process it
			 * @return 	Internal resource index of AE or -1 in case of failure		
			 * @verdict	inconc if no AE registration request is received 
			 */
			function f_ae_preamble_registerAe() runs on AeTester return integer {
    		
				var MsgIn v_request;
				var Contents[-] v_modifiedResource;
				var integer v_resourceIndex, v_parentIndex;
				var RequestPrimitive v_rp;
    		
				tc_ac.start;
				alt {    				
					[] mcaPort.receive(mw_request(mw_createAe)) -> value v_request {
						tc_ac.stop;
    					
						v_rp := v_request.primitive.requestPrimitive;		
						v_parentIndex := f_getResourceIndex(v_rp.to_);
						v_resourceIndex := f_ae_createResource(v_rp.primitiveContent, v_parentIndex, v_rp.resourceType, v_modifiedResource);
						if(v_resourceIndex != -1) {
							mcaPort.send(m_response(m_responsePrimitive_content(int2001, v_rp.requestIdentifier, {any_1 := {v_modifiedResource}})));
							log("Preamble: Application registered successfuly");
						}
						else {
							mcaPort.send(m_response(m_responsePrimitive(int5000, v_request.primitive.requestPrimitive.requestIdentifier)));
							setverdict(inconc, testcasename() & ": AE registration failed");
						}					
					}
    					
					[] tc_ac.timeout {
						setverdict(inconc, testcasename() & ": AE registration request not received");
						stop;
					}	     				   	
				}    
				
				f_checkAeTesterStatus();	
    			
				return v_resourceIndex;	
			}	
						
		} // end preambleFunctions
		
		group helpingFunctions {
			
			/**
			 * @desc   Creates specified resource
			 * @param  p_resource          Resource to be created
			 * @param  p_parentIndex       Parent index of resource to be saved
			 * @param  p_resourceType      Type of the resource to be created
			 * @param  p_modifiedResource  Assigned and/or modified fields
			 * @return Internal resource index of the saved resource or -1
			 */
			function f_ae_createResource(in PrimitiveContent p_resource, in integer p_parentIndex, in ResourceType p_resourceType, out Contents[-] p_modifiedResource) runs on AeTester return integer {

				var integer v_resourceIndex;
				
				// AE TODO To review the code (use of indexes, generation of value for certain attributes, etc..)
				if(p_resourceType == int2 and ispresent(p_resource)) {
				  	if(ischosen(p_resource.any_1[0].AE_optional)){
				      	var AE_optional v_ae := p_resource.any_1[0].AE_optional;
      					var AE_optional v_aeModified;					
      					
      					v_resourceIndex := lengthof(vc_resourcesList) - 1;
      					v_ae.resourceType := p_resourceType;
      					
      					v_ae.parentID := int2str(p_parentIndex);
      					v_ae.creationTime := fx_generateTimestamp();
      					v_ae.lastModifiedTime := v_ae.creationTime;											
      					v_ae.resourceID := "ae" & int2char(v_resourceIndex);
      					v_ae.aE_ID := "ae" & int2char(v_resourceIndex);
      					v_ae.resourceName := "ae" & int2char(v_resourceIndex);
      
      					v_aeModified.parentID := v_ae.parentID;
      					v_aeModified.creationTime := v_ae.creationTime;
      					v_aeModified.lastModifiedTime := v_ae.lastModifiedTime;											
      					v_aeModified.resourceID := v_ae.resourceID;
      					v_aeModified.aE_ID := v_ae.aE_ID;
      					v_aeModified.resourceName := v_ae.resourceName;
      					
      					p_resource.any_1[0].AE_optional := v_ae;
      					p_modifiedResource.AE_optional := v_aeModified;
      					return f_setResource(p_resource, p_parentIndex);			   
				    
				    }
										
				}	
				
				// TODO: implement other resource types			
				
				// Error
				return -1;
			}
			
		} // end helpingFunctions
		
		group altstepFunctions {
    
			/**
			  * @desc	Ae altstep
			  */
			 altstep a_ae_default() runs on AeTester {

				var MsgIn v_request; 
				
				[] mcaPort.receive(mw_request(?)) -> value v_request {
					log("a_default: WARNING: Unexpected request received");
					mcaPort.send(m_response(m_responsePrimitive(int5000, v_request.primitive.requestPrimitive.requestIdentifier)));
					repeat;
				}
				    		
				[] mcaPort.receive {
					log("a_ae_default: WARNING: Unexpected message received");
					repeat;
				}
			 }		
			 
			/**
			 * @desc    Waits for CREATE request, stores resource and replies to request 
			 * @remark  This altstep includes a_ae_default
			 * @see		a_ae_default
			 */
			altstep a_ae_cf03() runs on AeTester {
				
				var MsgIn v_request;			
				var Contents[-] v_modifiedResource;
				var integer v_resourceIndex, v_parentIndex;
				var RequestPrimitive v_rp;
				
				[] mcaPort.receive(mw_request(mw_create)) -> value v_request {	
					v_rp := v_request.primitive.requestPrimitive;		
					v_parentIndex := f_getResourceIndex(v_rp.to_);
					v_resourceIndex := f_ae_createResource(v_rp.primitiveContent, v_parentIndex, v_rp.resourceType, v_modifiedResource);
					if(v_resourceIndex != -1) {
						mcaPort.send(m_response(m_responsePrimitive_content(int2001, v_rp.requestIdentifier, {any_1 := {v_modifiedResource}})));
					}
					else {
						mcaPort.send(m_response(m_responsePrimitive(int5000, v_request.primitive.requestPrimitive.requestIdentifier)));
					}					
					repeat;	
				}
				
				[] a_ae_default();				
			}
    		 
		}//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 template ListOfURIs v_defaultListOfURIs := {"NotInitialized"};
			var template AcpType v_defaultAcpIDs := {"NotInitialized"};

			if(p_resourceType != int2) {
				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_parentIndex].resource);//resourceID of the locationPolicy
				}	
				if(match(valueof(p_request.primitiveContent.any_1[0].Container_optional.accessControlPolicyIDs), v_defaultAcpIDs )){
					p_request.primitiveContent.any_1[0].Container_optional.accessControlPolicyIDs := {f_getResourceId(vc_resourcesList[vc_acpAuxIndex].resource)};
				}	  
			}
			
			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 f_resourceIdCleaner(p_contentResource.any_1[0].AccessControlPolicy_optional.resourceID);
			}
			if(ischosen(p_contentResource.any_1[0].Container_optional)) {
				return f_resourceIdCleaner(p_contentResource.any_1[0].Container_optional.resourceID);
			}
			if(ischosen(p_contentResource.any_1[0].Schedule_optional)) {
				return f_resourceIdCleaner(p_contentResource.any_1[0].Schedule_optional.resourceID);
			}
			if(ischosen(p_contentResource.any_1[0].PollingChannel_optional)) {
				return f_resourceIdCleaner(p_contentResource.any_1[0].PollingChannel_optional.resourceID);
			}
			if(ischosen(p_contentResource.any_1[0].Subscription_optional)) {
				return f_resourceIdCleaner(p_contentResource.any_1[0].Subscription_optional.resourceID);
			}
			if(ischosen(p_contentResource.any_1[0].Group_optional)) {
				return f_resourceIdCleaner(p_contentResource.any_1[0].Group_optional.resourceID);
			}
			if(ischosen(p_contentResource.any_1[0].AE_optional)) {
				return f_resourceIdCleaner(p_contentResource.any_1[0].AE_optional.resourceID);
			}
			if(ischosen(p_contentResource.any_1[0].ServiceSubscribedAppRule_optional)) {
				return f_resourceIdCleaner(p_contentResource.any_1[0].ServiceSubscribedAppRule_optional.resourceID);
			}
			log(""&__SCOPE__&":WARNING: Primitive Content Kind not implemented");
			if (PX_DISABLE_STOP_ON_ERROR) {
				return "1";
			} else {
				testcase.stop;
				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;
			}
			if(ischosen(p_contentResource.any_1[0].ServiceSubscribedAppRule_optional)) {
				return p_contentResource.any_1[0].ServiceSubscribedAppRule_optional.resourceName;
			}
			log(__SCOPE__&":WARNING: Primitive Content Kind not implemented");
			if (PX_DISABLE_STOP_ON_ERROR) {
				return "1";
			} else {
				testcase.stop;
				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;
			
		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 index for a given resource address (URI)
		 * @param p_address	Resource URI (can be structured/unstructured cseRelative/spRelative/absolute)
		 * @return Internal resource index of the given resource or -1 in case of error
		 */
		function f_getResourceIndex(in XSD.AnyURI p_address) return integer {
			return -1; //TODO
		}
    		
		/**
		 * @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 Tester return XSD.ID {
			var XSD.ID v_resourceAddress;
			
			if(PX_ADDRESSING_FORMAT == e_cseRelative) {
					
				if(PX_UNSTRUCTURED) {
					if(p_targetResourceIndex == -1) {
						return PX_CSE_RESOURCE_ID;
					} 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);					
		}
		
		/**
		 * @desc Retrieve AE_ID for a given AE resource
		 * @param p_targetResourceIndex Internal resource index of the given resource
		 * @return AE_ID of the given resource
		 */
		function f_getAeId(integer  p_targetResourceIndex := -1) runs on AeTester return XSD.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;
			}
			
			log("f_getAeId: WARNING: p_targetResourceIndex does not refer to AE resource");
			return "";
			
		} // end f_getAeId
    				
	}//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_checkCseTesterStatus() runs on CseTester {
	
			if (getverdict != pass) {
				 f_cse_postamble_deleteResources();
				 // Tear down
				 f_cfCseTesterDown();
			}
		}
		
		/**
		 * @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_checkAeTesterStatus() runs on AeTester {
	
			if (getverdict != pass) {
				 //f_ae_postamble_deleteResources();
				 // Tear down
				 f_cfAeTesterDown();
			}
		}
		
		/**
		 * @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 p_event, in charstring p_data) runs on Tester {
			

			var charstring v_data := "" & p_data; // clear encoding rules (ttwb issue ?)
			acPort.send(AcRequestPrimitive:{p_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
		
		function f_resourceIdCleaner(in XSD.ID p_resourceID) return XSD.ID {
			var integer v_length := lengthof(p_resourceID);
			var integer i;
			var XSD.ID result := "";
			
			for (i := v_length - 1; i>=0; i := i-1){
				if(p_resourceID[i]=="/"){
					return result;
				}
				else{
					result := p_resourceID[i] & result;
				}	
			}
			return result;
		}
		function f_removeElementFromList (inout IntegerList p_list, in integer index) {
			var IntegerList result := {};
			var integer i;
			for(i := 0; i < lengthof(p_list); i := i+1){
				if(i != index){
					result := result & {p_list[i]};
				}
			}
			p_list := result;
		}
		
		function f_getTemplateFromPrimitiveContent (in template PrimitiveContent p_primitiveContent) return template PrimitiveContent{
			var template PrimitiveContent v_primitiveContent := omit;
			
			if(ischosen(p_primitiveContent.any_1[0].Container_optional)){ // Container
				v_primitiveContent.any_1 := {{Container_optional := mw_contentContainerBase}};
				
				if(ispresent(p_primitiveContent.any_1[0].Container_optional.labels)){
					v_primitiveContent.any_1[0].Container_optional.labels := ?;
				}
    			if(ispresent(p_primitiveContent.any_1[0].Container_optional.accessControlPolicyIDs)){
    				v_primitiveContent.any_1[0].Container_optional.accessControlPolicyIDs := ?;
    			}
    			if(ispresent(p_primitiveContent.any_1[0].Container_optional.dynamicAuthorizationConsultationIDs)){
    				v_primitiveContent.any_1[0].Container_optional.dynamicAuthorizationConsultationIDs := ?;
    			}
    			if(ispresent(p_primitiveContent.any_1[0].Container_optional.announceTo)){
    				v_primitiveContent.any_1[0].Container_optional.announceTo := ?;
    			}
    			if(ispresent(p_primitiveContent.any_1[0].Container_optional.announcedAttribute)){
    				v_primitiveContent.any_1[0].Container_optional.announcedAttribute := ?;
    			}
    			if(ispresent(p_primitiveContent.any_1[0].Container_optional.creator)){
    				v_primitiveContent.any_1[0].Container_optional.creator := ?;
    			}
    			if(ispresent(p_primitiveContent.any_1[0].Container_optional.maxNrOfInstances)){
    				v_primitiveContent.any_1[0].Container_optional.maxNrOfInstances := ?;
    			}
    			if(ispresent(p_primitiveContent.any_1[0].Container_optional.maxByteSize)){
    				v_primitiveContent.any_1[0].Container_optional.maxByteSize := ?;
    			}
    			if(ispresent(p_primitiveContent.any_1[0].Container_optional.maxInstanceAge)){
    				v_primitiveContent.any_1[0].Container_optional.maxInstanceAge := ?;
    			}
				if(ispresent(p_primitiveContent.any_1[0].Container_optional.locationID)){
					v_primitiveContent.any_1[0].Container_optional.locationID := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Container_optional.ontologyRef)){
					v_primitiveContent.any_1[0].Container_optional.ontologyRef := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Container_optional.disableRetrieval)){
					v_primitiveContent.any_1[0].Container_optional.disableRetrieval := ?;
				}
			}
			
			else if(ischosen(p_primitiveContent.any_1[0].AE_optional)){ // AE
				v_primitiveContent.any_1 := {{AE_optional := mw_contentAeBase}};
				
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.labels)){
					v_primitiveContent.any_1[0].AE_optional.labels := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.accessControlPolicyIDs)){
					v_primitiveContent.any_1[0].AE_optional.accessControlPolicyIDs := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.dynamicAuthorizationConsultationIDs)){
					v_primitiveContent.any_1[0].AE_optional.dynamicAuthorizationConsultationIDs := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.announceTo)){
					v_primitiveContent.any_1[0].AE_optional.announceTo := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.announcedAttribute)){
					v_primitiveContent.any_1[0].AE_optional.announcedAttribute := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.appName)){
					v_primitiveContent.any_1[0].AE_optional.appName := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.pointOfAccess)){
					v_primitiveContent.any_1[0].AE_optional.pointOfAccess := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.ontologyRef)){
					v_primitiveContent.any_1[0].AE_optional.ontologyRef := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.nodeLink)){
					v_primitiveContent.any_1[0].AE_optional.nodeLink := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.contentSerialization)){
					v_primitiveContent.any_1[0].AE_optional.contentSerialization := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AE_optional.e2eSecInfo)){
					v_primitiveContent.any_1[0].AE_optional.e2eSecInfo := ?;
				}	
			}
			
			else if(ischosen(p_primitiveContent.any_1[0].AccessControlPolicy_optional)){ // ACP
				v_primitiveContent.any_1 := {{AccessControlPolicy_optional := mw_contentAcpBase}};
	
				if(ispresent(p_primitiveContent.any_1[0].AccessControlPolicy_optional.labels)){
					v_primitiveContent.any_1[0].AccessControlPolicy_optional.labels := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].AccessControlPolicy_optional.announceTo)){
					v_primitiveContent.any_1[0].AccessControlPolicy_optional.announceTo := ?;
				}
			}
			
			else if(ischosen(p_primitiveContent.any_1[0].ContentInstance_optional)){ // ContentInstance
				v_primitiveContent.any_1 := {{ContentInstance_optional := mw_contentContentInstanceBase}};

				if(ispresent(p_primitiveContent.any_1[0].ContentInstance_optional.labels)){
					v_primitiveContent.any_1[0].ContentInstance_optional.labels := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].ContentInstance_optional.announceTo)){
					v_primitiveContent.any_1[0].ContentInstance_optional.announceTo := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].ContentInstance_optional.announcedAttribute)){
					v_primitiveContent.any_1[0].ContentInstance_optional.announcedAttribute := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].ContentInstance_optional.creator)){
					v_primitiveContent.any_1[0].ContentInstance_optional.creator := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].ContentInstance_optional.contentInfo)){
					v_primitiveContent.any_1[0].ContentInstance_optional.contentInfo := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].ContentInstance_optional.contentRef)){
					v_primitiveContent.any_1[0].ContentInstance_optional.contentRef := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].ContentInstance_optional.ontologyRef)){
					v_primitiveContent.any_1[0].ContentInstance_optional.ontologyRef := ?;
				}
			}
			
			else if(ischosen(p_primitiveContent.any_1[0].Group_optional)){ // Group
				v_primitiveContent.any_1 := {{Group_optional := mw_contentGroupBase}};

				if(ispresent(p_primitiveContent.any_1[0].Group_optional.labels)){
					v_primitiveContent.any_1[0].Group_optional.labels := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.accessControlPolicyIDs)){
					v_primitiveContent.any_1[0].Group_optional.accessControlPolicyIDs := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.dynamicAuthorizationConsultationIDs)){
					v_primitiveContent.any_1[0].Group_optional.dynamicAuthorizationConsultationIDs := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.announceTo)){
					v_primitiveContent.any_1[0].Group_optional.announceTo := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.announcedAttribute)){
					v_primitiveContent.any_1[0].Group_optional.announcedAttribute := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.creator)){
					v_primitiveContent.any_1[0].Group_optional.creator := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.membersAccessControlPolicyIDs)){
					v_primitiveContent.any_1[0].Group_optional.membersAccessControlPolicyIDs := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.memberTypeValidated)){
					v_primitiveContent.any_1[0].Group_optional.memberTypeValidated := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.consistencyStrategy)){
					v_primitiveContent.any_1[0].Group_optional.consistencyStrategy := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Group_optional.groupName)){
					v_primitiveContent.any_1[0].Group_optional.groupName := ?;
				}
			}
			
			else if(ischosen(p_primitiveContent.any_1[0].PollingChannel_optional)){ // PollingChannel
				v_primitiveContent.any_1 := {{PollingChannel_optional := mw_contentPollingChannelBase}};

				if(ispresent(p_primitiveContent.any_1[0].PollingChannel_optional.labels)){
					v_primitiveContent.any_1[0].PollingChannel_optional.labels := ?;
				}
			}
			
			else if(ischosen(p_primitiveContent.any_1[0].Schedule_optional)){ // Schedule
				v_primitiveContent.any_1 := {{Schedule_optional := mw_contentScheduleBase}};

				if(ispresent(p_primitiveContent.any_1[0].Schedule_optional.labels)){
					v_primitiveContent.any_1[0].Schedule_optional.labels := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Schedule_optional.announceTo)){
					v_primitiveContent.any_1[0].Schedule_optional.announceTo := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Schedule_optional.announcedAttribute)){
					v_primitiveContent.any_1[0].Schedule_optional.announcedAttribute := ?;
				}
			}
			
			else if(ischosen(p_primitiveContent.any_1[0].Subscription_optional)){ // Schedule
				v_primitiveContent.any_1 := {{Subscription_optional := mw_contentSubscriptionBase}};

				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.labels)){
					v_primitiveContent.any_1[0].Subscription_optional.labels := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.accessControlPolicyIDs)){
					v_primitiveContent.any_1[0].Subscription_optional.accessControlPolicyIDs := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.dynamicAuthorizationConsultationIDs)){
					v_primitiveContent.any_1[0].Subscription_optional.dynamicAuthorizationConsultationIDs := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.creator)){
					v_primitiveContent.any_1[0].Subscription_optional.creator := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.eventNotificationCriteria)){
					v_primitiveContent.any_1[0].Subscription_optional.eventNotificationCriteria := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.expirationCounter)){
					v_primitiveContent.any_1[0].Subscription_optional.expirationCounter := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.groupID)){
					v_primitiveContent.any_1[0].Subscription_optional.groupID := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.notificationForwardingURI)){
					v_primitiveContent.any_1[0].Subscription_optional.notificationForwardingURI := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.batchNotify)){
					v_primitiveContent.any_1[0].Subscription_optional.batchNotify := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.rateLimit)){
					v_primitiveContent.any_1[0].Subscription_optional.rateLimit := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.preSubscriptionNotify)){
					v_primitiveContent.any_1[0].Subscription_optional.preSubscriptionNotify := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.pendingNotification)){
					v_primitiveContent.any_1[0].Subscription_optional.pendingNotification := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.notificationStoragePriority)){
					v_primitiveContent.any_1[0].Subscription_optional.notificationStoragePriority := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.latestNotify)){
					v_primitiveContent.any_1[0].Subscription_optional.latestNotify := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.notificationContentType)){
					v_primitiveContent.any_1[0].Subscription_optional.notificationContentType := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.notificationEventCat)){
					v_primitiveContent.any_1[0].Subscription_optional.notificationEventCat := ?;
				}
				if(ispresent(p_primitiveContent.any_1[0].Subscription_optional.subscriberURI)){
					v_primitiveContent.any_1[0].Subscription_optional.subscriberURI := ?;
				}
			}
			log("Etape0");
			return v_primitiveContent;
		}
		
		function f_match2PrimitiveContent (in PrimitiveContent p_responsePrimitiveContent, in template PrimitiveContent p_requestPrimitiveContent) runs on CseTester {
			var template PrimitiveContent v_primitiveContent;
			var PrimitiveContent v_response;
			v_response := p_responsePrimitiveContent;
			v_primitiveContent := f_getTemplateFromPrimitiveContent(p_requestPrimitiveContent);
			log("Etape1");
				if(not(match(v_response, v_primitiveContent))){
					setverdict(inconc, "Preamble: Error resource incomplete, some attribute missing ");
				}

		}
		
		
	}//end of commonFunctions
	
	group externalFunctions {
		
		/**
		 * @desc Generates a oneM2M timestamp based on current time. 
		 * 		 Format shall be YYYYMMDDTHHMMSS 
		 */		
		external function fx_generateTimestamp() return charstring;

	} // end externalFunctions
	
}  // end of module