diff --git a/LibOneM2M/OneM2M_Functions.ttcn b/LibOneM2M/OneM2M_Functions.ttcn index 72ccb87620c5b3f8227a4a81df87cf0b6149f6f9..c3c4c503d512a894918710316b66c37451b38ed1 100644 --- a/LibOneM2M/OneM2M_Functions.ttcn +++ b/LibOneM2M/OneM2M_Functions.ttcn @@ -1316,6 +1316,13 @@ module OneM2M_Functions { log(__SCOPE__ & ":INFO: resourceName not returned. Using the one provided in the request: " & p_request.primitiveContent.group_.resourceName) } } + case (int29) { + if (isvalue(p_response.primitiveContent.timeSeries) and + not(ispresent(p_response.primitiveContent.timeSeries.resourceName))) { + p_response.primitiveContent.timeSeries.resourceName := p_request.primitiveContent.timeSeries.resourceName; + log(__SCOPE__ & ":INFO: resourceName not returned. Using the one provided in the request: " & p_request.primitiveContent.timeSeries.resourceName) + } + } case else { log(__SCOPE__&":WARNING: Resource Type "&int2str(enum2int(p_resourceType))&" not implemented"); } @@ -1400,6 +1407,31 @@ module OneM2M_Functions { } + function f_cse_generateMissingDataPoint(in integer p_timeSeriesResourceIndex) runs on AeSimu{ + + var RequestPrimitive v_request; + var integer v_resourceIndex := -1; + var integer i; + var XSD.NonNegativeInteger v_periodicInterval := vc_resourcesList[p_timeSeriesResourceIndex].resource.timeSeries.periodicInterval; + var XSD.NonNegativeInteger v_missingDataDetectTimer := vc_resourcesList[p_timeSeriesResourceIndex].resource.timeSeries.missingDataDetectTimer; + timer t_noAction; + + //Activate defaults when running on a PTC + f_cse_activateDefaults_ae(); + i := 0; + while (i < 3) { + v_request := f_getCreateRequestPrimitive(int30, m_createTimeSeriesInstanceBase, p_timeSeriesResourceIndex); + v_request.primitiveContent.timeSeriesInstance.resourceName := "MyTimeSeriesInstance" & int2str(i); + + v_resourceIndex := f_cse_createResource(int30, v_request, p_timeSeriesResourceIndex); + i := i + 1; + t_noAction.start(int2float(v_periodicInterval)); + } + + //After missingDataTimerDetect, a missing data point should have been detected + t_noAction.start(int2float(v_missingDataDetectTimer)); + + } }//end group AeSimu @@ -1740,6 +1772,15 @@ module OneM2M_Functions { v_matchResult := match(p_requestPrimitive.primitiveContent.notification.notificationEvent.representation.responsePrimitive.primitiveContent.container, p_primitiveContent.container) } } + + if (ischosen(p_primitiveContent.timeSeries)){ + if(isvalue(p_requestPrimitive.primitiveContent.notification.notificationEvent.representation.resource.timeSeries)) { + v_matchResult := match(p_requestPrimitive.primitiveContent.notification.notificationEvent.representation.resource.timeSeries, p_primitiveContent.timeSeries) + } + else if(isvalue(p_requestPrimitive.primitiveContent.notification.notificationEvent.representation.responsePrimitive.primitiveContent.timeSeries)) { + v_matchResult := match(p_requestPrimitive.primitiveContent.notification.notificationEvent.representation.responsePrimitive.primitiveContent.timeSeries, p_primitiveContent.timeSeries) + } + } return v_matchResult; diff --git a/LibOneM2M/OneM2M_Templates.ttcn b/LibOneM2M/OneM2M_Templates.ttcn index 1602d4af6ebc98c83fda1ee26633f5c36ed086e3..c1b95e967bbca25d619deec0588541e7c1b6ff48 100644 --- a/LibOneM2M/OneM2M_Templates.ttcn +++ b/LibOneM2M/OneM2M_Templates.ttcn @@ -18,7 +18,7 @@ module OneM2M_Templates { import from OneM2M_TypesAndValues all; //import from OneM2M_AdditionalTypes all; import from OneM2M_Pixits all; - //import from OneM2M_Functions all; + import from OneM2M_Functions all; /** @@ -1248,6 +1248,55 @@ module OneM2M_Templates { primitiveContent := {m2mServiceSubscriptionProfile := m_contentCreatem2mServiceSubscriptionProfileBase} }; + /** + * @desc Base CREATE request primitive for timeSeries resource + */ + template (value) RequestPrimitive m_createTimeSeriesBase modifies m_create := { + requestIdentifier := testcasename() & "-m_createTimeSeries", + resourceType := int29, + primitiveContent := {timeSeries := m_contentCreateTimeSeries ()} + }; + + template (value) RequestPrimitive m_createTimeSeries(in template (omit) XSD.String p_name := c_defaultTimeSeriesResourceName, + in XSD.Boolean p_missingDataDetect := true, + in XSD.NonNegativeInteger p_periodicInterval := 5, + in XSD.NonNegativeInteger p_missingDataMaxNr := 5, + in XSD.NonNegativeInteger p_missingDataDetectTimer := 2000) modifies m_createTimeSeriesBase := { + primitiveContent := {timeSeries := m_contentCreateTimeSeriesAttributes (p_name, p_missingDataDetect, p_periodicInterval, p_missingDataMaxNr, p_missingDataDetectTimer)} + }; + + /** + * @desc Reception template for CREATE timeSeries + */ + template RequestPrimitive mw_createTimeSeries(template XSD.ID p_from := *, template XSD.ID p_to := ?) modifies mw_create := { + resourceType := int29, + primitiveContent := {timeSeries := ?} + }; + + /** + * @desc Base CREATE request primitive for timeSeriesInstance resource + */ + template (value) RequestPrimitive m_createTimeSeriesInstanceBase modifies m_create := { + requestIdentifier := testcasename() & "-m_createTimeSeriesInstance", + resourceType := int30, + primitiveContent := {timeSeriesInstance := m_contentCreateTimeSeriesInstance()} + }; + + template (value) RequestPrimitive m_createTimeSeriesInstance(XSD.ID p_parentResourceAddress, in template (omit) XSD.String p_name := c_defaultTimeSeriesInstanceResourceName) modifies m_create := { + to_ := p_parentResourceAddress, + requestIdentifier := testcasename() & "-m_createTimeSeriesInstance", + resourceType := int30, + primitiveContent := {timeSeriesInstance := m_contentCreateTimeSeriesInstance (p_name)} + }; + + /** + * @desc Reception template for CREATE timeSeriesInstance + */ + template RequestPrimitive mw_createTimeSeriesInstance(template XSD.ID p_from := *, template XSD.ID p_to := ?) modifies mw_create := { + resourceType := int30, + primitiveContent := {timeSeriesInstance := ?} + }; + }//end group Create group Delete { @@ -2450,6 +2499,116 @@ module OneM2M_Templates { choice := omit //O }; + /** + * @desc Base primitiveContent for CREATE operation for timeSeries resource + * @param p_name Resource name + */ + template (value) TimeSeries_optional m_contentCreateTimeSeries (in template (omit) XSD.String p_name := c_defaultTimeSeriesResourceName):= { + resourceName := p_name,//O + resourceType := omit,//NP + resourceID := omit,//NP + parentID := omit,//NP + creationTime := omit,//NP + lastModifiedTime := omit,//NP + labels := omit,//O + accessControlPolicyIDs := omit,//O + expirationTime := omit,//O + dynamicAuthorizationConsultationIDs := omit, //O + announceTo := omit,//O + announcedAttribute := omit,//O + stateTag := omit,//NP + creator := omit,//O + maxNrOfInstances := omit,//O + maxByteSize := omit,//O + maxInstanceAge := omit,//O + currentNrOfInstances := omit,//NP + currentByteSize := omit,//NP + periodicInterval := omit,//O + missingDataDetect := omit,//O + missingDataMaxNr := omit,//O + missingDataList := omit,//NP + missingDataCurrentNr := omit,//NP + missingDataDetectTimer := omit,//O + ontologyRef := omit,//O + choice := omit//NP + }; + + /** + * @desc Base primitiveContent for CREATE operation for timeSeries resource + * @param p_name Resource name + */ + template (value) TimeSeries_optional m_contentCreateTimeSeriesAttributes (in template (omit) XSD.String p_name := c_defaultTimeSeriesResourceName, + in template (omit) XSD.Boolean p_missingDataDetect := omit, + in template (omit) XSD.NonNegativeInteger p_periodicInterval := omit, + in template (omit) XSD.NonNegativeInteger p_missingDataMaxNr := omit, + in template (omit) XSD.NonNegativeInteger p_missingDataDetectTimer := omit) modifies m_contentCreateTimeSeries := { + + periodicInterval := p_periodicInterval,//O + missingDataDetect := p_missingDataDetect,//O + missingDataMaxNr := p_missingDataMaxNr,//O + missingDataDetectTimer := p_missingDataDetectTimer//O + } + /** + * @desc Base primitiveContent for invalid CREATE operation for timeSeries resource (using Container_update_invalid) + * @param p_name Resource name + */ + template (value) TimeSeries_update_invalid m_contentCreateTimeSeriesInvalid (in template (omit) XSD.String p_name := c_defaultTimeSeriesResourceName):= { + resourceName := p_name,//O + resourceType := omit,//NP + resourceID := omit,//NP + parentID := omit,//NP + creationTime := omit,//NP + lastModifiedTime := omit,//NP + expirationCounter := omit,//Field not existing in container resource + labels := omit,//O + accessControlPolicyIDs := omit,//O + expirationTime := omit,//O + dynamicAuthorizationConsultationIDs := omit, //O + announceTo := omit,//O + announcedAttribute := omit,//O + stateTag := omit,//NP + creator := omit,//O + maxNrOfInstances := omit,//O + maxByteSize := omit,//O + maxInstanceAge := omit,//O + currentNrOfInstances := omit,//NP + currentByteSize := omit,//NP + periodicInterval := omit,//O + missingDataDetect := omit,//O + missingDataMaxNr := omit,//O + missingDataList := omit,//NP + missingDataCurrentNr := omit,//NP + missingDataDetectTimer := omit,//O + ontologyRef := omit,//O + choice := omit//NP + }; + + /** + * @desc Base primitiveContent for CREATE operation for Container resource + * @param p_name Resource name + */ + template (value) TimeSeriesInstance_optional m_contentCreateTimeSeriesInstance (in template (omit) XSD.String p_name := c_defaultTimeSeriesInstanceResourceName):= { + resourceName := p_name,//O + resourceType := omit,//NP + resourceID := omit,//NP + parentID := omit,//NP + creationTime := omit,//NP + lastModifiedTime := omit,//NP + labels := omit,//O + expirationTime := omit,//O + announceTo := omit,//O + announcedAttribute := omit,//O + dataGenerationTime := {alt_ := fx_generateTimestamp()},//M + content := "Value",//M + sequenceNr := omit,//O + contentSize := omit//NP + }; + + template (value) MissingData m_missingData( in XSD.NonNegativeInteger p_number, in XSD.Duration p_duration) := { + number := p_number, + duration := p_duration + }; + }//end group ContentCreate group ContentUpdate { @@ -3931,6 +4090,45 @@ module OneM2M_Templates { template CSEBase_optional mw_contentCSEBase_rc1 modifies mw_contentCSEBaseBase := { choice := omit //O } + + template TimeSeries_optional mw_contentTimeSeriesBase := { + resourceName := ?,//M + resourceType := ?,//M + resourceID := ?,//M + parentID := ?,//M + creationTime := ?,//M + lastModifiedTime := ?,//M + labels := *,//O + accessControlPolicyIDs := *,//O + expirationTime := ?,//M + dynamicAuthorizationConsultationIDs := *,//O + announceTo := *,//O + announcedAttribute := *,//O + stateTag := ?,//M + creator := ?,//M + maxNrOfInstances := *,//O + maxByteSize := *,//O + maxInstanceAge := *,//O + currentNrOfInstances := ?,//M + currentByteSize := ?,//M + periodicInterval := *,//O + missingDataDetect := *,//O + missingDataMaxNr := *,//O + missingDataList := *,//O + missingDataCurrentNr := *,//O + missingDataDetectTimer := *,//O + ontologyRef := *,//O + choice := *//O + }; + + template TimeSeries_optional mw_contentTimeSeries(in template MissingDataList p_missingDataList := *, in template XSD.NonNegativeInteger p_missingDataCurrentNr := *) modifies mw_contentTimeSeriesBase := { + missingDataList := p_missingDataList, + missingDataCurrentNr := p_missingDataCurrentNr + } + + template TimeSeries_optional mw_contentTimeSeries_rc1 modifies mw_contentTimeSeriesBase := { + choice := omit //O + } }//end group responseContent diff --git a/LibOneM2M/OneM2M_Types.ttcn b/LibOneM2M/OneM2M_Types.ttcn index 62010691dce9a2821d50b1b9efad86faab929eb7..9baf894e36db594cf988f4ad0a9685d8ca7702b2 100644 --- a/LibOneM2M/OneM2M_Types.ttcn +++ b/LibOneM2M/OneM2M_Types.ttcn @@ -1716,6 +1716,8 @@ type union PrimitiveContent { ServiceSubscribedAppRule_optional serviceSubscribedAppRule, Subscription_optional subscription, SemanticDescriptor_optional semanticDescriptor, + TimeSeries_optional timeSeries, + TimeSeriesInstance_optional timeSeriesInstance, GenericInterworkingOperationInstance_optional genericInterworkingOperationInstance, //SecurityInfo SecurityInfo securityInfo, @@ -7805,7 +7807,9 @@ group OptionalResourceTypes { ListOfURIs relatedSemantics optional, union { record length(1 .. infinity) of ChildResourceRef childResource_list, - record length(1 .. infinity) of Subscription subscription_list + record length(1 .. infinity) of union { + Subscription_optional subscription + } choice_list } choice optional } with { @@ -7816,8 +7820,44 @@ group OptionalResourceTypes { variant (choice) "untagged"; variant (choice.childResource_list) "untagged"; variant (choice.childResource_list[-]) "name as 'childResource'"; - variant (choice.subscription_list) "untagged"; - variant (choice.subscription_list[-]) "name as 'subscription'"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; + }; + + type record SemanticDescriptorAnnc_optional + { + ResourceName resourceName optional, + ResourceType resourceType optional, + XSD.ID resourceID optional, + NhURI parentID optional, + Timestamp creationTime optional, + Timestamp lastModifiedTime optional, + Labels labels optional, + AcpType accessControlPolicyIDs optional, + Timestamp expirationTime optional, + XSD.AnyURI link optional, + ListOfURIs dynamicAuthorizationConsultationIDs optional, + DescriptorRepresentation descriptorRepresentation optional, + Sparql semanticOpExec optional, + XSD.Base64Binary descriptor optional, + XSD.AnyURI ontologyRef optional, + ListOfURIs relatedSemantics optional, + union { + record length(1 .. infinity) of ChildResourceRef childResource_list, + record length(1 .. infinity) of union { + Subscription_optional subscription + } choice_list + } choice optional + } + with { + variant "name as uncapitalized"; + variant "element"; + variant (resourceName) "attribute"; + variant (choice) "untagged"; + variant (choice.childResource_list) "untagged"; + variant (choice.childResource_list[-]) "name as 'childResource'"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; }; type record ServiceSubscribedAppRule_optional @@ -7838,7 +7878,9 @@ group OptionalResourceTypes { record length(1 .. infinity) of RoleID allowedRole_IDs optional, union { record length(1 .. infinity) of ChildResourceRef childResource_list, - record length(1 .. infinity) of Subscription subscription_list + record length(1 .. infinity) of union { + Subscription_optional subscription + } choice_list } choice optional } with { @@ -7851,8 +7893,8 @@ group OptionalResourceTypes { variant (choice) "untagged"; variant (choice.childResource_list) "untagged"; variant (choice.childResource_list[-]) "name as 'childResource'"; - variant (choice.subscription_list) "untagged"; - variant (choice.subscription_list[-]) "name as 'subscription'"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; }; type record ServiceSubscribedNode_optional @@ -7873,7 +7915,9 @@ group OptionalResourceTypes { ListOfURIs ruleLinks optional, union { record length(1 .. infinity) of ChildResourceRef childResource_list, - record length(1 .. infinity) of Subscription subscription_list + record length(1 .. infinity) of union { + Subscription_optional subscription + } choice_list } choice optional } with { @@ -7885,8 +7929,8 @@ group OptionalResourceTypes { variant (choice) "untagged"; variant (choice.childResource_list) "untagged"; variant (choice.childResource_list[-]) "name as 'childResource'"; - variant (choice.subscription_list) "untagged"; - variant (choice.subscription_list[-]) "name as 'subscription'"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; }; type record StatsCollect_optional @@ -7911,7 +7955,9 @@ group OptionalResourceTypes { XSD.String eventID optional, union { record length(1 .. infinity) of ChildResourceRef childResource_list, - record length(1 .. infinity) of Subscription subscription_list + record length(1 .. infinity) of union { + Subscription_optional subscription + } choice_list } choice optional } with { @@ -7921,8 +7967,8 @@ group OptionalResourceTypes { variant (choice) "untagged"; variant (choice.childResource_list) "untagged"; variant (choice.childResource_list[-]) "name as 'childResource'"; - variant (choice.subscription_list) "untagged"; - variant (choice.subscription_list[-]) "name as 'subscription'"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; }; type record StatsConfig_optional @@ -8004,6 +8050,155 @@ group OptionalResourceTypes { variant (choice.choice_list) "untagged"; variant (choice.choice_list[-]) "untagged"; }; + + type record TimeSeries_optional + { + ResourceName resourceName optional, + ResourceType resourceType optional, + XSD.ID resourceID optional, + NhURI parentID optional, + Timestamp creationTime optional, + Timestamp lastModifiedTime optional, + Labels labels optional, + AcpType accessControlPolicyIDs optional, + Timestamp expirationTime optional, + ListOfURIs dynamicAuthorizationConsultationIDs optional, + ListOfURIs announceTo optional, + record length(1 .. infinity) of XSD.NCName announcedAttribute optional, + XSD.NonNegativeInteger stateTag optional, + XSD.ID creator optional, + XSD.NonNegativeInteger maxNrOfInstances optional, + XSD.NonNegativeInteger maxByteSize optional, + XSD.NonNegativeInteger maxInstanceAge optional, + XSD.NonNegativeInteger currentNrOfInstances optional, + XSD.NonNegativeInteger currentByteSize optional, + XSD.NonNegativeInteger periodicInterval optional, + XSD.Boolean missingDataDetect optional, + XSD.NonNegativeInteger missingDataMaxNr optional, + MissingDataList missingDataList optional, + XSD.NonNegativeInteger missingDataCurrentNr optional, + XSD.NonNegativeInteger missingDataDetectTimer optional, + XSD.AnyURI ontologyRef optional, + union { + record length(1 .. infinity) of ChildResourceRef childResource_list, + record length(1 .. infinity) of union { + TimeSeriesInstance_optional timeSeriesInstance, + Subscription_optional subscription, + SemanticDescriptor_optional semanticDescriptor + } choice_list + } choice optional + } + with { + variant "name as uncapitalized"; + variant "element"; + variant (resourceName) "attribute"; + variant (announcedAttribute) "list"; + //variant (missingDataDetect) "text 'true' as '1'"; + //variant (missingDataDetect) "text 'false' as '0'"; + variant (choice) "untagged"; + variant (choice.childResource_list) "untagged"; + variant (choice.childResource_list[-]) "name as 'childResource'"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; + }; + + + type record TimeSeriesAnnc_optional + { + ResourceName resourceName optional, + ResourceType resourceType optional, + XSD.ID resourceID optional, + NhURI parentID optional, + Timestamp creationTime optional, + Timestamp lastModifiedTime optional, + Labels labels optional, + AcpType accessControlPolicyIDs optional, + Timestamp expirationTime optional, + XSD.AnyURI link optional, + ListOfURIs dynamicAuthorizationConsultationIDs optional, + XSD.NonNegativeInteger stateTag optional, + XSD.NonNegativeInteger maxNrOfInstances optional, + XSD.NonNegativeInteger maxByteSize optional, + XSD.NonNegativeInteger maxInstanceAge optional, + XSD.NonNegativeInteger currentNrOfInstances optional, + XSD.NonNegativeInteger currentByteSize optional, + XSD.NonNegativeInteger periodicInterval optional, + XSD.Boolean missingDataDetect optional, + MissingDataList missingDataList optional, + XSD.NonNegativeInteger missingDataCurrentNr optional, + XSD.NonNegativeInteger missingDataDetectTimer optional, + XSD.AnyURI ontologyRef optional, + union { + record length(1 .. infinity) of ChildResourceRef childResource_list, + record length(1 .. infinity) of union { + TimeSeriesInstance_optional timeSeriesInstance, + TimeSeriesInstanceAnnc_optional timeSeriesInstanceAnnc, + Subscription_optional subscription, + SemanticDescriptor_optional semanticDescriptor, + SemanticDescriptorAnnc_optional semanticDescriptorAnnc + } choice_list + } choice optional + } + with { + variant "name as uncapitalized"; + variant "element"; + variant (resourceName) "attribute"; + //variant (missingDataDetect) "text 'true' as '1'"; + //variant (missingDataDetect) "text 'false' as '0'"; + variant (choice) "untagged"; + variant (choice.childResource_list) "untagged"; + variant (choice.childResource_list[-]) "name as 'childResource'"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; + }; + + type record TimeSeriesInstance_optional + { + ResourceName resourceName optional, + ResourceType resourceType optional, + XSD.ID resourceID optional, + NhURI parentID optional, + Timestamp creationTime optional, + Timestamp lastModifiedTime optional, + Labels labels optional, + Timestamp expirationTime optional, + ListOfURIs announceTo optional, + record length(1 .. infinity) of XSD.NCName announcedAttribute optional, + AbsRelTimestamp dataGenerationTime optional, + XSD.AnySimpleType content optional, + XSD.NonNegativeInteger sequenceNr optional, + XSD.NonNegativeInteger contentSize optional + } + with { + variant "name as uncapitalized"; + variant "element"; + variant (resourceName) "attribute"; + variant (announcedAttribute) "list"; + }; + + + type record TimeSeriesInstanceAnnc_optional + { + ResourceName resourceName optional, + ResourceType resourceType optional, + XSD.ID resourceID optional, + NhURI parentID optional, + Timestamp creationTime optional, + Timestamp lastModifiedTime optional, + Labels labels optional, + Timestamp expirationTime optional, + XSD.AnyURI link optional, + AbsRelTimestamp dataGenerationTime optional, + XSD.AnySimpleType content optional, + XSD.NonNegativeInteger sequenceNr optional, + XSD.NonNegativeInteger contentSize optional + } + with { + variant "name as uncapitalized"; + variant "element"; + variant (resourceName) "attribute"; + }; + }//end group OptionalResourceTypes @@ -8291,6 +8486,59 @@ group InvalidTypes { variant (choice.choice_list) "untagged"; variant (choice.choice_list[-]) "untagged"; }; + + type record TimeSeries_update_invalid + { + ResourceName resourceName optional, + ResourceType resourceType optional, + XSD.ID resourceID optional, + NhURI parentID optional, + Timestamp creationTime optional, + Timestamp lastModifiedTime optional, + XSD.PositiveInteger expirationCounter optional,//Invalid field, non existing for Container + Labels labels optional, + AcpType accessControlPolicyIDs optional, + Timestamp expirationTime optional, + ListOfURIs dynamicAuthorizationConsultationIDs optional, + ListOfURIs announceTo optional, + record length(1 .. infinity) of XSD.NCName announcedAttribute optional, + XSD.NonNegativeInteger stateTag optional, + XSD.ID creator optional, + XSD.NonNegativeInteger maxNrOfInstances optional, + XSD.NonNegativeInteger maxByteSize optional, + XSD.NonNegativeInteger maxInstanceAge optional, + XSD.NonNegativeInteger currentNrOfInstances optional, + XSD.NonNegativeInteger currentByteSize optional, + XSD.NonNegativeInteger periodicInterval optional, + XSD.Boolean missingDataDetect optional, + XSD.NonNegativeInteger missingDataMaxNr optional, + MissingDataList missingDataList optional, + XSD.NonNegativeInteger missingDataCurrentNr optional, + XSD.NonNegativeInteger missingDataDetectTimer optional, + XSD.AnyURI ontologyRef optional, + union { + record length(1 .. infinity) of ChildResourceRef childResource_list, + record length(1 .. infinity) of union { + TimeSeriesInstance_optional timeSeriesInstance, + Subscription_optional subscription, + SemanticDescriptor_optional semanticDescriptor + } choice_list + } choice optional + } + with { + variant "name as uncapitalized"; + variant "element"; + variant (resourceName) "attribute"; + variant (announcedAttribute) "list"; + //variant (missingDataDetect) "text 'true' as '1'"; + //variant (missingDataDetect) "text 'false' as '0'"; + variant (choice) "untagged"; + variant (choice.childResource_list) "untagged"; + variant (choice.childResource_list[-]) "name as 'childResource'"; + variant (choice.choice_list) "untagged"; + variant (choice.choice_list[-]) "untagged"; + }; + type record LocationPolicy_update_invalid { @@ -8400,7 +8648,8 @@ group OtherTypes { StatsCollect_optional statsCollect, M2mServiceSubscriptionProfile_optional m2mServiceSubscriptionProfile, ServiceSubscribedAppRule_optional serviceSubscribedAppRule, - Subscription_optional subscription + Subscription_optional subscription, + TimeSeries_optional timeSeries } with { variant "untagged"; diff --git a/LibOneM2M/OneM2M_TypesAndValues.ttcn b/LibOneM2M/OneM2M_TypesAndValues.ttcn index 8f8a33bbf8a4a4b4293526475898b65b817fb1e3..d2c642df70f515f9d8c404453b8e34ddb57010d6 100644 --- a/LibOneM2M/OneM2M_TypesAndValues.ttcn +++ b/LibOneM2M/OneM2M_TypesAndValues.ttcn @@ -37,6 +37,8 @@ module OneM2M_TypesAndValues { const XSD.String c_defaultStatsCollectResourceName := "MyStatsCollectResource"; const XSD.String c_defaultm2mServiceSubscriptionProfileResourceName := "Mym2mServiceSubscriptionProfileResource"; const XSD.String c_defaultServiceSubscribedAppRuleResourceName := "MyServiceSubscribedAppRuleResource"; + const XSD.String c_defaultTimeSeriesResourceName := "MyTimeSeriesResource"; + const XSD.String c_defaultTimeSeriesInstanceResourceName := "MyTimeSeriesResource"; const XSD.ID c_aeAuxName := "MyAe"; const XSD.String c_defaultAE2Name := "MyAe2"; const XSD.String c_acpAuxName := "MyAcp"; diff --git a/OneM2M_Testcases_CSE_Release_2.ttcn b/OneM2M_Testcases_CSE_Release_2.ttcn index f9f4085039c1556bac2ed92b85301983f96358c6..dcc02bdf8ff764272987ab9f074ba3163fffed91 100644 --- a/OneM2M_Testcases_CSE_Release_2.ttcn +++ b/OneM2M_Testcases_CSE_Release_2.ttcn @@ -9082,7 +9082,404 @@ module OneM2M_Testcases_CSE_Release_2 { }//end group PollingChannel - }//end group CSE + group Device_Management { + group timeSeries { + + /** + * @desc Check that the IUT inserts the dataGenerationTime informantion of a missing data point and increases the missingDataCurrentNr attribute when a missing data point is detected + * + */ + testcase TC_CSE_TS_001() runs on Tester system CseSystem { + + var AeSimu v_ae1 := AeSimu.create("AE1") alive; + + v_ae1.start(f_CSE_TS_001()); + + v_ae1.done; + + } + + function f_CSE_TS_001() runs on AeSimu return ResponsePrimitive { + + // Local variables + var MsgIn v_response; + var RequestPrimitive v_request; + var integer v_aeIndex := -1; + var integer v_resourceIndex := -1; + + // Test control + + // Test component configuration + f_cf01Up(); + + // Test adapter configuration + + // Preamble + + v_aeIndex := f_cse_preamble_registerAe(); + + v_resourceIndex := f_cse_createResource(int29, m_createTimeSeries(-, -, 5, -, 2000), v_aeIndex); + + //Create data points and force a missingDataPoint + f_cse_generateMissingDataPoint(v_resourceIndex); + // Test Body + mcaPort.send(m_request(m_retrieve(f_getResourceAddress(v_resourceIndex), f_getOriginator(v_resourceIndex)))); + tc_ac.start; + alt { + [] mcaPort.receive(mw_response(mw_responsePrimitive(int2000))) -> value v_response { + tc_ac.stop; + setverdict(pass, __SCOPE__ & ": Response OK for retrieving"); + if(not(ispresent(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList))) { + setverdict(fail, __SCOPE__ & ": missingDataList attribute not present"); + } + if(not(ispresent(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataCurrentNr))) { + setverdict(fail, __SCOPE__ & ": missingDataCurrentNr attribute not present"); + } else { + if(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataCurrentNr != 1) { + setverdict(fail, __SCOPE__ & ": missingDataCurrentNr attribute wrong value"); + } + } + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveOK())) -> value v_response { + tc_ac.stop; + setverdict(fail, __SCOPE__ & ": Wrong response status code"); + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) -> value v_response { + tc_ac.stop; + setverdict(fail, __SCOPE__ & ": Error while retrieving resource"); + } + [] tc_ac.timeout { + setverdict(fail, __SCOPE__ & ": No answer while retrieving resource"); + } + } + + // Postamble + f_cse_postamble_deleteResources(); + + // Tear down + f_cf01Down(); + + return vc_response.primitive.responsePrimitive; + + }//end f_CSE_DMR_TS_001 + + /** + * @desc Check that the IUT removes the oldest element in MissingDataList when MissingDataCurrentNr reaches MissingDataMaxNr to enable insertion of a new missing data point + * + */ + testcase TC_CSE_TS_002() runs on Tester system CseSystem { + + var AeSimu v_ae1 := AeSimu.create("AE1") alive; + + v_ae1.start(f_CSE_TS_002()); + + v_ae1.done; + + } + + function f_CSE_TS_002() runs on AeSimu return ResponsePrimitive { + + // Local variables + var MsgIn v_response; + var RequestPrimitive v_request := valueof(m_createTimeSeriesBase); + var integer v_aeIndex := -1; + var integer v_resourceIndex := -1; + var Timestamp v_missingDataPointTimestamp; + var XSD.Long v_missingDataPointRel; + + // Test control + + // Test component configuration + f_cf01Up(); + + // Test adapter configuration + + // Preamble + + v_aeIndex := f_cse_preamble_registerAe(); + + v_resourceIndex := f_cse_createResource(int29, m_createTimeSeries(-, -, 5, 1, 2000), v_aeIndex); + + //Create data points and force a missingDataPoint + f_cse_generateMissingDataPoint(v_resourceIndex); + + //Retrieve first missing data point + mcaPort.send(m_request(m_retrieve(f_getResourceAddress(v_resourceIndex), f_getOriginator(v_resourceIndex)))); + + tc_ac.start; + alt { + [] mcaPort.receive(mw_response(mw_responsePrimitive(int2000))) -> value v_response { + tc_ac.stop; + setverdict(pass, __SCOPE__ & ": Response OK for retrieving"); + if(not(ispresent(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList))) { + setverdict(inconc, __SCOPE__ & ": missingDataList attribute not present"); + } else { + if(ischosen(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_)) { + v_missingDataPointTimestamp := v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_[0]; + } else { + v_missingDataPointRel := v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_1[0]; + } + } + if(not(ispresent(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataCurrentNr))) { + setverdict(inconc, __SCOPE__ & ": missingDataCurrentNr attribute not present"); + } else { + if(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataCurrentNr != 1) { + setverdict(inconc, __SCOPE__ & ": missingDataCurrentNr attribute wrong value"); + } + } + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveOK())) -> value v_response { + tc_ac.stop; + setverdict(inconc, __SCOPE__ & ": Wrong response status code"); + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) -> value v_response { + tc_ac.stop; + setverdict(inconc, __SCOPE__ & ": Error while retrieving resource"); + } + [] tc_ac.timeout { + setverdict(inconc, __SCOPE__ & ": No answer while retrieving resource"); + } + } + + f_checkAeSimuStatus(); + + //Test body + //Create data points and force a second missingDataPoint + f_cse_generateMissingDataPoint(v_resourceIndex); + + //Retrieve second missing data point + mcaPort.send(m_request(m_retrieve(f_getResourceAddress(v_resourceIndex), f_getOriginator(v_resourceIndex)))); + + tc_ac.start; + alt { + [] mcaPort.receive(mw_response(mw_responsePrimitive(int2000))) -> value v_response { + tc_ac.stop; + setverdict(pass, __SCOPE__ & ": Response OK for retrieving"); + if(not(ispresent(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList))) { + setverdict(inconc, __SCOPE__ & ": missingDataList attribute not present"); + } else { + if(ischosen(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_)) { + if(v_missingDataPointTimestamp < v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_[0]) { + setverdict(pass, __SCOPE__ & ": missingData point inserted in missingDataList"); + } else { + setverdict(fail, __SCOPE__ & ": missingData point not inserted in missingDataList"); + } + } else { + if(v_missingDataPointRel < v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataList.alt_1[0]) { + setverdict(pass, __SCOPE__ & ": missingData point inserted in missingDataList"); + } else { + setverdict(fail, __SCOPE__ & ": missingData point not inserted in missingDataList"); + } + } + } + if(not(ispresent(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataCurrentNr))) { + setverdict(fail, __SCOPE__ & ": missingDataCurrentNr attribute not present"); + } else { + if(v_response.primitive.responsePrimitive.primitiveContent.timeSeries.missingDataCurrentNr != 1) { + setverdict(fail, __SCOPE__ & ": missingDataCurrentNr attribute wrong value"); + } + } + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveOK())) -> value v_response { + tc_ac.stop; + setverdict(fail, __SCOPE__ & ": Wrong response status code"); + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) -> value v_response { + tc_ac.stop; + setverdict(fail, __SCOPE__ & ": Error while retrieving resource"); + } + [] tc_ac.timeout { + setverdict(fail, __SCOPE__ & ": No answer while retrieving resource"); + } + } + // Postamble + f_cse_postamble_deleteResources(); + + // Tear down + f_cf01Down(); + + return vc_response.primitive.responsePrimitive; + + }//end f_CSE_DMR_TS_002 + + /** + * @desc Check that the IUT sends a notification with missing data points information when the number of missing data points detected becomes equal to the minimum specified missing number of the Time Series Data specified in missingData condition of the subscription resource + * + */ + testcase TC_CSE_TS_003() runs on Tester system CseSystem { + + var AeSimu v_ae1 := AeSimu.create("AE1") alive; + + v_ae1.start(f_CSE_TS_003()); + + v_ae1.done; + + } + + function f_CSE_TS_003() runs on AeSimu { + // Local variables + var integer v_aeIndex := -1; + var integer v_timeSeriesIndex := -1; + var integer v_subscriptionIndex := -1; + var EventNotificationCriteria v_eventNotificationCriteria := valueof(m_eventNotificationCriteria({int1}, -)); + var template RequestPrimitive v_createRequest := omit; + var RequestPrimitive v_request; + var integer v_ae2Index := -1; + var XSD.NonNegativeInteger v_missingDataPointNumber := 1; + var template PrimitiveContent v_contentNotification := {timeSeries := mw_contentTimeSeries(?,v_missingDataPointNumber)}; + + v_eventNotificationCriteria.missingData := valueof(m_missingData(v_missingDataPointNumber, "1000")); + + // Test control + // Test component configuration + f_cf01Up(true); + + // Test adapter configuration + + // Preamble + v_aeIndex := f_cse_preamble_registerAe();//c_CRUDNDi); + + v_timeSeriesIndex := f_cse_createResource(int29, m_createTimeSeries(-, true, 5, -, 2000), v_aeIndex);//TimeSeries + f_cse_preamble_subscriptionVerification(v_ae2Index, v_createRequest, int23);//AE2 registered + + v_createRequest := m_createSubscriptionAdvanced(f_getResourceAddress(v_timeSeriesIndex), -, {f_getResourceAddress(v_aeIndex)}, v_eventNotificationCriteria, omit, omit, omit, omit, omit, omit); + + v_subscriptionIndex := f_cse_createResource(int23, v_createRequest, v_timeSeriesIndex);//Subscription under TimeSeries + + if(vc_ae2.running) { + vc_ae2.stop; + }; + + // Test Body + + //Create data points and force a missingDataPoint + vc_ae2.start(f_cse_generateMissingDataPoint(v_timeSeriesIndex)); + vc_ae2.done; + + f_cse_notifyProcedure_representationHandler(v_contentNotification); + + //Postamble + f_cse_postamble_deleteResources(); + + //Tear down + f_cf01Down(); + + } // end f_CSE_TS_003 + + /** + * @desc Check that the IUT does not send notification when the total number of missing data points does not exceed the minimum specified missing number of the Time Series Data specified in missingData condition of the subscription resource during the window duration specified in the same missingData condition + * + */ + testcase TC_CSE_TS_004() runs on Tester system CseSystem { + + var AeSimu v_ae1 := AeSimu.create("AE1") alive; + + v_ae1.start(f_CSE_TS_004()); + + v_ae1.done; + + } + + function f_CSE_TS_004() runs on AeSimu { + // Local variables + var integer v_aeIndex := -1; + var integer v_timeSeriesIndex := -1; + var integer v_subscriptionIndex := -1; + var EventNotificationCriteria v_eventNotificationCriteria := valueof(m_eventNotificationCriteria({int1}, -)); + var template RequestPrimitive v_createRequest := omit; + var ResponsePrimitive v_responsePrimitive; + var integer v_ae2Index := -1; + var XSD.NonNegativeInteger v_missingDataPointNumber := 100; + var template PrimitiveContent v_contentResponse; + + v_eventNotificationCriteria.missingData := valueof(m_missingData(v_missingDataPointNumber, "1000")); + + // Test control + + // Test component configuration + f_cf01Up(true); + + // Test adapter configuration + + // Preamble + v_aeIndex := f_cse_preamble_registerAe();//c_CRUDNDi); + + v_timeSeriesIndex := f_cse_createResource(int29, m_createTimeSeries(-, true, 5, -, 2000), v_aeIndex);//TimeSeries + + f_cse_preamble_subscriptionVerification(v_ae2Index, v_createRequest, int23);//AE2 registered + + v_createRequest := m_createSubscriptionAdvanced(f_getResourceAddress(v_timeSeriesIndex), -, {f_getResourceAddress(v_aeIndex)}, v_eventNotificationCriteria, omit, omit, omit, omit, omit, omit); + + v_subscriptionIndex := f_cse_createResource(int23, v_createRequest, v_timeSeriesIndex);//Subscription under TimeSeries + + if(vc_ae2.running) { + vc_ae2.stop; + }; + + // Test Body + + //Create data points and force a missingDataPoint + vc_ae2.start(f_cse_generateMissingDataPoint(v_timeSeriesIndex)); + vc_ae2.done; + + tc_ac.start; + alt { + [] mcaPortIn.receive(mw_request(mw_notifyNotification(?))){ + tc_ac.stop; + setverdict(fail, __SCOPE__ & ":ERROR: Notification received"); + //Send response in any case + v_responsePrimitive := valueof(m_responseNotification(int2001, omit)); + v_responsePrimitive.requestIdentifier := vc_request.primitive.requestPrimitive.requestIdentifier; + mcaPortIn.send(m_response(v_responsePrimitive)); + } + [] tc_ac.timeout { + setverdict(pass, __SCOPE__ & ": Notification not received"); + } + } + + //Check if the IUT restarts missing data point counter and timer + mcaPort.send(m_request(m_retrieve(f_getResourceAddress(v_timeSeriesIndex), f_getOriginator(v_timeSeriesIndex)))); + + v_contentResponse.timeSeries := mw_contentTimeSeries_rc1; + v_contentResponse.timeSeries.missingDataCurrentNr := 0; + + tc_ac.start; + alt { + [] mcaPort.receive(mw_response(mw_responsePrimitive(int2000, v_contentResponse))){ + tc_ac.stop; + setverdict(pass, __SCOPE__ & ": Response OK for retrieving. MissingDataCurrentNr has been restarted"); + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveOK(v_contentResponse))){ + tc_ac.stop; + setverdict(fail, __SCOPE__ & ": Wrong response status code"); + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveOK)){ + tc_ac.stop; + setverdict(fail, __SCOPE__ & ": Error, resource elements provided not matching expected resource elements"); + } + [] mcaPort.receive(mw_response(mw_responsePrimitiveKO)){ + tc_ac.stop; + setverdict(fail, __SCOPE__ & ": Error while retrieving resource"); + } + [] tc_ac.timeout { + setverdict(fail, __SCOPE__ & ": No answer while retrieving resource"); + } + } + + //Postamble + f_cse_postamble_deleteResources(); + + //Tear down + f_cf01Down(); + + } // end f_CSE_TS_004 + + }//end group timeSeries + + }//end group dataManagement + + }//end group CSE + }