From: Arkadiusz Pietraszek Date: Fri, 24 Apr 2020 13:38:11 +0000 (+0200) Subject: [6.0][Bluetooth] Representation of binary data unification X-Git-Tag: submit/tizen/20200715.055037~3^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c82950fac6619ab44151c9fc555d7bb17fd2a3c1;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [6.0][Bluetooth] Representation of binary data unification Currently binary data is passed to functions and received in return as different types. This API change has been designed to unify binary data handling across Bluetooth module. Adding type: typedef (byte[] or DOMString or Uint8Array) Bytes; Adding functions: byte[] toByteArray(Bytes); DOMString toDOMString(Bytes); Uint8Array toUint8Array(Bytes); Changing functions signatures: BluetoothLEServiceData(DOMString uuid, Bytes data); BluetoothLEManufacturerData(DOMString uuid, Bytes data); void BluetoothGATTCharacteristic::writeValue (Bytes value, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback); void BluetoothGATTDescriptor::writeValue (Bytes value, optional SuccessCallback? successCallback, optional ErrorCallback? errorCallback); unsigned long BluetoothSocket::writeData(Bytes); [ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-259 [Verification] Automatic bluetooth tct pass rate 100% Unit tests for new functions added Change-Id: I31e436149ecab6c4b7223ba493d13638cd707851 Signed-off-by: Arkadiusz Pietraszek --- diff --git a/src/bluetooth/bluetooth_api.js b/src/bluetooth/bluetooth_api.js index 64428fc0..6e55fadf 100755 --- a/src/bluetooth/bluetooth_api.js +++ b/src/bluetooth/bluetooth_api.js @@ -172,7 +172,12 @@ tizen.BluetoothLEServiceData = function(d) { return data_; }, set: function(v) { - data_ = Converter.toString(v); + try { + data_ = BluetoothManager_toDOMString(v); + } + catch (err) { + data_ = Converter.toString(v); + } } } }); @@ -392,7 +397,11 @@ tizen.BluetoothLEManufacturerData = function(d) { return data_; }, set: function(v) { - data_ = Converter.toString(v); + try { + data_ = BluetoothManager_toDOMString(v); + } catch (err) { + data_ = Converter.toString(v); + } } } }); @@ -530,20 +539,14 @@ var BluetoothSocket = function(data) { _bluetoothSocketListeners.addListener(this); }; -BluetoothSocket.prototype.writeData = function() { +BluetoothSocket.prototype.writeData = function(data) { privUtils_.log('Entered BluetoothSocket.writeData()'); - var args = AV.validateArgs(arguments, [ - { - name: 'data', - type: AV.Types.ARRAY, - values: AV.Types.BYTE - } - ]); + var byteData = BluetoothManager_toByteArray(data); var callArgs = { id: this._id, - data: args.data + data: byteData }; var result = native.callSync('BluetoothSocketWriteData', callArgs); @@ -1659,7 +1662,7 @@ var BluetoothGATTService = function(data, address) { }); }; -var toByteArray = function(array) { +var numberArrayToByteArray = function(array) { var d = []; array.forEach(function(b) { @@ -1780,7 +1783,7 @@ var BluetoothGATTCharacteristic = function(data, address) { if (native.isFailure(result)) { native.callIfPossible(args.errorCallback, native.getErrorObject(result)); } else { - var d = toByteArray(native.getResultObject(result)); + var d = numberArrayToByteArray(native.getResultObject(result)); args.successCallback(d); } }; @@ -1794,14 +1797,9 @@ var BluetoothGATTCharacteristic = function(data, address) { } }; - this.writeValue = function() { + this.writeValue = function(value, successCallback, errorCallback) { privUtils_.log('Entered BluetoothGATTCharacteristic.writeValue()'); - var args = AV.validateArgs(arguments, [ - { - name: 'value', - type: AV.Types.ARRAY, - values: AV.Types.BYTE - }, + var args = AV.validateArgs([successCallback, errorCallback], [ { name: 'successCallback', type: AV.Types.FUNCTION, @@ -1826,7 +1824,7 @@ var BluetoothGATTCharacteristic = function(data, address) { var callArgs = { handle: handle_, - value: toByteArray(args.value), + value: BluetoothManager_toByteArray(value), address: address_ }; @@ -1855,7 +1853,7 @@ var BluetoothGATTCharacteristic = function(data, address) { var callback = function(event) { if (event.handle === handle_) { - args.callback(toByteArray(native.getResultObject(event))); + args.callback(numberArrayToByteArray(native.getResultObject(event))); } }; @@ -2027,7 +2025,7 @@ var BluetoothGATTDescriptor = function(data, address) { if (native.isFailure(result)) { native.callIfPossible(args.errorCallback, native.getErrorObject(result)); } else { - var d = toByteArray(native.getResultObject(result)); + var d = numberArrayToByteArray(native.getResultObject(result)); args.successCallback(d); } }; @@ -2041,14 +2039,9 @@ var BluetoothGATTDescriptor = function(data, address) { } }; - this.writeValue = function() { + this.writeValue = function(value, successCallback, errorCallback) { privUtils_.log('Entered BluetoothGATTDescriptor.writeValue()'); - var args = AV.validateArgs(arguments, [ - { - name: 'value', - type: AV.Types.ARRAY, - values: AV.Types.BYTE - }, + var args = AV.validateArgs([successCallback, errorCallback], [ { name: 'successCallback', type: AV.Types.FUNCTION, @@ -2073,7 +2066,7 @@ var BluetoothGATTDescriptor = function(data, address) { var callArgs = { handle: handle_, - value: toByteArray(args.value), + value: BluetoothManager_toByteArray(value), address: address_ }; @@ -2778,6 +2771,97 @@ BluetoothManager.prototype.getLEAdapter = function() { return BluetoothManager_getLEAdapter(); }; +var BluetoothManager_checkAndNormalizeHexString = function(hexString) { + hexString = hexString.toLowerCase(); + if (hexString.startsWith('0x')) { + hexString = hexString.substring(2); + } + if (!(/^[0-9a-f]+$/.test(hexString))) { + throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Given string is not hexadecimal value'); + } + if ('0' === hexString) { + return '00'; + } + if (1 === hexString.length%2) { + // to save consistency with BluetoothLEManufacturerData, last character is omitted + hexString = hexString.replace(/.$/,''); + } + return hexString; +} + +var BluetoothManager_HexStringToUint8Array = function(hexString) { + hexString = BluetoothManager_checkAndNormalizeHexString(hexString); + if (0 === hexString.length) { + return new Uint8Array([]); + } + var data = hexString.match(/[0-9a-f]{2}/g).map(function(byte) {return parseInt(byte, 16)}); + return new Uint8Array(data); +} + +var BluetoothManager_byteArrayToHexString = function(bytes) { + if (0 == bytes.length) { + return ''; + } + return '0x' + Array.prototype.map.call(bytes, function(byte) { + return ('0' + (byte & 0xFF).toString(16)).slice(-2); + }).join(''); +} + +var BluetoothManager_toByteArray = function(data) { + if (String === data.constructor) { + return numberArrayToByteArray(BluetoothManager_HexStringToUint8Array(data)); + } else { + try { + data = numberArrayToByteArray(data); + } + catch(err) { + throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'argument is not a valid Bytes type'); + } + } + return data; +}; + +BluetoothManager.prototype.toByteArray = function(data) { + privUtils_.log('Entered BluetoothManager.toByteArray()'); + return BluetoothManager_toByteArray(data); +}; + +var BluetoothManager_toDOMString = function(data) { + if (String === data.constructor) { + data = BluetoothManager_checkAndNormalizeHexString(data); + if (0 !== data.length) { + data = '0x' + data; + } + return data; + } else { + return BluetoothManager_byteArrayToHexString(numberArrayToByteArray(data)); + } +}; + +BluetoothManager.prototype.toDOMString = function(data) { + privUtils_.log('Entered BluetoothManager.toDOMString()'); + return BluetoothManager_toDOMString(data); +}; + +var BluetoothManager_toUint8Array = function(data) { + if (String === data.constructor) { + return BluetoothManager_HexStringToUint8Array(data); + } else { + try { + data = new Uint8Array(numberArrayToByteArray(data)); + } + catch(err) { + throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'argument is not a valid Bytes type'); + } + } + return data; +}; + +BluetoothManager.prototype.toUint8Array = function(data) { + privUtils_.log('Entered BluetoothManager.toUint8Array()'); + return BluetoothManager_toUint8Array(data); +}; + var BluetoothManager_UUIDIsValid128Bit = function(uuid) { var re128BitFormat = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; if (re128BitFormat.test(uuid)) { diff --git a/src/bluetooth/js/ut/test_toByteArray.js b/src/bluetooth/js/ut/test_toByteArray.js new file mode 100644 index 00000000..d5964243 --- /dev/null +++ b/src/bluetooth/js/ut/test_toByteArray.js @@ -0,0 +1,216 @@ +mocha.setup('bdd'); + +describe('toByteArray', function() { + ///////// argument of type String + // expected behaviour + it('should return [10], after getting "0a" argument', function(done) { + var StringArgument = "0a"; + var expected = [10]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [12], after getting "0C" argument', function(done) { + var StringArgument = "0C"; + var expected = [12]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [11], after getting "0b" argument', function(done) { + var StringArgument = "0b"; + var expected = [11]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [13], after getting "0D" argument', function(done) { + var StringArgument = "0D"; + var expected = [13]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [14], after getting "0E" argument', function(done) { + var StringArgument = "0E"; + var expected = [14]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [15, 10, 188, 222], after getting "0F0abCDE" argument', function(done) { + var StringArgument = "0F0abCDE"; + var expected = [15, 10, 188, 222]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [10], after getting "0x0a" argument', function(done) { + var StringArgument = "0x0a"; + var expected = [10]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [12], after getting "0X0C" argument', function(done) { + var StringArgument = "0X0C"; + var expected = [12]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [11], after getting "0x0b" argument', function(done) { + var StringArgument = "0x0b"; + var expected = [11]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [13], after getting "0X0D" argument', function(done) { + var StringArgument = "0x0D"; + var expected = [13]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [14], after getting "0x0E" argument', function(done) { + var StringArgument = "0X0E"; + var expected = [14]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [15, 10, 188, 222], after getting "0X0F0abCDE" argument', function(done) { + var StringArgument = "0x0F0abCDE"; + var expected = [15, 10, 188, 222]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + + // ignoring last character in string with odd length + it('should return [0], after getting "0" argument', function(done) { + var StringArgument = "0"; + var expected = [0]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [1], after getting "012" argument', function(done) { + var StringArgument = "012"; + var expected = [1]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [1, 35], after getting "01234" argument', function(done) { + var StringArgument = "01234"; + var expected = [1, 35]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [1, 35, 69], after getting "0123456" argument', function(done) { + var StringArgument = "0123456"; + var expected = [1, 35, 69]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [1, 35, 69, 103], after getting "01234567f" argument', function(done) { + var StringArgument = "01234567f"; + var expected = [1, 35, 69, 103]; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + it('should return [], after getting "1" argument', function(done) { + var StringArgument = "1"; + var expected = []; + chai.expect(tizen.bluetooth.toByteArray(StringArgument)).to.eql(expected); + done(); + }); + + // Exceptions with DOMString input + it('should throw TypeMismatchError if argument is not of a valid Byte type: "NotAValidByte"', function(done) { + try { + tizen.bluetooth.toByteArray('NotAValidByte'); + done(new Error('Expected TypeMismatchError.')); + } catch (error) { + chai.expect(error.name).to.equal('TypeMismatchError'); + done(); + } + }); + it('should throw TypeMismatchError if argument is not of a valid Byte type: "0x0x1234"', function(done) { + try { + tizen.bluetooth.toByteArray('0x0x1234'); + done(new Error('Expected TypeMismatchError.')); + } catch (error) { + chai.expect(error.name).to.equal('TypeMismatchError'); + done(); + } + }); + + ///////// argument of type byte[] + // expected behaviour + it('should return [1], after getting [1] argument', function(done) { + var ByteArgument = [1]; + var expected = [1]; + chai.expect(tizen.bluetooth.toByteArray(ByteArgument)).to.eql(expected); + done(); + }); + it('should return [12], after getting [12] argument', function(done) { + var ByteArgument = [12]; + var expected = [12]; + chai.expect(tizen.bluetooth.toByteArray(ByteArgument)).to.eql(expected); + done(); + }); + it('should return [15, 10, 188, 222], after getting [15, 10, 188, 222] argument', function(done) { + var ByteArgument = [15, 10, 188, 222]; + var expected = [15, 10, 188, 222]; + chai.expect(tizen.bluetooth.toByteArray(ByteArgument)).to.eql(expected); + done(); + }); + it('should return [241, 246, 138], after getting [-15, -10, -118] argument', function(done) { + var ByteArgument = [-15, -10, -118]; + var expected = [241, 246, 138]; + chai.expect(tizen.bluetooth.toByteArray(ByteArgument)).to.eql(expected); + done(); + }); + it('should return [36, 242, 86, 15], after getting [-1500, 1010, -2218, 9999] argument', function(done) { + var ByteArgument = [-1500, 1010, -2218, 9999]; + var expected = [36, 242, 86, 15]; + chai.expect(tizen.bluetooth.toByteArray(ByteArgument)).to.eql(expected); + done(); + }); + it('should return [], after getting [] argument', function(done) { + var ByteArgument = []; + var expected = []; + chai.expect(tizen.bluetooth.toByteArray(ByteArgument)).to.eql(expected); + done(); + }); + + ///////// argument of type Uint8Array + // expected behaviour + it('should return [1], after getting Uint8Array[1] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([1]); + var expected = [1]; + chai.expect(tizen.bluetooth.toByteArray(Uint8ArrayArgument)).to.eql(expected); + done(); + }); + it('should return [12], after getting Uint8Array[12] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([12]); + var expected = [12]; + chai.expect(tizen.bluetooth.toByteArray(Uint8ArrayArgument)).to.eql(expected); + done(); + }); + it('should return [15, 10, 188, 222], after getting Uint8Array[15, 10, 188, 222] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([15, 10, 188, 222]); + var expected = [15, 10, 188, 222]; + chai.expect(tizen.bluetooth.toByteArray(Uint8ArrayArgument)).to.eql(expected); + done(); + }); + it('should return [], after getting Uint8Array([]) argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([]); + var expected = []; + chai.expect(tizen.bluetooth.toByteArray(Uint8ArrayArgument)).to.eql(expected); + done(); + }); +}); + +mocha.checkLeaks(); +mocha + .run() + .on('pass', function(test) { + console.log(test.title + ' OK'); + }) + .on('fail', function(test, err) { + console.error(test.title + ' FAILED'); + console.error(err); + }) + .on('end', function() { + console.log('All done'); + }); diff --git a/src/bluetooth/js/ut/test_toDOMString.js b/src/bluetooth/js/ut/test_toDOMString.js new file mode 100644 index 00000000..f098e477 --- /dev/null +++ b/src/bluetooth/js/ut/test_toDOMString.js @@ -0,0 +1,216 @@ +mocha.setup('bdd'); + +describe('toByteArray', function() { + ///////// argument of type String + // expected behaviour + it('should return "0x0a", after getting "0a" argument', function(done) { + var StringArgument = '0a'; + var expected = '0x0a'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0c", after getting "0C" argument', function(done) { + var StringArgument = '0C'; + var expected = '0x0c'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0b", after getting "0b" argument', function(done) { + var StringArgument = '0b'; + var expected = '0x0b'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0d", after getting "0D" argument', function(done) { + var StringArgument = '0D'; + var expected = '0x0d'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0e", after getting "0E" argument', function(done) { + var StringArgument = '0E'; + var expected = '0x0e'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0f0abcde", after getting "0F0abCDE" argument', function(done) { + var StringArgument = '0F0abCDE'; + var expected = '0x0f0abcde'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0a", after getting "0x0a" argument', function(done) { + var StringArgument = '0x0a'; + var expected = '0x0a'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0c", after getting "0X0C" argument', function(done) { + var StringArgument = '0X0C'; + var expected = '0x0c'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0b", after getting "0x0b" argument', function(done) { + var StringArgument = '0x0b'; + var expected = '0x0b'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0d", after getting "0X0D" argument', function(done) { + var StringArgument = '0x0D'; + var expected = '0x0d'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0e", after getting "0x0E" argument', function(done) { + var StringArgument = '0X0E'; + var expected = '0x0e'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0x0f0abcde", after getting "0X0F0abCDE" argument', function(done) { + var StringArgument = '0x0F0abCDE'; + var expected = '0x0f0abcde'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + + // ignoring last character in string with odd length + it('should return "0x00", after getting "0" argument', function(done) { + var StringArgument = '0'; + var expected = '0x00'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "01", after getting "012" argument', function(done) { + var StringArgument = '012'; + var expected = '0x01'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "0123", after getting "01234" argument', function(done) { + var StringArgument = '01234'; + var expected = '0x0123'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "012345", after getting "0123456" argument', function(done) { + var StringArgument = '0123456'; + var expected = '0x012345'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "01234567", after getting "01234567f" argument', function(done) { + var StringArgument = '01234567f'; + var expected = '0x01234567'; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + it('should return "", after getting "1" argument', function(done) { + var StringArgument = '1'; + var expected = ''; + chai.expect(tizen.bluetooth.toDOMString(StringArgument)).to.equal(expected); + done(); + }); + + // Exceptions with DOMString input + it('should throw TypeMismatchError if argument is not of a valid Byte type: "NotAValidByte"', function(done) { + try { + tizen.bluetooth.toDOMString('NotAValidByte'); + done(new Error('Expected TypeMismatchError.')); + } catch (error) { + chai.expect(error.name).to.equal('TypeMismatchError'); + done(); + } + }); + it('should throw TypeMismatchError if argument is not of a valid Byte type: "0x0x1234"', function(done) { + try { + tizen.bluetooth.toDOMString('0x0x1234'); + done(new Error('Expected TypeMismatchError.')); + } catch (error) { + chai.expect(error.name).to.equal('TypeMismatchError'); + done(); + } + }); + + ///////// argument of type byte[] + // expected behaviour + it('should return "0x01", after getting [1] argument', function(done) { + var ByteArgument = [1]; + var expected = '0x01'; + chai.expect(tizen.bluetooth.toDOMString(ByteArgument)).to.equal(expected); + done(); + }); + it('should return "0x0c", after getting [12] argument', function(done) { + var ByteArgument = [12]; + var expected = '0x0c'; + chai.expect(tizen.bluetooth.toDOMString(ByteArgument)).to.equal(expected); + done(); + }); + it('should return "0x0f0abcde", after getting [15, 10, 188, 222] argument', function(done) { + var ByteArgument = [15, 10, 188, 222]; + var expected = '0x0f0abcde'; + chai.expect(tizen.bluetooth.toDOMString(ByteArgument)).to.equal(expected); + done(); + }); + it('should return "0xf1f68a", after getting [-15, -10, -118] argument', function(done) { + var ByteArgument = [-15, -10, -118]; + var expected = '0xf1f68a'; + chai.expect(tizen.bluetooth.toDOMString(ByteArgument)).to.equal(expected); + done(); + }); + it('should return "0x24F2560f", after getting [-1500, 1010, -2218, 9999] argument', function(done) { + var ByteArgument = [-1500, 1010, -2218, 9999]; + var expected = '0x24f2560f'; + chai.expect(tizen.bluetooth.toDOMString(ByteArgument)).to.equal(expected); + done(); + }); + it('should throw TypeMismatchError, after getting [] argument', function(done) { + var ByteArgument = []; + var expected = ''; + chai.expect(tizen.bluetooth.toDOMString(ByteArgument)).to.equal(expected); + done(); + }); + + ///////// argument of type Uint8Array + // expected behaviour + it('should return "0x01", after getting Uint8Array[1] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([1]); + var expected = '0x01'; + chai.expect(tizen.bluetooth.toDOMString(Uint8ArrayArgument)).to.equal(expected); + done(); + }); + it('should return "0x0c", after getting Uint8Array[12] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([12]); + var expected = '0x0c'; + chai.expect(tizen.bluetooth.toDOMString(Uint8ArrayArgument)).to.equal(expected); + done(); + }); + it('should return "0x0f0abcde", after getting Uint8Array[15, 10, 188, 222] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([15, 10, 188, 222]); + var expected = '0x0f0abcde'; + chai.expect(tizen.bluetooth.toDOMString(Uint8ArrayArgument)).to.equal(expected); + done(); + }); + it('should return "", after getting Uint8Array([]) argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([]); + var expected = ''; + chai.expect(tizen.bluetooth.toDOMString(Uint8ArrayArgument)).to.equal(expected); + done(); + }); +}); + +mocha.checkLeaks(); +mocha + .run() + .on('pass', function(test) { + console.log(test.title + ' OK'); + }) + .on('fail', function(test, err) { + console.error(test.title + ' FAILED'); + console.error(err); + }) + .on('end', function() { + console.log('All done'); + }); diff --git a/src/bluetooth/js/ut/test_toUint8Array.js b/src/bluetooth/js/ut/test_toUint8Array.js new file mode 100644 index 00000000..c4ea87c9 --- /dev/null +++ b/src/bluetooth/js/ut/test_toUint8Array.js @@ -0,0 +1,216 @@ +mocha.setup('bdd'); + +describe('toUint8Array', function() { + ///////// argument of type String + // expected behaviour + it('should return Uint8Array[10], after getting "0a" argument', function(done) { + var StringArgument = "0a"; + var expected = new Uint8Array([10]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[12], after getting "0C" argument', function(done) { + var StringArgument = "0C"; + var expected = new Uint8Array([12]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[11], after getting "0b" argument', function(done) { + var StringArgument = "0b"; + var expected = new Uint8Array([11]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[13], after getting "0D" argument', function(done) { + var StringArgument = "0D"; + var expected = new Uint8Array([13]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[14], after getting "0E" argument', function(done) { + var StringArgument = "0E"; + var expected = new Uint8Array([14]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[15, 10, 188, 222], after getting "0F0abCDE" argument', function(done) { + var StringArgument = "0F0abCDE"; + var expected = new Uint8Array([15, 10, 188, 222]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[10], after getting "0x0a" argument', function(done) { + var StringArgument = "0x0a"; + var expected = new Uint8Array([10]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[12], after getting "0X0C" argument', function(done) { + var StringArgument = "0X0C"; + var expected = new Uint8Array([12]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[11], after getting "0x0b" argument', function(done) { + var StringArgument = "0x0b"; + var expected = new Uint8Array([11]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[13], after getting "0X0D" argument', function(done) { + var StringArgument = "0x0D"; + var expected = new Uint8Array([13]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[14], after getting "0x0E" argument', function(done) { + var StringArgument = "0X0E"; + var expected = new Uint8Array([14]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[15, 10, 188, 222], after getting "0X0F0abCDE" argument', function(done) { + var StringArgument = "0x0F0abCDE"; + var expected = new Uint8Array([15, 10, 188, 222]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + + // ignoring last character in string with odd length + it('should return Uint8Array[0], after getting "0" argument', function(done) { + var StringArgument = "0"; + var expected = new Uint8Array([0]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[1], after getting "012" argument', function(done) { + var StringArgument = "012"; + var expected = new Uint8Array([1]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[1, 35], after getting "01234" argument', function(done) { + var StringArgument = "01234"; + var expected = new Uint8Array([1, 35]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[1, 35, 69], after getting "0123456" argument', function(done) { + var StringArgument = "0123456"; + var expected = new Uint8Array([1, 35, 69]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[1, 35, 69, 103], after getting "01234567f" argument', function(done) { + var StringArgument = "01234567f"; + var expected = new Uint8Array([1, 35, 69, 103]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[], after getting "1" argument', function(done) { + var StringArgument = "1"; + var expected = new Uint8Array([]); + chai.expect(tizen.bluetooth.toUint8Array(StringArgument)).to.eql(expected); + done(); + }); + + // Exceptions with DOMString input + it('should throw TypeMismatchError if argument is not of a valid Byte type: "NotAValidByte"', function(done) { + try { + tizen.bluetooth.toUint8Array('NotAValidByte'); + done(new Error('Expected TypeMismatchError.')); + } catch (error) { + chai.expect(error.name).to.equal('TypeMismatchError'); + done(); + } + }); + it('should throw TypeMismatchError if argument is not of a valid Byte type: "0x0x1234"', function(done) { + try { + tizen.bluetooth.toUint8Array('0x0x1234'); + done(new Error('Expected TypeMismatchError.')); + } catch (error) { + chai.expect(error.name).to.equal('TypeMismatchError'); + done(); + } + }); + + ///////// argument of type byte[] + // expected behaviour + it('should return Uint8Array[1], after getting [1] argument', function(done) { + var ByteArgument = [1]; + var expected = new Uint8Array([1]); + chai.expect(tizen.bluetooth.toUint8Array(ByteArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[12], after getting [12] argument', function(done) { + var ByteArgument = [12]; + var expected = new Uint8Array([12]); + chai.expect(tizen.bluetooth.toUint8Array(ByteArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[15, 10, 188, 222], after getting [15, 10, 188, 222] argument', function(done) { + var ByteArgument = [15, 10, 188, 222]; + var expected = new Uint8Array([15, 10, 188, 222]); + chai.expect(tizen.bluetooth.toUint8Array(ByteArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[241, 246, 138], after getting [-15, -10, -118] argument', function(done) { + var ByteArgument = [-15, -10, -118]; + var expected = new Uint8Array([241, 246, 138]); + chai.expect(tizen.bluetooth.toUint8Array(ByteArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[36, 242, 86, 15], after getting [-1500, 1010, -2218, 9999] argument', function(done) { + var ByteArgument = [-1500, 1010, -2218, 9999]; + var expected = new Uint8Array([36, 242, 86, 15]); + chai.expect(tizen.bluetooth.toUint8Array(ByteArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[], after getting [] argument', function(done) { + var ByteArgument = []; + var expected = new Uint8Array([]); + chai.expect(tizen.bluetooth.toUint8Array(ByteArgument)).to.eql(expected); + done(); + }); + + ///////// argument of type Uint8Array + // expected behaviour + it('should return Uint8Array[1], after getting Uint8Array[1] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([1]); + var expected = new Uint8Array([1]); + chai.expect(tizen.bluetooth.toUint8Array(Uint8ArrayArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[12], after getting Uint8Array[12] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([12]); + var expected = new Uint8Array([12]); + chai.expect(tizen.bluetooth.toUint8Array(Uint8ArrayArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[15, 10, 188, 222], after getting Uint8Array[15, 10, 188, 222] argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([15, 10, 188, 222]); + var expected = new Uint8Array([15, 10, 188, 222]); + chai.expect(tizen.bluetooth.toUint8Array(Uint8ArrayArgument)).to.eql(expected); + done(); + }); + it('should return Uint8Array[], after getting Uint8Array([]) argument', function(done) { + var Uint8ArrayArgument = new Uint8Array([]); + var expected = new Uint8Array([]); + chai.expect(tizen.bluetooth.toUint8Array(Uint8ArrayArgument)).to.eql(expected); + done(); + }); +}); + +mocha.checkLeaks(); +mocha + .run() + .on('pass', function(test) { + console.log(test.title + ' OK'); + }) + .on('fail', function(test, err) { + console.error(test.title + ' FAILED'); + console.error(err); + }) + .on('end', function() { + console.log('All done'); + });