[6.0][Bluetooth] Representation of binary data unification 59/231859/10
authorArkadiusz Pietraszek <a.pietraszek@samsung.com>
Fri, 24 Apr 2020 13:38:11 +0000 (15:38 +0200)
committerArkadiusz Pietraszek <a.pietraszek@samsung.com>
Tue, 14 Jul 2020 09:46:54 +0000 (11:46 +0200)
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 <a.pietraszek@samsung.com>
src/bluetooth/bluetooth_api.js
src/bluetooth/js/ut/test_toByteArray.js [new file with mode: 0644]
src/bluetooth/js/ut/test_toDOMString.js [new file with mode: 0644]
src/bluetooth/js/ut/test_toUint8Array.js [new file with mode: 0644]

index 64428fc0f6336fde34034fe7d7c39a1d9cb39a35..6e55fadf67585df033e0a77b7cc45d00b94c35ff 100755 (executable)
@@ -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 (file)
index 0000000..d596424
--- /dev/null
@@ -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 (file)
index 0000000..f098e47
--- /dev/null
@@ -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 (file)
index 0000000..c4ea87c
--- /dev/null
@@ -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');
+    });