@ledgerhq/react-native-hw-transport-ble 6.31.0 → 6.32.0-next.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/CHANGELOG.md +26 -0
- package/LICENSE.txt +21 -0
- package/lib/BleTransport.d.ts +67 -16
- package/lib/BleTransport.d.ts.map +1 -1
- package/lib/BleTransport.js +187 -79
- package/lib/BleTransport.js.map +1 -1
- package/lib/BleTransport.test.js +103 -15
- package/lib/BleTransport.test.js.map +1 -1
- package/lib/remapErrors.d.ts +1 -2
- package/lib/remapErrors.d.ts.map +1 -1
- package/lib/remapErrors.js.map +1 -1
- package/lib-es/BleTransport.d.ts +67 -16
- package/lib-es/BleTransport.d.ts.map +1 -1
- package/lib-es/BleTransport.js +191 -83
- package/lib-es/BleTransport.js.map +1 -1
- package/lib-es/BleTransport.test.js +104 -16
- package/lib-es/BleTransport.test.js.map +1 -1
- package/lib-es/remapErrors.d.ts +1 -2
- package/lib-es/remapErrors.d.ts.map +1 -1
- package/lib-es/remapErrors.js.map +1 -1
- package/package.json +9 -7
- package/src/BleTransport.test.ts +116 -15
- package/src/BleTransport.ts +278 -100
- package/src/remapErrors.ts +2 -1
|
@@ -7,8 +7,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
+
import { TransportExchangeTimeoutError } from "@ledgerhq/errors";
|
|
10
11
|
import BleTransport from "../src/BleTransport";
|
|
11
|
-
import { Subscription } from "rxjs";
|
|
12
|
+
import { Subscription, VirtualTimeScheduler } from "rxjs";
|
|
13
|
+
let mockNoResponseFromDevice = false;
|
|
14
|
+
const mockCancelTransaction = jest.fn();
|
|
15
|
+
let mockNegotiatedMtu;
|
|
12
16
|
/**
|
|
13
17
|
* It is essential to mock the BLE component of a BLE transport to verify
|
|
14
18
|
* the reliability of the connect/reconnect/disconnect logic, which is decoupled
|
|
@@ -132,6 +136,12 @@ jest.mock("react-native-ble-plx", () => {
|
|
|
132
136
|
serviceUUID: "13d63400-2c97-6004-0000-4c6564676572",
|
|
133
137
|
serviceID: 105553179758272,
|
|
134
138
|
writeWithoutResponse: (raw) => __awaiter(this, void 0, void 0, function* () {
|
|
139
|
+
// No response are sent back from the device (using `onDeviceResponse`)
|
|
140
|
+
// Imitates the case where the device is still connected but does not responds
|
|
141
|
+
// when saving the newly confirmed seed.
|
|
142
|
+
if (mockNoResponseFromDevice) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
135
145
|
if (!dynamicProps.isConnected)
|
|
136
146
|
throw new BleError(22, "Device is not connected");
|
|
137
147
|
const hex = Buffer.from(raw, "base64").toString("hex");
|
|
@@ -139,7 +149,7 @@ jest.mock("react-native-ble-plx", () => {
|
|
|
139
149
|
switch (hex) {
|
|
140
150
|
// MTU handshake
|
|
141
151
|
case "0800000000":
|
|
142
|
-
value =
|
|
152
|
+
value = mockNegotiatedMtu;
|
|
143
153
|
break;
|
|
144
154
|
// getAppAndVersion - returning BOLOS on 1.0.0-rc9
|
|
145
155
|
case "0500000005b010000000":
|
|
@@ -168,12 +178,19 @@ jest.mock("react-native-ble-plx", () => {
|
|
|
168
178
|
},
|
|
169
179
|
};
|
|
170
180
|
},
|
|
181
|
+
cancelTransaction: mockCancelTransaction,
|
|
171
182
|
};
|
|
172
183
|
},
|
|
173
184
|
};
|
|
174
185
|
});
|
|
175
186
|
describe("BleTransport connectivity test coverage", () => {
|
|
176
187
|
const deviceId = "20EDD96F-7430-6E33-AB22-DD8AAB857CD4";
|
|
188
|
+
beforeEach(() => {
|
|
189
|
+
mockNoResponseFromDevice = false;
|
|
190
|
+
// MTU of 153 bytes
|
|
191
|
+
mockNegotiatedMtu = Buffer.from("080000000099", "hex");
|
|
192
|
+
mockCancelTransaction.mockClear();
|
|
193
|
+
});
|
|
177
194
|
describe("Device available and already paired", () => {
|
|
178
195
|
it("should find the device, connect, negotiate MTU", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
179
196
|
const transport = yield BleTransport.open(deviceId);
|
|
@@ -181,7 +198,7 @@ describe("BleTransport connectivity test coverage", () => {
|
|
|
181
198
|
}));
|
|
182
199
|
it("should be disconnectable, and cleanup", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
183
200
|
const transport = yield BleTransport.open(deviceId);
|
|
184
|
-
yield BleTransport.
|
|
201
|
+
yield BleTransport.disconnectDevice(deviceId);
|
|
185
202
|
expect(transport.isConnected).toBe(false);
|
|
186
203
|
}));
|
|
187
204
|
it("should disconnect in 500ms (5s default) after calling close", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -222,21 +239,92 @@ describe("BleTransport connectivity test coverage", () => {
|
|
|
222
239
|
// Nb due to the different environments, the timeout behaves differently here
|
|
223
240
|
// and I can't check against a number for it to be cleared or not.
|
|
224
241
|
expect(transport.disconnectTimeout._destroyed).toBe(false);
|
|
225
|
-
yield BleTransport.
|
|
242
|
+
yield BleTransport.disconnectDevice(deviceId);
|
|
226
243
|
expect(transport.disconnectTimeout._destroyed).toBe(true);
|
|
227
244
|
}));
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
245
|
+
describe("When the message to exchange fits in 1 frame", () => {
|
|
246
|
+
it("should handle exchanges if all goes well", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
247
|
+
const transport = yield BleTransport.open(deviceId);
|
|
248
|
+
expect(transport.isConnected).toBe(true);
|
|
249
|
+
const response = yield transport.exchange(Buffer.from("b010000000", "hex"));
|
|
250
|
+
expect(response.toString("hex")).toBe("0105424f4c4f5309312e302e302d7263399000");
|
|
251
|
+
}));
|
|
252
|
+
it("should throw on exchanges if disconnected", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
253
|
+
const transport = yield BleTransport.open(deviceId);
|
|
254
|
+
expect(transport.isConnected).toBe(true);
|
|
255
|
+
yield BleTransport.disconnectDevice(deviceId);
|
|
256
|
+
yield expect(transport.exchange(Buffer.from("b010000000", "hex"))).rejects.toThrow(); // More specific errors some day.
|
|
257
|
+
}));
|
|
258
|
+
describe("And when an abort timeout is set", () => {
|
|
259
|
+
const abortTimeoutMs = 1000;
|
|
260
|
+
it("should throw an error and cancel the transaction if the abort timeout was reached", done => {
|
|
261
|
+
const rxjsScheduler = new VirtualTimeScheduler();
|
|
262
|
+
function asyncFn() {
|
|
263
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
264
|
+
const transport = yield BleTransport.open(deviceId);
|
|
265
|
+
expect(transport.isConnected).toBe(true);
|
|
266
|
+
// Once we got the transport (MTU exchanged), we stop the communication
|
|
267
|
+
mockNoResponseFromDevice = true;
|
|
268
|
+
transport
|
|
269
|
+
.exchange(Buffer.from("b010000000", "hex"), { abortTimeoutMs })
|
|
270
|
+
.then(() => {
|
|
271
|
+
done("It should not succeed");
|
|
272
|
+
})
|
|
273
|
+
.catch(error => {
|
|
274
|
+
expect(error).toBeInstanceOf(TransportExchangeTimeoutError);
|
|
275
|
+
expect(mockCancelTransaction).toHaveBeenCalledTimes(1);
|
|
276
|
+
done();
|
|
277
|
+
});
|
|
278
|
+
rxjsScheduler.flush();
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
asyncFn();
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
// Multi-frames message response is not handled by our current mocked react-native-ble-plx
|
|
286
|
+
// The logic of encoding a message into several frames is tested directly with unit tests on ledgerhq/devices/lib/ble/sendAPDU
|
|
287
|
+
describe("When the message to exchange needs more than 1 frame", () => {
|
|
288
|
+
beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
289
|
+
// Triggering a disconnection and clearing the transport cache
|
|
290
|
+
yield BleTransport.disconnectDevice(deviceId);
|
|
291
|
+
// MTU of 25 bytes
|
|
292
|
+
mockNegotiatedMtu = Buffer.from("080000000019", "hex");
|
|
293
|
+
}));
|
|
294
|
+
afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
295
|
+
// Triggering a disconnection and clearing the transport cache
|
|
296
|
+
yield BleTransport.disconnectDevice(deviceId);
|
|
297
|
+
}));
|
|
298
|
+
describe("And when an abort timeout is set", () => {
|
|
299
|
+
const abortTimeoutMs = 1000;
|
|
300
|
+
it("should throw an error and cancel the transactions of all operations if the abort timeout was reached", done => {
|
|
301
|
+
const rxjsScheduler = new VirtualTimeScheduler();
|
|
302
|
+
function asyncFn() {
|
|
303
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
304
|
+
const transport = yield BleTransport.open(deviceId);
|
|
305
|
+
expect(transport.isConnected).toBe(true);
|
|
306
|
+
// Once we got the transport (MTU exchanged), we stop the communication
|
|
307
|
+
mockNoResponseFromDevice = true;
|
|
308
|
+
// Imaginary APDU that will create an encoded message longer than MTU = 25 bytes
|
|
309
|
+
transport
|
|
310
|
+
.exchange(Buffer.from("b010000000b010000000b010000000b010000000b010000000", "hex"), {
|
|
311
|
+
abortTimeoutMs,
|
|
312
|
+
})
|
|
313
|
+
.then(() => {
|
|
314
|
+
done("It should not succeed");
|
|
315
|
+
})
|
|
316
|
+
.catch(error => {
|
|
317
|
+
expect(error).toBeInstanceOf(TransportExchangeTimeoutError);
|
|
318
|
+
expect(mockCancelTransaction).toHaveBeenCalledTimes(2);
|
|
319
|
+
done();
|
|
320
|
+
});
|
|
321
|
+
rxjsScheduler.flush();
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
asyncFn();
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
});
|
|
240
328
|
it("should disconnect if close is called, even if pending response", done => {
|
|
241
329
|
// This is actually a very important test, if we have an ongoing apdu response,
|
|
242
330
|
// as in, the device never replied, but we expressed the intention of disconnecting
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BleTransport.test.js","sourceRoot":"","sources":["../src/BleTransport.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BleTransport.test.js","sourceRoot":"","sources":["../src/BleTransport.test.ts"],"names":[],"mappings":"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"}
|
package/lib-es/remapErrors.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { HwTransportError, HwTransportErrorType } from "@ledgerhq/errors";
|
|
2
2
|
import { BleError, BleErrorCode } from "react-native-ble-plx";
|
|
3
|
-
type IOBleErrorRemap = Error | BleError | null | undefined;
|
|
3
|
+
export type IOBleErrorRemap = Error | BleError | null | undefined;
|
|
4
4
|
export declare const remapError: (error: IOBleErrorRemap) => IOBleErrorRemap;
|
|
5
5
|
export declare const rethrowError: (e: Error | null | undefined) => never;
|
|
6
6
|
export declare const decoratePromiseErrors: <A>(promise: Promise<A>) => Promise<A>;
|
|
7
7
|
export declare const bleErrorToHwTransportError: Map<BleErrorCode, HwTransportErrorType>;
|
|
8
8
|
export declare const mapBleErrorToHwTransportError: (bleError: BleError) => HwTransportError;
|
|
9
|
-
export {};
|
|
10
9
|
//# sourceMappingURL=remapErrors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remapErrors.d.ts","sourceRoot":"","sources":["../src/remapErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAmB,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/E,
|
|
1
|
+
{"version":3,"file":"remapErrors.d.ts","sourceRoot":"","sources":["../src/remapErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAmB,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/E,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;AAElE,eAAO,MAAM,UAAU,UAAW,eAAe,KAAG,eAqBnD,CAAC;AAEF,eAAO,MAAM,YAAY,MAAO,KAAK,GAAG,IAAI,GAAG,SAAS,KAAG,KAE1D,CAAC;AAEF,eAAO,MAAM,qBAAqB,wCACL,CAAC;AAE9B,eAAO,MAAM,0BAA0B,yCAQrC,CAAC;AAEH,eAAO,MAAM,6BAA6B,aAAc,QAAQ,KAAG,gBAOlE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remapErrors.js","sourceRoot":"","sources":["../src/remapErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"remapErrors.js","sourceRoot":"","sources":["../src/remapErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAI/E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAsB,EAAmB,EAAE;IACpE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3C,IAAI,KAAK,YAAY,QAAQ,EAAE;QAC7B,IACE,KAAK,CAAC,YAAY,KAAK,eAAe,CAAC,aAAa;YACpD,KAAK,CAAC,MAAM,KAAK,kCAAkC,EACnD;YACA,OAAO,IAAI,kBAAkB,EAAE,CAAC;YAChC,6DAA6D;YAC7D,iFAAiF;SAClF;aAAM,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,YAAY,MAAK,EAAE,EAAE;YACrC,OAAO,IAAI,aAAa,EAAE,CAAC;SAC5B;KACF;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrF,OAAO,IAAI,kBAAkB,EAAE,CAAC;KACjC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAA2B,EAAS,EAAE;IACjE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAI,OAAmB,EAAc,EAAE,CAC1E,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAE9B,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IAChD,CAAC,YAAY,CAAC,eAAe,EAAE,oBAAoB,CAAC,wBAAwB,CAAC;IAC7E,CAAC,YAAY,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,wBAAwB,CAAC;IACtF;QACE,kFAAkF;QAClF,YAAY,CAAC,qBAAqB;QAClC,oBAAoB,CAAC,4BAA4B;KAClD;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,QAAkB,EAAoB,EAAE;IACpF,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,OAAO,aAAa,QAAQ,CAAC,SAAS,EAAE,CAAC;IAErE,MAAM,WAAW,GAAG,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;IAEvE,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/react-native-hw-transport-ble",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.32.0-next.0",
|
|
4
4
|
"description": "Ledger Hardware Wallet Bluetooth BLE transport for React Native",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -27,20 +27,22 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"react-native-ble-plx": "2.0.3",
|
|
29
29
|
"rxjs": "^7.8.1",
|
|
30
|
-
"
|
|
31
|
-
"@ledgerhq/
|
|
32
|
-
"@ledgerhq/
|
|
30
|
+
"uuid": "^9.0.1",
|
|
31
|
+
"@ledgerhq/devices": "^8.2.0-next.0",
|
|
32
|
+
"@ledgerhq/errors": "^6.16.1-next.0",
|
|
33
|
+
"@ledgerhq/hw-transport": "^6.30.1-next.0",
|
|
33
34
|
"@ledgerhq/logs": "^6.12.0"
|
|
34
35
|
},
|
|
35
36
|
"gitHead": "dd0dea64b58e5a9125c8a422dcffd29e5ef6abec",
|
|
36
37
|
"devDependencies": {
|
|
37
|
-
"@types/jest": "^29.5.
|
|
38
|
+
"@types/jest": "^29.5.10",
|
|
38
39
|
"@types/node": "^20.8.10",
|
|
40
|
+
"@types/uuid": "^9.0.5",
|
|
39
41
|
"documentation": "14.0.2",
|
|
40
|
-
"jest": "^
|
|
42
|
+
"jest": "^29.7.0",
|
|
41
43
|
"rimraf": "^4.4.1",
|
|
42
44
|
"source-map-support": "^0.5.21",
|
|
43
|
-
"ts-jest": "^
|
|
45
|
+
"ts-jest": "^29.1.1",
|
|
44
46
|
"ts-node": "^10.4.0"
|
|
45
47
|
},
|
|
46
48
|
"scripts": {
|
package/src/BleTransport.test.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
import { TransportExchangeTimeoutError } from "@ledgerhq/errors";
|
|
1
2
|
import BleTransport from "../src/BleTransport";
|
|
2
|
-
import { Subscription } from "rxjs";
|
|
3
|
+
import { Subscription, VirtualTimeScheduler } from "rxjs";
|
|
4
|
+
|
|
5
|
+
let mockNoResponseFromDevice = false;
|
|
6
|
+
const mockCancelTransaction = jest.fn();
|
|
7
|
+
let mockNegotiatedMtu: Buffer;
|
|
3
8
|
|
|
4
9
|
/**
|
|
5
10
|
* It is essential to mock the BLE component of a BLE transport to verify
|
|
@@ -12,7 +17,6 @@ import { Subscription } from "rxjs";
|
|
|
12
17
|
* to cover test cases. It should be noted that this mock is not comprehensive
|
|
13
18
|
* and may require further refinement to meet all requirements.
|
|
14
19
|
*/
|
|
15
|
-
|
|
16
20
|
jest.mock("react-native-ble-plx", () => {
|
|
17
21
|
class BleError {
|
|
18
22
|
iosErrorCode: number;
|
|
@@ -134,6 +138,13 @@ jest.mock("react-native-ble-plx", () => {
|
|
|
134
138
|
serviceUUID: "13d63400-2c97-6004-0000-4c6564676572",
|
|
135
139
|
serviceID: 105553179758272,
|
|
136
140
|
writeWithoutResponse: async raw => {
|
|
141
|
+
// No response are sent back from the device (using `onDeviceResponse`)
|
|
142
|
+
// Imitates the case where the device is still connected but does not responds
|
|
143
|
+
// when saving the newly confirmed seed.
|
|
144
|
+
if (mockNoResponseFromDevice) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
137
148
|
if (!dynamicProps.isConnected)
|
|
138
149
|
throw new BleError(22, "Device is not connected");
|
|
139
150
|
|
|
@@ -143,7 +154,7 @@ jest.mock("react-native-ble-plx", () => {
|
|
|
143
154
|
switch (hex) {
|
|
144
155
|
// MTU handshake
|
|
145
156
|
case "0800000000":
|
|
146
|
-
value =
|
|
157
|
+
value = mockNegotiatedMtu;
|
|
147
158
|
break;
|
|
148
159
|
// getAppAndVersion - returning BOLOS on 1.0.0-rc9
|
|
149
160
|
case "0500000005b010000000":
|
|
@@ -175,6 +186,7 @@ jest.mock("react-native-ble-plx", () => {
|
|
|
175
186
|
},
|
|
176
187
|
};
|
|
177
188
|
},
|
|
189
|
+
cancelTransaction: mockCancelTransaction,
|
|
178
190
|
};
|
|
179
191
|
},
|
|
180
192
|
};
|
|
@@ -183,6 +195,13 @@ jest.mock("react-native-ble-plx", () => {
|
|
|
183
195
|
describe("BleTransport connectivity test coverage", () => {
|
|
184
196
|
const deviceId = "20EDD96F-7430-6E33-AB22-DD8AAB857CD4";
|
|
185
197
|
|
|
198
|
+
beforeEach(() => {
|
|
199
|
+
mockNoResponseFromDevice = false;
|
|
200
|
+
// MTU of 153 bytes
|
|
201
|
+
mockNegotiatedMtu = Buffer.from("080000000099", "hex");
|
|
202
|
+
mockCancelTransaction.mockClear();
|
|
203
|
+
});
|
|
204
|
+
|
|
186
205
|
describe("Device available and already paired", () => {
|
|
187
206
|
it("should find the device, connect, negotiate MTU", async () => {
|
|
188
207
|
const transport = await BleTransport.open(deviceId);
|
|
@@ -191,7 +210,7 @@ describe("BleTransport connectivity test coverage", () => {
|
|
|
191
210
|
|
|
192
211
|
it("should be disconnectable, and cleanup", async () => {
|
|
193
212
|
const transport = await BleTransport.open(deviceId);
|
|
194
|
-
await BleTransport.
|
|
213
|
+
await BleTransport.disconnectDevice(deviceId);
|
|
195
214
|
expect(transport.isConnected).toBe(false);
|
|
196
215
|
});
|
|
197
216
|
|
|
@@ -243,23 +262,105 @@ describe("BleTransport connectivity test coverage", () => {
|
|
|
243
262
|
// Nb due to the different environments, the timeout behaves differently here
|
|
244
263
|
// and I can't check against a number for it to be cleared or not.
|
|
245
264
|
expect((transport.disconnectTimeout as any)._destroyed).toBe(false);
|
|
246
|
-
await BleTransport.
|
|
265
|
+
await BleTransport.disconnectDevice(deviceId);
|
|
247
266
|
expect((transport.disconnectTimeout as any)._destroyed).toBe(true);
|
|
248
267
|
});
|
|
249
268
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
269
|
+
describe("When the message to exchange fits in 1 frame", () => {
|
|
270
|
+
it("should handle exchanges if all goes well", async () => {
|
|
271
|
+
const transport = await BleTransport.open(deviceId);
|
|
272
|
+
expect(transport.isConnected).toBe(true);
|
|
253
273
|
|
|
254
|
-
|
|
255
|
-
|
|
274
|
+
const response = await transport.exchange(Buffer.from("b010000000", "hex"));
|
|
275
|
+
expect(response.toString("hex")).toBe("0105424f4c4f5309312e302e302d7263399000");
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it("should throw on exchanges if disconnected", async () => {
|
|
279
|
+
const transport = await BleTransport.open(deviceId);
|
|
280
|
+
expect(transport.isConnected).toBe(true);
|
|
281
|
+
await BleTransport.disconnectDevice(deviceId);
|
|
282
|
+
await expect(transport.exchange(Buffer.from("b010000000", "hex"))).rejects.toThrow(); // More specific errors some day.
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
describe("And when an abort timeout is set", () => {
|
|
286
|
+
const abortTimeoutMs = 1000;
|
|
287
|
+
|
|
288
|
+
it("should throw an error and cancel the transaction if the abort timeout was reached", done => {
|
|
289
|
+
const rxjsScheduler = new VirtualTimeScheduler();
|
|
290
|
+
|
|
291
|
+
async function asyncFn() {
|
|
292
|
+
const transport = await BleTransport.open(deviceId);
|
|
293
|
+
expect(transport.isConnected).toBe(true);
|
|
294
|
+
// Once we got the transport (MTU exchanged), we stop the communication
|
|
295
|
+
mockNoResponseFromDevice = true;
|
|
296
|
+
|
|
297
|
+
transport
|
|
298
|
+
.exchange(Buffer.from("b010000000", "hex"), { abortTimeoutMs })
|
|
299
|
+
.then(() => {
|
|
300
|
+
done("It should not succeed");
|
|
301
|
+
})
|
|
302
|
+
.catch(error => {
|
|
303
|
+
expect(error).toBeInstanceOf(TransportExchangeTimeoutError);
|
|
304
|
+
expect(mockCancelTransaction).toHaveBeenCalledTimes(1);
|
|
305
|
+
done();
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
rxjsScheduler.flush();
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
asyncFn();
|
|
312
|
+
});
|
|
313
|
+
});
|
|
256
314
|
});
|
|
257
315
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
316
|
+
// Multi-frames message response is not handled by our current mocked react-native-ble-plx
|
|
317
|
+
// The logic of encoding a message into several frames is tested directly with unit tests on ledgerhq/devices/lib/ble/sendAPDU
|
|
318
|
+
describe("When the message to exchange needs more than 1 frame", () => {
|
|
319
|
+
beforeEach(async () => {
|
|
320
|
+
// Triggering a disconnection and clearing the transport cache
|
|
321
|
+
await BleTransport.disconnectDevice(deviceId);
|
|
322
|
+
|
|
323
|
+
// MTU of 25 bytes
|
|
324
|
+
mockNegotiatedMtu = Buffer.from("080000000019", "hex");
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
afterEach(async () => {
|
|
328
|
+
// Triggering a disconnection and clearing the transport cache
|
|
329
|
+
await BleTransport.disconnectDevice(deviceId);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
describe("And when an abort timeout is set", () => {
|
|
333
|
+
const abortTimeoutMs = 1000;
|
|
334
|
+
|
|
335
|
+
it("should throw an error and cancel the transactions of all operations if the abort timeout was reached", done => {
|
|
336
|
+
const rxjsScheduler = new VirtualTimeScheduler();
|
|
337
|
+
|
|
338
|
+
async function asyncFn() {
|
|
339
|
+
const transport = await BleTransport.open(deviceId);
|
|
340
|
+
expect(transport.isConnected).toBe(true);
|
|
341
|
+
// Once we got the transport (MTU exchanged), we stop the communication
|
|
342
|
+
mockNoResponseFromDevice = true;
|
|
343
|
+
|
|
344
|
+
// Imaginary APDU that will create an encoded message longer than MTU = 25 bytes
|
|
345
|
+
transport
|
|
346
|
+
.exchange(Buffer.from("b010000000b010000000b010000000b010000000b010000000", "hex"), {
|
|
347
|
+
abortTimeoutMs,
|
|
348
|
+
})
|
|
349
|
+
.then(() => {
|
|
350
|
+
done("It should not succeed");
|
|
351
|
+
})
|
|
352
|
+
.catch(error => {
|
|
353
|
+
expect(error).toBeInstanceOf(TransportExchangeTimeoutError);
|
|
354
|
+
expect(mockCancelTransaction).toHaveBeenCalledTimes(2);
|
|
355
|
+
done();
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
rxjsScheduler.flush();
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
asyncFn();
|
|
362
|
+
});
|
|
363
|
+
});
|
|
263
364
|
});
|
|
264
365
|
|
|
265
366
|
it("should disconnect if close is called, even if pending response", done => {
|