iotagent-node-lib 2.18.0 → 2.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +1 -2
- package/doc/advanced-topics.md +122 -53
- package/doc/api.md +52 -52
- package/doc/development.md +8 -9
- package/doc/expressionLanguage.md +514 -316
- package/doc/installationguide.md +66 -64
- package/doc/usermanual.md +48 -16
- package/docker/Mosquitto/Dockerfile +1 -0
- package/docker/Mosquitto/README.md +1 -0
- package/docker/Mosquitto/startMosquitto.sh +6 -4
- package/lib/command/commandLine.js +1 -1
- package/lib/fiware-iotagent-lib.js +3 -0
- package/lib/jexlTranformsMap.js +9 -1
- package/lib/model/Device.js +4 -1
- package/lib/model/Group.js +19 -1
- package/lib/plugins/expressionParser.js +6 -4
- package/lib/plugins/expressionPlugin.js +8 -1
- package/lib/plugins/jexlParser.js +3 -1
- package/lib/request-shim.js +111 -0
- package/lib/services/common/genericMiddleware.js +6 -2
- package/lib/services/common/iotManagerService.js +1 -1
- package/lib/services/common/securityServiceKeystone.js +1 -1
- package/lib/services/common/securityServiceOAuth2.js +3 -2
- package/lib/services/devices/deviceRegistryMongoDB.js +1 -0
- package/lib/services/devices/devices-NGSI-LD.js +1 -1
- package/lib/services/devices/devices-NGSI-v2.js +2 -6
- package/lib/services/devices/registrationUtils.js +0 -2
- package/lib/services/ngsi/entities-NGSI-LD.js +95 -11
- package/lib/services/ngsi/entities-NGSI-v2.js +93 -8
- package/lib/services/ngsi/ngsiService.js +3 -2
- package/lib/services/northBound/contextServer-NGSI-LD.js +3 -2
- package/lib/services/northBound/deviceProvisioningServer.js +29 -6
- package/lib/services/northBound/northboundServer.js +2 -0
- package/lib/services/northBound/restUtils.js +1 -1
- package/package.json +4 -4
- package/test/tools/utils.js +2 -0
- package/test/unit/expressions/jexlExpression-test.js +5 -5
- package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +1 -1
- package/test/unit/general/deviceService-test.js +2 -5
- package/test/unit/general/loglevel-api_test.js +6 -11
- package/test/unit/general/migration-test.js +1 -0
- package/test/unit/general/startup-test.js +1 -0
- package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +1 -0
- package/test/unit/mongodb/mongodb-group-registry-test.js +1 -1
- package/test/unit/mongodb/mongodb-registry-test.js +2 -1
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin12a.json +7 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin13.json +13 -13
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin1a.json +18 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin29.json +18 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin31.json +15 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin32.json +17 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin33.json +18 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin34.json +17 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin4a.json +36 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin7.json +16 -16
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin8a.json +18 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
- package/test/unit/ngsi-ld/expressions/jexlBasedTransformations-test.js +1018 -0
- package/test/unit/ngsi-ld/general/contextBrokerOAuthSecurityAccess-test.js +2 -2
- package/test/unit/ngsi-ld/general/deviceService-test.js +1 -1
- package/test/unit/ngsi-ld/general/https-support-test.js +2 -1
- package/test/unit/ngsi-ld/general/iotam-autoregistration-test.js +2 -1
- package/test/unit/ngsi-ld/general/startup-test.js +1 -0
- package/test/unit/ngsi-ld/lazyAndCommands/active-devices-attribute-update-test.js +3 -1
- package/test/unit/ngsi-ld/lazyAndCommands/command-test.js +2 -1
- package/test/unit/ngsi-ld/lazyAndCommands/lazy-devices-test.js +2 -6
- package/test/unit/ngsi-ld/lazyAndCommands/polling-commands-test.js +2 -1
- package/test/unit/ngsi-ld/ngsiService/active-devices-test.js +1 -0
- package/test/unit/ngsi-ld/ngsiService/autocast-test.js +1 -0
- package/test/unit/ngsi-ld/ngsiService/geoproperties-test.js +1 -0
- package/test/unit/ngsi-ld/ngsiService/subscriptions-test.js +4 -3
- package/test/unit/ngsi-ld/plugins/alias-plugin_test.js +1 -0
- package/test/unit/ngsi-ld/plugins/bidirectional-plugin_test.js +3 -2
- package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +61 -0
- package/test/unit/ngsi-ld/provisioning/device-provisioning-api_test.js +2 -1
- package/test/unit/ngsi-ld/provisioning/device-registration_test.js +3 -2
- package/test/unit/ngsi-ld/provisioning/device-update-registration_test.js +1 -0
- package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +42 -54
- package/test/unit/ngsi-ld/provisioning/provisionDeviceMultientity-test.js +2 -1
- package/test/unit/ngsi-ld/provisioning/removeProvisionedDevice-test.js +4 -4
- package/test/unit/ngsi-ld/provisioning/singleConfigurationMode-test.js +3 -5
- package/test/unit/ngsi-ld/provisioning/updateProvisionedDevices-test.js +12 -18
- package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +3 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin17.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin32.json +16 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin33.json +22 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json +12 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin16.json +25 -0
- package/test/unit/ngsiv2/expressions/expressionBasedTransformations-test.js +4 -4
- package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +500 -0
- package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +3 -2
- package/test/unit/ngsiv2/general/deviceService-test.js +9 -8
- package/test/unit/ngsiv2/general/https-support-test.js +2 -1
- package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +2 -1
- package/test/unit/ngsiv2/general/startup-test.js +1 -0
- package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +3 -1
- package/test/unit/ngsiv2/lazyAndCommands/command-test.js +2 -1
- package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +14 -18
- package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +3 -1
- package/test/unit/ngsiv2/ngsiService/active-devices-test.js +1 -0
- package/test/unit/ngsiv2/ngsiService/queryDeviceInformationInCb-test.js +0 -1
- package/test/unit/ngsiv2/ngsiService/subscriptions-test.js +4 -3
- package/test/unit/ngsiv2/plugins/bidirectional-plugin_test.js +3 -2
- package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +210 -0
- package/test/unit/ngsiv2/plugins/translation-inPlugins_test.js +1 -1
- package/test/unit/ngsiv2/provisioning/device-group-api-test.js +3 -2
- package/test/unit/ngsiv2/provisioning/device-group-utils-test.js +2 -1
- package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +2 -1
- package/test/unit/ngsiv2/provisioning/device-registration_test.js +3 -2
- package/test/unit/ngsiv2/provisioning/device-update-registration_test.js +4 -3
- package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +42 -53
- package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +2 -1
- package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +4 -4
- package/test/unit/ngsiv2/provisioning/singleConfigurationMode-test.js +3 -4
- package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +13 -19
- package/test/unit/plugins/capture-configuration-inPlugins_test.js +3 -1
- package/test/unit/plugins/capture-provision-inPlugins_test.js +2 -1
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin20.json +0 -25
|
@@ -30,6 +30,7 @@ const utils = require('../../../tools/utils');
|
|
|
30
30
|
const should = require('should');
|
|
31
31
|
const logger = require('logops');
|
|
32
32
|
const nock = require('nock');
|
|
33
|
+
const timekeeper = require('timekeeper');
|
|
33
34
|
let contextBrokerMock;
|
|
34
35
|
const iotAgentConfig = {
|
|
35
36
|
logLevel: 'FATAL',
|
|
@@ -216,6 +217,134 @@ const iotAgentConfig = {
|
|
|
216
217
|
expression: 'updated|trim'
|
|
217
218
|
}
|
|
218
219
|
]
|
|
220
|
+
},
|
|
221
|
+
GPS: {
|
|
222
|
+
commands: [],
|
|
223
|
+
type: 'GPS',
|
|
224
|
+
lazy: [],
|
|
225
|
+
active: [
|
|
226
|
+
{
|
|
227
|
+
name: 'location',
|
|
228
|
+
type: 'geo:json',
|
|
229
|
+
expression: "{coordinates: [lon,lat], type: 'Point'}"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
name: 'TimeInstant',
|
|
233
|
+
type: 'DateTime',
|
|
234
|
+
expression: 'ts|toisodate'
|
|
235
|
+
}
|
|
236
|
+
],
|
|
237
|
+
explicitAttrs: true
|
|
238
|
+
},
|
|
239
|
+
GPS2: {
|
|
240
|
+
commands: [],
|
|
241
|
+
type: 'GPS',
|
|
242
|
+
lazy: [],
|
|
243
|
+
active: [
|
|
244
|
+
{
|
|
245
|
+
name: 'location',
|
|
246
|
+
type: 'geo:json',
|
|
247
|
+
expression: "{coordinates: [lon,lat], type: 'Point'}"
|
|
248
|
+
}
|
|
249
|
+
],
|
|
250
|
+
explicitAttrs: true
|
|
251
|
+
},
|
|
252
|
+
GPS3: {
|
|
253
|
+
commands: [],
|
|
254
|
+
type: 'GPS',
|
|
255
|
+
lazy: [],
|
|
256
|
+
static: [
|
|
257
|
+
{
|
|
258
|
+
name: 'color',
|
|
259
|
+
type: 'string',
|
|
260
|
+
value: 'blue'
|
|
261
|
+
}
|
|
262
|
+
],
|
|
263
|
+
active: [
|
|
264
|
+
{
|
|
265
|
+
name: 'price',
|
|
266
|
+
type: 'number'
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: 'location',
|
|
270
|
+
type: 'geo:json',
|
|
271
|
+
expression: "{coordinates: [lon,lat], type: 'Point'}"
|
|
272
|
+
}
|
|
273
|
+
],
|
|
274
|
+
explicitAttrs: '[ "location" ]'
|
|
275
|
+
},
|
|
276
|
+
GPS4: {
|
|
277
|
+
commands: [],
|
|
278
|
+
type: 'GPS',
|
|
279
|
+
lazy: [],
|
|
280
|
+
static: [
|
|
281
|
+
{
|
|
282
|
+
name: 'color',
|
|
283
|
+
type: 'string',
|
|
284
|
+
value: 'blue'
|
|
285
|
+
}
|
|
286
|
+
],
|
|
287
|
+
active: [
|
|
288
|
+
{
|
|
289
|
+
name: 'price',
|
|
290
|
+
type: 'number'
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
name: 'location',
|
|
294
|
+
type: 'geo:json',
|
|
295
|
+
expression: "{coordinates: [lon,lat], type: 'Point'}"
|
|
296
|
+
}
|
|
297
|
+
],
|
|
298
|
+
explicitAttrs: '[ "loca" + "tion" ]'
|
|
299
|
+
},
|
|
300
|
+
GPS5: {
|
|
301
|
+
commands: [],
|
|
302
|
+
type: 'GPS',
|
|
303
|
+
lazy: [],
|
|
304
|
+
static: [
|
|
305
|
+
{
|
|
306
|
+
name: 'color',
|
|
307
|
+
type: 'string',
|
|
308
|
+
value: 'blue'
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
active: [
|
|
312
|
+
{
|
|
313
|
+
name: 'price',
|
|
314
|
+
type: 'number'
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
name: 'location',
|
|
318
|
+
type: 'geo:json',
|
|
319
|
+
expression: "{coordinates: [lon,lat], type: 'Point'}"
|
|
320
|
+
}
|
|
321
|
+
],
|
|
322
|
+
explicitAttrs: '[ myattr ]'
|
|
323
|
+
},
|
|
324
|
+
GPS6: {
|
|
325
|
+
commands: [],
|
|
326
|
+
type: 'GPS',
|
|
327
|
+
lazy: [],
|
|
328
|
+
static: [
|
|
329
|
+
{
|
|
330
|
+
name: 'lat',
|
|
331
|
+
type: 'Number',
|
|
332
|
+
value: 52
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
name: 'lon',
|
|
336
|
+
type: 'Number',
|
|
337
|
+
value: 13
|
|
338
|
+
}
|
|
339
|
+
],
|
|
340
|
+
active: [
|
|
341
|
+
{
|
|
342
|
+
name: 'location',
|
|
343
|
+
type: 'geo:json',
|
|
344
|
+
expression: "{coordinates: [lon,lat], type: 'Point'}"
|
|
345
|
+
}
|
|
346
|
+
],
|
|
347
|
+
explicitAttrs: true
|
|
219
348
|
}
|
|
220
349
|
},
|
|
221
350
|
service: 'smartgondor',
|
|
@@ -225,6 +354,38 @@ const iotAgentConfig = {
|
|
|
225
354
|
throttling: 'PT5S'
|
|
226
355
|
};
|
|
227
356
|
|
|
357
|
+
const iotAgentConfigTS = {
|
|
358
|
+
logLevel: 'FATAL',
|
|
359
|
+
contextBroker: {
|
|
360
|
+
host: '192.168.1.1',
|
|
361
|
+
port: '1026',
|
|
362
|
+
ngsiVersion: 'v2'
|
|
363
|
+
},
|
|
364
|
+
defaultExpressionLanguage: 'jexl',
|
|
365
|
+
server: {
|
|
366
|
+
port: 4041
|
|
367
|
+
},
|
|
368
|
+
types: {
|
|
369
|
+
GPS: {
|
|
370
|
+
commands: [],
|
|
371
|
+
type: 'GPS',
|
|
372
|
+
lazy: [],
|
|
373
|
+
active: [
|
|
374
|
+
{
|
|
375
|
+
name: 'location',
|
|
376
|
+
type: 'geo:json',
|
|
377
|
+
expression: "{coordinates: [lon,lat], type: 'Point'}"
|
|
378
|
+
}
|
|
379
|
+
],
|
|
380
|
+
explicitAttrs: true
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
timestamp: true,
|
|
384
|
+
service: 'smartgondor',
|
|
385
|
+
subservice: 'gardens',
|
|
386
|
+
providerUrl: 'http://smartgondor.com'
|
|
387
|
+
};
|
|
388
|
+
|
|
228
389
|
describe('Java expression language (JEXL) based transformations plugin', function () {
|
|
229
390
|
beforeEach(function (done) {
|
|
230
391
|
logger.setLevel('FATAL');
|
|
@@ -804,4 +965,343 @@ describe('Java expression language (JEXL) based transformations plugin', functio
|
|
|
804
965
|
});
|
|
805
966
|
});
|
|
806
967
|
});
|
|
968
|
+
|
|
969
|
+
describe('When there are additional attributes sent by the device to be calculated and removed', function () {
|
|
970
|
+
// Case: Expression which results is sent as a new attribute
|
|
971
|
+
const values = [
|
|
972
|
+
{
|
|
973
|
+
name: 'lat',
|
|
974
|
+
type: 'Number',
|
|
975
|
+
value: 52
|
|
976
|
+
},
|
|
977
|
+
{
|
|
978
|
+
name: 'lon',
|
|
979
|
+
type: 'Number',
|
|
980
|
+
value: 13
|
|
981
|
+
},
|
|
982
|
+
{
|
|
983
|
+
name: 'ts',
|
|
984
|
+
type: 'Number',
|
|
985
|
+
value: 1
|
|
986
|
+
}
|
|
987
|
+
];
|
|
988
|
+
|
|
989
|
+
beforeEach(function () {
|
|
990
|
+
nock.cleanAll();
|
|
991
|
+
|
|
992
|
+
contextBrokerMock = nock('http://192.168.1.1:1026')
|
|
993
|
+
.matchHeader('fiware-service', 'smartgondor')
|
|
994
|
+
.matchHeader('fiware-servicepath', 'gardens')
|
|
995
|
+
.patch(
|
|
996
|
+
'/v2/entities/gps1/attrs',
|
|
997
|
+
utils.readExampleFile(
|
|
998
|
+
'./test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin32.json'
|
|
999
|
+
)
|
|
1000
|
+
)
|
|
1001
|
+
.query({ type: 'GPS' })
|
|
1002
|
+
.reply(204);
|
|
1003
|
+
});
|
|
1004
|
+
|
|
1005
|
+
it('should calculate them and remove non-explicitAttrs from the payload', function (done) {
|
|
1006
|
+
iotAgentLib.update('gps1', 'GPS', '', values, function (error) {
|
|
1007
|
+
should.not.exist(error);
|
|
1008
|
+
contextBrokerMock.done();
|
|
1009
|
+
done();
|
|
1010
|
+
});
|
|
1011
|
+
});
|
|
1012
|
+
});
|
|
1013
|
+
|
|
1014
|
+
describe('When there is an extra TimeInstant sent by the device to be removed', function () {
|
|
1015
|
+
// Case: Expression which results is sent as a new attribute
|
|
1016
|
+
const values = [
|
|
1017
|
+
{
|
|
1018
|
+
name: 'lat',
|
|
1019
|
+
type: 'Number',
|
|
1020
|
+
value: 52
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
name: 'lon',
|
|
1024
|
+
type: 'Number',
|
|
1025
|
+
value: 13
|
|
1026
|
+
},
|
|
1027
|
+
{
|
|
1028
|
+
name: 'TimeInstant',
|
|
1029
|
+
type: 'DateTime',
|
|
1030
|
+
value: '2015-08-05T07:35:01.468+00:00'
|
|
1031
|
+
}
|
|
1032
|
+
];
|
|
1033
|
+
|
|
1034
|
+
beforeEach(function () {
|
|
1035
|
+
nock.cleanAll();
|
|
1036
|
+
|
|
1037
|
+
contextBrokerMock = nock('http://192.168.1.1:1026')
|
|
1038
|
+
.matchHeader('fiware-service', 'smartgondor')
|
|
1039
|
+
.matchHeader('fiware-servicepath', 'gardens')
|
|
1040
|
+
.patch(
|
|
1041
|
+
'/v2/entities/gps1/attrs',
|
|
1042
|
+
utils.readExampleFile(
|
|
1043
|
+
'./test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
|
|
1044
|
+
)
|
|
1045
|
+
)
|
|
1046
|
+
.query({ type: 'GPS' })
|
|
1047
|
+
.reply(204);
|
|
1048
|
+
});
|
|
1049
|
+
|
|
1050
|
+
it('should calculate them and remove non-explicitAttrs from the payload', function (done) {
|
|
1051
|
+
iotAgentLib.update('gps1', 'GPS2', '', values, function (error) {
|
|
1052
|
+
should.not.exist(error);
|
|
1053
|
+
contextBrokerMock.done();
|
|
1054
|
+
done();
|
|
1055
|
+
});
|
|
1056
|
+
});
|
|
1057
|
+
});
|
|
1058
|
+
|
|
1059
|
+
describe('When there is an extra TimeInstant sent by the device to be removed by string', function () {
|
|
1060
|
+
// Case: Expression which results is sent as a new attribute
|
|
1061
|
+
const values = [
|
|
1062
|
+
{
|
|
1063
|
+
name: 'lat',
|
|
1064
|
+
type: 'Number',
|
|
1065
|
+
value: 52
|
|
1066
|
+
},
|
|
1067
|
+
{
|
|
1068
|
+
name: 'lon',
|
|
1069
|
+
type: 'Number',
|
|
1070
|
+
value: 13
|
|
1071
|
+
},
|
|
1072
|
+
{
|
|
1073
|
+
name: 'TimeInstant',
|
|
1074
|
+
type: 'DateTime',
|
|
1075
|
+
value: '2015-08-05T07:35:01.468+00:00'
|
|
1076
|
+
}
|
|
1077
|
+
];
|
|
1078
|
+
|
|
1079
|
+
beforeEach(function () {
|
|
1080
|
+
nock.cleanAll();
|
|
1081
|
+
|
|
1082
|
+
contextBrokerMock = nock('http://192.168.1.1:1026')
|
|
1083
|
+
.matchHeader('fiware-service', 'smartgondor')
|
|
1084
|
+
.matchHeader('fiware-servicepath', 'gardens')
|
|
1085
|
+
.patch(
|
|
1086
|
+
'/v2/entities/gps1/attrs',
|
|
1087
|
+
utils.readExampleFile(
|
|
1088
|
+
'./test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
|
|
1089
|
+
)
|
|
1090
|
+
)
|
|
1091
|
+
.query({ type: 'GPS' })
|
|
1092
|
+
.reply(204);
|
|
1093
|
+
});
|
|
1094
|
+
|
|
1095
|
+
it('should calculate them and remove non-explicitAttrs by string from the payload', function (done) {
|
|
1096
|
+
iotAgentLib.update('gps1', 'GPS3', '', values, function (error) {
|
|
1097
|
+
should.not.exist(error);
|
|
1098
|
+
contextBrokerMock.done();
|
|
1099
|
+
done();
|
|
1100
|
+
});
|
|
1101
|
+
});
|
|
1102
|
+
});
|
|
1103
|
+
|
|
1104
|
+
describe('When there is an extra TimeInstant sent by the device to be removed by jexl expression', function () {
|
|
1105
|
+
// Case: Expression which results is sent as a new attribute
|
|
1106
|
+
const values = [
|
|
1107
|
+
{
|
|
1108
|
+
name: 'lat',
|
|
1109
|
+
type: 'Number',
|
|
1110
|
+
value: 52
|
|
1111
|
+
},
|
|
1112
|
+
{
|
|
1113
|
+
name: 'lon',
|
|
1114
|
+
type: 'Number',
|
|
1115
|
+
value: 13
|
|
1116
|
+
},
|
|
1117
|
+
{
|
|
1118
|
+
name: 'TimeInstant',
|
|
1119
|
+
type: 'DateTime',
|
|
1120
|
+
value: '2015-08-05T07:35:01.468+00:00'
|
|
1121
|
+
}
|
|
1122
|
+
];
|
|
1123
|
+
|
|
1124
|
+
beforeEach(function () {
|
|
1125
|
+
nock.cleanAll();
|
|
1126
|
+
|
|
1127
|
+
contextBrokerMock = nock('http://192.168.1.1:1026')
|
|
1128
|
+
.matchHeader('fiware-service', 'smartgondor')
|
|
1129
|
+
.matchHeader('fiware-servicepath', 'gardens')
|
|
1130
|
+
.patch(
|
|
1131
|
+
'/v2/entities/gps1/attrs',
|
|
1132
|
+
utils.readExampleFile(
|
|
1133
|
+
'./test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
|
|
1134
|
+
)
|
|
1135
|
+
)
|
|
1136
|
+
.query({ type: 'GPS' })
|
|
1137
|
+
.reply(204);
|
|
1138
|
+
});
|
|
1139
|
+
|
|
1140
|
+
it('should calculate them and remove non-explicitAttrs by jexl expression from the payload', function (done) {
|
|
1141
|
+
iotAgentLib.update('gps1', 'GPS4', '', values, function (error) {
|
|
1142
|
+
should.not.exist(error);
|
|
1143
|
+
contextBrokerMock.done();
|
|
1144
|
+
done();
|
|
1145
|
+
});
|
|
1146
|
+
});
|
|
1147
|
+
});
|
|
1148
|
+
|
|
1149
|
+
describe('When there is an extra TimeInstant sent by the device to be removed by jexl expression with context ', function () {
|
|
1150
|
+
// Case: Expression which results is sent as a new attribute
|
|
1151
|
+
const values = [
|
|
1152
|
+
{
|
|
1153
|
+
name: 'lat',
|
|
1154
|
+
type: 'Number',
|
|
1155
|
+
value: 52
|
|
1156
|
+
},
|
|
1157
|
+
{
|
|
1158
|
+
name: 'lon',
|
|
1159
|
+
type: 'Number',
|
|
1160
|
+
value: 13
|
|
1161
|
+
},
|
|
1162
|
+
{
|
|
1163
|
+
name: 'myattr',
|
|
1164
|
+
type: 'String',
|
|
1165
|
+
value: 'location'
|
|
1166
|
+
},
|
|
1167
|
+
{
|
|
1168
|
+
name: 'TimeInstant',
|
|
1169
|
+
type: 'DateTime',
|
|
1170
|
+
value: '2015-08-05T07:35:01.468+00:00'
|
|
1171
|
+
}
|
|
1172
|
+
];
|
|
1173
|
+
|
|
1174
|
+
beforeEach(function () {
|
|
1175
|
+
nock.cleanAll();
|
|
1176
|
+
|
|
1177
|
+
contextBrokerMock = nock('http://192.168.1.1:1026')
|
|
1178
|
+
.matchHeader('fiware-service', 'smartgondor')
|
|
1179
|
+
.matchHeader('fiware-servicepath', 'gardens')
|
|
1180
|
+
.patch(
|
|
1181
|
+
'/v2/entities/gps1/attrs',
|
|
1182
|
+
utils.readExampleFile(
|
|
1183
|
+
'./test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
|
|
1184
|
+
)
|
|
1185
|
+
)
|
|
1186
|
+
.query({ type: 'GPS' })
|
|
1187
|
+
.reply(204);
|
|
1188
|
+
});
|
|
1189
|
+
|
|
1190
|
+
it('should calculate them and remove non-explicitAttrs by jexl expression with context from the payload ', function (done) {
|
|
1191
|
+
iotAgentLib.update('gps1', 'GPS5', '', values, function (error) {
|
|
1192
|
+
should.not.exist(error);
|
|
1193
|
+
contextBrokerMock.done();
|
|
1194
|
+
done();
|
|
1195
|
+
});
|
|
1196
|
+
});
|
|
1197
|
+
});
|
|
1198
|
+
|
|
1199
|
+
describe('When there is an extra TimeInstant sent by the device to be removedb jexl expression using static attrs', function () {
|
|
1200
|
+
// Case: Expression which results is sent as a new attribute
|
|
1201
|
+
const values = [
|
|
1202
|
+
{
|
|
1203
|
+
name: 'TimeInstant',
|
|
1204
|
+
type: 'DateTime',
|
|
1205
|
+
value: '2015-08-05T07:35:01.468+00:00'
|
|
1206
|
+
}
|
|
1207
|
+
];
|
|
1208
|
+
|
|
1209
|
+
beforeEach(function () {
|
|
1210
|
+
nock.cleanAll();
|
|
1211
|
+
|
|
1212
|
+
contextBrokerMock = nock('http://192.168.1.1:1026')
|
|
1213
|
+
.matchHeader('fiware-service', 'smartgondor')
|
|
1214
|
+
.matchHeader('fiware-servicepath', 'gardens')
|
|
1215
|
+
.patch(
|
|
1216
|
+
'/v2/entities/gps1/attrs',
|
|
1217
|
+
utils.readExampleFile(
|
|
1218
|
+
'./test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json'
|
|
1219
|
+
)
|
|
1220
|
+
)
|
|
1221
|
+
.query({ type: 'GPS' })
|
|
1222
|
+
.reply(204);
|
|
1223
|
+
});
|
|
1224
|
+
|
|
1225
|
+
it('should calculate them and remove non-explicitAttrs from the payload', function (done) {
|
|
1226
|
+
iotAgentLib.update('gps1', 'GPS6', '', values, function (error) {
|
|
1227
|
+
should.not.exist(error);
|
|
1228
|
+
contextBrokerMock.done();
|
|
1229
|
+
done();
|
|
1230
|
+
});
|
|
1231
|
+
});
|
|
1232
|
+
});
|
|
1233
|
+
});
|
|
1234
|
+
|
|
1235
|
+
describe('Java expression language (JEXL) based transformations plugin - Timestamps', function () {
|
|
1236
|
+
beforeEach(function (done) {
|
|
1237
|
+
logger.setLevel('FATAL');
|
|
1238
|
+
|
|
1239
|
+
iotAgentLib.activate(iotAgentConfigTS, function () {
|
|
1240
|
+
iotAgentLib.clearAll(function () {
|
|
1241
|
+
iotAgentLib.addUpdateMiddleware(iotAgentLib.dataPlugins.attributeAlias.update);
|
|
1242
|
+
iotAgentLib.addQueryMiddleware(iotAgentLib.dataPlugins.attributeAlias.query);
|
|
1243
|
+
iotAgentLib.addUpdateMiddleware(iotAgentLib.dataPlugins.expressionTransformation.update);
|
|
1244
|
+
done();
|
|
1245
|
+
});
|
|
1246
|
+
});
|
|
1247
|
+
});
|
|
1248
|
+
|
|
1249
|
+
afterEach(function (done) {
|
|
1250
|
+
iotAgentLib.clearAll(function () {
|
|
1251
|
+
iotAgentLib.deactivate(done);
|
|
1252
|
+
});
|
|
1253
|
+
});
|
|
1254
|
+
|
|
1255
|
+
describe('When timestamps are added but are not explicitly defined', function () {
|
|
1256
|
+
// Case: Expression which results is sent as a new attribute
|
|
1257
|
+
const values = [
|
|
1258
|
+
{
|
|
1259
|
+
name: 'lat',
|
|
1260
|
+
type: 'Number',
|
|
1261
|
+
value: 52
|
|
1262
|
+
},
|
|
1263
|
+
{
|
|
1264
|
+
name: 'lon',
|
|
1265
|
+
type: 'Number',
|
|
1266
|
+
value: 13
|
|
1267
|
+
},
|
|
1268
|
+
{
|
|
1269
|
+
name: 'ts',
|
|
1270
|
+
type: 'Number',
|
|
1271
|
+
value: 1
|
|
1272
|
+
}
|
|
1273
|
+
];
|
|
1274
|
+
|
|
1275
|
+
beforeEach(function () {
|
|
1276
|
+
const time = new Date(1438760101468); // 2015-08-05T07:35:01.468+00:00
|
|
1277
|
+
|
|
1278
|
+
timekeeper.freeze(time);
|
|
1279
|
+
nock.cleanAll();
|
|
1280
|
+
|
|
1281
|
+
contextBrokerMock = nock('http://192.168.1.1:1026')
|
|
1282
|
+
.matchHeader('fiware-service', 'smartgondor')
|
|
1283
|
+
.matchHeader('fiware-servicepath', 'gardens')
|
|
1284
|
+
.patch(
|
|
1285
|
+
'/v2/entities/gps1/attrs',
|
|
1286
|
+
utils.readExampleFile(
|
|
1287
|
+
'./test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin33.json'
|
|
1288
|
+
)
|
|
1289
|
+
)
|
|
1290
|
+
.query({ type: 'GPS' })
|
|
1291
|
+
.reply(204);
|
|
1292
|
+
});
|
|
1293
|
+
|
|
1294
|
+
afterEach(function (done) {
|
|
1295
|
+
timekeeper.reset();
|
|
1296
|
+
done();
|
|
1297
|
+
});
|
|
1298
|
+
|
|
1299
|
+
it('should calculate them and not remove the timestamp from the payload', function (done) {
|
|
1300
|
+
iotAgentLib.update('gps1', 'GPS', '', values, function (error) {
|
|
1301
|
+
should.not.exist(error);
|
|
1302
|
+
contextBrokerMock.done();
|
|
1303
|
+
done();
|
|
1304
|
+
});
|
|
1305
|
+
});
|
|
1306
|
+
});
|
|
807
1307
|
});
|
|
@@ -27,10 +27,11 @@
|
|
|
27
27
|
|
|
28
28
|
const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
|
|
29
29
|
const utils = require('../../../tools/utils');
|
|
30
|
+
const request = utils.request;
|
|
30
31
|
const should = require('should');
|
|
31
32
|
const logger = require('logops');
|
|
32
33
|
const nock = require('nock');
|
|
33
|
-
|
|
34
|
+
|
|
34
35
|
const timekeeper = require('timekeeper');
|
|
35
36
|
let contextBrokerMock;
|
|
36
37
|
let oauth2Mock;
|
|
@@ -338,7 +339,7 @@ describe('NGSI-v2 - Secured access to the Context Broker with OAuth2 provider',
|
|
|
338
339
|
)
|
|
339
340
|
.reply(201, utils.readExampleFile('./test/unit/examples/oauthResponses/tokenFromTrust.json'), {});
|
|
340
341
|
|
|
341
|
-
contextBrokerMock.delete('/v2/subscriptions/51c0ac9ed714fb3b37d7d5a8').reply(204);
|
|
342
|
+
contextBrokerMock.delete('/v2/subscriptions/51c0ac9ed714fb3b37d7d5a8', '').reply(204);
|
|
342
343
|
|
|
343
344
|
iotAgentLib.getDevice('Light1', 'smartgondor', 'electricity', function (error, device) {
|
|
344
345
|
iotAgentLib.subscribe(device, ['dimming'], null, function (error) {
|
|
@@ -27,9 +27,10 @@
|
|
|
27
27
|
|
|
28
28
|
const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
|
|
29
29
|
const utils = require('../../../tools/utils');
|
|
30
|
+
const request = utils.request;
|
|
30
31
|
const should = require('should');
|
|
31
32
|
const nock = require('nock');
|
|
32
|
-
|
|
33
|
+
|
|
33
34
|
const logger = require('logops');
|
|
34
35
|
const async = require('async');
|
|
35
36
|
const iotAgentConfig = {
|
|
@@ -192,12 +193,12 @@ describe('NGSI-v2 - Device Service: utils', function () {
|
|
|
192
193
|
.post('/v2/entities?options=upsert')
|
|
193
194
|
.reply(204);
|
|
194
195
|
|
|
195
|
-
async.series(
|
|
196
|
-
|
|
197
|
-
results
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
196
|
+
async.series(
|
|
197
|
+
[utils.request.bind(utils.request, groupCreation), utils.request.bind(utils.request, deviceCreation)],
|
|
198
|
+
function (error, results) {
|
|
199
|
+
done();
|
|
200
|
+
}
|
|
201
|
+
);
|
|
201
202
|
});
|
|
202
203
|
|
|
203
204
|
it('should return the existing device', function (done) {
|
|
@@ -222,7 +223,7 @@ describe('NGSI-v2 - Device Service: utils', function () {
|
|
|
222
223
|
.post('/v2/entities?options=upsert')
|
|
223
224
|
.reply(204);
|
|
224
225
|
|
|
225
|
-
async.series([request.bind(request, groupCreation)], function (error, results) {
|
|
226
|
+
async.series([utils.request.bind(utils.request, groupCreation)], function (error, results) {
|
|
226
227
|
done();
|
|
227
228
|
});
|
|
228
229
|
});
|
|
@@ -27,9 +27,10 @@
|
|
|
27
27
|
/* eslint-disable no-unused-vars */
|
|
28
28
|
|
|
29
29
|
const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
const nock = require('nock');
|
|
32
32
|
const utils = require('../../../tools/utils');
|
|
33
|
+
const request = utils.request;
|
|
33
34
|
const groupRegistryMemory = require('../../../../lib/services/groups/groupRegistryMemory');
|
|
34
35
|
const should = require('should');
|
|
35
36
|
const iotAgentConfig = {
|
|
@@ -24,9 +24,10 @@
|
|
|
24
24
|
/* eslint-disable no-unused-vars */
|
|
25
25
|
|
|
26
26
|
const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
const nock = require('nock');
|
|
29
29
|
const utils = require('../../../tools/utils');
|
|
30
|
+
const request = utils.request;
|
|
30
31
|
const groupRegistryMemory = require('../../../../lib/services/groups/groupRegistryMemory');
|
|
31
32
|
const should = require('should');
|
|
32
33
|
const iotAgentConfig = {
|
|
@@ -30,6 +30,7 @@ const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
|
|
|
30
30
|
const should = require('should');
|
|
31
31
|
const nock = require('nock');
|
|
32
32
|
const utils = require('../../../tools/utils');
|
|
33
|
+
const request = utils.request;
|
|
33
34
|
const config = require('../../../../lib/commonConfig');
|
|
34
35
|
const iotAgentConfig = {
|
|
35
36
|
logLevel: 'FATAL',
|
|
@@ -26,11 +26,13 @@
|
|
|
26
26
|
/* eslint-disable no-unused-vars */
|
|
27
27
|
|
|
28
28
|
const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
|
|
29
|
+
const utils = require('../../../tools/utils');
|
|
30
|
+
const request = utils.request;
|
|
29
31
|
const should = require('should');
|
|
30
32
|
const logger = require('logops');
|
|
31
33
|
const nock = require('nock');
|
|
32
34
|
const mongoUtils = require('../../mongodb/mongoDBUtils');
|
|
33
|
-
|
|
35
|
+
|
|
34
36
|
let contextBrokerMock;
|
|
35
37
|
const iotAgentConfig = {
|
|
36
38
|
logLevel: 'FATAL',
|
|
@@ -27,11 +27,12 @@
|
|
|
27
27
|
|
|
28
28
|
const iotAgentLib = require('../../../../lib/fiware-iotagent-lib');
|
|
29
29
|
const utils = require('../../../tools/utils');
|
|
30
|
+
const request = utils.request;
|
|
30
31
|
const should = require('should');
|
|
31
32
|
const logger = require('logops');
|
|
32
33
|
const nock = require('nock');
|
|
33
34
|
const mongoUtils = require('../../mongodb/mongoDBUtils');
|
|
34
|
-
|
|
35
|
+
|
|
35
36
|
const timekeeper = require('timekeeper');
|
|
36
37
|
let contextBrokerMock;
|
|
37
38
|
let statusAttributeMock;
|