@onekeyfe/hd-core 1.2.0-alpha.53 → 1.2.0-alpha.54
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/__tests__/AllNetworkGetAddressBase.tracing.test.ts +0 -78
- package/__tests__/DeviceCommands.test.ts +0 -45
- package/__tests__/DeviceEventRegistration.test.ts +0 -6
- package/__tests__/check-all-firmware-release-protocol-v2.test.ts +3 -198
- package/__tests__/connectSettings.test.ts +47 -5
- package/__tests__/device-initialize-timeout.test.ts +56 -0
- package/__tests__/device-lifecycle-events.test.ts +3 -105
- package/__tests__/firmware-update/check-all-firmware-release.test.ts +175 -0
- package/__tests__/firmware-update/firmware-artifact-source.test.ts +119 -0
- package/__tests__/firmware-update/firmware-host-binding.test.ts +70 -0
- package/__tests__/firmware-update/firmware-preparation-error.test.ts +27 -0
- package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +200 -0
- package/__tests__/firmware-update/firmware-update-capabilities.test.ts +13 -0
- package/__tests__/firmware-update/firmware-update-plan-bootloader-identity.test.ts +294 -0
- package/__tests__/firmware-update/firmware-update-plan.test.ts +593 -0
- package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +213 -0
- package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +59 -31
- package/__tests__/firmware-update/firmware-update-v3-reconnect.test.ts +58 -0
- package/__tests__/firmware-update/firmware-upload-source.test.ts +70 -0
- package/__tests__/get-device-state.test.ts +12 -132
- package/__tests__/homescreen.test.ts +1 -41
- package/__tests__/logBlockEvent.test.ts +1 -1
- package/__tests__/method-protocol-support.test.ts +0 -19
- package/__tests__/open-wallet-session.test.ts +33 -446
- package/__tests__/protocol-v2-unlock-policy.test.ts +35 -201
- package/__tests__/protocol-v2.test.ts +1034 -1378
- package/__tests__/protocolV2UiInteraction.test.ts +0 -63
- package/__tests__/public-pro2-api-boundary.test.ts +0 -1
- package/__tests__/search-devices.test.ts +3 -12
- package/dist/api/BaseMethod.d.ts +1 -3
- package/dist/api/BaseMethod.d.ts.map +1 -1
- package/dist/api/CheckAllFirmwareRelease.d.ts +1 -2
- package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
- package/dist/api/FirmwareUpdate.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV2.d.ts +11 -0
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts +7 -3
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV4.d.ts +25 -11
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/api/GetPassphraseState.d.ts.map +1 -1
- package/dist/api/OpenWalletSession.d.ts.map +1 -1
- package/dist/api/SearchDevices.d.ts.map +1 -1
- package/dist/api/allnetwork/AllNetworkGetAddressBase.d.ts.map +1 -1
- package/dist/api/device/DeviceUnlock.d.ts +2 -2
- package/dist/api/device/DeviceUnlock.d.ts.map +1 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts +5 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareArtifactSource.d.ts +25 -0
- package/dist/api/firmware/FirmwareArtifactSource.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareHostBinding.d.ts +6 -0
- package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -0
- package/dist/api/firmware/FirmwarePreparationError.d.ts +3 -0
- package/dist/api/firmware/FirmwarePreparationError.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts +9 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts +3 -0
- package/dist/api/firmware/FirmwareUpdateCapabilities.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts +25 -0
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +32 -0
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -0
- package/dist/api/firmware/getBinary.d.ts +7 -0
- package/dist/api/firmware/getBinary.d.ts.map +1 -1
- package/dist/api/firmware/progressThrottle.d.ts +3 -0
- package/dist/api/firmware/progressThrottle.d.ts.map +1 -0
- package/dist/api/firmware/updateBootloader.d.ts +2 -0
- package/dist/api/firmware/updateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/uploadFirmware.d.ts +9 -1
- package/dist/api/firmware/uploadFirmware.d.ts.map +1 -1
- package/dist/api/helpers/protocolV2FileWrite.d.ts +0 -2
- package/dist/api/helpers/protocolV2FileWrite.d.ts.map +1 -1
- package/dist/api/index.d.ts +0 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/protocol-v2/ProtocolInfoRequest.d.ts.map +1 -1
- package/dist/api/protocol-v2/helpers.d.ts.map +1 -1
- package/dist/api/stellar/StellarSignTransaction.d.ts +1 -1
- package/dist/core/deviceEventRegistration.d.ts +0 -2
- package/dist/core/deviceEventRegistration.d.ts.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/data-manager/DataManager.d.ts +2 -4
- package/dist/data-manager/DataManager.d.ts.map +1 -1
- package/dist/data-manager/connectSettings.d.ts.map +1 -1
- package/dist/device/Device.d.ts +6 -29
- package/dist/device/Device.d.ts.map +1 -1
- package/dist/device/DeviceCommands.d.ts +4 -4
- package/dist/device/DeviceCommands.d.ts.map +1 -1
- package/dist/device/DevicePool.d.ts.map +1 -1
- package/dist/events/device.d.ts +0 -4
- package/dist/events/device.d.ts.map +1 -1
- package/dist/events/logBlockEvent.d.ts.map +1 -1
- package/dist/events/ui-promise.d.ts +2 -4
- package/dist/events/ui-promise.d.ts.map +1 -1
- package/dist/events/ui-request.d.ts +2 -31
- package/dist/events/ui-request.d.ts.map +1 -1
- package/dist/events/ui-response.d.ts +2 -10
- package/dist/events/ui-response.d.ts.map +1 -1
- package/dist/index.d.ts +231 -214
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3497 -2559
- package/dist/inject.d.ts +1 -6
- package/dist/inject.d.ts.map +1 -1
- package/dist/lowLevelInject.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/features.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/lockedError.d.ts +2 -0
- package/dist/protocols/protocol-v2/lockedError.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/uiInteraction.d.ts +4 -7
- package/dist/protocols/protocol-v2/uiInteraction.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/unlockPolicy.d.ts +3 -1
- package/dist/protocols/protocol-v2/unlockPolicy.d.ts.map +1 -1
- package/dist/protocols/protocol-v2/unlockRetry.d.ts +10 -0
- package/dist/protocols/protocol-v2/unlockRetry.d.ts.map +1 -0
- package/dist/protocols/protocol-v2/walletSession.d.ts +1 -5
- package/dist/protocols/protocol-v2/walletSession.d.ts.map +1 -1
- package/dist/topLevelInject.d.ts.map +1 -1
- package/dist/types/api/checkAllFirmwareRelease.d.ts +4 -2
- package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
- package/dist/types/api/deviceUnlock.d.ts +1 -5
- package/dist/types/api/deviceUnlock.d.ts.map +1 -1
- package/dist/types/api/deviceUpdateBootloader.d.ts +6 -0
- package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
- package/dist/types/api/export.d.ts +4 -2
- package/dist/types/api/export.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +70 -2
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdateCapabilities.d.ts +9 -0
- package/dist/types/api/firmwareUpdateCapabilities.d.ts.map +1 -0
- package/dist/types/api/firmwareUpdatePlan.d.ts +28 -0
- package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -0
- package/dist/types/api/firmwareUpdatePreparedPlan.d.ts +42 -0
- package/dist/types/api/firmwareUpdatePreparedPlan.d.ts.map +1 -0
- package/dist/types/api/index.d.ts +10 -7
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/api/protocolV2.d.ts +0 -3
- package/dist/types/api/protocolV2.d.ts.map +1 -1
- package/dist/types/device.d.ts.map +1 -1
- package/dist/types/params.d.ts +0 -1
- package/dist/types/params.d.ts.map +1 -1
- package/dist/types/settings.d.ts +13 -22
- package/dist/types/settings.d.ts.map +1 -1
- package/dist/utils/deviceFeaturesCompat.d.ts +1 -0
- package/dist/utils/deviceFeaturesCompat.d.ts.map +1 -1
- package/dist/utils/deviceFeaturesUtils.d.ts +0 -4
- package/dist/utils/deviceFeaturesUtils.d.ts.map +1 -1
- package/dist/utils/homescreen.d.ts +0 -4
- package/dist/utils/homescreen.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/patch.d.ts +1 -1
- package/dist/utils/patch.d.ts.map +1 -1
- package/dist/utils/pro2Wallpaper.d.ts +0 -10
- package/dist/utils/pro2Wallpaper.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/BaseMethod.ts +10 -8
- package/src/api/CheckAllFirmwareRelease.ts +57 -54
- package/src/api/FirmwareUpdate.ts +15 -7
- package/src/api/FirmwareUpdateV2.ts +316 -126
- package/src/api/FirmwareUpdateV3.ts +265 -63
- package/src/api/FirmwareUpdateV4.ts +965 -566
- package/src/api/GetPassphraseState.ts +1 -7
- package/src/api/OpenWalletSession.ts +17 -54
- package/src/api/SearchDevices.ts +1 -3
- package/src/api/allnetwork/AllNetworkGetAddressBase.ts +11 -32
- package/src/api/device/DeviceUnlock.ts +3 -8
- package/src/api/device/DeviceUpdateBootloader.ts +122 -6
- package/src/api/firmware/FirmwareArtifactSource.ts +278 -0
- package/src/api/firmware/FirmwareHostBinding.ts +100 -0
- package/src/api/firmware/FirmwarePreparationError.ts +12 -0
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +83 -16
- package/src/api/firmware/FirmwareUpdateCapabilities.ts +9 -0
- package/src/api/firmware/FirmwareUpdatePlan.ts +772 -0
- package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +415 -0
- package/src/api/firmware/progressThrottle.ts +44 -0
- package/src/api/firmware/updateBootloader.ts +19 -4
- package/src/api/firmware/uploadFirmware.ts +144 -39
- package/src/api/helpers/protocolV2FileWrite.ts +4 -11
- package/src/api/index.ts +0 -2
- package/src/api/protocol-v2/ProtocolInfoRequest.ts +1 -3
- package/src/api/protocol-v2/helpers.ts +0 -1
- package/src/core/deviceEventRegistration.ts +0 -4
- package/src/core/index.ts +83 -167
- package/src/data/messages/messages-protocol-v2.json +0 -25
- package/src/data-manager/DataManager.ts +38 -67
- package/src/data-manager/connectSettings.ts +11 -0
- package/src/device/Device.ts +42 -258
- package/src/device/DeviceCommands.ts +1 -7
- package/src/device/DevicePool.ts +2 -7
- package/src/events/device.ts +0 -4
- package/src/events/logBlockEvent.ts +0 -1
- package/src/events/ui-promise.ts +2 -4
- package/src/events/ui-request.ts +2 -36
- package/src/events/ui-response.ts +2 -12
- package/src/index.ts +5 -0
- package/src/inject.ts +24 -60
- package/src/lowLevelInject.ts +8 -7
- package/src/protocols/protocol-v2/features.ts +3 -10
- package/src/protocols/protocol-v2/lockedError.ts +10 -0
- package/src/protocols/protocol-v2/uiInteraction.ts +6 -46
- package/src/protocols/protocol-v2/unlockPolicy.ts +105 -1
- package/src/protocols/protocol-v2/unlockRetry.ts +109 -0
- package/src/protocols/protocol-v2/walletSession.ts +30 -180
- package/src/topLevelInject.ts +8 -7
- package/src/types/api/checkAllFirmwareRelease.ts +4 -2
- package/src/types/api/deviceUnlock.ts +1 -12
- package/src/types/api/deviceUpdateBootloader.ts +6 -0
- package/src/types/api/export.ts +18 -1
- package/src/types/api/firmwareUpdate.ts +76 -3
- package/src/types/api/firmwareUpdateCapabilities.ts +9 -0
- package/src/types/api/firmwareUpdatePlan.ts +38 -0
- package/src/types/api/firmwareUpdatePreparedPlan.ts +53 -0
- package/src/types/api/index.ts +14 -13
- package/src/types/api/protocolV2.ts +0 -13
- package/src/types/device.ts +0 -3
- package/src/types/params.ts +1 -7
- package/src/types/settings.ts +13 -42
- package/src/utils/deviceFeaturesCompat.ts +6 -0
- package/src/utils/deviceFeaturesUtils.ts +0 -8
- package/src/utils/homescreen.ts +6 -32
- package/src/utils/index.ts +1 -6
- package/src/utils/pro2Wallpaper.ts +8 -35
- package/__tests__/deviceUploadNft.test.ts +0 -293
- package/__tests__/pro2Nft.test.ts +0 -108
- package/__tests__/protocol-binding.test.ts +0 -89
- package/__tests__/protocol-v2-resources.test.ts +0 -284
- package/__tests__/protocol-v2-ui-lifecycle.test.ts +0 -91
- package/__tests__/uiProgressThrottle.test.ts +0 -74
- package/__tests__/uiPromiseRegistry.test.ts +0 -86
- package/dist/api/DetectDeviceConnectProtocol.d.ts +0 -7
- package/dist/api/DetectDeviceConnectProtocol.d.ts.map +0 -1
- package/dist/api/protocol-v2/DeviceUploadNft.d.ts +0 -31
- package/dist/api/protocol-v2/DeviceUploadNft.d.ts.map +0 -1
- package/dist/core/uiPromiseRegistry.d.ts +0 -4
- package/dist/core/uiPromiseRegistry.d.ts.map +0 -1
- package/dist/protocols/protocol-v2/resources.d.ts +0 -30
- package/dist/protocols/protocol-v2/resources.d.ts.map +0 -1
- package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts +0 -22
- package/dist/protocols/protocol-v2/unlockPolicyRunner.d.ts.map +0 -1
- package/dist/types/api/detectDeviceConnectProtocol.d.ts +0 -4
- package/dist/types/api/detectDeviceConnectProtocol.d.ts.map +0 -1
- package/dist/utils/pro2Nft.d.ts +0 -31
- package/dist/utils/pro2Nft.d.ts.map +0 -1
- package/dist/utils/uiProgressThrottle.d.ts +0 -3
- package/dist/utils/uiProgressThrottle.d.ts.map +0 -1
- package/src/api/DetectDeviceConnectProtocol.ts +0 -18
- package/src/api/protocol-v2/DeviceUploadNft.ts +0 -189
- package/src/core/uiPromiseRegistry.ts +0 -41
- package/src/protocols/protocol-v2/resources.ts +0 -359
- package/src/protocols/protocol-v2/unlockPolicyRunner.ts +0 -118
- package/src/types/api/detectDeviceConnectProtocol.ts +0 -7
- package/src/utils/pro2Nft.ts +0 -142
- package/src/utils/uiProgressThrottle.ts +0 -63
|
@@ -18,83 +18,6 @@ class TestAllNetworkMethod extends AllNetworkGetAddressBase {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
describe('AllNetworkGetAddressBase tracing', () => {
|
|
21
|
-
test('resumes a Protocol V2 hidden wallet before running a nested chain method', async () => {
|
|
22
|
-
const calls: string[] = [];
|
|
23
|
-
const checkPassphraseStateSafety = jest.fn().mockImplementation(() => {
|
|
24
|
-
calls.push('resume-hidden-session');
|
|
25
|
-
return Promise.resolve(true);
|
|
26
|
-
});
|
|
27
|
-
const innerMethod = {
|
|
28
|
-
checkSafetyLevelOnTestNet: jest.fn().mockResolvedValue(false),
|
|
29
|
-
connectId: 'connect-id',
|
|
30
|
-
deviceId: 'device-id',
|
|
31
|
-
getVersionRange: jest.fn().mockReturnValue({}),
|
|
32
|
-
assertProtocolSupported: jest.fn(),
|
|
33
|
-
init: jest.fn(),
|
|
34
|
-
name: 'evmGetAddress',
|
|
35
|
-
responseID: 43,
|
|
36
|
-
unlockPolicy: 'unlock-before-run',
|
|
37
|
-
run: jest.fn().mockImplementation(() => {
|
|
38
|
-
calls.push('run-chain-method');
|
|
39
|
-
return Promise.resolve([{ address: '0xhidden' }]);
|
|
40
|
-
}),
|
|
41
|
-
setDevice: jest.fn(),
|
|
42
|
-
strictCheckDeviceSupport: false,
|
|
43
|
-
};
|
|
44
|
-
(findMethod as jest.Mock).mockReturnValue(innerMethod);
|
|
45
|
-
const method = new TestAllNetworkMethod({
|
|
46
|
-
id: 1,
|
|
47
|
-
payload: {
|
|
48
|
-
method: 'allNetworkGetAddress',
|
|
49
|
-
connectId: 'connect-id',
|
|
50
|
-
deviceId: 'device-id',
|
|
51
|
-
passphraseState: 'hidden-state',
|
|
52
|
-
bundle: [],
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
method.protocolV2UnlockContext = { preflightCompleted: true };
|
|
56
|
-
const typedCall = jest.fn();
|
|
57
|
-
method.device = {
|
|
58
|
-
checkPassphraseStateSafety,
|
|
59
|
-
commands: {
|
|
60
|
-
typedCall,
|
|
61
|
-
},
|
|
62
|
-
getCurrentFirmwareType: jest.fn(),
|
|
63
|
-
getProtocol: jest.fn().mockReturnValue('V2'),
|
|
64
|
-
getCurrentFirmwareVersionString: jest.fn().mockReturnValue('1.0.0'),
|
|
65
|
-
getCurrentMethodVersionRange: jest
|
|
66
|
-
.fn()
|
|
67
|
-
.mockImplementation((getRange: (type: string) => unknown) => getRange('pro2')),
|
|
68
|
-
instanceId: 'device-instance',
|
|
69
|
-
isProtocolV2: jest.fn().mockReturnValue(true),
|
|
70
|
-
isBootloader: jest.fn().mockReturnValue(false),
|
|
71
|
-
isRomloader: jest.fn().mockReturnValue(false),
|
|
72
|
-
off: jest.fn(),
|
|
73
|
-
on: jest.fn(),
|
|
74
|
-
state: { status: { unlocked: true } },
|
|
75
|
-
updateProtocolV2Status: jest.fn(),
|
|
76
|
-
} as any;
|
|
77
|
-
|
|
78
|
-
await method.callMethod(
|
|
79
|
-
'evmGetAddress',
|
|
80
|
-
{
|
|
81
|
-
bundle: [
|
|
82
|
-
{
|
|
83
|
-
_originRequestParams: {
|
|
84
|
-
network: 'evm',
|
|
85
|
-
path: "m/44'/60'/0'/0/0",
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
],
|
|
89
|
-
},
|
|
90
|
-
0
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
expect(checkPassphraseStateSafety).toHaveBeenCalledWith('hidden-state', false, undefined);
|
|
94
|
-
expect(calls).toEqual(['resume-hidden-session', 'run-chain-method']);
|
|
95
|
-
expect(typedCall).not.toHaveBeenCalled();
|
|
96
|
-
});
|
|
97
|
-
|
|
98
21
|
test('releases the nested request context when an unhandled error escapes', async () => {
|
|
99
22
|
const deviceInstanceId = 'device-instance';
|
|
100
23
|
const innerMethod = {
|
|
@@ -128,7 +51,6 @@ describe('AllNetworkGetAddressBase tracing', () => {
|
|
|
128
51
|
getCurrentMethodVersionRange: jest
|
|
129
52
|
.fn()
|
|
130
53
|
.mockImplementation((getRange: (type: string) => unknown) => getRange('classic')),
|
|
131
|
-
isProtocolV2: jest.fn().mockReturnValue(false),
|
|
132
54
|
off: jest.fn(),
|
|
133
55
|
on: jest.fn(),
|
|
134
56
|
} as any;
|
|
@@ -125,51 +125,6 @@ describe('DeviceCommands failure mapping', () => {
|
|
|
125
125
|
expect(JSON.stringify(log.messages)).not.toContain('secret-wallet-address');
|
|
126
126
|
});
|
|
127
127
|
|
|
128
|
-
it('logs the sanitized DeviceFirmwareUpdateStatus response payload', async () => {
|
|
129
|
-
const commands = createCommands();
|
|
130
|
-
const log = getLogger(LoggerNames.DeviceCommands);
|
|
131
|
-
log.messages.length = 0;
|
|
132
|
-
|
|
133
|
-
await expect(
|
|
134
|
-
commands._filterCommonTypes(
|
|
135
|
-
{
|
|
136
|
-
type: 'DeviceFirmwareUpdateStatus',
|
|
137
|
-
message: {
|
|
138
|
-
records: [
|
|
139
|
-
{
|
|
140
|
-
target_id: 4,
|
|
141
|
-
status: 2,
|
|
142
|
-
payload_version: 0x010203,
|
|
143
|
-
path: 'vol0:/application_p1.bin',
|
|
144
|
-
},
|
|
145
|
-
],
|
|
146
|
-
},
|
|
147
|
-
} as any,
|
|
148
|
-
'DeviceFirmwareUpdateStatusGet'
|
|
149
|
-
)
|
|
150
|
-
).resolves.toMatchObject({ type: 'DeviceFirmwareUpdateStatus' });
|
|
151
|
-
|
|
152
|
-
expect(log.messages.at(-1)?.message).toEqual([
|
|
153
|
-
'_filterCommonTypes: ',
|
|
154
|
-
{
|
|
155
|
-
request: 'DeviceFirmwareUpdateStatusGet',
|
|
156
|
-
response: {
|
|
157
|
-
type: 'DeviceFirmwareUpdateStatus',
|
|
158
|
-
message: {
|
|
159
|
-
records: [
|
|
160
|
-
{
|
|
161
|
-
target_id: 4,
|
|
162
|
-
status: 2,
|
|
163
|
-
payload_version: 0x010203,
|
|
164
|
-
path: 'vol0:/application_p1.bin',
|
|
165
|
-
},
|
|
166
|
-
],
|
|
167
|
-
},
|
|
168
|
-
},
|
|
169
|
-
},
|
|
170
|
-
]);
|
|
171
|
-
});
|
|
172
|
-
|
|
173
128
|
it('maps an invalid DeviceSessionGet resume to WalletSessionInvalid', async () => {
|
|
174
129
|
const commands = createCommands();
|
|
175
130
|
|
|
@@ -3,8 +3,6 @@ import { registerHardwareUiEventListeners } from '../src/core/deviceEventRegistr
|
|
|
3
3
|
|
|
4
4
|
const handlers = {
|
|
5
5
|
pin: jest.fn(),
|
|
6
|
-
pinOnDevice: jest.fn(),
|
|
7
|
-
pinOnDeviceComplete: jest.fn(),
|
|
8
6
|
button: jest.fn(),
|
|
9
7
|
passphrase: jest.fn(),
|
|
10
8
|
passphraseOnDevice: jest.fn(),
|
|
@@ -23,8 +21,6 @@ describe('hardware UI event registration', () => {
|
|
|
23
21
|
expect(registerHardwareUiEventListeners(device as any, handlers)).toBe(true);
|
|
24
22
|
expect(device.on.mock.calls.map(([type]) => type)).toEqual([
|
|
25
23
|
DEVICE.PIN,
|
|
26
|
-
DEVICE.PIN_ON_DEVICE,
|
|
27
|
-
DEVICE.PIN_ON_DEVICE_COMPLETE,
|
|
28
24
|
DEVICE.BUTTON,
|
|
29
25
|
DEVICE.PASSPHRASE,
|
|
30
26
|
DEVICE.PASSPHRASE_ON_DEVICE,
|
|
@@ -38,8 +34,6 @@ describe('hardware UI event registration', () => {
|
|
|
38
34
|
expect(registerHardwareUiEventListeners(device as any, handlers)).toBe(true);
|
|
39
35
|
expect(device.on.mock.calls.map(([type]) => type)).toEqual([
|
|
40
36
|
DEVICE.PIN,
|
|
41
|
-
DEVICE.PIN_ON_DEVICE,
|
|
42
|
-
DEVICE.PIN_ON_DEVICE_COMPLETE,
|
|
43
37
|
DEVICE.BUTTON,
|
|
44
38
|
DEVICE.PASSPHRASE,
|
|
45
39
|
DEVICE.PASSPHRASE_ON_DEVICE,
|
|
@@ -5,7 +5,6 @@ import CheckAllFirmwareRelease, {
|
|
|
5
5
|
} from '../src/api/CheckAllFirmwareRelease';
|
|
6
6
|
import { DataManager } from '../src/data-manager';
|
|
7
7
|
import { createCoreApi } from '../src/inject';
|
|
8
|
-
import { PROTOCOL_V2_RESOURCE_DEVICE_PATHS } from '../src/protocols/protocol-v2/resources';
|
|
9
8
|
|
|
10
9
|
import type { CoreApi } from '../src/types/api';
|
|
11
10
|
import type { DeviceStateVersions, IFirmwareReleaseInfo } from '../src/types';
|
|
@@ -73,74 +72,7 @@ const release: IFirmwareReleaseInfo = {
|
|
|
73
72
|
],
|
|
74
73
|
};
|
|
75
74
|
|
|
76
|
-
const stableResources = ['images', 'animation', 'wallpaper', 'translations', 'roobert', 'noto'].map(
|
|
77
|
-
(type, index) => ({
|
|
78
|
-
type,
|
|
79
|
-
url: `https://example.com/${type}.okpkg`,
|
|
80
|
-
size: 0x52a0 + index + 1,
|
|
81
|
-
fileHash: 'a'.repeat(64),
|
|
82
|
-
headerHash: index.toString(16).padStart(128, '0'),
|
|
83
|
-
})
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
const createFilesystemTypedCall = (missingAll = false) => {
|
|
87
|
-
const resourceByPath = new Map(
|
|
88
|
-
stableResources.map(resource => [
|
|
89
|
-
PROTOCOL_V2_RESOURCE_DEVICE_PATHS[
|
|
90
|
-
resource.type as keyof typeof PROTOCOL_V2_RESOURCE_DEVICE_PATHS
|
|
91
|
-
],
|
|
92
|
-
resource,
|
|
93
|
-
])
|
|
94
|
-
);
|
|
95
|
-
return jest.fn((requestType: string, _responseType: string, payload: Record<string, any>) => {
|
|
96
|
-
if (requestType === 'ResourceInventoryGet') {
|
|
97
|
-
throw new Error('ResourceInventoryGet is unavailable on released firmware');
|
|
98
|
-
}
|
|
99
|
-
if (requestType === 'FilesystemPathInfoQuery') {
|
|
100
|
-
const resource = resourceByPath.get(payload.path);
|
|
101
|
-
return {
|
|
102
|
-
message: {
|
|
103
|
-
exist: Boolean(resource) && !missingAll,
|
|
104
|
-
directory: false,
|
|
105
|
-
size: missingAll ? 0 : resource?.size,
|
|
106
|
-
},
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
if (requestType === 'FilesystemFileRead') {
|
|
110
|
-
const resource = resourceByPath.get(payload.file.path);
|
|
111
|
-
if (!resource || missingAll) throw new Error('missing resource');
|
|
112
|
-
const header = new Uint8Array(0x52a0);
|
|
113
|
-
const view = new DataView(header.buffer);
|
|
114
|
-
'OKPP'.split('').forEach((char, index) => {
|
|
115
|
-
header[index] = char.charCodeAt(0);
|
|
116
|
-
});
|
|
117
|
-
'RESC'.split('').forEach((char, index) => {
|
|
118
|
-
header[0x08 + index] = char.charCodeAt(0);
|
|
119
|
-
});
|
|
120
|
-
view.setUint32(0x0c, header.byteLength, true);
|
|
121
|
-
for (let index = 0; index < resource.headerHash.length / 2; index++) {
|
|
122
|
-
header[0x240 + index] = Number.parseInt(
|
|
123
|
-
resource.headerHash.slice(index * 2, index * 2 + 2),
|
|
124
|
-
16
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
const offset = Number(payload.file.offset);
|
|
128
|
-
const chunkLength = Number(payload.chunk_len);
|
|
129
|
-
return {
|
|
130
|
-
message: {
|
|
131
|
-
data: header.slice(offset, offset + chunkLength),
|
|
132
|
-
},
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
throw new Error(`Unexpected request: ${requestType}`);
|
|
136
|
-
});
|
|
137
|
-
};
|
|
138
|
-
|
|
139
75
|
describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
140
|
-
afterEach(() => {
|
|
141
|
-
jest.restoreAllMocks();
|
|
142
|
-
});
|
|
143
|
-
|
|
144
76
|
test('builds ordered firmwareUpdateV4 targets from recommended component versions', () => {
|
|
145
77
|
const result = buildProtocolV2FirmwareRelease({
|
|
146
78
|
currentVersions,
|
|
@@ -152,7 +84,7 @@ describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
|
152
84
|
status: 'required',
|
|
153
85
|
hasUpgrade: true,
|
|
154
86
|
required: true,
|
|
155
|
-
targetsToUpdate: ['boot', 'app_v1'],
|
|
87
|
+
targetsToUpdate: ['boot', 'app_v1', 'resource'],
|
|
156
88
|
components: [
|
|
157
89
|
{ configKey: 'bootloader', status: 'outdated', updateTarget: 'boot' },
|
|
158
90
|
{ configKey: 'applicationP1', status: 'outdated', updateTarget: 'app_v1' },
|
|
@@ -210,7 +142,6 @@ describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
|
210
142
|
applicationP1Hash: 'aa'.repeat(32),
|
|
211
143
|
applicationP2Hash: 'bb'.repeat(32),
|
|
212
144
|
},
|
|
213
|
-
checkFirmwareHash: true,
|
|
214
145
|
remotePayloadHashes: {
|
|
215
146
|
applicationP1: 'aa'.repeat(64),
|
|
216
147
|
applicationP2: 'cc'.repeat(64),
|
|
@@ -229,37 +160,6 @@ describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
|
229
160
|
});
|
|
230
161
|
});
|
|
231
162
|
|
|
232
|
-
test('uses version-only comparison for same-version packages by default', () => {
|
|
233
|
-
const packageSet: IFirmwareReleaseInfo = {
|
|
234
|
-
...release,
|
|
235
|
-
required: false,
|
|
236
|
-
resourceBundles: undefined,
|
|
237
|
-
installOrder: ['applicationP1'],
|
|
238
|
-
components: {
|
|
239
|
-
applicationP1: {
|
|
240
|
-
target: 'APPLICATION_P1',
|
|
241
|
-
version: [1, 0, 0],
|
|
242
|
-
url: 'https://example.com/application-p1.okpkg',
|
|
243
|
-
payloadHash: 'cc'.repeat(64),
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
expect(
|
|
249
|
-
buildProtocolV2FirmwareRelease({
|
|
250
|
-
currentVersions: { ...currentVersions, applicationP1: '1.0.0' },
|
|
251
|
-
currentVerification: { applicationP1Hash: 'aa'.repeat(32) },
|
|
252
|
-
firmwareType: EFirmwareType.Universal,
|
|
253
|
-
release: packageSet,
|
|
254
|
-
})
|
|
255
|
-
).toMatchObject({
|
|
256
|
-
status: 'valid',
|
|
257
|
-
hasUpgrade: false,
|
|
258
|
-
targetsToUpdate: [],
|
|
259
|
-
components: [{ configKey: 'applicationP1', status: 'valid' }],
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
|
|
263
163
|
test('keeps same-version hash-aware components unknown without metadata payloadHash', () => {
|
|
264
164
|
const packageSet: IFirmwareReleaseInfo = {
|
|
265
165
|
...release,
|
|
@@ -280,7 +180,6 @@ describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
|
280
180
|
buildProtocolV2FirmwareRelease({
|
|
281
181
|
currentVersions: { ...currentVersions, applicationP1: '1.0.0' },
|
|
282
182
|
currentVerification: { applicationP1Hash: 'aa'.repeat(32) },
|
|
283
|
-
checkFirmwareHash: true,
|
|
284
183
|
firmwareType: EFirmwareType.Universal,
|
|
285
184
|
release: packageSet,
|
|
286
185
|
})
|
|
@@ -316,7 +215,6 @@ describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
|
316
215
|
const result = buildProtocolV2FirmwareRelease({
|
|
317
216
|
currentVersions,
|
|
318
217
|
currentVerification: { applicationP1Hash: 'aa'.repeat(32) },
|
|
319
|
-
checkFirmwareHash: true,
|
|
320
218
|
remotePayloadHashes: { applicationP1: 'cc'.repeat(64) },
|
|
321
219
|
firmwareType: EFirmwareType.Universal,
|
|
322
220
|
release: packageSet,
|
|
@@ -325,7 +223,7 @@ describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
|
325
223
|
expect(result.targetsToUpdate).toEqual(['app_v1', 'app_v2']);
|
|
326
224
|
});
|
|
327
225
|
|
|
328
|
-
test('
|
|
226
|
+
test('uses the existing method on Protocol V2 and keeps its public API name', async () => {
|
|
329
227
|
const method = new CheckAllFirmwareRelease({
|
|
330
228
|
id: 1,
|
|
331
229
|
payload: {
|
|
@@ -342,7 +240,6 @@ describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
|
342
240
|
status: { mode: 'normal' },
|
|
343
241
|
versions: currentVersions,
|
|
344
242
|
});
|
|
345
|
-
const typedCall = createFilesystemTypedCall(true);
|
|
346
243
|
method.device = {
|
|
347
244
|
isProtocolV2: () => true,
|
|
348
245
|
features: {
|
|
@@ -350,124 +247,32 @@ describe('checkAllFirmwareRelease Protocol V2 support', () => {
|
|
|
350
247
|
firmwareVersion: '1.0.0',
|
|
351
248
|
},
|
|
352
249
|
getDeviceState,
|
|
353
|
-
getCommands: () => ({ typedCall }),
|
|
354
250
|
} as unknown as CheckAllFirmwareRelease['device'];
|
|
355
251
|
jest.spyOn(DataManager, 'getFirmwareLatestRelease').mockReturnValue(release);
|
|
356
|
-
jest.spyOn(DataManager, 'getProtocolV2Resources').mockReturnValue(stableResources as any);
|
|
357
252
|
|
|
358
253
|
await expect(method.run()).resolves.toMatchObject({
|
|
359
254
|
protocol: 'V2',
|
|
360
255
|
deviceType: 'pro2',
|
|
361
256
|
status: 'required',
|
|
362
|
-
|
|
363
|
-
targetsToUpdate: ['boot', 'app_v1'],
|
|
257
|
+
targetsToUpdate: ['boot', 'app_v1', 'resource'],
|
|
364
258
|
firmware: {
|
|
365
259
|
status: 'required',
|
|
366
260
|
},
|
|
367
261
|
});
|
|
368
|
-
expect(typedCall).not.toHaveBeenCalled();
|
|
369
|
-
expect(getDeviceState).toHaveBeenCalledWith({
|
|
370
|
-
refreshSections: ['identity', 'versions'],
|
|
371
|
-
});
|
|
372
262
|
expect(method.getSupportedProtocols()).toEqual(['V1', 'V2']);
|
|
373
263
|
});
|
|
374
264
|
|
|
375
|
-
test('requests and compares firmware hashes only when explicitly enabled', async () => {
|
|
376
|
-
const packageSet: IFirmwareReleaseInfo = {
|
|
377
|
-
...release,
|
|
378
|
-
required: false,
|
|
379
|
-
resourceBundles: undefined,
|
|
380
|
-
installOrder: ['applicationP1'],
|
|
381
|
-
components: {
|
|
382
|
-
applicationP1: {
|
|
383
|
-
target: 'APPLICATION_P1',
|
|
384
|
-
version: [1, 0, 0],
|
|
385
|
-
url: 'https://example.com/application-p1.okpkg',
|
|
386
|
-
payloadHash: 'cc'.repeat(64),
|
|
387
|
-
},
|
|
388
|
-
},
|
|
389
|
-
};
|
|
390
|
-
const method = new CheckAllFirmwareRelease({
|
|
391
|
-
id: 1,
|
|
392
|
-
payload: {
|
|
393
|
-
method: 'checkAllFirmwareRelease',
|
|
394
|
-
firmwareType: EFirmwareType.Universal,
|
|
395
|
-
checkFirmwareHash: true,
|
|
396
|
-
},
|
|
397
|
-
});
|
|
398
|
-
method.init();
|
|
399
|
-
const getDeviceState = jest.fn().mockResolvedValue({
|
|
400
|
-
identity: { deviceType: 'pro2', firmwareType: EFirmwareType.Universal },
|
|
401
|
-
status: { mode: 'normal' },
|
|
402
|
-
versions: { ...currentVersions, applicationP1: '1.0.0' },
|
|
403
|
-
verification: { applicationP1Hash: 'aa'.repeat(32) },
|
|
404
|
-
});
|
|
405
|
-
method.device = {
|
|
406
|
-
isProtocolV2: () => true,
|
|
407
|
-
features: { deviceType: 'pro2', firmwareVersion: '1.0.0' },
|
|
408
|
-
getDeviceState,
|
|
409
|
-
getCommands: () => ({ typedCall: jest.fn() }),
|
|
410
|
-
} as unknown as CheckAllFirmwareRelease['device'];
|
|
411
|
-
jest.spyOn(DataManager, 'getFirmwareLatestRelease').mockReturnValue(packageSet);
|
|
412
|
-
jest.spyOn(DataManager, 'getProtocolV2Resources').mockReturnValue(undefined);
|
|
413
|
-
|
|
414
|
-
await expect(method.run()).resolves.toMatchObject({
|
|
415
|
-
status: 'outdated',
|
|
416
|
-
targetsToUpdate: ['app_v1'],
|
|
417
|
-
});
|
|
418
|
-
expect(getDeviceState).toHaveBeenCalledWith({
|
|
419
|
-
refreshSections: ['identity', 'versions', 'verification'],
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
test.each(['bootloader', 'romloader'] as const)(
|
|
424
|
-
'uses filesystem inventory in %s mode instead of forcing all resources',
|
|
425
|
-
async mode => {
|
|
426
|
-
const method = new CheckAllFirmwareRelease({
|
|
427
|
-
id: 1,
|
|
428
|
-
payload: {
|
|
429
|
-
method: 'checkAllFirmwareRelease',
|
|
430
|
-
firmwareType: EFirmwareType.Universal,
|
|
431
|
-
},
|
|
432
|
-
});
|
|
433
|
-
method.init();
|
|
434
|
-
const typedCall = createFilesystemTypedCall();
|
|
435
|
-
method.device = {
|
|
436
|
-
isProtocolV2: () => true,
|
|
437
|
-
features: { deviceType: 'pro2', firmwareVersion: '1.0.0' },
|
|
438
|
-
getDeviceState: jest.fn().mockResolvedValue({
|
|
439
|
-
identity: { deviceType: 'pro2', firmwareType: EFirmwareType.Universal },
|
|
440
|
-
status: { mode },
|
|
441
|
-
versions: currentVersions,
|
|
442
|
-
}),
|
|
443
|
-
getCommands: () => ({ typedCall }),
|
|
444
|
-
} as unknown as CheckAllFirmwareRelease['device'];
|
|
445
|
-
jest.spyOn(DataManager, 'getFirmwareLatestRelease').mockReturnValue(release);
|
|
446
|
-
jest.spyOn(DataManager, 'getProtocolV2Resources').mockReturnValue(stableResources as any);
|
|
447
|
-
|
|
448
|
-
await expect(method.run()).resolves.toMatchObject({
|
|
449
|
-
protocol: 'V2',
|
|
450
|
-
resourceStatus: 'valid',
|
|
451
|
-
targetsToUpdate: ['boot', 'app_v1'],
|
|
452
|
-
});
|
|
453
|
-
expect(typedCall.mock.calls.some(call => call[0] === 'ResourceInventoryGet')).toBe(false);
|
|
454
|
-
expect(typedCall.mock.calls.some(call => call[0] === 'FilesystemFileRead')).toBe(true);
|
|
455
|
-
}
|
|
456
|
-
);
|
|
457
|
-
|
|
458
265
|
test('continues forwarding the existing public method', async () => {
|
|
459
266
|
const call = jest.fn().mockResolvedValue({ success: true, payload: {} });
|
|
460
267
|
const api = createCoreApi(call as CoreApi['call']) as CoreApi;
|
|
461
268
|
|
|
462
269
|
await api.checkAllFirmwareRelease('pro2-connect-id', {
|
|
463
|
-
checkFirmwareHash: true,
|
|
464
270
|
firmwareType: EFirmwareType.Universal,
|
|
465
271
|
retryCount: 0,
|
|
466
272
|
});
|
|
467
273
|
|
|
468
274
|
expect(call).toHaveBeenCalledWith({
|
|
469
275
|
connectId: 'pro2-connect-id',
|
|
470
|
-
checkFirmwareHash: true,
|
|
471
276
|
firmwareType: EFirmwareType.Universal,
|
|
472
277
|
retryCount: 0,
|
|
473
278
|
method: 'checkAllFirmwareRelease',
|
|
@@ -1,19 +1,61 @@
|
|
|
1
|
+
import DataManager from '../src/data-manager/DataManager';
|
|
1
2
|
import { parseConnectSettings } from '../src/data-manager/connectSettings';
|
|
2
3
|
|
|
4
|
+
import type { RemoteConfigResponse } from '../src/types';
|
|
5
|
+
|
|
6
|
+
jest.mock('axios', () => ({
|
|
7
|
+
get: jest.fn(),
|
|
8
|
+
}));
|
|
9
|
+
|
|
3
10
|
jest.mock('../src/data/config', () => ({
|
|
4
11
|
getSDKVersion: jest.fn(() => '1.0.0'),
|
|
5
12
|
DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
|
|
6
13
|
}));
|
|
7
14
|
|
|
15
|
+
const mockAxiosGet: jest.Mock = jest.requireMock('axios').get;
|
|
16
|
+
|
|
8
17
|
describe('parseConnectSettings', () => {
|
|
9
|
-
|
|
10
|
-
|
|
18
|
+
const preloadedConfig = {
|
|
19
|
+
bridge: {},
|
|
20
|
+
classic: { firmware: [], ble: [] },
|
|
21
|
+
classic1s: { firmware: [], ble: [] },
|
|
22
|
+
classicpure: { firmware: [], ble: [] },
|
|
23
|
+
mini: { firmware: [], ble: [] },
|
|
24
|
+
touch: { firmware: [], ble: [] },
|
|
25
|
+
pro: { firmware: [], ble: [] },
|
|
26
|
+
pro2: { firmware: [], ble: [] },
|
|
27
|
+
} as unknown as RemoteConfigResponse;
|
|
28
|
+
|
|
29
|
+
it('keeps a serializable preloaded config in parsed settings', () => {
|
|
30
|
+
const settings = parseConnectSettings({
|
|
31
|
+
firmwareManifestMode: 'sdk-managed',
|
|
32
|
+
preloadedConfig,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
expect(settings.firmwareManifestMode).toBe('sdk-managed');
|
|
36
|
+
expect(settings.preloadedConfig).toBe(preloadedConfig);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('uses the preloaded config before the SDK network client', async () => {
|
|
40
|
+
const settings = parseConnectSettings({
|
|
41
|
+
firmwareManifestMode: 'sdk-managed',
|
|
42
|
+
preloadedConfig,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
await DataManager.load(settings);
|
|
46
|
+
|
|
47
|
+
expect(mockAxiosGet).not.toHaveBeenCalled();
|
|
48
|
+
expect(DataManager.deviceMap.classic).toEqual({ firmware: [], ble: [] });
|
|
49
|
+
});
|
|
11
50
|
|
|
51
|
+
it('fails closed without a preloaded config in external-only mode', async () => {
|
|
12
52
|
const settings = parseConnectSettings({
|
|
13
|
-
|
|
14
|
-
configFetcher,
|
|
53
|
+
firmwareManifestMode: 'external-only',
|
|
15
54
|
});
|
|
16
55
|
|
|
17
|
-
expect(settings
|
|
56
|
+
await expect(DataManager.load(settings)).rejects.toThrow(
|
|
57
|
+
'External firmware config snapshot is required'
|
|
58
|
+
);
|
|
59
|
+
expect(mockAxiosGet).not.toHaveBeenCalled();
|
|
18
60
|
});
|
|
19
61
|
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Device } from '../src/device/Device';
|
|
2
|
+
import TransportManager from '../src/data-manager/TransportManager';
|
|
3
|
+
|
|
4
|
+
jest.mock('../src/data/config', () => ({
|
|
5
|
+
getSDKVersion: jest.fn(() => '1.0.0'),
|
|
6
|
+
DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
|
|
7
|
+
}));
|
|
8
|
+
|
|
9
|
+
function buildV1Device() {
|
|
10
|
+
const device = Object.create(Device.prototype) as Device;
|
|
11
|
+
const typedCall = jest.fn(() => Promise.resolve({ message: { device_id: 'device' } }));
|
|
12
|
+
Object.assign(device, {
|
|
13
|
+
commands: { typedCall },
|
|
14
|
+
stateStore: { getState: () => undefined },
|
|
15
|
+
isProtocolV2: () => false,
|
|
16
|
+
_updateFeatures: jest.fn(),
|
|
17
|
+
getInternalState: jest.fn(() => undefined),
|
|
18
|
+
});
|
|
19
|
+
return { device, typedCall };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
describe('Device.initialize Protocol V1 timeout', () => {
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
jest.spyOn(TransportManager, 'reconfigure').mockResolvedValue(undefined);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
jest.restoreAllMocks();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('passes a custom Initialize timeout through to typedCall', async () => {
|
|
32
|
+
const { device, typedCall } = buildV1Device();
|
|
33
|
+
|
|
34
|
+
await device.initialize({ timeoutMs: 2500 });
|
|
35
|
+
|
|
36
|
+
expect(typedCall).toHaveBeenCalledWith(
|
|
37
|
+
'Initialize',
|
|
38
|
+
'Features',
|
|
39
|
+
expect.objectContaining({ is_contains_attach: true }),
|
|
40
|
+
{ timeoutMs: 2500 }
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('keeps the 25s Initialize timeout by default', async () => {
|
|
45
|
+
const { device, typedCall } = buildV1Device();
|
|
46
|
+
|
|
47
|
+
await device.initialize();
|
|
48
|
+
|
|
49
|
+
expect(typedCall).toHaveBeenCalledWith(
|
|
50
|
+
'Initialize',
|
|
51
|
+
'Features',
|
|
52
|
+
expect.objectContaining({ is_contains_attach: true }),
|
|
53
|
+
{ timeoutMs: 25 * 1000 }
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
});
|