prisme-flow
Version:
prisme platform flow engine
593 lines (567 loc) • 20.4 kB
JavaScript
var expect = require('chai').expect;
var utils = require('./utils');
var baServices = require('../../lib/bacnet-services');
describe('bacstack - Services layer', function() {
describe('Iam', function() {
it('should successfully encode and decode', function() {
var buffer = utils.getBuffer();
baServices.encodeIamBroadcast(buffer, 47, 1, 1, 7);
var result = baServices.decodeIamBroadcast(buffer.buffer, 0);
delete result.len;
expect(result).to.deep.equal({
deviceId: 47,
maxApdu: 1,
segmentation: 1,
vendorId: 7
});
});
});
describe('WhoHas', function() {
it('should successfully encode and decode by id', function() {
var buffer = utils.getBuffer();
baServices.EncodeWhoHasBroadcast(buffer, 3, 4000, {type: 3, instance: 15});
var result = baServices.DecodeWhoHasBroadcast(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
lowLimit: 3,
highLimit: 4000,
objId: {
type: 3,
instance: 15
}
});
});
it('should successfully encode and decode by name', function() {
var buffer = utils.getBuffer();
baServices.EncodeWhoHasBroadcast(buffer, 3, 4000, {}, 'analog-output-1');
var result = baServices.DecodeWhoHasBroadcast(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
lowLimit: 3,
highLimit: 4000,
objName: 'analog-output-1'
});
});
});
describe('WhoIs', function() {
it('should successfully encode and decode', function() {
var buffer = utils.getBuffer();
baServices.EncodeWhoIsBroadcast(buffer, 1, 3000);
var result = baServices.DecodeWhoIsBroadcast(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
lowLimit: 1,
highLimit: 3000
});
});
});
describe('ReadPropertyAcknowledge', function() {
it('should successfully encode and decode a boolean value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 1, Value: true},
{Tag: 1, Value: false}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 1, value: true, len: 1},
{type: 1, value: false, len: 1}
]
});
});
it('should successfully encode and decode an unsigned value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 2, Value: 1},
{Tag: 2, Value: 1000},
{Tag: 2, Value: 1000000},
{Tag: 2, Value: 1000000000}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 2, value: 1, len: 2},
{type: 2, value: 1000, len: 3},
{type: 2, value: 1000000, len: 4},
{type: 2, value: 1000000000, len: 5}
]
});
});
it('should successfully encode and decode a signed value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 3, Value: -1},
{Tag: 3, Value: -1000},
{Tag: 3, Value: -1000000},
{Tag: 3, Value: -1000000000}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 3, value: -1, len: 2},
{type: 3, value: -1000, len: 3},
{type: 3, value: -1000000, len: 4},
{type: 3, value: -1000000000, len: 5}
]
});
});
it('should successfully encode and decode an real value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 4, Value: 0},
{Tag: 4, Value: 0.1}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(Math.floor(0.1 * 10000)).to.equal(Math.floor(result.valueList[1].value * 10000));
result.valueList[1].value = 0;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 4, value: 0, len: 5},
{type: 4, value: 0, len: 5}
]
});
});
it('should successfully encode and decode a double value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 5, Value: 0},
{Tag: 5, Value: 100.121212}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 5, value: 0, len: 10},
{type: 5, value: 100.121212, len: 10}
]
});
});
it('should successfully encode and decode an octet-string value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 6, Value: []},
{Tag: 6, Value: [1, 2, 100, 200]}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 6, value: [], len: 1},
{type: 6, value: [1, 2, 100, 200], len: 5}
]
});
});
it('should successfully encode and decode a character-string value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 7, Value: ''},
{Tag: 7, Value: 'Test1234$'}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 7, value: '', len: 2},
{type: 7, value: 'Test1234$', len: 12}
]
});
});
it('should successfully encode and decode a bit-string value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 8, Value: {bits_used: 0, value: []}},
{Tag: 8, Value: {bits_used: 24, value: [0xAA, 0xAA, 0xAA]}}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 8, value: {bits_used: 0, value: []}, len: 2},
{type: 8, value: {bits_used: 24, value: [0xAA, 0xAA, 0xAA]}, len: 5}
]
});
});
it('should successfully encode and decode a enumeration value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 9, Value: 0},
{Tag: 9, Value: 4}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 9, value: 0, len: 2},
{type: 9, value: 4, len: 2}
]
});
});
it('should successfully encode and decode a date value', function() {
var buffer = utils.getBuffer();
var date = new Date(1, 1, 1);
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 10, Value: date}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 10, value: date, len: 5}
]
});
});
it('should successfully encode and decode a time value', function() {
var buffer = utils.getBuffer();
var time = new Date(1, 1, 1);
time.setMilliseconds(990);
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 11, Value: time}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 11, value: time, len: 5}
]
});
});
it('should successfully encode and decode a object-identifier value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
{Tag: 12, Value: {type: 3, instance: 0}},
{Tag: 12, Value: {type: 3, instance: 50000}},
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 8,
instance: 40000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 81
},
valueList: [
{type: 12, value: {type: 3, instance: 0}, len: 5},
{type: 12, value: {type: 3, instance: 50000}, len: 5}
]
});
});
it('should successfully encode and decode a cov-subscription value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 222, instance: 3}, 152, 0xFFFFFFFF, [
{Tag: 111, Value: {
Recipient: {net: 12, adr: [0, 1]},
subscriptionProcessIdentifier: 3,
monitoredObjectIdentifier: {type: 2, instance: 1},
monitoredProperty: {propertyIdentifier: 85, propertyArrayIndex: 0},
IssueConfirmedNotifications: false,
TimeRemaining: 5,
COVIncrement: 1
}},
{Tag: 111, Value: {
Recipient: {net: 0xFFFF, adr: []},
subscriptionProcessIdentifier: 3,
monitoredObjectIdentifier: {type: 2, instance: 1},
monitoredProperty: {propertyIdentifier: 85, propertyArrayIndex: 5},
IssueConfirmedNotifications: true,
TimeRemaining: 5
}}
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 222,
instance: 3
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 152
},
valueList: [
{type: 111, value: {
recipient: {net: 12, adr: [0, 1]},
subscriptionProcessIdentifier: 3,
monitoredObjectIdentifier: {type: 2, instance: 1},
monitoredProperty: {propertyIdentifier: 85, propertyArrayIndex: 0},
issueConfirmedNotifications: false,
timeRemaining: 5,
covIncrement: 1
}, len: 33},
{type: 111, value: {
recipient: {net: 0xFFFF, adr: []},
subscriptionProcessIdentifier: 3,
monitoredObjectIdentifier: {type: 2, instance: 1},
monitoredProperty: {propertyIdentifier: 85, propertyArrayIndex: 5},
issueConfirmedNotifications: true,
timeRemaining: 5,
}, len: 27}
]
});
});
it('should successfully encode and decode a read-access-specification value', function() {
var buffer = utils.getBuffer();
baServices.EncodeReadPropertyAcknowledge(buffer, {type: 223, instance: 90000}, 53, 0xFFFFFFFF, [
{Tag: 115, Value: {objectIdentifier: {type: 3, instance: 0}, propertyReferences: []}},
{Tag: 115, Value: {objectIdentifier: {type: 3, instance: 50000}, propertyReferences: [
{propertyIdentifier: 85},
{propertyIdentifier: 1, propertyArrayIndex: 2}
]}},
]);
var result = baServices.DecodeReadPropertyAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
objectId: {
type: 223,
instance: 90000
},
property: {
propertyArrayIndex: 0xFFFFFFFF,
propertyIdentifier: 53
},
valueList: [
{type: 115, value: {objectIdentifier: {type: 3, instance: 0}, propertyReferences: []}, len: 7},
{type: 115, value: {objectIdentifier: {type: 3, instance: 50000}, propertyReferences: [
{propertyIdentifier: 85, propertyArrayIndex: 0xFFFFFFFF},
{propertyIdentifier: 1, propertyArrayIndex: 2}
]}, len: 13}
]
});
});
});
describe('ReadPropertyMultipleAcknowledge', function() {
it('should successfully encode and decode', function() {
var buffer = utils.getBuffer();
var date = new Date(1, 1, 1);
var time = new Date(1, 1, 1);
time.setMilliseconds(990);
baServices.EncodeReadPropertyMultipleAcknowledge(buffer, [
{objectIdentifier: {type: 9, instance: 50000}, values: [
{property: {propertyIdentifier: 81, propertyArrayIndex: 0xFFFFFFFF}, value: [
{Tag: 1, Value: true},
{Tag: 1, Value: false},
{Tag: 2, Value: 1},
{Tag: 2, Value: 1000},
{Tag: 2, Value: 1000000},
{Tag: 2, Value: 1000000000},
{Tag: 3, Value: -1},
{Tag: 3, Value: -1000},
{Tag: 3, Value: -1000000},
{Tag: 3, Value: -1000000000},
{Tag: 4, Value: 0.1},
{Tag: 5, Value: 100.121212},
// FIXME: correct octet-string implementation
// {Tag: 6, Value: [1, 2, 100, 200]},
{Tag: 7, Value: 'Test1234$'},
// FIXME: correct bit-string implementation
// {Tag: 8, Value: {bits_used: 0, value: []}},
// {Tag: 8, Value: {bits_used: 24, value: [0xAA, 0xAA, 0xAA]}},
{Tag: 9, Value: 4},
{Tag: 10, Value: date},
{Tag: 11, Value: time},
{Tag: 12, Value: {type: 3, instance: 0}}
]}
]}
]);
var result = baServices.DecodeReadPropertyMultipleAcknowledge(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(Math.floor(0.1 * 10000)).to.equal(Math.floor(result.values[0].values[0].value[10].value * 10000));
result.values[0].values[0].value[10].value = 0;
expect(result).to.deep.equal({
values: [{
objectIdentifier: {
type: 9,
instance: 50000
},
values: [{
propertyArrayIndex: 4294967295,
propertyIdentifier: 81,
value: [
{type: 1, value: true},
{type: 1, value: false},
{type: 2, value: 1},
{type: 2, value: 1000},
{type: 2, value: 1000000},
{type: 2, value: 1000000000},
{type: 3, value: -1},
{type: 3, value: -1000},
{type: 3, value: -1000000},
{type: 3, value: -1000000000},
{type: 4, value: 0},
{type: 5, value: 100.121212},
{type: 7, value: 'Test1234$'},
{type: 9, value: 4},
{type: 10, value: date},
{type: 11, value: time},
{type: 12, value: {type: 3, instance: 0}}
]
}]
}]
});
});
});
describe('DeviceCommunicationControl', function() {
it('should successfully encode and decode', function() {
var buffer = utils.getBuffer();
baServices.EncodeDeviceCommunicationControl(buffer, 30, 1);
var result = baServices.DecodeDeviceCommunicationControl(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
timeDuration: 30,
enableDisable: 1
});
});
it('should successfully encode and decode with password', function() {
var buffer = utils.getBuffer();
baServices.EncodeDeviceCommunicationControl(buffer, 30, 1, 'Test1234!');
var result = baServices.DecodeDeviceCommunicationControl(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
timeDuration: 30,
enableDisable: 1,
password: 'Test1234!'
});
});
});
describe('ReinitializeDevice', function() {
it('should successfully encode and decode', function() {
var buffer = utils.getBuffer();
baServices.EncodeReinitializeDevice(buffer, 5);
var result = baServices.DecodeReinitializeDevice(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
state: 5
});
});
it('should successfully encode and decode with password', function() {
var buffer = utils.getBuffer();
baServices.EncodeReinitializeDevice(buffer, 5, 'Test1234$');
var result = baServices.DecodeReinitializeDevice(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
state: 5,
password: 'Test1234$'
});
});
});
describe('TimeSync', function() {
it('should successfully encode and decode', function() {
var buffer = utils.getBuffer();
var date = new Date();
date.setMilliseconds(990);
baServices.EncodeTimeSync(buffer, date);
var result = baServices.DecodeTimeSync(buffer.buffer, 0, buffer.offset);
delete result.len;
expect(result).to.deep.equal({
value: date,
});
});
});
describe('Error', function() {
it('should successfully encode and decode', function() {
var buffer = utils.getBuffer();
baServices.EncodeError(buffer, 15, 25);
var result = baServices.DecodeError(buffer.buffer, 0);
delete result.len;
expect(result).to.deep.equal({
class: 15,
code: 25
});
});
});
});