From 21500ba608b18244e03cb031df4c41d6384de4b7 Mon Sep 17 00:00:00 2001 From: garciay <yann.garcia@fscom.fr> Date: Wed, 26 Mar 2025 13:34:42 +0100 Subject: [PATCH] Add discover/get IOT --- go-packages/meep-iot-mgr/iot-mgr.go | 2 +- go-packages/meep-sss-mgr/mqtt.go | 9 +- go-packages/meep-sss-mgr/onem2m-mgr.go | 497 ++----- go-packages/meep-sss-mgr/onem2m-mgr_test.go | 1325 ++++++++++++++----- 4 files changed, 1111 insertions(+), 722 deletions(-) diff --git a/go-packages/meep-iot-mgr/iot-mgr.go b/go-packages/meep-iot-mgr/iot-mgr.go index d6c74abbe..a517df845 100644 --- a/go-packages/meep-iot-mgr/iot-mgr.go +++ b/go-packages/meep-iot-mgr/iot-mgr.go @@ -500,7 +500,7 @@ func (tm *IotMgr) createDeviceWithIotPlatformId(device DeviceInfo, requestedIotP // //DownlinkInfo *DownlinkInfo // ClientCertificate string // } - sensor, err := registeredIotPlatformsMap[requestedIotPlatformId].oneM2M.OneM2M_create(sensor, requestedIotPlatformId, sensor.SensorType) + sensor, err := registeredIotPlatformsMap[requestedIotPlatformId].oneM2M.OneM2M_create(sensor, "") if err != nil { return deviceResp, err } diff --git a/go-packages/meep-sss-mgr/mqtt.go b/go-packages/meep-sss-mgr/mqtt.go index 321a3e50a..04ca84151 100644 --- a/go-packages/meep-sss-mgr/mqtt.go +++ b/go-packages/meep-sss-mgr/mqtt.go @@ -177,14 +177,15 @@ func (broker_mqtt *SssMgrMqtt) send(p_ctx SssMgrBindingProtocolContext) (err err body["pc"] = p_ctx.body } if p_ctx.queries != nil && len(p_ctx.queries) != 0 { - d := make(map[string]int, 0) - for k, v := range p_ctx.queries { - if k == "ty" { // mosquitto_pub -d -q 0 -h 172.29.10.56 -p 1883 -t "/oneM2M/req/CAdmin/laboai-acme-ic-cse/json" -m "{\"fr\":\"CAdmin\",\"op\":2,\"rqi\":\"432bb877-7dc5-4e4d-b424-9c0d50604596\",\"rvi\":\"4\",\"to\":\"laboai-cse-in/YannouDomainAutomation/YannouGardenZone0\",\"ty\":3,\"fc\":{\"fu\":2,\"fo\":1}}" - body[k], err = strconv.Atoi(v) + d := make(map[string]interface{}, 0) + for k, v := range p_ctx.queries { // FIXME FSCOM Check in pure string is working too? + if k == "ty" { + s, err := strconv.Atoi(v) if err != nil { log.Error(err.Error()) return err, nil } + d[k] = []int{s} continue } d[k], err = strconv.Atoi(v) diff --git a/go-packages/meep-sss-mgr/onem2m-mgr.go b/go-packages/meep-sss-mgr/onem2m-mgr.go index ab5127e6f..5901c31bb 100644 --- a/go-packages/meep-sss-mgr/onem2m-mgr.go +++ b/go-packages/meep-sss-mgr/onem2m-mgr.go @@ -344,8 +344,9 @@ func (tm *SssMgr) populateSensors(iotPlatformInfo IotPlatformInfo) error { // Build the queries queries := map[string]string{} queries["fu"] = "1" // Filter usage - queries["ty"] = "3" // Filter on oneM2M CIN for sensors + queries["ty"] = "3" // Filter on oneM2M CNT for sensors ctx.queries = queries + err, resp := protocol.send(ctx) if err != nil { log.Error("OneM2M_create: ", err.Error()) @@ -385,281 +386,17 @@ func (tm *SssMgr) populateSensors(iotPlatformInfo IotPlatformInfo) error { var sensor = SensorDiscoveryInfo{ IotPlatformId: iotPlatformInfo.IotPlatformId, } - for k, v := range oneM2M_cin { - log.Debug(k, " value is ", v) - log.Debug("populateSensors: type(v): ", reflect.TypeOf(v)) - - if k == "ri" { - if item, ok := v.(string); ok { - sensor.SensorIdentifier = item - } else { - log.Error("populateSensors: Failed to process ", k) - } - } else if k == "ty" { - if item, ok := v.(float64); ok { - sensor.SensorType = strconv.FormatFloat(item, 'f', -1, 64) - } else { - log.Error("populateSensors: Failed to process ", k) - } - } else { - sensor.SensorPropertyList = append(sensor.SensorPropertyList, k) - if item, ok := v.(string); ok { - sensor.SensorCharacteristicList = append( - sensor.SensorCharacteristicList, - SensorCharacteristic{ - CharacteristicName: k, - CharacteristicValue: string(item), - }) - } else if item, ok := v.(float64); ok { - sensor.SensorCharacteristicList = append( - sensor.SensorCharacteristicList, - SensorCharacteristic{ - CharacteristicName: k, - CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64), - }) - } else if item, ok := v.(int64); ok { - sensor.SensorCharacteristicList = append( - sensor.SensorCharacteristicList, - SensorCharacteristic{ - CharacteristicName: k, - CharacteristicValue: strconv.FormatInt(item, 10), - }) - } else if item, ok := v.(bool); ok { - sensor.SensorCharacteristicList = append( - sensor.SensorCharacteristicList, - SensorCharacteristic{ - CharacteristicName: k, - CharacteristicValue: strconv.FormatBool(item), - }) - } else if item, ok := v.([]string); ok { - sensor.SensorCharacteristicList = append( - sensor.SensorCharacteristicList, - SensorCharacteristic{ - CharacteristicName: k, - CharacteristicValue: strings.Join(item, ","), - }) - } else if item, ok := v.([]int64); ok { - log.Error("populateSensors: Failed to convert list of int64 into string: ", item) - } else if item, ok := v.([]interface{}); ok { - log.Debug("populateSensors: Got []interface {} for ", k) - log.Debug("populateSensors: ValueOf ", reflect.ValueOf(item)) - s := SensorCharacteristic{ - CharacteristicName: k, - } - var buf bytes.Buffer - fmt.Fprintf(&buf, "%T", reflect.ValueOf(item)) - s.CharacteristicValue = buf.String() - sensor.SensorCharacteristicList = append(sensor.SensorCharacteristicList, s) - } else { - log.Error("populateSensors: Failed to process ", k) - } - } + sensor, err = tm.oneM2M_deserialize(sensor, oneM2M_cin) + if err != nil { + log.Warn("populateSensors: ", err.Error()) + continue + } - } // End of 'for' statement log.Info("populateSensors: sensor: ", sensor) sensorsMap[sensor.SensorIdentifier] = sensor sensorsPerPlatformMap[sensor.IotPlatformId] = append(sensorsPerPlatformMap[sensor.IotPlatformId], sensor.SensorIdentifier) } // End of 'for' statement - // // 1. Get the list of the AE - // // Build the URL - // url := "http://" + iotPlatformInfo.Address + ":" + strconv.Itoa(int(iotPlatformInfo.Port)) + "/" + iotPlatformInfo.Name - // log.Debug("populateSensors: url=", url) - // // Build the headers - // var headers = http.Header{} - // headers["Accept"] = []string{headerAccept} - // headers["Content-Type"] = []string{headerContentType} - // headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it - // headers["X-M2M-RI"] = []string{uuid.New().String()} - // headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it - // // Build the queries - // queries := map[string]string{} - // queries["fu"] = "1" // Filter usage - // queries["ty"] = "4" // Filter on oneM2M CIN for sensors - // // Send the request - // response, err := sendRequest("GET", url, headers, nil, nil, queries, 200) - // if err != nil { - // log.Error("populateSensors: ", err.Error()) - // return err - // } - // log.Debug("populateSensors: response: ", string(response)) - - // var oneM2M_uril map[string][]string - // err = json.Unmarshal(response, &oneM2M_uril) - // if err != nil { - // log.Error("populateSensors: ", err.Error()) - // return err - // } - // log.Debug("populateSensors: oneM2M_uril: ", len(oneM2M_uril)) - // log.Debug(oneM2M_uril) - // if _, ok := oneM2M_uril["m2m:uril"]; !ok { - // err := errors.New("populateSensors: CharacteristicName not found: m2m:uril") - // log.Error(err.Error()) - // return err - // } - // // Loop for each CIN and build the sensor list - // for _, v := range oneM2M_uril["m2m:uril"] { - // log.Debug("populateSensors: Processing key: ", v) - - // url := "http://" + iotPlatformInfo.Address + ":" + strconv.Itoa(int(iotPlatformInfo.Port)) + "/" + v - // log.Debug("populateSensors: url=", url) - // // Build the headers - // var headers = http.Header{} - // headers["Accept"] = []string{headerAccept} - // headers["Content-Type"] = []string{headerContentType} - // headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it - // headers["X-M2M-RI"] = []string{uuid.New().String()} - // headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it - // // Build the queries - // queries := map[string]string{} - // queries["fu"] = "2" // Filter usage - // // Send the request - // response, err := sendRequest("GET", url, headers, nil, nil, queries, 200) - // if err != nil { - // log.Error("populateSensors: ", err.Error()) - // return err - // } - // log.Debug("populateSensors: response: ", string(response)) - // var oneM2M_cin map[string]map[string]interface{} - // err = json.Unmarshal(response, &oneM2M_cin) - // if err != nil { - // log.Error("populateSensors: ", err.Error()) - // continue - // } - // log.Debug("populateSensors: type(oneM2M_cin): ", reflect.TypeOf(oneM2M_cin)) - // log.Debug("populateSensors: len(oneM2M_cin): ", len(oneM2M_cin)) - // log.Debug("populateSensors: oneM2M_cin: ", oneM2M_cin) - // for _, m := range oneM2M_cin { - // //log.Debug("==> ", i, " value is ", m) - // var sensor = SensorDiscoveryInfo{ - // IotPlatformId: iotPlatformInfo.IotPlatformId, - // } - - // // m is a map[string]interface. - // // loop over keys and values in the map. - // for k, v := range m { - // log.Debug(k, " value is ", v) - // log.Debug("populateSensors: type(v): ", reflect.TypeOf(v)) - - // if k == "ri" { - // if item, ok := v.(string); ok { - // sensor.SensorIdentifier = item - // } else { - // log.Error("populateSensors: Failed to process ", k) - // } - // } else if k == "ty" { - // if item, ok := v.(float64); ok { - // sensor.SensorType = strconv.FormatFloat(item, 'f', -1, 64) - // } else { - // log.Error("populateSensors: Failed to process ", k) - // } - // } else { - // sensor.SensorPropertyList = append(sensor.SensorPropertyList, k) - // if item, ok := v.(string); ok { - // sensor.SensorCharacteristicList = append( - // sensor.SensorCharacteristicList, - // SensorCharacteristic{ - // CharacteristicName: k, - // CharacteristicValue: string(item), - // }) - // } else if item, ok := v.(float64); ok { - // sensor.SensorCharacteristicList = append( - // sensor.SensorCharacteristicList, - // SensorCharacteristic{ - // CharacteristicName: k, - // CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64), - // }) - // } else if item, ok := v.(int64); ok { - // sensor.SensorCharacteristicList = append( - // sensor.SensorCharacteristicList, - // SensorCharacteristic{ - // CharacteristicName: k, - // CharacteristicValue: strconv.FormatInt(item, 10), - // }) - // } else if item, ok := v.(bool); ok { - // sensor.SensorCharacteristicList = append( - // sensor.SensorCharacteristicList, - // SensorCharacteristic{ - // CharacteristicName: k, - // CharacteristicValue: strconv.FormatBool(item), - // }) - // } else if item, ok := v.([]string); ok { - // sensor.SensorCharacteristicList = append( - // sensor.SensorCharacteristicList, - // SensorCharacteristic{ - // CharacteristicName: k, - // CharacteristicValue: strings.Join(item, ","), - // }) - // } else if item, ok := v.([]int64); ok { - // log.Error("populateSensors: Failed to convert list of int64 into string: ", item) - // } else if item, ok := v.([]interface{}); ok { - // log.Debug("populateSensors: Got []interface {} for ", k) - // log.Debug("populateSensors: ValueOf ", reflect.ValueOf(item)) - // s := SensorCharacteristic{ - // CharacteristicName: k, - // } - // var buf bytes.Buffer - // fmt.Fprintf(&buf, "%T", reflect.ValueOf(item)) - // s.CharacteristicValue = buf.String() - // sensor.SensorCharacteristicList = append(sensor.SensorCharacteristicList, s) - // } else { - // log.Error("populateSensors: Failed to process ", k) - // } - // } - // // if k == "rn" { - // // if item, ok := v.(string); ok { - // // sensor.DeviceId = item - // // } else { - // // log.Error("populateSensors: Failed to process ", k) - // // } - // // } else if k == "ri" { - // // if item, ok := v.(string); ok { - // // sensor.SensorIdentifier = item - // // } else { - // // log.Error("populateSensors: Failed to process ", k) - // // } - // // } else if k == "ty" { - // // if item, ok := v.(float64); ok { - // // sensor.SensorStatusType = strconv.FormatFloat(item, 'f', -1, 64) - // // } else { - // // log.Error("populateSensors: Failed to process ", k) - // // } - // // } else { // default: if k == "lt" || k == "et" || k == "ct" || k == "st" || k == "pi" || k == "lbl" { - // // if item, ok := v.(string); ok { - // // sensor.SensorCharacteristicList = append( - // // sensor.SensorCharacteristicList, - // // SensorCharacteristic{ - // // CharacteristicName: k, - // // CharacteristicValue: string(item), - // // CharacteristicUnitOfMeasure: nil, - // // }) - // // } else if item, ok := v.(float64); ok { - // // sensor.SensorCharacteristicList = append( - // // sensor.SensorCharacteristicList, - // // SensorCharacteristic{ - // // CharacteristicName: k, - // // CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64), - // // CharacteristicUnitOfMeasure: nil, - // // }) - // // } else if item, ok := v.([]string); ok { - // // sensor.SensorCharacteristicList = append( - // // sensor.SensorCharacteristicList, - // // SensorCharacteristic{ - // // CharacteristicName: k, - // // CharacteristicValue: strings.Join(item, ","), - // // CharacteristicUnitOfMeasure: nil, - // // }) - // // } else { - // // log.Error("populateSensors: Failed to process ", k) - // // } - // // } - // } // End of 'for' loop - // log.Info("populateSensors: sensor: ", sensor) - // sensorsMap[sensor.SensorIdentifier] = sensor - // sensorsPerPlatformMap[sensor.IotPlatformId] = append(sensorsPerPlatformMap[sensor.IotPlatformId], sensor.SensorIdentifier) - // } // End of 'for' loop - - // } // End of 'for' statement log.Info("populateSensors: sensorsMap: ", sensorsMap) log.Info("populateSensors: sensorsPerPlatformMap: ", sensorsPerPlatformMap) @@ -716,15 +453,15 @@ func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensor bodyMap["m2m:cnt"][val.CharacteristicName] = val.CharacteristicValue } // End of 'for' statement } - } else if sensor.SensorType == "CNI" { - bodyMap["m2m:cni"] = make(map[string]interface{}, 0) - bodyMap["m2m:cni"]["cnf"] = "text/plain:0" - bodyMap["m2m:cni"]["rn"] = sensor.SensorIdentifier + } else if sensor.SensorType == "CIN" { + bodyMap["m2m:cin"] = make(map[string]interface{}, 0) + bodyMap["m2m:cin"]["cnf"] = "text/plain:0" + bodyMap["m2m:cin"]["rn"] = sensor.SensorIdentifier // Add metadata if len(sensor.SensorCharacteristicList) != 0 { for _, val := range sensor.SensorCharacteristicList { - log.Debug("OneM2M_create: Adding CNI metadata: ", val) - bodyMap["m2m:cni"][val.CharacteristicName] = val.CharacteristicValue + log.Debug("OneM2M_create: Adding CIN metadata: ", val) + bodyMap["m2m:cin"][val.CharacteristicName] = val.CharacteristicValue } // End of 'for' statement } } else { @@ -753,7 +490,7 @@ func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensor ctx.ty = 2 } else if sensor.SensorType == "CNT" { ctx.ty = 3 - } else if sensor.SensorType == "CNI" { + } else if sensor.SensorType == "CIN" { ctx.ty = 4 } else { err = errors.New("OneM2M_create: Invalid type") @@ -770,7 +507,7 @@ func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensor log.Debug("OneM2M_create: TypeOf(resp): ", reflect.TypeOf(resp)) if _, ok := resp.(map[string]interface{}); !ok { log.Error("OneM2M_create: Interface not available") - + return sensorResp, err } // Add additional entries @@ -793,111 +530,157 @@ func (tm *SssMgr) OneM2M_create(sensor SensorDiscoveryInfo, path string) (sensor return sensorResp, nil } -func (tm *SssMgr) oneM2M_discovery(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (sensorResp SensorDiscoveryInfo, err error) { - // FIXME FSCOM: requestedIotPlatformId should be useless +func (tm *SssMgr) OneM2M_discovery(type_ string, iotPlatformId string) (sensorResp []SensorDiscoveryInfo, err error) { + + if profiling { + profilingTimers["OneM2M_discovery"] = time.Now() + } + + log.Info(">>> OneM2OneM2M_discovery_get: path: ", type_) + log.Info(">>> OneM2M_discovery: iotPlatformId: ", iotPlatformId) + + if iotPlatformId == "" { + err = errors.New("IotPlatformId fiels shall be set") + log.Error("OneM2M_discovery: ", err.Error()) + return nil, err + } + + tm.wg.Wait() + log.Info("OneM2M_discovery: After Synchro") // 1. Get the list of the AE - // Build the URL - url := "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + registeredIotPlatformsMap[requestedIotPlatformId].Name - log.Debug("oneM2M_discovery: url=", url) - // Build the headers - var headers = http.Header{} - headers["Accept"] = []string{headerAccept} - headers["Content-Type"] = []string{headerContentType} - headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it - headers["X-M2M-RI"] = []string{uuid.New().String()} - headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it - // Build the queries + // Build the context + var ctx = SssMgrBindingProtocolContext{ + host: registeredIotPlatformsMap[iotPlatformId].Address, + port: registeredIotPlatformsMap[iotPlatformId].Port, + name: registeredIotPlatformsMap[iotPlatformId].Name, + to: registeredIotPlatformsMap[iotPlatformId].Name, + from: "Admin", // FIXME FSCOM How to get it + op: 2, // RETRIEVE + ty: -1, + rqi: uuid.New().String(), + rvi: []string{"4"}, // FIXME FSCOM How to get it + code: 200, + } + // Build the queries parameters queries := map[string]string{} - if type_ == "CN" { - queries["fu"] = "1" // Filter usage - queries["ty"] = "4" // Filter on oneM2M CIN for sensor + queries["fu"] = "1" // Filter usage + if type_ == "AE" { + ctx.ty = 2 + queries["ty"] = "2" + } else if type_ == "CNT" { + ctx.ty = 3 + queries["ty"] = "3" + } else if type_ == "CIN" { + ctx.ty = 4 + queries["ty"] = "4" } else { - err = errors.New("oneM2M_discovery: Invalid type") - log.Error("oneM2M_discovery: ", err.Error()) - return sensorResp, err + err = errors.New("OneM2M_discovery: Invalid type") + log.Error("OneM2M_discovery: ", err.Error()) + return nil, err } - // Send the request - response, err := sendRequest("GET", url, headers, nil, nil, queries, 200) + ctx.queries = queries + + err, resp := protocol.send(ctx) if err != nil { - log.Error("oneM2M_discovery: ", err.Error()) - return sensorResp, err + log.Error("OneM2M_create: ", err.Error()) + return nil, err } - log.Debug("oneM2M_discovery: response: ", string(response)) + log.Debug("OneM2M_discovery: resp: ", resp) + log.Debug("OneM2M_discovery: TypeOf(resp): ", reflect.TypeOf(resp)) + oneM2M_uril := resp.(map[string]interface{}) + log.Debug("OneM2M_discovery: oneM2M_uril: ", oneM2M_uril) + log.Debug("OneM2M_discovery: TypeOf(oneM2M_uril): ", reflect.TypeOf(oneM2M_uril)) + log.Debug("OneM2M_discovery: len(oneM2M_uril): ", len(oneM2M_uril)) + sensorResp = make([]SensorDiscoveryInfo, len(oneM2M_uril)) + // Loop for each CIN and build the sensor list + sensorResp = make([]SensorDiscoveryInfo, 0) + for _, v := range oneM2M_uril["m2m:uril"].([]interface{}) { + log.Debug("OneM2M_discovery: Processing key: v: ", v) + log.Debug("OneM2M_discovery: Processing key: TypeOf(v): ", reflect.TypeOf(v)) + s := v.(string) + if s == "laboai-cse-in/acpCreateACPs" || s == "laboai-cse-in/CAdmin" { + // FIXME FSCOM Bug in MQTT DISCOVERY request which does not provide the same response that HTTP DISCOVERY with the same filter criteria + continue // Discard it + } + r, err := tm.OneM2M_get(v.(string), iotPlatformId) + if err != nil { + log.Error("OneM2M_discovery: ", err.Error()) + return nil, err + } + sensorResp = append(sensorResp, r) + } // End of 'for' statement + log.Debug("OneM2M_discovery: len(sensorResp): ", len(sensorResp)) + log.Debug("OneM2M_discovery: sensorResp: ", sensorResp) - var d map[string]map[string]interface{} - err = json.Unmarshal(response, &d) - if err != nil { - log.Error("oneM2M_discovery: ", err.Error()) - return sensorResp, err + if profiling { + now := time.Now() + log.Debug("OneM2M_discovery: ", now.Sub(profilingTimers["OneM2M_discovery"])) } - log.Debug("oneM2M_discovery: d: ", d) - // Add additional entries - // sensorResp, err = tm.oneM2M_deserialize(sensor, d) - // if err != nil { - // log.Error("oneM2M_discovery: ", err.Error()) - // return sensorResp, err - // } - log.Debug("oneM2M_discovery: sensorResp: ", sensorResp) return sensorResp, nil } -func (tm *SssMgr) oneM2M_get(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (sensorResp SensorDiscoveryInfo, err error) { - // FIXME FSCOM: requestedIotPlatformId should be useless +func (tm *SssMgr) OneM2M_get(path string, iotPlatformId string) (sensorResp SensorDiscoveryInfo, err error) { - if sensor.SensorIdentifier == "" { - err = errors.New("oneM2M_get: Cannot find \"ri\" value") - log.Error("oneM2M_get: ", err.Error()) + if profiling { + profilingTimers["OneM2M_get"] = time.Now() + } + + log.Info(">>> OneM2M_get: path: ", path) + log.Info(">>> OneM2M_get: iotPlatformId: ", iotPlatformId) + + if path == "" || iotPlatformId == "" { + err = errors.New("OneM2M_get: Invalid parameters") + log.Error("OneM2M_get: ", err.Error()) return sensorResp, err } + tm.wg.Wait() + log.Info("OneM2M_get: After Synchro") + // 1. Get the list of the AE - // Build the URL - url := "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + sensor.SensorIdentifier - log.Debug("oneM2M_get: url=", url) - // Build the headers - var headers = http.Header{} - headers["Accept"] = []string{headerAccept} - headers["Content-Type"] = []string{headerContentType} - headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it - headers["X-M2M-RI"] = []string{uuid.New().String()} - headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it - // Build the queries - queries := map[string]string{} - if type_ == "AE" { - queries = nil - } else if type_ == "CN" { - queries["fu"] = "1" // Filter usage - queries["ty"] = "4" // Filter on oneM2M CIN for sensor - } else { - err = errors.New("oneM2M_get: Invalid type") - log.Error("oneM2M_get: ", err.Error()) - return sensorResp, err + // Build the context + var ctx = SssMgrBindingProtocolContext{ + host: registeredIotPlatformsMap[iotPlatformId].Address, + port: registeredIotPlatformsMap[iotPlatformId].Port, + name: registeredIotPlatformsMap[iotPlatformId].Name, + to: path, + from: "Admin", // FIXME FSCOM How to get it + op: 2, // RETRIEVE + ty: -1, + rqi: uuid.New().String(), + rvi: []string{"4"}, // FIXME FSCOM How to get it + code: 200, } - // Send the request - response, err := sendRequest("GET", url, headers, nil, nil, queries, 200) + + err, resp := protocol.send(ctx) if err != nil { - log.Error("oneM2M_get: ", err.Error()) + log.Error("OneM2M_get: ", err.Error()) + return sensorResp, err + } + log.Debug("OneM2M_get: resp: ", resp) + log.Debug("OneM2M_get: TypeOf(resp): ", reflect.TypeOf(resp)) + if _, ok := resp.(map[string]interface{}); !ok { + log.Error("OneM2M_get: Interface not available") return sensorResp, err } - log.Debug("oneM2M_get: response: ", string(response)) - var d map[string]map[string]interface{} - err = json.Unmarshal(response, &d) + // Add additional entries + sensorResp.IotPlatformId = iotPlatformId + sensorResp, err = tm.oneM2M_deserialize(sensorResp, resp.(map[string]interface{})) + if err != nil { - log.Error("oneM2M_get: ", err.Error()) + log.Error("OneM2M_get: ", err.Error()) return sensorResp, err } - log.Debug("oneM2M_get: d: ", d) + log.Debug("OneM2M_get: sensorResp: ", sensorResp) + + if profiling { + now := time.Now() + log.Debug("OneM2M_get: ", now.Sub(profilingTimers["OneM2M_get"])) + } - // Add additional entries - // sensorResp, err = tm.oneM2M_deserialize(sensor, d) - // if err != nil { - // log.Error("oneM2M_get: ", err.Error()) - // return sensorResp, err - // } - log.Debug("oneM2M_get: sensorResp: ", sensorResp) return sensorResp, nil } @@ -1037,7 +820,7 @@ func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[st case 3: sensorResp.SensorType = "CNT" case 4: - sensorResp.SensorType = "CNI" + sensorResp.SensorType = "CIN" default: sensorResp.SensorType = strconv.FormatFloat(item, 'f', -1, 64) } diff --git a/go-packages/meep-sss-mgr/onem2m-mgr_test.go b/go-packages/meep-sss-mgr/onem2m-mgr_test.go index 2bda18bb4..99cc83396 100644 --- a/go-packages/meep-sss-mgr/onem2m-mgr_test.go +++ b/go-packages/meep-sss-mgr/onem2m-mgr_test.go @@ -81,206 +81,828 @@ func TestNewSssMgr(t *testing.T) { tm = nil } -// func TestPopulateDevicesPerIotPlatformsHttp(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } +func TestPopulateDevicesPerIotPlatformsHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + err = tm.populateDevicesPerIotPlatforms() + if err != nil { + t.Fatalf(err.Error()) + } + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestSensorDiscoveryInfoAllHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + sensors, err := tm.SensorDiscoveryInfoAll() + if err != nil { + t.Fatalf(err.Error()) + } + fmt.Println("len=", len(sensors)) + fmt.Println("sensors", sensors) + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestGetSensorHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + sensors, err := tm.SensorDiscoveryInfoAll() + if err != nil { + t.Fatalf(err.Error()) + } + + for _, v := range sensors { + fmt.Println("v", v) + fmt.Println("TypeOf(v)", reflect.TypeOf(v)) + + sensor, err := tm.GetSensor(v.SensorIdentifier) + if !validate_sensor_discovery_info(v, sensor) { + t.Fatalf(err.Error()) + } + } + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_createAEHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + var sensor = SensorDiscoveryInfo{ + SensorIdentifier: "12345", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + new_sensor, err := tm.OneM2M_create(sensor, "") + if err != nil { + t.Fatalf("Failed to create new sensor") + } + + // Verify content + if !validate_sensor_ae(sensor, new_sensor) { + t.Fatalf("Failed to validate AE content") + } + + _ = tm.OneM2M_Delete(new_sensor) + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_createAE_CNTHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + var sensor_ae = SensorDiscoveryInfo{ + SensorIdentifier: "CMyAE", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") + if err != nil { + t.Fatalf("Failed to create new AE sensor") + } + + // Verify content + if !validate_sensor_ae(sensor_ae, new_sensor_ae) { + t.Fatalf("Failed to validate AE content") + } + + var sensor_cnt = SensorDiscoveryInfo{ + SensorIdentifier: "CMyCNT", + SensorType: "CNT", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + // sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1) + // sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} + sensorPath := new_sensor_ae.SensorIdentifier + new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) + if err != nil { + t.Fatalf("Failed to create new CNT sensor") + } + + // Verify content + if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { + t.Fatalf("Failed to validate AE content") + } + + err = tm.OneM2M_Delete(new_sensor_cnt) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + err = tm.OneM2M_Delete(new_sensor_ae) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_createAE_CNT_CNIHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + var sensor_ae = SensorDiscoveryInfo{ + SensorIdentifier: "CMyAE", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") + if err != nil { + t.Fatalf("Failed to create new AE sensor") + } + + // Verify content + if !validate_sensor_ae(sensor_ae, new_sensor_ae) { + t.Fatalf("Failed to validate AE content") + } + + var sensor_cnt = SensorDiscoveryInfo{ + SensorIdentifier: "CMyCNT", + SensorType: "CNT", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensorPath := new_sensor_ae.SensorIdentifier + new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) + if err != nil { + t.Fatalf("Failed to create new CNT sensor") + } + + // Verify content + if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { + t.Fatalf("Failed to validate CNT content") + } + + var sensor_cin = SensorDiscoveryInfo{ + SensorIdentifier: "CMyCNI", + SensorType: "CIN", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1) + sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} + sensorPath = new_sensor_cnt.SensorIdentifier + new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + + // Verify content + if !validate_sensor_cin(sensor_cin, new_sensor_cin) { + t.Fatalf("Failed to validate CIN content") + } + + err = tm.OneM2M_Delete(new_sensor_cin) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + err = tm.OneM2M_Delete(new_sensor_cnt) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + err = tm.OneM2M_Delete(new_sensor_ae) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_deleteHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + var new_sensor = SensorDiscoveryInfo{ + SensorIdentifier: "12345", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensor, err := oneM2M_create(tm, new_sensor, "") + if err != nil { + t.Fatalf("Failed to create new sensor: " + err.Error()) + } + + err = tm.OneM2M_Delete(sensor) + if err != nil { + t.Fatalf("Failed to create new sensor: " + err.Error()) + } + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_getHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) + if err != nil { + t.Fatalf("Failed to create sensors") + } + + // Verify content + if len(sensors) != 3 || len(received_sensors) != 3 { + t.Fatalf("Failed to create sensors") + } + + // Get one sensor + sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId) + if err != nil { + t.Fatalf("Failed to discover CNT sensor") + } + // Verify content + if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) { + t.Fatalf("Failed to validate CNT content") + } + + sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId) + if err != nil { + t.Fatalf("Failed to discover CNT sensor") + } + // Verify content + if !validate_sensor_cin(received_sensors["CIN"], sensorResp) { + t.Fatalf("Failed to validate CIN content") + } + + _ = tm.OneM2M_Delete(received_sensors["CIN"]) + _ = tm.OneM2M_Delete(received_sensors["CNT"]) + _ = tm.OneM2M_Delete(received_sensors["AE"]) + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_discoveryHttp(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + _, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) + if err != nil { + t.Fatalf("Failed to create sensors") + } + + // Verify content + if len(received_sensors) != 3 { + t.Fatalf("Failed to create sensors") + } + + // Discover CNTs + sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId) + if err != nil { + t.Fatalf("Failed to discover CNT sensor") + } + if len(sensorList) != 1 { + t.Fatalf("Wrong discover result") + } + // Verify content + if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) { + t.Fatalf("Failed to validate CNT content") + } + + // Discover AEs + sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId) + if err != nil { + t.Fatalf("Failed to discover AE sensor") + } + if len(sensorList) != 1 { + t.Fatalf("Wrong discover result") + } + // Verify content + if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) { + t.Fatalf("Failed to validate AE content") + } + + _ = tm.OneM2M_Delete(received_sensors["CIN"]) + _ = tm.OneM2M_Delete(received_sensors["CNT"]) + _ = tm.OneM2M_Delete(received_sensors["AE"]) + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestPopulateDevicesPerIotPlatformsMqtt(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + err = tm.populateDevicesPerIotPlatforms() + if err != nil { + t.Fatalf(err.Error()) + } + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestSensorDiscoveryInfoAllMqtt(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + err = tm.populateDevicesPerIotPlatforms() + if err != nil { + t.Fatalf(err.Error()) + } + + sensors, err := tm.SensorDiscoveryInfoAll() + if err != nil { + t.Fatalf(err.Error()) + } + fmt.Println("sensors: ", sensors) + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } +} + +func TestGetSensorMqtt(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + sensors, err := tm.SensorDiscoveryInfoAll() + if err != nil { + t.Fatalf(err.Error()) + } + + for _, v := range sensors { + fmt.Println("v", v) + fmt.Println("TypeOf(v)", reflect.TypeOf(v)) -// err = tm.populateDevicesPerIotPlatforms() -// if err != nil { -// t.Fatalf(err.Error()) -// } + sensor, err := tm.GetSensor(v.SensorIdentifier) + if !validate_sensor_discovery_info(v, sensor) { + t.Fatalf(err.Error()) + } + } -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} -// func TestSensorDiscoveryInfoAllHttp(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } +func TestOneM2M_createAEMQTT(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) -// sensors, err := tm.SensorDiscoveryInfoAll() -// if err != nil { -// t.Fatalf(err.Error()) -// } -// fmt.Println("len=", len(sensors)) -// fmt.Println("sensors", sensors) + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } + var new_sensor = SensorDiscoveryInfo{ + SensorIdentifier: "12345", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensor, err := tm.OneM2M_create(new_sensor, "") + if err != nil { + t.Fatalf("Failed to create new sensor") + } -// func TestGetSensorHttp(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) + // Verify content + if !validate_sensor_ae(sensor, new_sensor) { + t.Fatalf("Failed to validate AE content") + } -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } + _ = tm.OneM2M_Delete(sensor) -// sensors, err := tm.SensorDiscoveryInfoAll() -// if err != nil { -// t.Fatalf(err.Error()) -// } + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_createAE_CNTMQTT(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) -// for _, v := range sensors { -// fmt.Println("v", v) -// fmt.Println("TypeOf(v)", reflect.TypeOf(v)) + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } -// sensor, err := tm.GetSensor(v.SensorIdentifier) -// if !validate_sensor_discovery_info(v, sensor) { -// t.Fatalf(err.Error()) -// } -// } + var sensor_ae = SensorDiscoveryInfo{ + SensorIdentifier: "CMyAE", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") + if err != nil { + t.Fatalf("Failed to create new AE sensor") + } -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } + // Verify content + if !validate_sensor_ae(sensor_ae, new_sensor_ae) { + t.Fatalf("Failed to validate AE content") + } -// func TestOneM2M_createAEHttp(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) + var sensor_cnt = SensorDiscoveryInfo{ + SensorIdentifier: "CMyCNT", + SensorType: "CNT", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + // sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1) + // sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} + sensorPath := new_sensor_ae.SensorIdentifier + new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) + if err != nil { + t.Fatalf("Failed to create new sensor") + } -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } + // Verify content + if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { + t.Fatalf("Failed to validate CNT content") + } -// var new_sensor = SensorDiscoveryInfo{ -// SensorIdentifier: "12345", -// SensorType: "AE", -// SensorPosition: nil, -// IotPlatformId: "7feaadbb0400", -// } -// sensor, err := tm.OneM2M_create(new_sensor, "") -// if err != nil { -// t.Fatalf("Failed to create new sensor") -// } + err = tm.OneM2M_Delete(new_sensor_cnt) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + err = tm.OneM2M_Delete(new_sensor_ae) + if err != nil { + t.Fatalf("Failed to create new sensor") + } -// // Verify content -// fmt.Println(">>> validate_sensor_discovery_info_1: expected_sensor: ", new_sensor) -// fmt.Println(">>> validate_sensor_discovery_info_1: received_sensor: ", sensor) -// // if sensor.SensorIdentifier != new_sensor.SensorIdentifier { // FIXME FSCOM SensorIdentifier will be replaced by oneM2M ri -// // t.Fatalf("received_sensor.SensorIdentifier != SensorIdentifier") -// // } -// if sensor.SensorType != new_sensor.SensorType { -// t.Fatalf("received_sensor.SensorType != SensorType") -// } -// if sensor.IotPlatformId != new_sensor.IotPlatformId { -// t.Fatalf("received_sensor.IotPlatformId != IotPlatformId") -// } -// if len(sensor.SensorCharacteristicList) == 0 { -// t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty") -// } + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_createAE_CNT_CNIMQTT(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + var sensor_ae = SensorDiscoveryInfo{ + SensorIdentifier: "CMyAE", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") + if err != nil { + t.Fatalf("Failed to create new AE sensor") + } + + // Verify content + if !validate_sensor_ae(sensor_ae, new_sensor_ae) { + t.Fatalf("Failed to validate AE content") + } + + var sensor_cnt = SensorDiscoveryInfo{ + SensorIdentifier: "CMyCNT", + SensorType: "CNT", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensorPath := new_sensor_ae.SensorIdentifier + new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + + // Verify content + if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { + t.Fatalf("Failed to validate CNT content") + } + + var sensor_cin = SensorDiscoveryInfo{ + SensorIdentifier: "CMyCNI", + SensorType: "CIN", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1) + sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} + sensorPath = new_sensor_cnt.SensorIdentifier + new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + if new_sensor_cin.SensorType != sensor_cin.SensorType { + t.Fatalf("received_sensor.SensorType != SensorType") + } + if new_sensor_cin.IotPlatformId != sensor_cin.IotPlatformId { + t.Fatalf("received_sensor.IotPlatformId != IotPlatformId") + } + if len(new_sensor_cin.SensorCharacteristicList) == 0 { + t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty") + } + + err = tm.OneM2M_Delete(new_sensor_cin) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + err = tm.OneM2M_Delete(new_sensor_cnt) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + err = tm.OneM2M_Delete(new_sensor_ae) + if err != nil { + t.Fatalf("Failed to create new sensor") + } + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_deleteMQTT(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + var new_sensor = SensorDiscoveryInfo{ + SensorIdentifier: "12345", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensor, err := oneM2M_create(tm, new_sensor, "") + if err != nil { + t.Fatalf("Failed to create new sensor: " + err.Error()) + } + + err = tm.OneM2M_Delete(sensor) + if err != nil { + t.Fatalf("Failed to create new sensor: " + err.Error()) + } + + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} + +func TestOneM2M_getMQTT(t *testing.T) { + fmt.Println("--- ", t.Name()) + log.MeepTextLogInit(t.Name()) + + // Valid Connector + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + if err != nil || tm == nil { + t.Fatalf("Failed to create SSS Asset Manager") + } + + sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) + if err != nil { + t.Fatalf("Failed to create sensors") + } + + // Verify content + if len(sensors) != 3 || len(received_sensors) != 3 { + t.Fatalf("Failed to create sensors") + } + + // Get one sensor + sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId) + if err != nil { + t.Fatalf("Failed to discover CNT sensor") + } + // Verify content + if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) { + t.Fatalf("Failed to validate CNT content") + } + + sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId) + if err != nil { + t.Fatalf("Failed to discover CNT sensor") + } + // Verify content + if !validate_sensor_cin(received_sensors["CIN"], sensorResp) { + t.Fatalf("Failed to validate CIN content") + } -// _ = tm.OneM2M_Delete(sensor) + _ = tm.OneM2M_Delete(received_sensors["CIN"]) + _ = tm.OneM2M_Delete(received_sensors["CNT"]) + _ = tm.OneM2M_Delete(received_sensors["AE"]) -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } + // Cleanup + err = tm.DeleteSssMgr() + if err != nil { + t.Fatalf("Failed to cleanup SSS Asset Manager") + } + tm = nil +} -func TestOneM2M_createAE_CNTHttp(t *testing.T) { +func TestOneM2M_discoveryMQTT(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // Valid Connector fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) if err != nil || tm == nil { t.Fatalf("Failed to create SSS Asset Manager") } - var sensor_ae = SensorDiscoveryInfo{ - SensorIdentifier: "CMyAE", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") + _, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) if err != nil { - t.Fatalf("Failed to create new AE sensor") + t.Fatalf("Failed to create sensors") } // Verify content - fmt.Println(">>> validate_sensor_discovery_info_1: expected_sensor: ", sensor_ae) - fmt.Println(">>> validate_sensor_discovery_info_1: received_sensor: ", new_sensor_ae) - // if sensor.SensorIdentifier != new_sensor.SensorIdentifier { // FIXME FSCOM SensorIdentifier will be replaced by oneM2M ri - // t.Fatalf("received_sensor.SensorIdentifier != SensorIdentifier") - // } - if new_sensor_ae.SensorType != new_sensor_ae.SensorType { - t.Fatalf("received_sensor.SensorType != SensorType") - } - if new_sensor_ae.IotPlatformId != sensor_ae.IotPlatformId { - t.Fatalf("received_sensor.IotPlatformId != IotPlatformId") - } - if len(new_sensor_ae.SensorCharacteristicList) == 0 { - t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty") + if len(received_sensors) != 3 { + t.Fatalf("Failed to create sensors") } - var sensor_cnt = SensorDiscoveryInfo{ - SensorIdentifier: "CMyCNT", - SensorType: "CNT", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - // sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1) - // sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} - sensorPath := new_sensor_ae.SensorIdentifier - new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) + // Discover CNTs + sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId) if err != nil { - t.Fatalf("Failed to create new sensor") - } - if new_sensor_cnt.SensorType != sensor_cnt.SensorType { - t.Fatalf("received_sensor.SensorType != SensorType") + t.Fatalf("Failed to discover CNT sensor") } - if new_sensor_cnt.IotPlatformId != sensor_cnt.IotPlatformId { - t.Fatalf("received_sensor.IotPlatformId != IotPlatformId") + if len(sensorList) != 1 { + t.Fatalf("Wrong discover result") } - if len(new_sensor_cnt.SensorCharacteristicList) == 0 { - t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty") + // Verify content + if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) { + t.Fatalf("Failed to validate CNT content") } - err = tm.OneM2M_Delete(new_sensor_cnt) + // Discover AEs + sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId) if err != nil { - t.Fatalf("Failed to create new sensor") + t.Fatalf("Failed to discover AE sensor") } - err = tm.OneM2M_Delete(new_sensor_ae) - if err != nil { - t.Fatalf("Failed to create new sensor") + if len(sensorList) != 1 { + t.Fatalf("Wrong discover result") + } + // Verify content + if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) { + t.Fatalf("Failed to validate AE content") } + _ = tm.OneM2M_Delete(received_sensors["CIN"]) + _ = tm.OneM2M_Delete(received_sensors["CNT"]) + _ = tm.OneM2M_Delete(received_sensors["AE"]) + // Cleanup err = tm.DeleteSssMgr() if err != nil { @@ -289,208 +911,6 @@ func TestOneM2M_createAE_CNTHttp(t *testing.T) { tm = nil } -// func TestOneM2M_deleteHttp(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) - -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } - -// var new_sensor = SensorDiscoveryInfo{ -// SensorIdentifier: "12345", -// SensorType: "AE", -// SensorPosition: nil, -// IotPlatformId: "7feaadbb0400", -// } -// sensor, err := oneM2M_create(tm, new_sensor) -// if err != nil { -// t.Fatalf("Failed to create new sensor: ", err.Error()) -// } - -// err = tm.OneM2M_Delete(sensor) -// if err != nil { -// t.Fatalf("Failed to create new sensor: ", err.Error()) -// } - -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } - -// func TestPopulateDevicesPerIotPlatformsMqtt(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } -// err = tm.populateDevicesPerIotPlatforms() -// if err != nil { -// t.Fatalf(err.Error()) -// } -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } - -// func TestSensorDiscoveryInfoAllMqtt(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) - -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } - -// err = tm.populateDevicesPerIotPlatforms() -// if err != nil { -// t.Fatalf(err.Error()) -// } - -// sensors, err := tm.SensorDiscoveryInfoAll() -// if err != nil { -// t.Fatalf(err.Error()) -// } -// fmt.Println("sensors: ", sensors) - -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// } - -// func TestGetSensorMqtt(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) - -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } - -// sensors, err := tm.SensorDiscoveryInfoAll() -// if err != nil { -// t.Fatalf(err.Error()) -// } - -// for _, v := range sensors { -// fmt.Println("v", v) -// fmt.Println("TypeOf(v)", reflect.TypeOf(v)) - -// sensor, err := tm.GetSensor(v.SensorIdentifier) -// if !validate_sensor_discovery_info(v, sensor) { -// t.Fatalf(err.Error()) -// } -// } - -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } - -// func TestOneM2M_createAEMQTT(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) - -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } - -// var new_sensor = SensorDiscoveryInfo{ -// SensorIdentifier: "12345", -// SensorType: "AE", -// SensorPosition: nil, -// IotPlatformId: "7feaadbb0400", -// } -// sensor, err := tm.OneM2M_create(new_sensor, "") -// if err != nil { -// t.Fatalf("Failed to create new sensor") -// } - -// // Verify content -// fmt.Println(">>> validate_sensor_discovery_info_1: expected_sensor: ", new_sensor) -// fmt.Println(">>> validate_sensor_discovery_info_1: received_sensor: ", sensor) -// // if sensor.SensorIdentifier != new_sensor.SensorIdentifier { // FIXME FSCOM SensorIdentifier will be replaced by oneM2M ri -// // t.Fatalf("received_sensor.SensorIdentifier != SensorIdentifier") -// // } -// if sensor.SensorType != new_sensor.SensorType { -// t.Fatalf("received_sensor.SensorType != SensorType") -// } -// if sensor.IotPlatformId != new_sensor.IotPlatformId { -// t.Fatalf("received_sensor.IotPlatformId != IotPlatformId") -// } -// if len(sensor.SensorCharacteristicList) == 0 { -// t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty") -// } - -// _ = tm.OneM2M_Delete(sensor) - -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } - -// func TestOneM2M_deleteMQTT(t *testing.T) { -// fmt.Println("--- ", t.Name()) -// log.MeepTextLogInit(t.Name()) - -// // Valid Connector -// fmt.Println("Create valid SSS Asset Manager") -// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) -// if err != nil || tm == nil { -// t.Fatalf("Failed to create SSS Asset Manager") -// } - -// var new_sensor = SensorDiscoveryInfo{ -// SensorIdentifier: "12345", -// SensorType: "AE", -// SensorPosition: nil, -// IotPlatformId: "7feaadbb0400", -// } -// sensor, err := oneM2M_create(tm, new_sensor, "") -// if err != nil { -// t.Fatalf("Failed to create new sensor: " + err.Error()) -// } - -// err = tm.OneM2M_Delete(sensor) -// if err != nil { -// t.Fatalf("Failed to create new sensor: " + err.Error()) -// } - -// // Cleanup -// err = tm.DeleteSssMgr() -// if err != nil { -// t.Fatalf("Failed to cleanup SSS Asset Manager") -// } -// tm = nil -// } - // func TestVaidateOneM2MNotificationServer(t *testing.T) { // fmt.Println("--- ", t.Name()) // log.MeepTextLogInit(t.Name()) @@ -521,6 +941,56 @@ func oneM2M_create(tm *SssMgr, sensor SensorDiscoveryInfo, path string) (sensorR return sensorResp, nil } +func oneM2M_createAE_CNT_CIN(tm *SssMgr) (sensors map[string]SensorDiscoveryInfo, received_sensors map[string]SensorDiscoveryInfo, err error) { + sensors = make(map[string]SensorDiscoveryInfo, 0) + received_sensors = make(map[string]SensorDiscoveryInfo, 0) + + var sensor_ae = SensorDiscoveryInfo{ + SensorIdentifier: "CMyAE", + SensorType: "AE", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensors[sensor_ae.SensorType] = sensor_ae + new_sensor_ae, err := oneM2M_create(tm, sensor_ae, "") + if err != nil { + return nil, nil, err + } + received_sensors[new_sensor_ae.SensorType] = new_sensor_ae + + var sensor_cnt = SensorDiscoveryInfo{ + SensorIdentifier: "CMyCNT", + SensorType: "CNT", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensorPath := new_sensor_ae.SensorIdentifier + sensors[sensor_cnt.SensorType] = sensor_cnt + new_sensor_cnt, err := oneM2M_create(tm, sensor_cnt, sensorPath) + if err != nil { + return nil, nil, err + } + received_sensors[new_sensor_cnt.SensorType] = new_sensor_cnt + + var sensor_cin = SensorDiscoveryInfo{ + SensorIdentifier: "CMyCNI", + SensorType: "CIN", + SensorPosition: nil, + IotPlatformId: "7feaadbb0400", + } + sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1) + sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} + sensorPath = new_sensor_cnt.SensorIdentifier + sensors[sensor_cin.SensorType] = sensor_cin + new_sensor_cin, err := oneM2M_create(tm, sensor_cin, sensorPath) + if err != nil { + return nil, nil, err + } + received_sensors[new_sensor_cin.SensorType] = new_sensor_cin + + return sensors, received_sensors, nil +} + func validate_sensor_discovery_info(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool { fmt.Println(">>> validate_sensor_discovery_info: expected_sensor: ", expected_sensor) fmt.Println(">>> validate_sensor_discovery_info: received_sensor: ", received_sensor) @@ -545,3 +1015,138 @@ func validate_sensor_discovery_info(expected_sensor SensorDiscoveryInfo, receive return true } + +func validate_sensor_ae(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool { + fmt.Println(">>> validate_sensor_ae: expected_sensor: ", expected_sensor) + fmt.Println(">>> validate_sensor_ae: received_sensor: ", received_sensor) + + if received_sensor.SensorIdentifier == "" { + fmt.Println("validate_sensor_ae.SensorIdentifier shall be set") + return false + } + if received_sensor.SensorType == "" { + fmt.Println("validate_sensor_ae.SensorType shall be set") + return false + } + if received_sensor.IotPlatformId != expected_sensor.IotPlatformId { + fmt.Println("validate_sensor_ae.IotPlatformId != IotPlatformId") + return false + } + if len(received_sensor.SensorCharacteristicList) == 0 { + fmt.Println("validate_sensor_ae.SensorCharacteristicList shall not be empty") + return false + } + + for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined + found := true + switch c.CharacteristicName { + case "api": + case "srv": + case "pi": + case "ct": + case "et": + case "lt": + case "aei": + case "rn": + case "rr": + default: + found = true + } // End of 'switch' statement + if !found { + fmt.Println("Incomplete SensorCharacteristicList") + return false + } + } + + return true +} + +func validate_sensor_cnt(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool { + fmt.Println(">>> validate_sensor_cnt: expected_sensor: ", expected_sensor) + fmt.Println(">>> validate_sensor_cnt: received_sensor: ", received_sensor) + + if received_sensor.SensorIdentifier == "" { + fmt.Println("validate_sensor_ae.SensorIdentifier shall be set") + return false + } + if received_sensor.SensorType != received_sensor.SensorType { + fmt.Println("validate_sensor_cnt.SensorType != SensorType") + return false + } + if received_sensor.IotPlatformId != expected_sensor.IotPlatformId { + fmt.Println("validate_sensor_cnt.IotPlatformId != IotPlatformId") + return false + } + if len(received_sensor.SensorCharacteristicList) == 0 { + fmt.Println("validate_sensor_cnt.SensorCharacteristicList shall not be empty") + return false + } + + for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined + found := true + switch c.CharacteristicName { + case "cni": + case "pi": + case "ct": + case "et": + case "lt": + case "st": + case "cbs": + case "mbs": + case "mni": + case "rn": + default: + found = true + } // End of 'switch' statement + if !found { + fmt.Println("Incomplete SensorCharacteristicList") + return false + } + } + + return true +} + +func validate_sensor_cin(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool { + fmt.Println(">>> validate_sensor_cin: expected_sensor: ", expected_sensor) + fmt.Println(">>> validate_sensor_cin: received_sensor: ", received_sensor) + + if received_sensor.SensorIdentifier == "" { + fmt.Println("validate_sensor_ae.SensorIdentifier shall be set") + return false + } + if received_sensor.SensorType != received_sensor.SensorType { + fmt.Println("validate_sensor_cin.SensorType != SensorType") + return false + } + if received_sensor.IotPlatformId != expected_sensor.IotPlatformId { + fmt.Println("validate_sensor_cin.IotPlatformId != IotPlatformId") + return false + } + if len(received_sensor.SensorCharacteristicList) == 0 { + fmt.Println("validate_sensor_cin.SensorCharacteristicList shall not be empty") + return false + } + + for _, c := range received_sensor.SensorCharacteristicList { // FIXME FSCOM To be refined + found := true + switch c.CharacteristicName { + case "pi": + case "lt": + case "cs": + case "et": + case "cnf": + case "con": + case "ct": + case "rn": + default: + found = true + } // End of 'switch' statement + if !found { + fmt.Println("Incomplete SensorCharacteristicList") + return false + } + } + + return true +} -- GitLab