execbro 1.11.1 → 2.1.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/README.md +4 -4
- package/build/__tests__/unit/appContext.test.d.ts +2 -0
- package/build/__tests__/unit/appContext.test.d.ts.map +1 -0
- package/build/__tests__/unit/appContext.test.js +70 -0
- package/build/__tests__/unit/appContext.test.js.map +1 -0
- package/build/__tests__/unit/appRequest.test.d.ts +2 -0
- package/build/__tests__/unit/appRequest.test.d.ts.map +1 -0
- package/build/__tests__/unit/appRequest.test.js +179 -0
- package/build/__tests__/unit/appRequest.test.js.map +1 -0
- package/build/__tests__/unit/contextWiring.test.d.ts +2 -0
- package/build/__tests__/unit/contextWiring.test.d.ts.map +1 -0
- package/build/__tests__/unit/contextWiring.test.js +28 -0
- package/build/__tests__/unit/contextWiring.test.js.map +1 -0
- package/build/__tests__/unit/coordinateMiss.test.d.ts +2 -0
- package/build/__tests__/unit/coordinateMiss.test.d.ts.map +1 -0
- package/build/__tests__/unit/coordinateMiss.test.js +111 -0
- package/build/__tests__/unit/coordinateMiss.test.js.map +1 -0
- package/build/__tests__/unit/deviceResolverStaleRetry.test.d.ts +2 -0
- package/build/__tests__/unit/deviceResolverStaleRetry.test.d.ts.map +1 -0
- package/build/__tests__/unit/deviceResolverStaleRetry.test.js +69 -0
- package/build/__tests__/unit/deviceResolverStaleRetry.test.js.map +1 -0
- package/build/__tests__/unit/epochRender.test.d.ts +2 -0
- package/build/__tests__/unit/epochRender.test.d.ts.map +1 -0
- package/build/__tests__/unit/epochRender.test.js +60 -0
- package/build/__tests__/unit/epochRender.test.js.map +1 -0
- package/build/__tests__/unit/executeBudget.test.d.ts +2 -0
- package/build/__tests__/unit/executeBudget.test.d.ts.map +1 -0
- package/build/__tests__/unit/executeBudget.test.js +27 -0
- package/build/__tests__/unit/executeBudget.test.js.map +1 -0
- package/build/__tests__/unit/executor.test.js +48 -6
- package/build/__tests__/unit/executor.test.js.map +1 -1
- package/build/__tests__/unit/findElementTreeReuse.test.d.ts +2 -0
- package/build/__tests__/unit/findElementTreeReuse.test.d.ts.map +1 -0
- package/build/__tests__/unit/findElementTreeReuse.test.js +77 -0
- package/build/__tests__/unit/findElementTreeReuse.test.js.map +1 -0
- package/build/__tests__/unit/getLogsEmptyContract.test.js +4 -3
- package/build/__tests__/unit/getLogsEmptyContract.test.js.map +1 -1
- package/build/__tests__/unit/getLogsNativeSource.test.js +7 -8
- package/build/__tests__/unit/getLogsNativeSource.test.js.map +1 -1
- package/build/__tests__/unit/inspectorHarvest.test.js +1 -21
- package/build/__tests__/unit/inspectorHarvest.test.js.map +1 -1
- package/build/__tests__/unit/inspectorSource.test.js +1 -38
- package/build/__tests__/unit/inspectorSource.test.js.map +1 -1
- package/build/__tests__/unit/jsLogEvents.test.js +1 -0
- package/build/__tests__/unit/jsLogEvents.test.js.map +1 -1
- package/build/__tests__/unit/logBufferEpoch.test.d.ts +2 -0
- package/build/__tests__/unit/logBufferEpoch.test.d.ts.map +1 -0
- package/build/__tests__/unit/logBufferEpoch.test.js +63 -0
- package/build/__tests__/unit/logBufferEpoch.test.js.map +1 -0
- package/build/__tests__/unit/metro.test.js +18 -1
- package/build/__tests__/unit/metro.test.js.map +1 -1
- package/build/__tests__/unit/moduleRegistry.test.d.ts +2 -0
- package/build/__tests__/unit/moduleRegistry.test.d.ts.map +1 -0
- package/build/__tests__/unit/moduleRegistry.test.js +62 -0
- package/build/__tests__/unit/moduleRegistry.test.js.map +1 -0
- package/build/__tests__/unit/navigateVerify.test.d.ts +2 -0
- package/build/__tests__/unit/navigateVerify.test.d.ts.map +1 -0
- package/build/__tests__/unit/navigateVerify.test.js +30 -0
- package/build/__tests__/unit/navigateVerify.test.js.map +1 -0
- package/build/__tests__/unit/navigation.test.d.ts +2 -0
- package/build/__tests__/unit/navigation.test.d.ts.map +1 -0
- package/build/__tests__/unit/navigation.test.js +254 -0
- package/build/__tests__/unit/navigation.test.js.map +1 -0
- package/build/__tests__/unit/network.test.js +1 -0
- package/build/__tests__/unit/network.test.js.map +1 -1
- package/build/__tests__/unit/networkBufferEpoch.test.d.ts +2 -0
- package/build/__tests__/unit/networkBufferEpoch.test.d.ts.map +1 -0
- package/build/__tests__/unit/networkBufferEpoch.test.js +52 -0
- package/build/__tests__/unit/networkBufferEpoch.test.js.map +1 -0
- package/build/__tests__/unit/networkInterceptor.test.js +7 -7
- package/build/__tests__/unit/networkInterceptor.test.js.map +1 -1
- package/build/__tests__/unit/promiseHandles.test.d.ts +2 -0
- package/build/__tests__/unit/promiseHandles.test.d.ts.map +1 -0
- package/build/__tests__/unit/promiseHandles.test.js +61 -0
- package/build/__tests__/unit/promiseHandles.test.js.map +1 -0
- package/build/__tests__/unit/resolveBufferOffline.test.d.ts +2 -0
- package/build/__tests__/unit/resolveBufferOffline.test.d.ts.map +1 -0
- package/build/__tests__/unit/resolveBufferOffline.test.js +25 -0
- package/build/__tests__/unit/resolveBufferOffline.test.js.map +1 -0
- package/build/__tests__/unit/sdkMirrorPoller.test.d.ts +2 -0
- package/build/__tests__/unit/sdkMirrorPoller.test.d.ts.map +1 -0
- package/build/__tests__/unit/sdkMirrorPoller.test.js +118 -0
- package/build/__tests__/unit/sdkMirrorPoller.test.js.map +1 -0
- package/build/__tests__/unit/sessionEpoch.test.d.ts +2 -0
- package/build/__tests__/unit/sessionEpoch.test.d.ts.map +1 -0
- package/build/__tests__/unit/sessionEpoch.test.js +41 -0
- package/build/__tests__/unit/sessionEpoch.test.js.map +1 -0
- package/build/__tests__/unit/settleAndDiff.test.d.ts +2 -0
- package/build/__tests__/unit/settleAndDiff.test.d.ts.map +1 -0
- package/build/__tests__/unit/settleAndDiff.test.js +110 -0
- package/build/__tests__/unit/settleAndDiff.test.js.map +1 -0
- package/build/__tests__/unit/truncate.test.d.ts +2 -0
- package/build/__tests__/unit/truncate.test.d.ts.map +1 -0
- package/build/__tests__/unit/truncate.test.js +58 -0
- package/build/__tests__/unit/truncate.test.js.map +1 -0
- package/build/__tests__/unit/verifyAction.test.js +2 -1
- package/build/__tests__/unit/verifyAction.test.js.map +1 -1
- package/build/__tests__/unit/waitForMeasurements.test.d.ts +2 -0
- package/build/__tests__/unit/waitForMeasurements.test.d.ts.map +1 -0
- package/build/__tests__/unit/waitForMeasurements.test.js +69 -0
- package/build/__tests__/unit/waitForMeasurements.test.js.map +1 -0
- package/build/core/android.d.ts +3 -1
- package/build/core/android.d.ts.map +1 -1
- package/build/core/android.js +5 -5
- package/build/core/android.js.map +1 -1
- package/build/core/appContext.d.ts +53 -0
- package/build/core/appContext.d.ts.map +1 -0
- package/build/core/appContext.js +172 -0
- package/build/core/appContext.js.map +1 -0
- package/build/core/appRequest.d.ts +21 -0
- package/build/core/appRequest.d.ts.map +1 -0
- package/build/core/appRequest.js +95 -0
- package/build/core/appRequest.js.map +1 -0
- package/build/core/bufferConfig.d.ts +5 -0
- package/build/core/bufferConfig.d.ts.map +1 -0
- package/build/core/bufferConfig.js +20 -0
- package/build/core/bufferConfig.js.map +1 -0
- package/build/core/connection.d.ts.map +1 -1
- package/build/core/connection.js +29 -9
- package/build/core/connection.js.map +1 -1
- package/build/core/debugGlobals.d.ts.map +1 -1
- package/build/core/debugGlobals.js +13 -0
- package/build/core/debugGlobals.js.map +1 -1
- package/build/core/deviceDiscovery.d.ts +5 -1
- package/build/core/deviceDiscovery.d.ts.map +1 -1
- package/build/core/deviceDiscovery.js +13 -2
- package/build/core/deviceDiscovery.js.map +1 -1
- package/build/core/deviceResolver.d.ts.map +1 -1
- package/build/core/deviceResolver.js +17 -2
- package/build/core/deviceResolver.js.map +1 -1
- package/build/core/epochRender.d.ts +19 -0
- package/build/core/epochRender.d.ts.map +1 -0
- package/build/core/epochRender.js +38 -0
- package/build/core/epochRender.js.map +1 -0
- package/build/core/guides.d.ts.map +1 -1
- package/build/core/guides.js +36 -91
- package/build/core/guides.js.map +1 -1
- package/build/core/index.d.ts +2 -3
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +4 -4
- package/build/core/index.js.map +1 -1
- package/build/core/inspector.d.ts +0 -39
- package/build/core/inspector.d.ts.map +1 -1
- package/build/core/inspector.js +1 -358
- package/build/core/inspector.js.map +1 -1
- package/build/core/ios.d.ts +14 -3
- package/build/core/ios.d.ts.map +1 -1
- package/build/core/ios.js +41 -17
- package/build/core/ios.js.map +1 -1
- package/build/core/jsExecute.d.ts +15 -0
- package/build/core/jsExecute.d.ts.map +1 -1
- package/build/core/jsExecute.js +136 -29
- package/build/core/jsExecute.js.map +1 -1
- package/build/core/logs.d.ts +12 -3
- package/build/core/logs.d.ts.map +1 -1
- package/build/core/logs.js +28 -5
- package/build/core/logs.js.map +1 -1
- package/build/core/metro.d.ts +2 -0
- package/build/core/metro.d.ts.map +1 -1
- package/build/core/metro.js +16 -8
- package/build/core/metro.js.map +1 -1
- package/build/core/moduleRegistry.d.ts +19 -0
- package/build/core/moduleRegistry.d.ts.map +1 -0
- package/build/core/moduleRegistry.js +67 -0
- package/build/core/moduleRegistry.js.map +1 -0
- package/build/core/nativeOnlyHints.d.ts.map +1 -1
- package/build/core/nativeOnlyHints.js +0 -2
- package/build/core/nativeOnlyHints.js.map +1 -1
- package/build/core/navigate.d.ts +46 -0
- package/build/core/navigate.d.ts.map +1 -0
- package/build/core/navigate.js +119 -0
- package/build/core/navigate.js.map +1 -0
- package/build/core/navigation.d.ts +66 -0
- package/build/core/navigation.d.ts.map +1 -0
- package/build/core/navigation.js +269 -0
- package/build/core/navigation.js.map +1 -0
- package/build/core/network.d.ts +12 -2
- package/build/core/network.d.ts.map +1 -1
- package/build/core/network.js +52 -12
- package/build/core/network.js.map +1 -1
- package/build/core/networkInterceptor.d.ts +1 -1
- package/build/core/networkInterceptor.d.ts.map +1 -1
- package/build/core/networkInterceptor.js +3 -2
- package/build/core/networkInterceptor.js.map +1 -1
- package/build/core/pressables.d.ts +33 -0
- package/build/core/pressables.d.ts.map +1 -1
- package/build/core/pressables.js +73 -4
- package/build/core/pressables.js.map +1 -1
- package/build/core/promiseHandles.d.ts +19 -0
- package/build/core/promiseHandles.d.ts.map +1 -0
- package/build/core/promiseHandles.js +58 -0
- package/build/core/promiseHandles.js.map +1 -0
- package/build/core/register.d.ts.map +1 -1
- package/build/core/register.js +1 -4
- package/build/core/register.js.map +1 -1
- package/build/core/sdkMirrorPoller.d.ts +31 -0
- package/build/core/sdkMirrorPoller.d.ts.map +1 -0
- package/build/core/sdkMirrorPoller.js +210 -0
- package/build/core/sdkMirrorPoller.js.map +1 -0
- package/build/core/state.d.ts +14 -0
- package/build/core/state.d.ts.map +1 -1
- package/build/core/state.js +48 -2
- package/build/core/state.js.map +1 -1
- package/build/core/toolHelpers.d.ts.map +1 -1
- package/build/core/toolHelpers.js +42 -10
- package/build/core/toolHelpers.js.map +1 -1
- package/build/core/truncate.d.ts +42 -0
- package/build/core/truncate.d.ts.map +1 -0
- package/build/core/truncate.js +169 -0
- package/build/core/truncate.js.map +1 -0
- package/build/core/types.d.ts +3 -0
- package/build/core/types.d.ts.map +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -2
- package/build/index.js.map +1 -1
- package/build/pro/coordinateMiss.d.ts +55 -0
- package/build/pro/coordinateMiss.d.ts.map +1 -0
- package/build/pro/coordinateMiss.js +122 -0
- package/build/pro/coordinateMiss.js.map +1 -0
- package/build/pro/tap.d.ts +8 -0
- package/build/pro/tap.d.ts.map +1 -1
- package/build/pro/tap.js +99 -11
- package/build/pro/tap.js.map +1 -1
- package/build/pro/verifyAction.d.ts +43 -2
- package/build/pro/verifyAction.d.ts.map +1 -1
- package/build/pro/verifyAction.js +95 -36
- package/build/pro/verifyAction.js.map +1 -1
- package/build/tools/_deviceArg.d.ts +17 -1
- package/build/tools/_deviceArg.d.ts.map +1 -1
- package/build/tools/_deviceArg.js +17 -1
- package/build/tools/_deviceArg.js.map +1 -1
- package/build/tools/bundleTools.d.ts.map +1 -1
- package/build/tools/bundleTools.js +20 -33
- package/build/tools/bundleTools.js.map +1 -1
- package/build/tools/componentTools.d.ts.map +1 -1
- package/build/tools/componentTools.js +41 -219
- package/build/tools/componentTools.js.map +1 -1
- package/build/tools/connectionTools.d.ts.map +1 -1
- package/build/tools/connectionTools.js +17 -22
- package/build/tools/connectionTools.js.map +1 -1
- package/build/tools/deviceTools.d.ts.map +1 -1
- package/build/tools/deviceTools.js +13 -167
- package/build/tools/deviceTools.js.map +1 -1
- package/build/tools/executionTools.d.ts.map +1 -1
- package/build/tools/executionTools.js +63 -18
- package/build/tools/executionTools.js.map +1 -1
- package/build/tools/interactionTools.d.ts +6 -0
- package/build/tools/interactionTools.d.ts.map +1 -1
- package/build/tools/interactionTools.js +41 -56
- package/build/tools/interactionTools.js.map +1 -1
- package/build/tools/logTools.d.ts.map +1 -1
- package/build/tools/logTools.js +61 -80
- package/build/tools/logTools.js.map +1 -1
- package/build/tools/metaTools.js +1 -1
- package/build/tools/metaTools.js.map +1 -1
- package/build/tools/navigationTools.d.ts +3 -0
- package/build/tools/navigationTools.d.ts.map +1 -0
- package/build/tools/navigationTools.js +60 -0
- package/build/tools/navigationTools.js.map +1 -0
- package/build/tools/networkTools.d.ts.map +1 -1
- package/build/tools/networkTools.js +44 -202
- package/build/tools/networkTools.js.map +1 -1
- package/build/tools/reduxTools.d.ts.map +1 -1
- package/build/tools/reduxTools.js +3 -2
- package/build/tools/reduxTools.js.map +1 -1
- package/build/tools/requestTools.d.ts +3 -0
- package/build/tools/requestTools.d.ts.map +1 -0
- package/build/tools/requestTools.js +79 -0
- package/build/tools/requestTools.js.map +1 -0
- package/build/tools/screenshotTools.d.ts.map +1 -1
- package/build/tools/screenshotTools.js +42 -25
- package/build/tools/screenshotTools.js.map +1 -1
- package/package.json +1 -1
- package/tools.json +22 -78
- package/build/__tests__/unit/flowpoints.test.d.ts +0 -2
- package/build/__tests__/unit/flowpoints.test.d.ts.map +0 -1
- package/build/__tests__/unit/flowpoints.test.js +0 -126
- package/build/__tests__/unit/flowpoints.test.js.map +0 -1
- package/build/__tests__/unit/flowpointsQuery.test.d.ts +0 -2
- package/build/__tests__/unit/flowpointsQuery.test.d.ts.map +0 -1
- package/build/__tests__/unit/flowpointsQuery.test.js +0 -91
- package/build/__tests__/unit/flowpointsQuery.test.js.map +0 -1
- package/build/__tests__/unit/selectionPoller.test.d.ts +0 -2
- package/build/__tests__/unit/selectionPoller.test.d.ts.map +0 -1
- package/build/__tests__/unit/selectionPoller.test.js +0 -109
- package/build/__tests__/unit/selectionPoller.test.js.map +0 -1
- package/build/__tests__/unit/verifyFlow.test.d.ts +0 -2
- package/build/__tests__/unit/verifyFlow.test.d.ts.map +0 -1
- package/build/__tests__/unit/verifyFlow.test.js +0 -45
- package/build/__tests__/unit/verifyFlow.test.js.map +0 -1
- package/build/core/selectionPoller.d.ts +0 -13
- package/build/core/selectionPoller.d.ts.map +0 -1
- package/build/core/selectionPoller.js +0 -102
- package/build/core/selectionPoller.js.map +0 -1
- package/build/pro/flowpointTools.d.ts +0 -4
- package/build/pro/flowpointTools.d.ts.map +0 -1
- package/build/pro/flowpointTools.js +0 -266
- package/build/pro/flowpointTools.js.map +0 -1
- package/build/pro/flowpoints.d.ts +0 -86
- package/build/pro/flowpoints.d.ts.map +0 -1
- package/build/pro/flowpoints.js +0 -283
- package/build/pro/flowpoints.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkBufferEpoch.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/networkBufferEpoch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,7 +32,7 @@ describe("applyInterceptedEvent", () => {
|
|
|
32
32
|
url: "https://api.example.com/data",
|
|
33
33
|
timestamp: 1700000000000,
|
|
34
34
|
});
|
|
35
|
-
applyInterceptedEvent(json, buffer);
|
|
35
|
+
applyInterceptedEvent(json, buffer, "dev");
|
|
36
36
|
expect(buffer.size).toBe(1);
|
|
37
37
|
const entry = buffer.get("js-ab12-1");
|
|
38
38
|
expect(entry).toBeDefined();
|
|
@@ -48,7 +48,7 @@ describe("applyInterceptedEvent", () => {
|
|
|
48
48
|
method: "GET",
|
|
49
49
|
url: "https://api.example.com/users",
|
|
50
50
|
timestamp: 1700000000000,
|
|
51
|
-
}), buffer);
|
|
51
|
+
}), buffer, "dev");
|
|
52
52
|
// Then apply the response
|
|
53
53
|
applyInterceptedEvent(JSON.stringify({
|
|
54
54
|
type: "response",
|
|
@@ -56,7 +56,7 @@ describe("applyInterceptedEvent", () => {
|
|
|
56
56
|
status: 200,
|
|
57
57
|
statusText: "OK",
|
|
58
58
|
duration: 150,
|
|
59
|
-
}), buffer);
|
|
59
|
+
}), buffer, "dev");
|
|
60
60
|
expect(buffer.size).toBe(1);
|
|
61
61
|
const entry = buffer.get("js-ab12-2");
|
|
62
62
|
expect(entry).toBeDefined();
|
|
@@ -72,13 +72,13 @@ describe("applyInterceptedEvent", () => {
|
|
|
72
72
|
method: "GET",
|
|
73
73
|
url: "https://api.example.com/fail",
|
|
74
74
|
timestamp: 1700000000000,
|
|
75
|
-
}), buffer);
|
|
75
|
+
}), buffer, "dev");
|
|
76
76
|
applyInterceptedEvent(JSON.stringify({
|
|
77
77
|
type: "error",
|
|
78
78
|
id: "js-ab12-3",
|
|
79
79
|
error: "Network request failed",
|
|
80
80
|
duration: 50,
|
|
81
|
-
}), buffer);
|
|
81
|
+
}), buffer, "dev");
|
|
82
82
|
expect(buffer.size).toBe(1);
|
|
83
83
|
const entry = buffer.get("js-ab12-3");
|
|
84
84
|
expect(entry).toBeDefined();
|
|
@@ -87,7 +87,7 @@ describe("applyInterceptedEvent", () => {
|
|
|
87
87
|
expect(entry.timing?.duration).toBe(50);
|
|
88
88
|
});
|
|
89
89
|
it("invalid JSON is silently ignored", () => {
|
|
90
|
-
applyInterceptedEvent("not valid json{{{", buffer);
|
|
90
|
+
applyInterceptedEvent("not valid json{{{", buffer, "dev");
|
|
91
91
|
expect(buffer.size).toBe(0);
|
|
92
92
|
});
|
|
93
93
|
it("response without matching request is silently ignored", () => {
|
|
@@ -97,7 +97,7 @@ describe("applyInterceptedEvent", () => {
|
|
|
97
97
|
status: 200,
|
|
98
98
|
statusText: "OK",
|
|
99
99
|
duration: 100,
|
|
100
|
-
}), buffer);
|
|
100
|
+
}), buffer, "dev");
|
|
101
101
|
expect(buffer.size).toBe(0);
|
|
102
102
|
});
|
|
103
103
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"networkInterceptor.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/networkInterceptor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACH,kBAAkB,EAClB,qBAAqB,GACxB,MAAM,kCAAkC,CAAC;AAE1C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,gFAAgF,CAAC;QAC9F,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACnC,IAAI,MAAqB,CAAC;IAE1B,UAAU,CAAC,GAAG,EAAE;QACZ,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YACxB,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,WAAW;YACf,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,8BAA8B;YACnC,SAAS,EAAE,aAAa;SAC3B,CAAC,CAAC;QAEH,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"networkInterceptor.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/networkInterceptor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACH,kBAAkB,EAClB,qBAAqB,GACxB,MAAM,kCAAkC,CAAC;AAE1C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,gFAAgF,CAAC;QAC9F,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACnC,IAAI,MAAqB,CAAC;IAE1B,UAAU,CAAC,GAAG,EAAE;QACZ,MAAM,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YACxB,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,WAAW;YACf,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,8BAA8B;YACnC,SAAS,EAAE,aAAa;SAC3B,CAAC,CAAC;QAEH,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,KAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACxD,MAAM,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,2BAA2B;QAC3B,qBAAqB,CACjB,IAAI,CAAC,SAAS,CAAC;YACX,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,WAAW;YACf,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,+BAA+B;YACpC,SAAS,EAAE,aAAa;SAC3B,CAAC,EACF,MAAM,EACN,KAAK,CACR,CAAC;QAEF,0BAA0B;QAC1B,qBAAqB,CACjB,IAAI,CAAC,SAAS,CAAC;YACX,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,WAAW;YACf,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,GAAG;SAChB,CAAC,EACF,MAAM,EACN,KAAK,CACR,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,KAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC7C,qBAAqB,CACjB,IAAI,CAAC,SAAS,CAAC;YACX,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,WAAW;YACf,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,8BAA8B;YACnC,SAAS,EAAE,aAAa;SAC3B,CAAC,EACF,MAAM,EACN,KAAK,CACR,CAAC;QAEF,qBAAqB,CACjB,IAAI,CAAC,SAAS,CAAC;YACX,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,WAAW;YACf,KAAK,EAAE,wBAAwB;YAC/B,QAAQ,EAAE,EAAE;SACf,CAAC,EACF,MAAM,EACN,KAAK,CACR,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACpD,MAAM,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,qBAAqB,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC7D,qBAAqB,CACjB,IAAI,CAAC,SAAS,CAAC;YACX,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,kBAAkB;YACtB,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,GAAG;SAChB,CAAC,EACF,MAAM,EACN,KAAK,CACR,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promiseHandles.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/promiseHandles.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "@jest/globals";
|
|
2
|
+
import { registerHandle, listHandles, dropHandle, clearHandlesForDevice, buildCollectExpression } from "../../core/promiseHandles.js";
|
|
3
|
+
describe("promise handles", () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
clearHandlesForDevice("iPhone Air");
|
|
6
|
+
clearHandlesForDevice("pixel");
|
|
7
|
+
});
|
|
8
|
+
it("records a handle per device", () => {
|
|
9
|
+
registerHandle("iPhone Air", "__rn_dbg_1_abc");
|
|
10
|
+
expect(listHandles("iPhone Air")).toContain("__rn_dbg_1_abc");
|
|
11
|
+
expect(listHandles("pixel")).toHaveLength(0);
|
|
12
|
+
});
|
|
13
|
+
it("drops a handle once collected", () => {
|
|
14
|
+
registerHandle("iPhone Air", "__rn_dbg_1_abc");
|
|
15
|
+
dropHandle("__rn_dbg_1_abc");
|
|
16
|
+
expect(listHandles("iPhone Air")).toHaveLength(0);
|
|
17
|
+
});
|
|
18
|
+
it("clears every handle for a device on reload", () => {
|
|
19
|
+
registerHandle("iPhone Air", "a");
|
|
20
|
+
registerHandle("iPhone Air", "b");
|
|
21
|
+
clearHandlesForDevice("iPhone Air");
|
|
22
|
+
expect(listHandles("iPhone Air")).toHaveLength(0);
|
|
23
|
+
});
|
|
24
|
+
it("treats handles as dead after a device reset", () => {
|
|
25
|
+
registerHandle("iPhone Air", "gone");
|
|
26
|
+
clearHandlesForDevice("iPhone Air");
|
|
27
|
+
expect(listHandles("iPhone Air")).not.toContain("gone");
|
|
28
|
+
});
|
|
29
|
+
it("builds ES5 collect source that deletes the slot when settled", () => {
|
|
30
|
+
const src = buildCollectExpression("__rn_dbg_1_abc");
|
|
31
|
+
expect(src).toContain("__rn_dbg_1_abc");
|
|
32
|
+
expect(src).toContain("delete");
|
|
33
|
+
expect(src).not.toMatch(/=>|\bconst\b|\blet\b/);
|
|
34
|
+
});
|
|
35
|
+
it("collect source reports pending without deleting the slot", () => {
|
|
36
|
+
const src = buildCollectExpression("slot1");
|
|
37
|
+
const run = new Function("globalThis", "return " + src + ";");
|
|
38
|
+
const g = { slot1: { s: "pending" } };
|
|
39
|
+
expect(run(g)).toBe("__pending__");
|
|
40
|
+
expect(g.slot1).toBeDefined();
|
|
41
|
+
});
|
|
42
|
+
it("collect source returns and clears a settled value", () => {
|
|
43
|
+
const src = buildCollectExpression("slot2");
|
|
44
|
+
const run = new Function("globalThis", "return " + src + ";");
|
|
45
|
+
const g = { slot2: { s: "ok", v: { total: 7 } } };
|
|
46
|
+
expect(run(g)).toEqual({ status: "ok", value: { total: 7 } });
|
|
47
|
+
expect(g.slot2).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
it("collect source distinguishes a missing slot from a pending one", () => {
|
|
50
|
+
const src = buildCollectExpression("slot3");
|
|
51
|
+
const run = new Function("globalThis", "return " + src + ";");
|
|
52
|
+
expect(run({})).toBe("__missing__");
|
|
53
|
+
});
|
|
54
|
+
it("collect source surfaces a rejected promise as an error status", () => {
|
|
55
|
+
const src = buildCollectExpression("slot4");
|
|
56
|
+
const run = new Function("globalThis", "return " + src + ";");
|
|
57
|
+
const g = { slot4: { s: "err", v: "Network request failed" } };
|
|
58
|
+
expect(run(g)).toEqual({ status: "err", value: "Network request failed" });
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=promiseHandles.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promiseHandles.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/promiseHandles.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveBufferOffline.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/resolveBufferOffline.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { resolveLogBuffer, resolveNetworkBuffer } from "../../core/toolHelpers.js";
|
|
2
|
+
import { getLogBuffer, getNetworkBuffer, logBuffers, networkBuffers, resetEpochs } from "../../core/state.js";
|
|
3
|
+
describe("buffer resolution while disconnected", () => {
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
logBuffers.clear();
|
|
6
|
+
networkBuffers.clear();
|
|
7
|
+
resetEpochs();
|
|
8
|
+
});
|
|
9
|
+
it("falls back to a buffered device name when nothing is connected", () => {
|
|
10
|
+
getLogBuffer("iPhone 17 Pro").add({
|
|
11
|
+
timestamp: new Date(),
|
|
12
|
+
level: "log",
|
|
13
|
+
message: "pre-restart",
|
|
14
|
+
});
|
|
15
|
+
expect(resolveLogBuffer("iPhone").getAll()[0].message).toBe("pre-restart");
|
|
16
|
+
});
|
|
17
|
+
it("matches case-insensitively", () => {
|
|
18
|
+
getNetworkBuffer("sdk_gphone64_arm64");
|
|
19
|
+
expect(() => resolveNetworkBuffer("GPHONE")).not.toThrow();
|
|
20
|
+
});
|
|
21
|
+
it("still throws when no buffer exists for the device either", () => {
|
|
22
|
+
expect(() => resolveLogBuffer("nonexistent")).toThrow(/No connected device/);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=resolveBufferOffline.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveBufferOffline.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/resolveBufferOffline.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE9G,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAClD,UAAU,CAAC,GAAG,EAAE;QACZ,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,cAAc,CAAC,KAAK,EAAE,CAAC;QACvB,WAAW,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACtE,YAAY,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC;YAC9B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,aAAa;SACzB,CAAC,CAAC;QACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAClC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdkMirrorPoller.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/sdkMirrorPoller.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { jest } from "@jest/globals";
|
|
2
|
+
const executeInApp = jest.fn();
|
|
3
|
+
jest.unstable_mockModule("../../core/executor.js", () => ({ executeInApp }));
|
|
4
|
+
const { mirrorOnce, __resetMirrorState } = await import("../../core/sdkMirrorPoller.js");
|
|
5
|
+
const { getLogBuffer, getNetworkBuffer, resetEpochs, bumpEpoch, getEpoch, connectedApps, logBuffers, networkBuffers } = await import("../../core/state.js");
|
|
6
|
+
const { __resetLogSeq } = await import("../../core/logs.js");
|
|
7
|
+
const payload = (network, console_, runId = "run-1") => ({
|
|
8
|
+
success: true,
|
|
9
|
+
result: JSON.stringify({ runId, network, console: console_ }),
|
|
10
|
+
});
|
|
11
|
+
const netEntry = (id) => ({
|
|
12
|
+
id,
|
|
13
|
+
timestamp: Date.now(),
|
|
14
|
+
method: "GET",
|
|
15
|
+
url: `https://api.test/${id}`,
|
|
16
|
+
status: 200,
|
|
17
|
+
requestHeaders: {},
|
|
18
|
+
responseHeaders: {},
|
|
19
|
+
completed: true,
|
|
20
|
+
});
|
|
21
|
+
const logEntry = (id, message) => ({
|
|
22
|
+
id,
|
|
23
|
+
timestamp: Date.now(),
|
|
24
|
+
level: "log",
|
|
25
|
+
message,
|
|
26
|
+
});
|
|
27
|
+
describe("mirrorOnce", () => {
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
executeInApp.mockReset();
|
|
30
|
+
__resetMirrorState();
|
|
31
|
+
__resetLogSeq();
|
|
32
|
+
resetEpochs();
|
|
33
|
+
getLogBuffer("dev").clear();
|
|
34
|
+
getNetworkBuffer("dev").clear();
|
|
35
|
+
});
|
|
36
|
+
it("copies SDK entries into the server buffers", async () => {
|
|
37
|
+
executeInApp.mockResolvedValue(payload([netEntry("n1")], [logEntry("c1", "hello")]));
|
|
38
|
+
const result = await mirrorOnce("dev");
|
|
39
|
+
expect(result).toEqual({ logs: 1, network: 1 });
|
|
40
|
+
expect(getNetworkBuffer("dev").size).toBe(1);
|
|
41
|
+
expect(getLogBuffer("dev").getAll()[0].message).toBe("hello");
|
|
42
|
+
});
|
|
43
|
+
it("is idempotent across repeated polls", async () => {
|
|
44
|
+
executeInApp.mockResolvedValue(payload([netEntry("n1")], [logEntry("c1", "hello")]));
|
|
45
|
+
await mirrorOnce("dev");
|
|
46
|
+
const second = await mirrorOnce("dev");
|
|
47
|
+
expect(second).toEqual({ logs: 0, network: 0 });
|
|
48
|
+
expect(getLogBuffer("dev").size).toBe(1);
|
|
49
|
+
expect(getNetworkBuffer("dev").size).toBe(1);
|
|
50
|
+
});
|
|
51
|
+
it("re-mirrors the same SDK ids after an epoch bump", async () => {
|
|
52
|
+
executeInApp.mockResolvedValue(payload([netEntry("n1")], [logEntry("c1", "hello")]));
|
|
53
|
+
await mirrorOnce("dev");
|
|
54
|
+
bumpEpoch("dev");
|
|
55
|
+
const afterRestart = await mirrorOnce("dev");
|
|
56
|
+
expect(afterRestart).toEqual({ logs: 1, network: 1 });
|
|
57
|
+
expect(getNetworkBuffer("dev").size).toBe(2);
|
|
58
|
+
});
|
|
59
|
+
it("bumps the epoch when the runtime nonce changes", async () => {
|
|
60
|
+
// The only reliable restart signal: Metro's inspector proxy reuses the
|
|
61
|
+
// CDP target id after a process kill, and a dead runtime emits no
|
|
62
|
+
// executionContextsCleared. A fresh globalThis is direct proof.
|
|
63
|
+
executeInApp.mockResolvedValue(payload([netEntry("n1")], [], "run-1"));
|
|
64
|
+
await mirrorOnce("dev");
|
|
65
|
+
expect(getEpoch("dev")).toBe(1);
|
|
66
|
+
// Same SDK id, new runtime: must land as a distinct entry, not overwrite.
|
|
67
|
+
executeInApp.mockResolvedValue(payload([netEntry("n1")], [], "run-2"));
|
|
68
|
+
const afterRestart = await mirrorOnce("dev");
|
|
69
|
+
expect(getEpoch("dev")).toBe(2);
|
|
70
|
+
expect(afterRestart).toEqual({ logs: 0, network: 1 });
|
|
71
|
+
expect(getNetworkBuffer("dev").size).toBe(2);
|
|
72
|
+
});
|
|
73
|
+
it("does not bump while the runtime nonce is stable", async () => {
|
|
74
|
+
executeInApp.mockResolvedValue(payload([netEntry("n1")], [], "run-1"));
|
|
75
|
+
await mirrorOnce("dev");
|
|
76
|
+
await mirrorOnce("dev");
|
|
77
|
+
await mirrorOnce("dev");
|
|
78
|
+
expect(getEpoch("dev")).toBe(1);
|
|
79
|
+
});
|
|
80
|
+
it("mirrors into the connected device's buffer key, not the caller's substring", async () => {
|
|
81
|
+
// Tools pass a user-facing substring ("iPhone"); the buffer key is the
|
|
82
|
+
// full device name. Using the substring as the key mirrors into a
|
|
83
|
+
// phantom buffer that device-scoped reads never resolve to, so the
|
|
84
|
+
// SDK data silently goes missing for exactly those calls.
|
|
85
|
+
connectedApps.set("8081-abc", {
|
|
86
|
+
ws: {},
|
|
87
|
+
deviceInfo: { deviceName: "iPhone 17 Pro", title: "app", id: "abc" },
|
|
88
|
+
port: 8081,
|
|
89
|
+
platform: "ios",
|
|
90
|
+
});
|
|
91
|
+
try {
|
|
92
|
+
executeInApp.mockResolvedValue(payload([netEntry("n1")], [logEntry("c1", "hi")]));
|
|
93
|
+
await mirrorOnce("iPhone");
|
|
94
|
+
expect(getNetworkBuffer("iPhone 17 Pro").size).toBe(1);
|
|
95
|
+
expect(getLogBuffer("iPhone 17 Pro").size).toBe(1);
|
|
96
|
+
expect(logBuffers.has("iPhone")).toBe(false);
|
|
97
|
+
expect(networkBuffers.has("iPhone")).toBe(false);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
connectedApps.delete("8081-abc");
|
|
101
|
+
getNetworkBuffer("iPhone 17 Pro").clear();
|
|
102
|
+
getLogBuffer("iPhone 17 Pro").clear();
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
it("returns zeroes when the eval fails", async () => {
|
|
106
|
+
executeInApp.mockResolvedValue({ success: false, error: "disconnected" });
|
|
107
|
+
expect(await mirrorOnce("dev")).toEqual({ logs: 0, network: 0 });
|
|
108
|
+
});
|
|
109
|
+
it("returns zeroes on malformed JSON", async () => {
|
|
110
|
+
executeInApp.mockResolvedValue({ success: true, result: "not json" });
|
|
111
|
+
expect(await mirrorOnce("dev")).toEqual({ logs: 0, network: 0 });
|
|
112
|
+
});
|
|
113
|
+
it("swallows a thrown eval", async () => {
|
|
114
|
+
executeInApp.mockRejectedValue(new Error("boom"));
|
|
115
|
+
expect(await mirrorOnce("dev")).toEqual({ logs: 0, network: 0 });
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=sdkMirrorPoller.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdkMirrorPoller.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/sdkMirrorPoller.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionEpoch.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/sessionEpoch.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { getEpoch, bumpEpoch, resetEpochs } from "../../core/state.js";
|
|
2
|
+
import { logBufferSize, networkBufferSize } from "../../core/bufferConfig.js";
|
|
3
|
+
describe("sessionEpoch", () => {
|
|
4
|
+
beforeEach(() => resetEpochs());
|
|
5
|
+
it("starts at 1 for an unseen device", () => {
|
|
6
|
+
expect(getEpoch("iPhone 17 Pro")).toBe(1);
|
|
7
|
+
});
|
|
8
|
+
it("increments on bump and returns the new value", () => {
|
|
9
|
+
expect(bumpEpoch("iPhone 17 Pro")).toBe(2);
|
|
10
|
+
expect(getEpoch("iPhone 17 Pro")).toBe(2);
|
|
11
|
+
});
|
|
12
|
+
it("tracks epochs independently per device", () => {
|
|
13
|
+
bumpEpoch("iPhone 17 Pro");
|
|
14
|
+
bumpEpoch("iPhone 17 Pro");
|
|
15
|
+
expect(getEpoch("iPhone 17 Pro")).toBe(3);
|
|
16
|
+
expect(getEpoch("sdk_gphone64_arm64")).toBe(1);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe("bufferConfig", () => {
|
|
20
|
+
const saved = { ...process.env };
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
process.env = { ...saved };
|
|
23
|
+
});
|
|
24
|
+
it("defaults to 2000 logs and 1000 network entries", () => {
|
|
25
|
+
expect(logBufferSize()).toBe(2000);
|
|
26
|
+
expect(networkBufferSize()).toBe(1000);
|
|
27
|
+
});
|
|
28
|
+
it("honours env overrides", () => {
|
|
29
|
+
process.env.EXECBRO_LOG_BUFFER_SIZE = "50";
|
|
30
|
+
process.env.EXECBRO_NET_BUFFER_SIZE = "25";
|
|
31
|
+
expect(logBufferSize()).toBe(50);
|
|
32
|
+
expect(networkBufferSize()).toBe(25);
|
|
33
|
+
});
|
|
34
|
+
it("ignores non-numeric and non-positive overrides", () => {
|
|
35
|
+
process.env.EXECBRO_LOG_BUFFER_SIZE = "abc";
|
|
36
|
+
expect(logBufferSize()).toBe(2000);
|
|
37
|
+
process.env.EXECBRO_LOG_BUFFER_SIZE = "0";
|
|
38
|
+
expect(logBufferSize()).toBe(2000);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=sessionEpoch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionEpoch.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/sessionEpoch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE9E,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3B,SAAS,CAAC,eAAe,CAAC,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,MAAM,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,IAAI,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,IAAI,CAAC;QAC3C,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,KAAK,CAAC;QAC5C,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,GAAG,CAAC;QAC1C,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settleAndDiff.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/settleAndDiff.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { settleAndDiff, SETTLE_POLL_START_MS, SETTLE_STABLE_TIMEOUT_MS, NO_CHANGE_CONFIRM_MS, } from "../../pro/verifyAction.js";
|
|
3
|
+
const frame = (tag) => ({
|
|
4
|
+
buffer: Buffer.from(tag),
|
|
5
|
+
width: 100,
|
|
6
|
+
height: 200,
|
|
7
|
+
scaleFactor: 1,
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Fake clock + fake capture/compare so the settle loop is exercised without a
|
|
11
|
+
* device. `compare` treats two buffers as "unchanged" when their bytes match,
|
|
12
|
+
* which mirrors what compareScreenshots reports for identical frames.
|
|
13
|
+
*/
|
|
14
|
+
function harness(script, opts = {}) {
|
|
15
|
+
const captureCostMs = opts.captureCostMs ?? 200;
|
|
16
|
+
let clock = 0;
|
|
17
|
+
let captures = 0;
|
|
18
|
+
const sleeps = [];
|
|
19
|
+
return {
|
|
20
|
+
get elapsed() { return clock; },
|
|
21
|
+
get captures() { return captures; },
|
|
22
|
+
sleeps,
|
|
23
|
+
args: {
|
|
24
|
+
beforeBuffer: Buffer.from("before"),
|
|
25
|
+
statusBarHeight: 59,
|
|
26
|
+
capture: async () => {
|
|
27
|
+
// Frames are consumed in order; the last one repeats forever.
|
|
28
|
+
const tag = script[Math.min(captures, script.length - 1)];
|
|
29
|
+
captures++;
|
|
30
|
+
clock += captureCostMs;
|
|
31
|
+
return tag === "__fail__" ? null : frame(tag);
|
|
32
|
+
},
|
|
33
|
+
compare: async (a, b) => {
|
|
34
|
+
const same = a.equals(b);
|
|
35
|
+
clock += 10;
|
|
36
|
+
return {
|
|
37
|
+
changed: !same,
|
|
38
|
+
changeRate: same ? 0 : 0.5,
|
|
39
|
+
changedPixels: same ? 0 : 5000,
|
|
40
|
+
totalPixels: 10000,
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
now: () => clock,
|
|
44
|
+
sleep: async (ms) => { sleeps.push(ms); clock += ms; },
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
describe("settleAndDiff", () => {
|
|
49
|
+
it("returns as soon as the screen changed and two consecutive frames match", async () => {
|
|
50
|
+
// "a" differs from before and repeats -> stable on the second capture.
|
|
51
|
+
const h = harness(["a", "a", "a", "a"]);
|
|
52
|
+
const result = await settleAndDiff(h.args);
|
|
53
|
+
expect(result).not.toBeNull();
|
|
54
|
+
expect(result.settled).toBe(true);
|
|
55
|
+
expect(result.diff.changedPixels).toBeGreaterThan(0);
|
|
56
|
+
expect(h.captures).toBe(2);
|
|
57
|
+
// 150ms lead-in + 2 captures — well under the old fixed 800ms wait.
|
|
58
|
+
expect(h.elapsed).toBeLessThan(700);
|
|
59
|
+
expect(h.sleeps[0]).toBe(SETTLE_POLL_START_MS);
|
|
60
|
+
});
|
|
61
|
+
it("keeps polling while the screen is still animating", async () => {
|
|
62
|
+
// Every frame differs from the previous one until the last pair.
|
|
63
|
+
const h = harness(["a", "b", "c", "c"]);
|
|
64
|
+
const result = await settleAndDiff(h.args);
|
|
65
|
+
expect(result.settled).toBe(true);
|
|
66
|
+
expect(result.frame.buffer.toString()).toBe("c");
|
|
67
|
+
expect(h.captures).toBe(4);
|
|
68
|
+
});
|
|
69
|
+
it("catches a late change that starts after the screen first looked idle", async () => {
|
|
70
|
+
// Identical to `before` twice (idle), then a modal slides in and settles.
|
|
71
|
+
const h = harness(["before", "before", "late", "late"]);
|
|
72
|
+
const result = await settleAndDiff(h.args);
|
|
73
|
+
expect(result.settled).toBe(true);
|
|
74
|
+
expect(result.diff.changedPixels).toBeGreaterThan(0);
|
|
75
|
+
expect(result.frame.buffer.toString()).toBe("late");
|
|
76
|
+
});
|
|
77
|
+
it("honours a caller-supplied no-change window (Android emulators animate slower)", async () => {
|
|
78
|
+
const h = harness(["before", "before", "before", "before", "before", "before", "before"]);
|
|
79
|
+
const result = await settleAndDiff({ ...h.args, noChangeConfirmMs: 1500 });
|
|
80
|
+
expect(result.diff.changedPixels).toBe(0);
|
|
81
|
+
expect(h.elapsed).toBeGreaterThanOrEqual(1500);
|
|
82
|
+
});
|
|
83
|
+
it("confirms 'no change' only after the confirmation window", async () => {
|
|
84
|
+
const h = harness(["before", "before", "before", "before", "before", "before"]);
|
|
85
|
+
const result = await settleAndDiff(h.args);
|
|
86
|
+
expect(result.settled).toBe(true);
|
|
87
|
+
expect(result.diff.changedPixels).toBe(0);
|
|
88
|
+
expect(h.elapsed).toBeGreaterThanOrEqual(NO_CHANGE_CONFIRM_MS);
|
|
89
|
+
// ...but it must not burn the full stable timeout on a quiet screen.
|
|
90
|
+
expect(h.elapsed).toBeLessThan(SETTLE_STABLE_TIMEOUT_MS + 500);
|
|
91
|
+
});
|
|
92
|
+
it("gives up at the cap when the screen never stabilises", async () => {
|
|
93
|
+
const h = harness(["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]);
|
|
94
|
+
const result = await settleAndDiff(h.args);
|
|
95
|
+
expect(result.settled).toBe(false);
|
|
96
|
+
expect(result.diff).toBeDefined();
|
|
97
|
+
expect(h.elapsed).toBeLessThan(SETTLE_STABLE_TIMEOUT_MS + 600);
|
|
98
|
+
});
|
|
99
|
+
it("returns null when the first capture fails", async () => {
|
|
100
|
+
const h = harness(["__fail__"]);
|
|
101
|
+
expect(await settleAndDiff(h.args)).toBeNull();
|
|
102
|
+
});
|
|
103
|
+
it("falls back to the last good frame when a later capture fails", async () => {
|
|
104
|
+
const h = harness(["a", "__fail__"]);
|
|
105
|
+
const result = await settleAndDiff(h.args);
|
|
106
|
+
expect(result).not.toBeNull();
|
|
107
|
+
expect(result.frame.buffer.toString()).toBe("a");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=settleAndDiff.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settleAndDiff.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/settleAndDiff.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/truncate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { truncateToBudget } from "../../core/truncate.js";
|
|
3
|
+
describe("truncateToBudget", () => {
|
|
4
|
+
it("returns small values byte-identical and reports no truncation", () => {
|
|
5
|
+
const value = { entityDrawerOpen: false };
|
|
6
|
+
const out = truncateToBudget(value, 25000);
|
|
7
|
+
expect(out.truncated).toBe(false);
|
|
8
|
+
expect(out.appliedBudget).toBeNull();
|
|
9
|
+
expect(JSON.stringify(out.value)).toBe(JSON.stringify(value));
|
|
10
|
+
});
|
|
11
|
+
it("bounds a large array and preserves its true length in the marker", () => {
|
|
12
|
+
const value = { data: Array.from({ length: 153 }, (_, i) => ({ id: i, a: 1, b: 2 })) };
|
|
13
|
+
const out = truncateToBudget(value, 300);
|
|
14
|
+
expect(out.truncated).toBe(true);
|
|
15
|
+
expect(out.returnedBytes).toBeLessThanOrEqual(300);
|
|
16
|
+
const rendered = JSON.stringify(out.value);
|
|
17
|
+
expect(rendered).toContain("more");
|
|
18
|
+
expect(rendered).toMatch(/\+1[0-9][0-9] more/);
|
|
19
|
+
});
|
|
20
|
+
it("survives circular references instead of throwing", () => {
|
|
21
|
+
const a = { name: "root" };
|
|
22
|
+
a.self = a;
|
|
23
|
+
const out = truncateToBudget(a, 25000);
|
|
24
|
+
// `truncated` reports "content was elided", and a cycle always is —
|
|
25
|
+
// it cannot be represented in JSON. Sibling keys survive intact.
|
|
26
|
+
expect(out.truncated).toBe(true);
|
|
27
|
+
expect(JSON.stringify(out.value)).toContain("[Circular]");
|
|
28
|
+
expect(out.value.name).toBe("root");
|
|
29
|
+
});
|
|
30
|
+
it("keeps repeated (non-circular) references intact", () => {
|
|
31
|
+
// A shared child appearing twice is not a cycle — marking the second
|
|
32
|
+
// occurrence "[Circular]" would be a false positive, so `seen` must be
|
|
33
|
+
// path-scoped rather than global.
|
|
34
|
+
const shared = { id: 7 };
|
|
35
|
+
const out = truncateToBudget({ first: shared, second: shared }, 25000);
|
|
36
|
+
expect(out.truncated).toBe(false);
|
|
37
|
+
expect(JSON.stringify(out.value)).toBe(JSON.stringify({ first: { id: 7 }, second: { id: 7 } }));
|
|
38
|
+
});
|
|
39
|
+
it("reports original and returned byte counts", () => {
|
|
40
|
+
const value = { s: "x".repeat(5000) };
|
|
41
|
+
const out = truncateToBudget(value, 200);
|
|
42
|
+
expect(out.originalBytes).toBeGreaterThan(5000);
|
|
43
|
+
expect(out.returnedBytes).toBeLessThanOrEqual(200);
|
|
44
|
+
expect(out.appliedBudget).not.toBeNull();
|
|
45
|
+
});
|
|
46
|
+
it("honours an explicit budget over the adaptive ladder", () => {
|
|
47
|
+
const value = { arr: [1, 2, 3, 4, 5, 6, 7, 8] };
|
|
48
|
+
const out = truncateToBudget(value, 25000, { maxArrayItems: 2 });
|
|
49
|
+
expect(JSON.stringify(out.value)).toContain("+6 more");
|
|
50
|
+
});
|
|
51
|
+
it("marks objects and arrays elided by depth with their sizes", () => {
|
|
52
|
+
const value = { a: { b: { c: { d: { e: [1, 2, 3] } } } } };
|
|
53
|
+
const out = truncateToBudget(value, 25000, { maxDepth: 2 });
|
|
54
|
+
const rendered = JSON.stringify(out.value);
|
|
55
|
+
expect(rendered).toContain("{Object(");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=truncate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/truncate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,8 @@ describe("verifyAction module", () => {
|
|
|
6
6
|
expect(typeof mod.verifyAndCapture).toBe("function");
|
|
7
7
|
expect(typeof mod.burstCaptureAndVerify).toBe("function");
|
|
8
8
|
expect(typeof mod.drawTapMarker).toBe("function");
|
|
9
|
-
expect(typeof mod.
|
|
9
|
+
expect(typeof mod.settleAndDiff).toBe("function");
|
|
10
|
+
expect(typeof mod.SETTLE_POLL_START_MS).toBe("number");
|
|
10
11
|
expect(typeof mod.BURST_FRAME_COUNT).toBe("number");
|
|
11
12
|
expect(typeof mod.BURST_FRAME_INTERVAL_MS).toBe("number");
|
|
12
13
|
});
|