obsidian-integration-testing 12.0.0 → 12.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/dist/lib/cjs/adb-device-list.cjs +54 -0
- package/dist/lib/cjs/adb-device-list.d.cts +72 -0
- package/dist/lib/cjs/android-sdk.cjs +52 -0
- package/dist/lib/cjs/android-sdk.d.cts +29 -0
- package/dist/lib/cjs/app-startup-progress.cjs +87 -0
- package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
- package/dist/lib/cjs/appium-server-marker.cjs +29 -32
- package/dist/lib/cjs/appium-server-marker.d.cts +22 -0
- package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
- package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
- package/dist/lib/cjs/community-plugin-registry.cjs +1 -1
- package/dist/lib/cjs/community-plugin-registry.d.cts +1 -1
- package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
- package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
- package/dist/lib/cjs/config-directory.cjs +46 -0
- package/dist/lib/cjs/config-directory.d.cts +45 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
- package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
- package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
- package/dist/lib/cjs/demo-vault-bootstrap.d.cts +3 -2
- package/dist/lib/cjs/demo-vault-populate.cjs +3 -2
- package/dist/lib/cjs/device-readiness.cjs +38 -3
- package/dist/lib/cjs/device-readiness.d.cts +83 -9
- package/dist/lib/cjs/emulator-arguments.cjs +6 -2
- package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
- package/dist/lib/cjs/emulator-backend.cjs +71 -0
- package/dist/lib/cjs/emulator-backend.d.cts +76 -0
- package/dist/lib/cjs/emulator-liveness.cjs +72 -0
- package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
- package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
- package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
- package/dist/lib/cjs/global-setup-core.cjs +30 -30
- package/dist/lib/cjs/global-setup-core.d.cts +27 -2
- package/dist/lib/cjs/headless-vault-config.cjs +51 -0
- package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
- package/dist/lib/cjs/index.cjs +12 -1
- package/dist/lib/cjs/index.d.cts +6 -1
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +14 -2
- package/dist/lib/cjs/mobile-input.d.cts +5 -9
- package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
- package/dist/lib/cjs/obsidian-instance.cjs +52 -3
- package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
- package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
- package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
- package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
- package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
- package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
- package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
- package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
- package/dist/lib/cjs/parent-liveness.cjs +42 -5
- package/dist/lib/cjs/parent-liveness.d.cts +37 -5
- package/dist/lib/cjs/port-owner.cjs +61 -0
- package/dist/lib/cjs/port-owner.d.cts +47 -0
- package/dist/lib/cjs/process-capture.cjs +62 -0
- package/dist/lib/cjs/process-capture.d.cts +83 -0
- package/dist/lib/cjs/process-exit-message.cjs +14 -8
- package/dist/lib/cjs/process-exit-message.d.cts +37 -3
- package/dist/lib/cjs/process-liveness.cjs +51 -0
- package/dist/lib/cjs/process-liveness.d.cts +18 -0
- package/dist/lib/cjs/run-version-matrix.cjs +1 -1
- package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
- package/dist/lib/cjs/teardown-verdict.cjs +53 -0
- package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
- package/dist/lib/cjs/temporary-vault.cjs +43 -8
- package/dist/lib/cjs/temporary-vault.d.cts +47 -5
- package/dist/lib/cjs/transport-appium.cjs +102 -17
- package/dist/lib/cjs/transport-appium.d.cts +53 -3
- package/dist/lib/cjs/transport-desktop-cdp.cjs +195 -6
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +99 -0
- package/dist/lib/cjs/transport-factory.cjs +951 -133
- package/dist/lib/cjs/transport-options.cjs +11 -3
- package/dist/lib/cjs/transport-options.d.cts +131 -12
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +7 -1
- package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
- package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
- package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
- package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +2 -2
- package/dist/lib/cjs/webview-cdp.cjs +6 -7
- package/dist/lib/cjs/webview-cdp.d.cts +5 -1
- package/dist/lib/esm/adb-device-list.d.mts +72 -0
- package/dist/lib/esm/adb-device-list.mjs +28 -0
- package/dist/lib/esm/android-sdk.d.mts +29 -0
- package/dist/lib/esm/android-sdk.mjs +18 -0
- package/dist/lib/esm/app-startup-progress.d.mts +128 -0
- package/dist/lib/esm/app-startup-progress.mjs +59 -0
- package/dist/lib/esm/appium-server-marker.d.mts +22 -0
- package/dist/lib/esm/appium-server-marker.mjs +28 -22
- package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
- package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
- package/dist/lib/esm/community-plugin-registry.d.mts +1 -1
- package/dist/lib/esm/community-plugin-registry.mjs +1 -1
- package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
- package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
- package/dist/lib/esm/config-directory.d.mts +45 -0
- package/dist/lib/esm/config-directory.mjs +21 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
- package/dist/lib/esm/connect-to-cdp.mjs +13 -7
- package/dist/lib/esm/demo-vault-bootstrap.d.mts +3 -2
- package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
- package/dist/lib/esm/demo-vault-populate.mjs +3 -2
- package/dist/lib/esm/device-readiness.d.mts +83 -9
- package/dist/lib/esm/device-readiness.mjs +34 -2
- package/dist/lib/esm/emulator-arguments.d.mts +26 -0
- package/dist/lib/esm/emulator-arguments.mjs +6 -2
- package/dist/lib/esm/emulator-backend.d.mts +76 -0
- package/dist/lib/esm/emulator-backend.mjs +45 -0
- package/dist/lib/esm/emulator-liveness.d.mts +158 -0
- package/dist/lib/esm/emulator-liveness.mjs +47 -0
- package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
- package/dist/lib/esm/emulator-snapshot.mjs +32 -0
- package/dist/lib/esm/global-setup-core.d.mts +27 -2
- package/dist/lib/esm/global-setup-core.mjs +34 -35
- package/dist/lib/esm/headless-vault-config.d.mts +67 -0
- package/dist/lib/esm/headless-vault-config.mjs +31 -0
- package/dist/lib/esm/index.d.mts +6 -1
- package/dist/lib/esm/index.mjs +11 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.d.mts +5 -9
- package/dist/lib/esm/mobile-input.mjs +14 -2
- package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
- package/dist/lib/esm/obsidian-instance.d.mts +12 -0
- package/dist/lib/esm/obsidian-instance.mjs +55 -3
- package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
- package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
- package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
- package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
- package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
- package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
- package/dist/lib/esm/owned-vault-seed.mjs +9 -5
- package/dist/lib/esm/parent-liveness.d.mts +37 -5
- package/dist/lib/esm/parent-liveness.mjs +42 -5
- package/dist/lib/esm/port-owner.d.mts +47 -0
- package/dist/lib/esm/port-owner.mjs +36 -0
- package/dist/lib/esm/process-capture.d.mts +83 -0
- package/dist/lib/esm/process-capture.mjs +38 -0
- package/dist/lib/esm/process-exit-message.d.mts +37 -3
- package/dist/lib/esm/process-exit-message.mjs +13 -8
- package/dist/lib/esm/process-liveness.d.mts +18 -0
- package/dist/lib/esm/process-liveness.mjs +17 -0
- package/dist/lib/esm/run-version-matrix.d.mts +1 -1
- package/dist/lib/esm/run-version-matrix.mjs +1 -1
- package/dist/lib/esm/teardown-verdict.d.mts +69 -0
- package/dist/lib/esm/teardown-verdict.mjs +28 -0
- package/dist/lib/esm/temporary-vault.d.mts +47 -5
- package/dist/lib/esm/temporary-vault.mjs +43 -8
- package/dist/lib/esm/transport-appium.d.mts +53 -3
- package/dist/lib/esm/transport-appium.mjs +108 -17
- package/dist/lib/esm/transport-desktop-cdp.d.mts +99 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +202 -7
- package/dist/lib/esm/transport-factory.mjs +995 -138
- package/dist/lib/esm/transport-options.d.mts +131 -12
- package/dist/lib/esm/transport-options.mjs +9 -2
- package/dist/lib/esm/transport.d.mts +7 -1
- package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
- package/dist/lib/esm/vault-plugin-install.mjs +20 -0
- package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
- package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
- package/dist/lib/esm/version-matrix.d.mts +2 -2
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/webview-cdp.d.mts +5 -1
- package/dist/lib/esm/webview-cdp.mjs +6 -7
- package/package.json +24 -23
- package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
- package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
- package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
- package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
- package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
- package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
- package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
- package/dist/lib/esm/obsidian-namespace.mjs +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure classification of whether the device a run is about to drive is still
|
|
5
|
+
* **there** — and, when it is not, which of the two very different things went
|
|
6
|
+
* wrong: the guest froze, or the emulator process itself did.
|
|
7
|
+
*
|
|
8
|
+
* The readiness gates in `device-readiness.ts` answer *"is the guest ready
|
|
9
|
+
* yet?"*, and both are deliberately best-effort: they warn and proceed. Nothing
|
|
10
|
+
* asked *"is it still answering?"* at the moment the session is created, so a
|
|
11
|
+
* guest that stopped answering between the last gate and `remote()` was handed
|
|
12
|
+
* to Appium anyway. What the operator then saw was Appium's own report:
|
|
13
|
+
*
|
|
14
|
+
* ```text
|
|
15
|
+
* WebDriverError: Device emulator-5554 was not in the list of connected devices
|
|
16
|
+
* when running "http://localhost:4723/session" with method "POST"
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* — measured on this host 2026-09-05, after 515s. That names the device, and
|
|
20
|
+
* `adb devices` then lists the device happily, so it sends the reader to the one
|
|
21
|
+
* diagnostic that cannot help. The same trap `wedged-appium-server.ts` exists to
|
|
22
|
+
* escape, one layer further down.
|
|
23
|
+
*
|
|
24
|
+
* ## The console is what tells the two apart
|
|
25
|
+
*
|
|
26
|
+
* `adb -s <device> emu <command>` is served by the **emulator's own console**,
|
|
27
|
+
* not by the guest's `adbd`. So the two probes answer different questions, and
|
|
28
|
+
* the pair is a diagnosis where either alone is a guess:
|
|
29
|
+
*
|
|
30
|
+
* | `adb shell` | `adb emu` | What it means |
|
|
31
|
+
* | --- | --- | --- |
|
|
32
|
+
* | succeeds | — | Alive. Proceed. |
|
|
33
|
+
* | fails | succeeds | The **guest** is frozen or too busy to schedule `adbd`. |
|
|
34
|
+
* | fails | fails | The **emulator process** is unreachable. Nothing will recover it. |
|
|
35
|
+
*
|
|
36
|
+
* Only a *successful* console probe clears the emulator — see
|
|
37
|
+
* {@link EmulatorLivenessProbeOutcome} for why a failed one cannot be read as
|
|
38
|
+
* the emulator answering.
|
|
39
|
+
*
|
|
40
|
+
* Measured 2026-09-05 across six hand-boots on this host — two AVDs and five
|
|
41
|
+
* argument sets — every one of which reached the bottom row 64–92s after boot:
|
|
42
|
+
*
|
|
43
|
+
* ```text
|
|
44
|
+
* 80s emulator console (QEMU, not the guest): HUNG
|
|
45
|
+
* 80s qemu-system-x86_64-headless (pid 10004): cpu=0% rss=5.82GB
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* **0% CPU** — blocked, not spinning — and a console that cannot answer. That is
|
|
49
|
+
* the QEMU main loop, below anything the guest, the GPU stack, the network
|
|
50
|
+
* simulator or the AVD's size can explain (each was eliminated by measurement,
|
|
51
|
+
* not by argument). It also explains the two downstream symptoms that had always
|
|
52
|
+
* looked like separate faults: `adb devices` keeps reporting `device` because
|
|
53
|
+
* nothing is left running to update that state, and the teardown's
|
|
54
|
+
* `adb emu kill` hangs for its full budget because it is asking the wedged
|
|
55
|
+
* console to shut itself down.
|
|
56
|
+
*
|
|
57
|
+
* The harness already *observed* the second half of this — teardown logs
|
|
58
|
+
* `Emulator console shutdown for emulator-5554 did not answer` — but only after
|
|
59
|
+
* the run had already failed with an error blaming the device. This module moves
|
|
60
|
+
* that observation to where it changes the verdict instead of annotating it.
|
|
61
|
+
*
|
|
62
|
+
* Kept separate from the integration-only `transport-factory` (excluded from
|
|
63
|
+
* unit tests) so the classification and the message stay unit-testable — the
|
|
64
|
+
* factory itself shells out to `adb`.
|
|
65
|
+
*/
|
|
66
|
+
/**
|
|
67
|
+
* Parameters for {@link buildEmulatorLivenessMessage}.
|
|
68
|
+
*/
|
|
69
|
+
export interface BuildEmulatorLivenessMessageParams {
|
|
70
|
+
/**
|
|
71
|
+
The device the run was about to drive.
|
|
72
|
+
*/
|
|
73
|
+
readonly deviceId: string;
|
|
74
|
+
/**
|
|
75
|
+
The emulator's captured stdout+stderr tail, when this run started it (empty when none).
|
|
76
|
+
*/
|
|
77
|
+
readonly emulatorOutput: string;
|
|
78
|
+
/**
|
|
79
|
+
The per-probe budget, so the message states what "did not answer" was measured against.
|
|
80
|
+
*/
|
|
81
|
+
readonly probeTimeoutInMilliseconds: number;
|
|
82
|
+
/**
|
|
83
|
+
Which failure this is. `'alive'` is not a failure and has no message.
|
|
84
|
+
*/
|
|
85
|
+
readonly verdict: Exclude<EmulatorLivenessVerdict, 'alive'>;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Whether a probe got an answer from the thing it was asking.
|
|
89
|
+
*
|
|
90
|
+
* Two-valued on purpose. An earlier draft split failures into "errored" and
|
|
91
|
+
* "timed out" and read an errored console as *the emulator speaking, with a
|
|
92
|
+
* refusal* — which is wrong, and wrong in the exact way this module exists to
|
|
93
|
+
* avoid. `adb -s <device> emu <command>` is routed by the **adb server**: when
|
|
94
|
+
* the device is `offline` adb refuses on the spot and never reaches the console,
|
|
95
|
+
* so the error is adb's, not the emulator's. Measured 2026-09-05, where that
|
|
96
|
+
* draft logged `shell=errored, console=errored -> guest-unresponsive` for a
|
|
97
|
+
* device whose emulator then had to be killed by PID because `adb emu kill`
|
|
98
|
+
* could not reach it either. Only a **successful** probe is an answer.
|
|
99
|
+
*/
|
|
100
|
+
export type EmulatorLivenessProbeOutcome = 'answered' | 'no-answer';
|
|
101
|
+
/**
|
|
102
|
+
* Whether the device is still usable, and if not, which layer failed.
|
|
103
|
+
*
|
|
104
|
+
* - `'alive'` — the guest answered. Proceed.
|
|
105
|
+
* - `'device-gone'` — the host's adb no longer lists it at all.
|
|
106
|
+
* - `'emulator-wedged'` — neither the guest nor the emulator's own console
|
|
107
|
+
* answers. The emulator process is stuck; retrying anything against this
|
|
108
|
+
* device cannot succeed.
|
|
109
|
+
* - `'guest-unresponsive'` — the console answers but the guest does not, so the
|
|
110
|
+
* emulator is alive and the guest is frozen or starved.
|
|
111
|
+
*/
|
|
112
|
+
export type EmulatorLivenessVerdict = 'alive' | 'device-gone' | 'emulator-wedged' | 'guest-unresponsive';
|
|
113
|
+
/**
|
|
114
|
+
* Parameters for {@link resolveEmulatorLivenessVerdict}.
|
|
115
|
+
*/
|
|
116
|
+
export interface ResolveEmulatorLivenessVerdictParams {
|
|
117
|
+
/**
|
|
118
|
+
* Whether `adb -s <device> emu avd status` succeeded — reaching the
|
|
119
|
+
* **emulator console**, served by the emulator process rather than by the
|
|
120
|
+
* guest.
|
|
121
|
+
*
|
|
122
|
+
* Meaningful only for an `emulator-<port>` device: the console fails against a
|
|
123
|
+
* physical handset however healthy it is, which is why a non-emulator is never
|
|
124
|
+
* convicted on it (the trap `avd-probe-verdict.ts` documents).
|
|
125
|
+
*/
|
|
126
|
+
readonly consoleProbe: EmulatorLivenessProbeOutcome;
|
|
127
|
+
/**
|
|
128
|
+
The device the run is about to drive.
|
|
129
|
+
*/
|
|
130
|
+
readonly deviceId: string;
|
|
131
|
+
/**
|
|
132
|
+
Whether the host's `adb devices` still lists the device in any state.
|
|
133
|
+
*/
|
|
134
|
+
readonly isListedByAdb: boolean;
|
|
135
|
+
/**
|
|
136
|
+
What `adb -s <device> shell true` answered — the **guest**, via `adbd`.
|
|
137
|
+
*/
|
|
138
|
+
readonly shellProbe: EmulatorLivenessProbeOutcome;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Builds the message for a device that stopped answering, naming the layer that
|
|
142
|
+
* failed and the evidence for it.
|
|
143
|
+
*
|
|
144
|
+
* @param params - The verdict, the device, the probe budget and the emulator's output.
|
|
145
|
+
* @returns The message.
|
|
146
|
+
*/
|
|
147
|
+
export declare function buildEmulatorLivenessMessage(params: BuildEmulatorLivenessMessageParams): string;
|
|
148
|
+
/**
|
|
149
|
+
* Decides whether the device is still usable, and which layer failed when it is
|
|
150
|
+
* not.
|
|
151
|
+
*
|
|
152
|
+
* A guest that answers settles it on its own — a console probe is only consulted
|
|
153
|
+
* when the guest has already gone quiet, so a healthy run never pays for it.
|
|
154
|
+
*
|
|
155
|
+
* @param params - What each probe answered, and whether adb still lists the device.
|
|
156
|
+
* @returns The verdict.
|
|
157
|
+
*/
|
|
158
|
+
export declare function resolveEmulatorLivenessVerdict(params: ResolveEmulatorLivenessVerdictParams): EmulatorLivenessVerdict;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { checkIsEmulatorDeviceId } from "./avd-probe-verdict.mjs";
|
|
2
|
+
import { appendProcessOutputTail } from "./process-exit-message.mjs";
|
|
3
|
+
function buildEmulatorLivenessMessage(params) {
|
|
4
|
+
const budget = `${String(params.probeTimeoutInMilliseconds)}ms`;
|
|
5
|
+
const diagnosis = {
|
|
6
|
+
"device-gone": [
|
|
7
|
+
"The host's `adb devices` no longer lists it, so it is no longer serving adb at all.",
|
|
8
|
+
"Either the emulator exited, or it wedged badly enough to drop off adb \u2014 the emulator output below is the best evidence for which.",
|
|
9
|
+
"An emulator this run started is replaced automatically once, so seeing this means the replacement did not survive either. Check that nothing else on this host stops emulators, and that the emulator build and system image are sound."
|
|
10
|
+
],
|
|
11
|
+
"emulator-wedged": [
|
|
12
|
+
`Neither the guest (\`adb -s ${params.deviceId} shell\`) nor the emulator's own console (\`adb -s ${params.deviceId} emu avd status\`) answered within ${budget}.`,
|
|
13
|
+
"The console is served by the emulator process, not by the guest, so its silence means the EMULATOR is wedged \u2014 not the guest, not the Appium server, and not the device being absent.",
|
|
14
|
+
"`adb devices` will still list this device and will mislead you: nothing is left running to update that state.",
|
|
15
|
+
"A wedged emulator does not come back, so retrying the session against it cannot succeed. One this run started is replaced with a fresh boot automatically, which means seeing this message is the replacement failing too.",
|
|
16
|
+
"If it recurs at the same point in every run, the fault is below the harness \u2014 and the first thing to check is what filters this host's sockets. Endpoint-security, content-blocking and VPN products install socket filter drivers in the path of every socket call the emulator makes, the console's localhost connection included; stopping that service has fixed exactly this signature. After that, the emulator build, the system image and the host hypervisor."
|
|
17
|
+
],
|
|
18
|
+
"guest-unresponsive": [
|
|
19
|
+
`The guest (\`adb -s ${params.deviceId} shell\`) did not answer within ${budget}, but the emulator's own console did.`,
|
|
20
|
+
"So the emulator process is healthy and the guest is frozen or too starved to schedule `adbd`.",
|
|
21
|
+
"A contended host is the usual cause; `deviceIdleTimeoutInMilliseconds` is the budget that governs waiting one out.",
|
|
22
|
+
"But if it recurs at the same point in every run, no timeout will fix it, and the host is not merely busy. Check what filters this host's sockets first \u2014 a content-blocking, endpoint-security or VPN socket filter driver produces this verdict as readily as it produces a fully wedged emulator \u2014 then the emulator build, the system image and the host hypervisor."
|
|
23
|
+
]
|
|
24
|
+
};
|
|
25
|
+
const lines = [
|
|
26
|
+
`Device ${params.deviceId} stopped answering before the Appium session could be established.`,
|
|
27
|
+
...diagnosis[params.verdict]
|
|
28
|
+
];
|
|
29
|
+
return appendProcessOutputTail(lines.join("\n"), { output: params.emulatorOutput, outputLabel: "Emulator output" });
|
|
30
|
+
}
|
|
31
|
+
function resolveEmulatorLivenessVerdict(params) {
|
|
32
|
+
if (params.shellProbe === "answered") {
|
|
33
|
+
return "alive";
|
|
34
|
+
}
|
|
35
|
+
if (!params.isListedByAdb) {
|
|
36
|
+
return "device-gone";
|
|
37
|
+
}
|
|
38
|
+
if (!checkIsEmulatorDeviceId(params.deviceId)) {
|
|
39
|
+
return "guest-unresponsive";
|
|
40
|
+
}
|
|
41
|
+
return params.consoleProbe === "answered" ? "guest-unresponsive" : "emulator-wedged";
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
buildEmulatorLivenessMessage,
|
|
45
|
+
resolveEmulatorLivenessVerdict
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWxpdmVuZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBjbGFzc2lmaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBkZXZpY2UgYSBydW4gaXMgYWJvdXQgdG8gZHJpdmUgaXMgc3RpbGxcbiAqICoqdGhlcmUqKiBcdTIwMTQgYW5kLCB3aGVuIGl0IGlzIG5vdCwgd2hpY2ggb2YgdGhlIHR3byB2ZXJ5IGRpZmZlcmVudCB0aGluZ3Mgd2VudFxuICogd3Jvbmc6IHRoZSBndWVzdCBmcm96ZSwgb3IgdGhlIGVtdWxhdG9yIHByb2Nlc3MgaXRzZWxmIGRpZC5cbiAqXG4gKiBUaGUgcmVhZGluZXNzIGdhdGVzIGluIGBkZXZpY2UtcmVhZGluZXNzLnRzYCBhbnN3ZXIgKlwiaXMgdGhlIGd1ZXN0IHJlYWR5XG4gKiB5ZXQ/XCIqLCBhbmQgYm90aCBhcmUgZGVsaWJlcmF0ZWx5IGJlc3QtZWZmb3J0OiB0aGV5IHdhcm4gYW5kIHByb2NlZWQuIE5vdGhpbmdcbiAqIGFza2VkICpcImlzIGl0IHN0aWxsIGFuc3dlcmluZz9cIiogYXQgdGhlIG1vbWVudCB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLCBzbyBhXG4gKiBndWVzdCB0aGF0IHN0b3BwZWQgYW5zd2VyaW5nIGJldHdlZW4gdGhlIGxhc3QgZ2F0ZSBhbmQgYHJlbW90ZSgpYCB3YXMgaGFuZGVkXG4gKiB0byBBcHBpdW0gYW55d2F5LiBXaGF0IHRoZSBvcGVyYXRvciB0aGVuIHNhdyB3YXMgQXBwaXVtJ3Mgb3duIHJlcG9ydDpcbiAqXG4gKiBgYGB0ZXh0XG4gKiBXZWJEcml2ZXJFcnJvcjogRGV2aWNlIGVtdWxhdG9yLTU1NTQgd2FzIG5vdCBpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgZGV2aWNlc1xuICogICB3aGVuIHJ1bm5pbmcgXCJodHRwOi8vbG9jYWxob3N0OjQ3MjMvc2Vzc2lvblwiIHdpdGggbWV0aG9kIFwiUE9TVFwiXG4gKiBgYGBcbiAqXG4gKiBcdTIwMTQgbWVhc3VyZWQgb24gdGhpcyBob3N0IDIwMjYtMDktMDUsIGFmdGVyIDUxNXMuIFRoYXQgbmFtZXMgdGhlIGRldmljZSwgYW5kXG4gKiBgYWRiIGRldmljZXNgIHRoZW4gbGlzdHMgdGhlIGRldmljZSBoYXBwaWx5LCBzbyBpdCBzZW5kcyB0aGUgcmVhZGVyIHRvIHRoZSBvbmVcbiAqIGRpYWdub3N0aWMgdGhhdCBjYW5ub3QgaGVscC4gVGhlIHNhbWUgdHJhcCBgd2VkZ2VkLWFwcGl1bS1zZXJ2ZXIudHNgIGV4aXN0cyB0b1xuICogZXNjYXBlLCBvbmUgbGF5ZXIgZnVydGhlciBkb3duLlxuICpcbiAqICMjIFRoZSBjb25zb2xlIGlzIHdoYXQgdGVsbHMgdGhlIHR3byBhcGFydFxuICpcbiAqIGBhZGIgLXMgPGRldmljZT4gZW11IDxjb21tYW5kPmAgaXMgc2VydmVkIGJ5IHRoZSAqKmVtdWxhdG9yJ3Mgb3duIGNvbnNvbGUqKixcbiAqIG5vdCBieSB0aGUgZ3Vlc3QncyBgYWRiZGAuIFNvIHRoZSB0d28gcHJvYmVzIGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zLCBhbmRcbiAqIHRoZSBwYWlyIGlzIGEgZGlhZ25vc2lzIHdoZXJlIGVpdGhlciBhbG9uZSBpcyBhIGd1ZXNzOlxuICpcbiAqIHwgYGFkYiBzaGVsbGAgfCBgYWRiIGVtdWAgfCBXaGF0IGl0IG1lYW5zIHxcbiAqIHwgLS0tIHwgLS0tIHwgLS0tIHxcbiAqIHwgc3VjY2VlZHMgfCBcdTIwMTQgfCBBbGl2ZS4gUHJvY2VlZC4gfFxuICogfCBmYWlscyB8IHN1Y2NlZWRzIHwgVGhlICoqZ3Vlc3QqKiBpcyBmcm96ZW4gb3IgdG9vIGJ1c3kgdG8gc2NoZWR1bGUgYGFkYmRgLiB8XG4gKiB8IGZhaWxzIHwgZmFpbHMgfCBUaGUgKiplbXVsYXRvciBwcm9jZXNzKiogaXMgdW5yZWFjaGFibGUuIE5vdGhpbmcgd2lsbCByZWNvdmVyIGl0LiB8XG4gKlxuICogT25seSBhICpzdWNjZXNzZnVsKiBjb25zb2xlIHByb2JlIGNsZWFycyB0aGUgZW11bGF0b3IgXHUyMDE0IHNlZVxuICoge0BsaW5rIEVtdWxhdG9yTGl2ZW5lc3NQcm9iZU91dGNvbWV9IGZvciB3aHkgYSBmYWlsZWQgb25lIGNhbm5vdCBiZSByZWFkIGFzXG4gKiB0aGUgZW11bGF0b3IgYW5zd2VyaW5nLlxuICpcbiAqIE1lYXN1cmVkIDIwMjYtMDktMDUgYWNyb3NzIHNpeCBoYW5kLWJvb3RzIG9uIHRoaXMgaG9zdCBcdTIwMTQgdHdvIEFWRHMgYW5kIGZpdmVcbiAqIGFyZ3VtZW50IHNldHMgXHUyMDE0IGV2ZXJ5IG9uZSBvZiB3aGljaCByZWFjaGVkIHRoZSBib3R0b20gcm93IDY0XHUyMDEzOTJzIGFmdGVyIGJvb3Q6XG4gKlxuICogYGBgdGV4dFxuICogODBzICBlbXVsYXRvciBjb25zb2xlIChRRU1VLCBub3QgdGhlIGd1ZXN0KTogSFVOR1xuICogODBzICBxZW11LXN5c3RlbS14ODZfNjQtaGVhZGxlc3MgKHBpZCAxMDAwNCk6IGNwdT0wJSByc3M9NS44MkdCXG4gKiBgYGBcbiAqXG4gKiAqKjAlIENQVSoqIFx1MjAxNCBibG9ja2VkLCBub3Qgc3Bpbm5pbmcgXHUyMDE0IGFuZCBhIGNvbnNvbGUgdGhhdCBjYW5ub3QgYW5zd2VyLiBUaGF0IGlzXG4gKiB0aGUgUUVNVSBtYWluIGxvb3AsIGJlbG93IGFueXRoaW5nIHRoZSBndWVzdCwgdGhlIEdQVSBzdGFjaywgdGhlIG5ldHdvcmtcbiAqIHNpbXVsYXRvciBvciB0aGUgQVZEJ3Mgc2l6ZSBjYW4gZXhwbGFpbiAoZWFjaCB3YXMgZWxpbWluYXRlZCBieSBtZWFzdXJlbWVudCxcbiAqIG5vdCBieSBhcmd1bWVudCkuIEl0IGFsc28gZXhwbGFpbnMgdGhlIHR3byBkb3duc3RyZWFtIHN5bXB0b21zIHRoYXQgaGFkIGFsd2F5c1xuICogbG9va2VkIGxpa2Ugc2VwYXJhdGUgZmF1bHRzOiBgYWRiIGRldmljZXNgIGtlZXBzIHJlcG9ydGluZyBgZGV2aWNlYCBiZWNhdXNlXG4gKiBub3RoaW5nIGlzIGxlZnQgcnVubmluZyB0byB1cGRhdGUgdGhhdCBzdGF0ZSwgYW5kIHRoZSB0ZWFyZG93bidzXG4gKiBgYWRiIGVtdSBraWxsYCBoYW5ncyBmb3IgaXRzIGZ1bGwgYnVkZ2V0IGJlY2F1c2UgaXQgaXMgYXNraW5nIHRoZSB3ZWRnZWRcbiAqIGNvbnNvbGUgdG8gc2h1dCBpdHNlbGYgZG93bi5cbiAqXG4gKiBUaGUgaGFybmVzcyBhbHJlYWR5ICpvYnNlcnZlZCogdGhlIHNlY29uZCBoYWxmIG9mIHRoaXMgXHUyMDE0IHRlYXJkb3duIGxvZ3NcbiAqIGBFbXVsYXRvciBjb25zb2xlIHNodXRkb3duIGZvciBlbXVsYXRvci01NTU0IGRpZCBub3QgYW5zd2VyYCBcdTIwMTQgYnV0IG9ubHkgYWZ0ZXJcbiAqIHRoZSBydW4gaGFkIGFscmVhZHkgZmFpbGVkIHdpdGggYW4gZXJyb3IgYmxhbWluZyB0aGUgZGV2aWNlLiBUaGlzIG1vZHVsZSBtb3Zlc1xuICogdGhhdCBvYnNlcnZhdGlvbiB0byB3aGVyZSBpdCBjaGFuZ2VzIHRoZSB2ZXJkaWN0IGluc3RlYWQgb2YgYW5ub3RhdGluZyBpdC5cbiAqXG4gKiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCAoZXhjbHVkZWQgZnJvbVxuICogdW5pdCB0ZXN0cykgc28gdGhlIGNsYXNzaWZpY2F0aW9uIGFuZCB0aGUgbWVzc2FnZSBzdGF5IHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZVxuICogZmFjdG9yeSBpdHNlbGYgc2hlbGxzIG91dCB0byBgYWRiYC5cbiAqL1xuXG5pbXBvcnQgeyBjaGVja0lzRW11bGF0b3JEZXZpY2VJZCB9IGZyb20gJy4vYXZkLXByb2JlLXZlcmRpY3QubWpzJztcbmltcG9ydCB7IGFwcGVuZFByb2Nlc3NPdXRwdXRUYWlsIH0gZnJvbSAnLi9wcm9jZXNzLWV4aXQtbWVzc2FnZS5tanMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZEVtdWxhdG9yTGl2ZW5lc3NNZXNzYWdlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEVtdWxhdG9yTGl2ZW5lc3NNZXNzYWdlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgdGhlIHJ1biB3YXMgYWJvdXQgdG8gZHJpdmUuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IncyBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwsIHdoZW4gdGhpcyBydW4gc3RhcnRlZCBpdCAoZW1wdHkgd2hlbiBub25lKS5cbiAgICovXG4gIHJlYWRvbmx5IGVtdWxhdG9yT3V0cHV0OiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBwZXItcHJvYmUgYnVkZ2V0LCBzbyB0aGUgbWVzc2FnZSBzdGF0ZXMgd2hhdCBcImRpZCBub3QgYW5zd2VyXCIgd2FzIG1lYXN1cmVkIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBwcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBXaGljaCBmYWlsdXJlIHRoaXMgaXMuIGAnYWxpdmUnYCBpcyBub3QgYSBmYWlsdXJlIGFuZCBoYXMgbm8gbWVzc2FnZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcmRpY3Q6IEV4Y2x1ZGU8RW11bGF0b3JMaXZlbmVzc1ZlcmRpY3QsICdhbGl2ZSc+O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBwcm9iZSBnb3QgYW4gYW5zd2VyIGZyb20gdGhlIHRoaW5nIGl0IHdhcyBhc2tpbmcuXG4gKlxuICogVHdvLXZhbHVlZCBvbiBwdXJwb3NlLiBBbiBlYXJsaWVyIGRyYWZ0IHNwbGl0IGZhaWx1cmVzIGludG8gXCJlcnJvcmVkXCIgYW5kXG4gKiBcInRpbWVkIG91dFwiIGFuZCByZWFkIGFuIGVycm9yZWQgY29uc29sZSBhcyAqdGhlIGVtdWxhdG9yIHNwZWFraW5nLCB3aXRoIGFcbiAqIHJlZnVzYWwqIFx1MjAxNCB3aGljaCBpcyB3cm9uZywgYW5kIHdyb25nIGluIHRoZSBleGFjdCB3YXkgdGhpcyBtb2R1bGUgZXhpc3RzIHRvXG4gKiBhdm9pZC4gYGFkYiAtcyA8ZGV2aWNlPiBlbXUgPGNvbW1hbmQ+YCBpcyByb3V0ZWQgYnkgdGhlICoqYWRiIHNlcnZlcioqOiB3aGVuXG4gKiB0aGUgZGV2aWNlIGlzIGBvZmZsaW5lYCBhZGIgcmVmdXNlcyBvbiB0aGUgc3BvdCBhbmQgbmV2ZXIgcmVhY2hlcyB0aGUgY29uc29sZSxcbiAqIHNvIHRoZSBlcnJvciBpcyBhZGIncywgbm90IHRoZSBlbXVsYXRvcidzLiBNZWFzdXJlZCAyMDI2LTA5LTA1LCB3aGVyZSB0aGF0XG4gKiBkcmFmdCBsb2dnZWQgYHNoZWxsPWVycm9yZWQsIGNvbnNvbGU9ZXJyb3JlZCAtPiBndWVzdC11bnJlc3BvbnNpdmVgIGZvciBhXG4gKiBkZXZpY2Ugd2hvc2UgZW11bGF0b3IgdGhlbiBoYWQgdG8gYmUga2lsbGVkIGJ5IFBJRCBiZWNhdXNlIGBhZGIgZW11IGtpbGxgXG4gKiBjb3VsZCBub3QgcmVhY2ggaXQgZWl0aGVyLiBPbmx5IGEgKipzdWNjZXNzZnVsKiogcHJvYmUgaXMgYW4gYW5zd2VyLlxuICovXG5leHBvcnQgdHlwZSBFbXVsYXRvckxpdmVuZXNzUHJvYmVPdXRjb21lID0gJ2Fuc3dlcmVkJyB8ICduby1hbnN3ZXInO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRldmljZSBpcyBzdGlsbCB1c2FibGUsIGFuZCBpZiBub3QsIHdoaWNoIGxheWVyIGZhaWxlZC5cbiAqXG4gKiAtIGAnYWxpdmUnYCBcdTIwMTQgdGhlIGd1ZXN0IGFuc3dlcmVkLiBQcm9jZWVkLlxuICogLSBgJ2RldmljZS1nb25lJ2AgXHUyMDE0IHRoZSBob3N0J3MgYWRiIG5vIGxvbmdlciBsaXN0cyBpdCBhdCBhbGwuXG4gKiAtIGAnZW11bGF0b3Itd2VkZ2VkJ2AgXHUyMDE0IG5laXRoZXIgdGhlIGd1ZXN0IG5vciB0aGUgZW11bGF0b3IncyBvd24gY29uc29sZVxuICogICBhbnN3ZXJzLiBUaGUgZW11bGF0b3IgcHJvY2VzcyBpcyBzdHVjazsgcmV0cnlpbmcgYW55dGhpbmcgYWdhaW5zdCB0aGlzXG4gKiAgIGRldmljZSBjYW5ub3Qgc3VjY2VlZC5cbiAqIC0gYCdndWVzdC11bnJlc3BvbnNpdmUnYCBcdTIwMTQgdGhlIGNvbnNvbGUgYW5zd2VycyBidXQgdGhlIGd1ZXN0IGRvZXMgbm90LCBzbyB0aGVcbiAqICAgZW11bGF0b3IgaXMgYWxpdmUgYW5kIHRoZSBndWVzdCBpcyBmcm96ZW4gb3Igc3RhcnZlZC5cbiAqL1xuZXhwb3J0IHR5cGUgRW11bGF0b3JMaXZlbmVzc1ZlcmRpY3QgPSAnYWxpdmUnIHwgJ2RldmljZS1nb25lJyB8ICdlbXVsYXRvci13ZWRnZWQnIHwgJ2d1ZXN0LXVucmVzcG9uc2l2ZSc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVFbXVsYXRvckxpdmVuZXNzVmVyZGljdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUVtdWxhdG9yTGl2ZW5lc3NWZXJkaWN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYGFkYiAtcyA8ZGV2aWNlPiBlbXUgYXZkIHN0YXR1c2Agc3VjY2VlZGVkIFx1MjAxNCByZWFjaGluZyB0aGVcbiAgICogKiplbXVsYXRvciBjb25zb2xlKiosIHNlcnZlZCBieSB0aGUgZW11bGF0b3IgcHJvY2VzcyByYXRoZXIgdGhhbiBieSB0aGVcbiAgICogZ3Vlc3QuXG4gICAqXG4gICAqIE1lYW5pbmdmdWwgb25seSBmb3IgYW4gYGVtdWxhdG9yLTxwb3J0PmAgZGV2aWNlOiB0aGUgY29uc29sZSBmYWlscyBhZ2FpbnN0IGFcbiAgICogcGh5c2ljYWwgaGFuZHNldCBob3dldmVyIGhlYWx0aHkgaXQgaXMsIHdoaWNoIGlzIHdoeSBhIG5vbi1lbXVsYXRvciBpcyBuZXZlclxuICAgKiBjb252aWN0ZWQgb24gaXQgKHRoZSB0cmFwIGBhdmQtcHJvYmUtdmVyZGljdC50c2AgZG9jdW1lbnRzKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnNvbGVQcm9iZTogRW11bGF0b3JMaXZlbmVzc1Byb2JlT3V0Y29tZTtcblxuICAvKipcbiAgVGhlIGRldmljZSB0aGUgcnVuIGlzIGFib3V0IHRvIGRyaXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgV2hldGhlciB0aGUgaG9zdCdzIGBhZGIgZGV2aWNlc2Agc3RpbGwgbGlzdHMgdGhlIGRldmljZSBpbiBhbnkgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBpc0xpc3RlZEJ5QWRiOiBib29sZWFuO1xuXG4gIC8qKlxuICBXaGF0IGBhZGIgLXMgPGRldmljZT4gc2hlbGwgdHJ1ZWAgYW5zd2VyZWQgXHUyMDE0IHRoZSAqKmd1ZXN0KiosIHZpYSBgYWRiZGAuXG4gICAqL1xuICByZWFkb25seSBzaGVsbFByb2JlOiBFbXVsYXRvckxpdmVuZXNzUHJvYmVPdXRjb21lO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBmb3IgYSBkZXZpY2UgdGhhdCBzdG9wcGVkIGFuc3dlcmluZywgbmFtaW5nIHRoZSBsYXllciB0aGF0XG4gKiBmYWlsZWQgYW5kIHRoZSBldmlkZW5jZSBmb3IgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2ZXJkaWN0LCB0aGUgZGV2aWNlLCB0aGUgcHJvYmUgYnVkZ2V0IGFuZCB0aGUgZW11bGF0b3IncyBvdXRwdXQuXG4gKiBAcmV0dXJucyBUaGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JMaXZlbmVzc01lc3NhZ2UocGFyYW1zOiBCdWlsZEVtdWxhdG9yTGl2ZW5lc3NNZXNzYWdlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgYnVkZ2V0ID0gYCR7U3RyaW5nKHBhcmFtcy5wcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXNgO1xuXG4gIC8qXG4gICAqIEEgYFJlY29yZGAga2V5ZWQgYnkgdGhlIHZlcmRpY3QgcmF0aGVyIHRoYW4gYSBgc3dpdGNoYDogZXhoYXVzdGl2ZW5lc3MgY29tZXNcbiAgICogZnJvbSB0aGUgdHlwZSwgd2l0aCBubyB1bnJlYWNoYWJsZSBgZGVmYXVsdGAgYXJtIHRvIGV4cGxhaW4gb3IgdG8gY292ZXIuXG4gICAqIFNhbWUgc2hhcGUgYXMgYHJlc29sdmVSZW1lZHlBZHZpY2VgIGluIGB3ZWRnZWQtYXBwaXVtLXNlcnZlci50c2AuXG4gICAqL1xuICBjb25zdCBkaWFnbm9zaXM6IFJlY29yZDxFeGNsdWRlPEVtdWxhdG9yTGl2ZW5lc3NWZXJkaWN0LCAnYWxpdmUnPiwgc3RyaW5nW10+ID0ge1xuICAgICdkZXZpY2UtZ29uZSc6IFtcbiAgICAgICdUaGUgaG9zdFxcJ3MgYGFkYiBkZXZpY2VzYCBubyBsb25nZXIgbGlzdHMgaXQsIHNvIGl0IGlzIG5vIGxvbmdlciBzZXJ2aW5nIGFkYiBhdCBhbGwuJyxcbiAgICAgICdFaXRoZXIgdGhlIGVtdWxhdG9yIGV4aXRlZCwgb3IgaXQgd2VkZ2VkIGJhZGx5IGVub3VnaCB0byBkcm9wIG9mZiBhZGIgXHUyMDE0IHRoZSBlbXVsYXRvciBvdXRwdXQgYmVsb3cgaXMgdGhlIGJlc3QgZXZpZGVuY2UgZm9yIHdoaWNoLicsXG4gICAgICAnQW4gZW11bGF0b3IgdGhpcyBydW4gc3RhcnRlZCBpcyByZXBsYWNlZCBhdXRvbWF0aWNhbGx5IG9uY2UsIHNvIHNlZWluZyB0aGlzIG1lYW5zIHRoZSByZXBsYWNlbWVudCBkaWQgbm90IHN1cnZpdmUgZWl0aGVyLiBDaGVjayB0aGF0IG5vdGhpbmcgZWxzZSBvbiB0aGlzIGhvc3Qgc3RvcHMgZW11bGF0b3JzLCBhbmQgdGhhdCB0aGUgZW11bGF0b3IgYnVpbGQgYW5kIHN5c3RlbSBpbWFnZSBhcmUgc291bmQuJ1xuICAgIF0sXG4gICAgJ2VtdWxhdG9yLXdlZGdlZCc6IFtcbiAgICAgIGBOZWl0aGVyIHRoZSBndWVzdCAoXFxgYWRiIC1zICR7cGFyYW1zLmRldmljZUlkfSBzaGVsbFxcYCkgbm9yIHRoZSBlbXVsYXRvcidzIG93biBjb25zb2xlIChcXGBhZGIgLXMgJHtwYXJhbXMuZGV2aWNlSWR9IGVtdSBhdmQgc3RhdHVzXFxgKSBhbnN3ZXJlZCB3aXRoaW4gJHtidWRnZXR9LmAsXG4gICAgICAnVGhlIGNvbnNvbGUgaXMgc2VydmVkIGJ5IHRoZSBlbXVsYXRvciBwcm9jZXNzLCBub3QgYnkgdGhlIGd1ZXN0LCBzbyBpdHMgc2lsZW5jZSBtZWFucyB0aGUgRU1VTEFUT1IgaXMgd2VkZ2VkIFx1MjAxNCBub3QgdGhlIGd1ZXN0LCBub3QgdGhlIEFwcGl1bSBzZXJ2ZXIsIGFuZCBub3QgdGhlIGRldmljZSBiZWluZyBhYnNlbnQuJyxcbiAgICAgICdgYWRiIGRldmljZXNgIHdpbGwgc3RpbGwgbGlzdCB0aGlzIGRldmljZSBhbmQgd2lsbCBtaXNsZWFkIHlvdTogbm90aGluZyBpcyBsZWZ0IHJ1bm5pbmcgdG8gdXBkYXRlIHRoYXQgc3RhdGUuJyxcbiAgICAgICdBIHdlZGdlZCBlbXVsYXRvciBkb2VzIG5vdCBjb21lIGJhY2ssIHNvIHJldHJ5aW5nIHRoZSBzZXNzaW9uIGFnYWluc3QgaXQgY2Fubm90IHN1Y2NlZWQuIE9uZSB0aGlzIHJ1biBzdGFydGVkIGlzIHJlcGxhY2VkIHdpdGggYSBmcmVzaCBib290IGF1dG9tYXRpY2FsbHksIHdoaWNoIG1lYW5zIHNlZWluZyB0aGlzIG1lc3NhZ2UgaXMgdGhlIHJlcGxhY2VtZW50IGZhaWxpbmcgdG9vLicsXG4gICAgICAnSWYgaXQgcmVjdXJzIGF0IHRoZSBzYW1lIHBvaW50IGluIGV2ZXJ5IHJ1biwgdGhlIGZhdWx0IGlzIGJlbG93IHRoZSBoYXJuZXNzIFx1MjAxNCBhbmQgdGhlIGZpcnN0IHRoaW5nIHRvIGNoZWNrIGlzIHdoYXQgZmlsdGVycyB0aGlzIGhvc3RcXCdzIHNvY2tldHMuIEVuZHBvaW50LXNlY3VyaXR5LCBjb250ZW50LWJsb2NraW5nIGFuZCBWUE4gcHJvZHVjdHMgaW5zdGFsbCBzb2NrZXQgZmlsdGVyIGRyaXZlcnMgaW4gdGhlIHBhdGggb2YgZXZlcnkgc29ja2V0IGNhbGwgdGhlIGVtdWxhdG9yIG1ha2VzLCB0aGUgY29uc29sZVxcJ3MgbG9jYWxob3N0IGNvbm5lY3Rpb24gaW5jbHVkZWQ7IHN0b3BwaW5nIHRoYXQgc2VydmljZSBoYXMgZml4ZWQgZXhhY3RseSB0aGlzIHNpZ25hdHVyZS4gQWZ0ZXIgdGhhdCwgdGhlIGVtdWxhdG9yIGJ1aWxkLCB0aGUgc3lzdGVtIGltYWdlIGFuZCB0aGUgaG9zdCBoeXBlcnZpc29yLidcbiAgICBdLFxuICAgICdndWVzdC11bnJlc3BvbnNpdmUnOiBbXG4gICAgICBgVGhlIGd1ZXN0IChcXGBhZGIgLXMgJHtwYXJhbXMuZGV2aWNlSWR9IHNoZWxsXFxgKSBkaWQgbm90IGFuc3dlciB3aXRoaW4gJHtidWRnZXR9LCBidXQgdGhlIGVtdWxhdG9yJ3Mgb3duIGNvbnNvbGUgZGlkLmAsXG4gICAgICAnU28gdGhlIGVtdWxhdG9yIHByb2Nlc3MgaXMgaGVhbHRoeSBhbmQgdGhlIGd1ZXN0IGlzIGZyb3plbiBvciB0b28gc3RhcnZlZCB0byBzY2hlZHVsZSBgYWRiZGAuJyxcbiAgICAgICdBIGNvbnRlbmRlZCBob3N0IGlzIHRoZSB1c3VhbCBjYXVzZTsgYGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNgIGlzIHRoZSBidWRnZXQgdGhhdCBnb3Zlcm5zIHdhaXRpbmcgb25lIG91dC4nLFxuICAgICAgJ0J1dCBpZiBpdCByZWN1cnMgYXQgdGhlIHNhbWUgcG9pbnQgaW4gZXZlcnkgcnVuLCBubyB0aW1lb3V0IHdpbGwgZml4IGl0LCBhbmQgdGhlIGhvc3QgaXMgbm90IG1lcmVseSBidXN5LiBDaGVjayB3aGF0IGZpbHRlcnMgdGhpcyBob3N0XFwncyBzb2NrZXRzIGZpcnN0IFx1MjAxNCBhIGNvbnRlbnQtYmxvY2tpbmcsIGVuZHBvaW50LXNlY3VyaXR5IG9yIFZQTiBzb2NrZXQgZmlsdGVyIGRyaXZlciBwcm9kdWNlcyB0aGlzIHZlcmRpY3QgYXMgcmVhZGlseSBhcyBpdCBwcm9kdWNlcyBhIGZ1bGx5IHdlZGdlZCBlbXVsYXRvciBcdTIwMTQgdGhlbiB0aGUgZW11bGF0b3IgYnVpbGQsIHRoZSBzeXN0ZW0gaW1hZ2UgYW5kIHRoZSBob3N0IGh5cGVydmlzb3IuJ1xuICAgIF1cbiAgfTtcblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBgRGV2aWNlICR7cGFyYW1zLmRldmljZUlkfSBzdG9wcGVkIGFuc3dlcmluZyBiZWZvcmUgdGhlIEFwcGl1bSBzZXNzaW9uIGNvdWxkIGJlIGVzdGFibGlzaGVkLmAsXG4gICAgLi4uZGlhZ25vc2lzW3BhcmFtcy52ZXJkaWN0XVxuICBdO1xuXG4gIHJldHVybiBhcHBlbmRQcm9jZXNzT3V0cHV0VGFpbChsaW5lcy5qb2luKCdcXG4nKSwgeyBvdXRwdXQ6IHBhcmFtcy5lbXVsYXRvck91dHB1dCwgb3V0cHV0TGFiZWw6ICdFbXVsYXRvciBvdXRwdXQnIH0pO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciB0aGUgZGV2aWNlIGlzIHN0aWxsIHVzYWJsZSwgYW5kIHdoaWNoIGxheWVyIGZhaWxlZCB3aGVuIGl0IGlzXG4gKiBub3QuXG4gKlxuICogQSBndWVzdCB0aGF0IGFuc3dlcnMgc2V0dGxlcyBpdCBvbiBpdHMgb3duIFx1MjAxNCBhIGNvbnNvbGUgcHJvYmUgaXMgb25seSBjb25zdWx0ZWRcbiAqIHdoZW4gdGhlIGd1ZXN0IGhhcyBhbHJlYWR5IGdvbmUgcXVpZXQsIHNvIGEgaGVhbHRoeSBydW4gbmV2ZXIgcGF5cyBmb3IgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFdoYXQgZWFjaCBwcm9iZSBhbnN3ZXJlZCwgYW5kIHdoZXRoZXIgYWRiIHN0aWxsIGxpc3RzIHRoZSBkZXZpY2UuXG4gKiBAcmV0dXJucyBUaGUgdmVyZGljdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckxpdmVuZXNzVmVyZGljdChwYXJhbXM6IFJlc29sdmVFbXVsYXRvckxpdmVuZXNzVmVyZGljdFBhcmFtcyk6IEVtdWxhdG9yTGl2ZW5lc3NWZXJkaWN0IHtcbiAgaWYgKHBhcmFtcy5zaGVsbFByb2JlID09PSAnYW5zd2VyZWQnKSB7XG4gICAgcmV0dXJuICdhbGl2ZSc7XG4gIH1cblxuICBpZiAoIXBhcmFtcy5pc0xpc3RlZEJ5QWRiKSB7XG4gICAgcmV0dXJuICdkZXZpY2UtZ29uZSc7XG4gIH1cblxuICAvKlxuICAgKiBgYWRiIFx1MjAyNiBlbXVgIGVycm9ycyBhZ2FpbnN0IGEgcGh5c2ljYWwgaGFuZHNldCBob3dldmVyIGhlYWx0aHkgaXQgaXMsIHNvIGl0c1xuICAgKiBzaWxlbmNlIGlzIG5vdCBldmlkZW5jZSB0aGVyZS4gT25seSBhbiBgZW11bGF0b3ItPHBvcnQ+YCBkZXZpY2UgaGFzIGFcbiAgICogY29uc29sZSB3aG9zZSBzaWxlbmNlIGNhbiBjb252aWN0IGl0IFx1MjAxNCB0aGUgc2FtZSByZXN0cmFpbnQgYGNsYXNzaWZ5QXZkUHJvYmVgXG4gICAqIHNob3dzIGluIG5ldmVyIHByb2JpbmcgYSBub24tZW11bGF0b3IgYXQgYWxsLlxuICAgKi9cbiAgaWYgKCFjaGVja0lzRW11bGF0b3JEZXZpY2VJZChwYXJhbXMuZGV2aWNlSWQpKSB7XG4gICAgcmV0dXJuICdndWVzdC11bnJlc3BvbnNpdmUnO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5jb25zb2xlUHJvYmUgPT09ICdhbnN3ZXJlZCcgPyAnZ3Vlc3QtdW5yZXNwb25zaXZlJyA6ICdlbXVsYXRvci13ZWRnZWQnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBa0VBLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsK0JBQStCO0FBNkZqQyxTQUFTLDZCQUE2QixRQUFvRDtBQUMvRixRQUFNLFNBQVMsR0FBRyxPQUFPLE9BQU8sMEJBQTBCLENBQUM7QUFPM0QsUUFBTSxZQUF5RTtBQUFBLElBQzdFLGVBQWU7QUFBQSxNQUNiO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsSUFDQSxtQkFBbUI7QUFBQSxNQUNqQiwrQkFBK0IsT0FBTyxRQUFRLHNEQUFzRCxPQUFPLFFBQVEsc0NBQXNDLE1BQU07QUFBQSxNQUMvSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLHNCQUFzQjtBQUFBLE1BQ3BCLHVCQUF1QixPQUFPLFFBQVEsbUNBQW1DLE1BQU07QUFBQSxNQUMvRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFFBQVE7QUFBQSxJQUNaLFVBQVUsT0FBTyxRQUFRO0FBQUEsSUFDekIsR0FBRyxVQUFVLE9BQU8sT0FBTztBQUFBLEVBQzdCO0FBRUEsU0FBTyx3QkFBd0IsTUFBTSxLQUFLLElBQUksR0FBRyxFQUFFLFFBQVEsT0FBTyxnQkFBZ0IsYUFBYSxrQkFBa0IsQ0FBQztBQUNwSDtBQVlPLFNBQVMsK0JBQStCLFFBQXVFO0FBQ3BILE1BQUksT0FBTyxlQUFlLFlBQVk7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLENBQUMsT0FBTyxlQUFlO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBUUEsTUFBSSxDQUFDLHdCQUF3QixPQUFPLFFBQVEsR0FBRztBQUM3QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sT0FBTyxpQkFBaUIsYUFBYSx1QkFBdUI7QUFDckU7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure helpers for locating and describing an AVD's saved boot snapshot.
|
|
5
|
+
*
|
|
6
|
+
* Only the opt-in `shouldReuseEmulatorSnapshot` path resumes one, and even then
|
|
7
|
+
* its age is worth a log line: a snapshot is the one input to a run that no gate
|
|
8
|
+
* inspects, and the failure a rotten one produces — a guest that serves adb,
|
|
9
|
+
* accepts a uiautomator2 session and then drops `offline` about half a minute
|
|
10
|
+
* later — reads as a code regression rather than as stale state. `emulator
|
|
11
|
+
* -avd … -no-snapshot-load` (the default) makes the question moot; when the
|
|
12
|
+
* caller has deliberately traded that away, *"resuming snapshot saved <date>"*
|
|
13
|
+
* is what keeps the trade visible in the transcript.
|
|
14
|
+
*
|
|
15
|
+
* Kept separate from the integration-only `transport-factory` so the path
|
|
16
|
+
* derivation and the wording stay unit-testable — the factory itself does the
|
|
17
|
+
* `stat`.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Parameters for {@link buildAvdSnapshotDirectoryCandidates}.
|
|
21
|
+
*/
|
|
22
|
+
export interface BuildAvdSnapshotDirectoryCandidatesParams {
|
|
23
|
+
/**
|
|
24
|
+
The Android Virtual Device name.
|
|
25
|
+
*/
|
|
26
|
+
readonly avdName: string;
|
|
27
|
+
/**
|
|
28
|
+
The process environment, read for the Android SDK's AVD-home overrides.
|
|
29
|
+
*/
|
|
30
|
+
readonly environment: Readonly<Record<string, string | undefined>>;
|
|
31
|
+
/**
|
|
32
|
+
The user's home directory, the base of the default AVD home.
|
|
33
|
+
*/
|
|
34
|
+
readonly homeDirectory: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parameters for {@link buildSnapshotAgeMessage}.
|
|
38
|
+
*/
|
|
39
|
+
export interface BuildSnapshotAgeMessageParams {
|
|
40
|
+
/**
|
|
41
|
+
The Android Virtual Device name.
|
|
42
|
+
*/
|
|
43
|
+
readonly avdName: string;
|
|
44
|
+
/**
|
|
45
|
+
When the snapshot was last written, or `undefined` when none was found.
|
|
46
|
+
*/
|
|
47
|
+
readonly savedAt?: Date | undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Builds the directories the AVD's boot snapshot could live in, most specific
|
|
51
|
+
* first.
|
|
52
|
+
*
|
|
53
|
+
* The lookup mirrors the emulator's own: `ANDROID_AVD_HOME` wins outright, then
|
|
54
|
+
* `.android/avd` under `ANDROID_SDK_HOME`, then under the user's home. Returning
|
|
55
|
+
* candidates rather than one path keeps the `stat` — and the decision that a
|
|
56
|
+
* miss is not an error — in the caller.
|
|
57
|
+
*
|
|
58
|
+
* @param params - The AVD name, the environment, and the home directory.
|
|
59
|
+
* @returns The candidate snapshot directories, most specific first.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildAvdSnapshotDirectoryCandidates(params: BuildAvdSnapshotDirectoryCandidatesParams): string[];
|
|
62
|
+
/**
|
|
63
|
+
* Builds the line logged when a run has opted into resuming a snapshot.
|
|
64
|
+
*
|
|
65
|
+
* @param params - The AVD name and the snapshot's save time, if it was found.
|
|
66
|
+
* @returns The log line.
|
|
67
|
+
*/
|
|
68
|
+
export declare function buildSnapshotAgeMessage(params: BuildSnapshotAgeMessageParams): string;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const DEFAULT_SNAPSHOT_NAME = "default_boot";
|
|
2
|
+
const AVD_HOME_SEGMENTS = [".android", "avd"];
|
|
3
|
+
const TRAILING_SEPARATOR_PATTERN = /[/\\]+$/;
|
|
4
|
+
function buildAvdSnapshotDirectoryCandidates(params) {
|
|
5
|
+
const { avdName, environment, homeDirectory } = params;
|
|
6
|
+
const avdHomes = [
|
|
7
|
+
environment["ANDROID_AVD_HOME"],
|
|
8
|
+
resolveAvdHomeUnder(environment["ANDROID_SDK_HOME"]),
|
|
9
|
+
resolveAvdHomeUnder(homeDirectory)
|
|
10
|
+
];
|
|
11
|
+
return avdHomes.filter((avdHome) => avdHome !== void 0 && avdHome.length > 0).map((avdHome) => joinPath(avdHome, `${avdName}.avd`, "snapshots", DEFAULT_SNAPSHOT_NAME));
|
|
12
|
+
}
|
|
13
|
+
function buildSnapshotAgeMessage(params) {
|
|
14
|
+
if (params.savedAt === void 0) {
|
|
15
|
+
return `Snapshot reuse is enabled for AVD "${params.avdName}", but no \`${DEFAULT_SNAPSHOT_NAME}\` snapshot was found \u2014 this run cold-boots and saves one for the next.`;
|
|
16
|
+
}
|
|
17
|
+
return `Snapshot reuse is enabled for AVD "${params.avdName}": resuming \`${DEFAULT_SNAPSHOT_NAME}\` saved ${params.savedAt.toISOString()}.`;
|
|
18
|
+
}
|
|
19
|
+
function joinPath(base, ...segments) {
|
|
20
|
+
return [base.replace(TRAILING_SEPARATOR_PATTERN, ""), ...segments].join("/");
|
|
21
|
+
}
|
|
22
|
+
function resolveAvdHomeUnder(base) {
|
|
23
|
+
if (base === void 0 || base.length === 0) {
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
return joinPath(base, ...AVD_HOME_SEGMENTS);
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
buildAvdSnapshotDirectoryCandidates,
|
|
30
|
+
buildSnapshotAgeMessage
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLXNuYXBzaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBoZWxwZXJzIGZvciBsb2NhdGluZyBhbmQgZGVzY3JpYmluZyBhbiBBVkQncyBzYXZlZCBib290IHNuYXBzaG90LlxuICpcbiAqIE9ubHkgdGhlIG9wdC1pbiBgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90YCBwYXRoIHJlc3VtZXMgb25lLCBhbmQgZXZlbiB0aGVuXG4gKiBpdHMgYWdlIGlzIHdvcnRoIGEgbG9nIGxpbmU6IGEgc25hcHNob3QgaXMgdGhlIG9uZSBpbnB1dCB0byBhIHJ1biB0aGF0IG5vIGdhdGVcbiAqIGluc3BlY3RzLCBhbmQgdGhlIGZhaWx1cmUgYSByb3R0ZW4gb25lIHByb2R1Y2VzIFx1MjAxNCBhIGd1ZXN0IHRoYXQgc2VydmVzIGFkYixcbiAqIGFjY2VwdHMgYSB1aWF1dG9tYXRvcjIgc2Vzc2lvbiBhbmQgdGhlbiBkcm9wcyBgb2ZmbGluZWAgYWJvdXQgaGFsZiBhIG1pbnV0ZVxuICogbGF0ZXIgXHUyMDE0IHJlYWRzIGFzIGEgY29kZSByZWdyZXNzaW9uIHJhdGhlciB0aGFuIGFzIHN0YWxlIHN0YXRlLiBgZW11bGF0b3JcbiAqIC1hdmQgXHUyMDI2IC1uby1zbmFwc2hvdC1sb2FkYCAodGhlIGRlZmF1bHQpIG1ha2VzIHRoZSBxdWVzdGlvbiBtb290OyB3aGVuIHRoZVxuICogY2FsbGVyIGhhcyBkZWxpYmVyYXRlbHkgdHJhZGVkIHRoYXQgYXdheSwgKlwicmVzdW1pbmcgc25hcHNob3Qgc2F2ZWQgPGRhdGU+XCIqXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSB0cmFkZSB2aXNpYmxlIGluIHRoZSB0cmFuc2NyaXB0LlxuICpcbiAqIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXRoXG4gKiBkZXJpdmF0aW9uIGFuZCB0aGUgd29yZGluZyBzdGF5IHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZSBmYWN0b3J5IGl0c2VsZiBkb2VzIHRoZVxuICogYHN0YXRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkQXZkU25hcHNob3REaXJlY3RvcnlDYW5kaWRhdGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEF2ZFNuYXBzaG90RGlyZWN0b3J5Q2FuZGlkYXRlc1BhcmFtcyB7XG4gIC8qKlxuICBUaGUgQW5kcm9pZCBWaXJ0dWFsIERldmljZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHJvY2VzcyBlbnZpcm9ubWVudCwgcmVhZCBmb3IgdGhlIEFuZHJvaWQgU0RLJ3MgQVZELWhvbWUgb3ZlcnJpZGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuXG4gIC8qKlxuICBUaGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCB0aGUgYmFzZSBvZiB0aGUgZGVmYXVsdCBBVkQgaG9tZS5cbiAgICovXG4gIHJlYWRvbmx5IGhvbWVEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU25hcHNob3RBZ2VNZXNzYWdlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoZW4gdGhlIHNuYXBzaG90IHdhcyBsYXN0IHdyaXR0ZW4sIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9uZSB3YXMgZm91bmQuXG4gICAqL1xuICByZWFkb25seSBzYXZlZEF0PzogRGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgc25hcHNob3QgdGhlIGVtdWxhdG9yIGxvYWRzIGFuZCBzYXZlcyBieSBkZWZhdWx0LlxuICovXG5jb25zdCBERUZBVUxUX1NOQVBTSE9UX05BTUUgPSAnZGVmYXVsdF9ib290JztcblxuLyoqXG4gKiBUaGUgZGlyZWN0b3J5IHRoZSBBbmRyb2lkIFNESyBrZWVwcyBBVkRzIGluLCB1bmRlciB3aGljaGV2ZXIgaG9tZSBhcHBsaWVzLlxuICovXG5jb25zdCBBVkRfSE9NRV9TRUdNRU5UUyA9IFsnLmFuZHJvaWQnLCAnYXZkJ107XG5jb25zdCBUUkFJTElOR19TRVBBUkFUT1JfUEFUVEVSTiA9IC9bL1xcXFxdKyQvO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZGlyZWN0b3JpZXMgdGhlIEFWRCdzIGJvb3Qgc25hcHNob3QgY291bGQgbGl2ZSBpbiwgbW9zdCBzcGVjaWZpY1xuICogZmlyc3QuXG4gKlxuICogVGhlIGxvb2t1cCBtaXJyb3JzIHRoZSBlbXVsYXRvcidzIG93bjogYEFORFJPSURfQVZEX0hPTUVgIHdpbnMgb3V0cmlnaHQsIHRoZW5cbiAqIGAuYW5kcm9pZC9hdmRgIHVuZGVyIGBBTkRST0lEX1NES19IT01FYCwgdGhlbiB1bmRlciB0aGUgdXNlcidzIGhvbWUuIFJldHVybmluZ1xuICogY2FuZGlkYXRlcyByYXRoZXIgdGhhbiBvbmUgcGF0aCBrZWVwcyB0aGUgYHN0YXRgIFx1MjAxNCBhbmQgdGhlIGRlY2lzaW9uIHRoYXQgYVxuICogbWlzcyBpcyBub3QgYW4gZXJyb3IgXHUyMDE0IGluIHRoZSBjYWxsZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQgbmFtZSwgdGhlIGVudmlyb25tZW50LCBhbmQgdGhlIGhvbWUgZGlyZWN0b3J5LlxuICogQHJldHVybnMgVGhlIGNhbmRpZGF0ZSBzbmFwc2hvdCBkaXJlY3RvcmllcywgbW9zdCBzcGVjaWZpYyBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXZkU25hcHNob3REaXJlY3RvcnlDYW5kaWRhdGVzKHBhcmFtczogQnVpbGRBdmRTbmFwc2hvdERpcmVjdG9yeUNhbmRpZGF0ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHsgYXZkTmFtZSwgZW52aXJvbm1lbnQsIGhvbWVEaXJlY3RvcnkgfSA9IHBhcmFtcztcblxuICBjb25zdCBhdmRIb21lcyA9IFtcbiAgICBlbnZpcm9ubWVudFsnQU5EUk9JRF9BVkRfSE9NRSddLFxuICAgIHJlc29sdmVBdmRIb21lVW5kZXIoZW52aXJvbm1lbnRbJ0FORFJPSURfU0RLX0hPTUUnXSksXG4gICAgcmVzb2x2ZUF2ZEhvbWVVbmRlcihob21lRGlyZWN0b3J5KVxuICBdO1xuXG4gIHJldHVybiBhdmRIb21lc1xuICAgIC5maWx0ZXIoKGF2ZEhvbWUpOiBhdmRIb21lIGlzIHN0cmluZyA9PiBhdmRIb21lICE9PSB1bmRlZmluZWQgJiYgYXZkSG9tZS5sZW5ndGggPiAwKVxuICAgIC5tYXAoKGF2ZEhvbWUpID0+IGpvaW5QYXRoKGF2ZEhvbWUsIGAke2F2ZE5hbWV9LmF2ZGAsICdzbmFwc2hvdHMnLCBERUZBVUxUX1NOQVBTSE9UX05BTUUpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGxpbmUgbG9nZ2VkIHdoZW4gYSBydW4gaGFzIG9wdGVkIGludG8gcmVzdW1pbmcgYSBzbmFwc2hvdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIEFWRCBuYW1lIGFuZCB0aGUgc25hcHNob3QncyBzYXZlIHRpbWUsIGlmIGl0IHdhcyBmb3VuZC5cbiAqIEByZXR1cm5zIFRoZSBsb2cgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU25hcHNob3RBZ2VNZXNzYWdlKHBhcmFtczogQnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGFyYW1zLnNhdmVkQXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgU25hcHNob3QgcmV1c2UgaXMgZW5hYmxlZCBmb3IgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIiwgYnV0IG5vIFxcYCR7REVGQVVMVF9TTkFQU0hPVF9OQU1FfVxcYCBzbmFwc2hvdCB3YXMgZm91bmQgXHUyMDE0IHRoaXMgcnVuIGNvbGQtYm9vdHMgYW5kIHNhdmVzIG9uZSBmb3IgdGhlIG5leHQuYDtcbiAgfVxuXG4gIHJldHVybiBgU25hcHNob3QgcmV1c2UgaXMgZW5hYmxlZCBmb3IgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIjogcmVzdW1pbmcgXFxgJHtERUZBVUxUX1NOQVBTSE9UX05BTUV9XFxgIHNhdmVkICR7cGFyYW1zLnNhdmVkQXQudG9JU09TdHJpbmcoKX0uYDtcbn1cblxuLyoqXG4gKiBKb2lucyBwYXRoIHNlZ21lbnRzIHdpdGggYC9gLCB3aGljaCBldmVyeSBwbGF0Zm9ybSdzIHBhdGggQVBJcyBhY2NlcHQuXG4gKlxuICogQHBhcmFtIGJhc2UgLSBUaGUgbGVhZGluZyBzZWdtZW50LCB3aG9zZSB0cmFpbGluZyBzZXBhcmF0b3JzIGFyZSBkcm9wcGVkLlxuICogQHBhcmFtIHNlZ21lbnRzIC0gVGhlIHNlZ21lbnRzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIFRoZSBqb2luZWQgcGF0aC5cbiAqL1xuZnVuY3Rpb24gam9pblBhdGgoYmFzZTogc3RyaW5nLCAuLi5zZWdtZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gW2Jhc2UucmVwbGFjZShUUkFJTElOR19TRVBBUkFUT1JfUEFUVEVSTiwgJycpLCAuLi5zZWdtZW50c10uam9pbignLycpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBBVkQgaG9tZSB1bmRlciBhIGJhc2UgZGlyZWN0b3J5LCB3aGVuIHRoZXJlIGlzIG9uZS5cbiAqXG4gKiBAcGFyYW0gYmFzZSAtIGBBTkRST0lEX1NES19IT01FYCBvciB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LlxuICogQHJldHVybnMgVGhlIEFWRCBob21lLCBvciBgdW5kZWZpbmVkYCB3aGVuIGBiYXNlYCBpcyB1bnNldC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUF2ZEhvbWVVbmRlcihiYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoYmFzZSA9PT0gdW5kZWZpbmVkIHx8IGJhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBqb2luUGF0aChiYXNlLCAuLi5BVkRfSE9NRV9TRUdNRU5UUyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUF5REEsTUFBTSx3QkFBd0I7QUFLOUIsTUFBTSxvQkFBb0IsQ0FBQyxZQUFZLEtBQUs7QUFDNUMsTUFBTSw2QkFBNkI7QUFjNUIsU0FBUyxvQ0FBb0MsUUFBNkQ7QUFDL0csUUFBTSxFQUFFLFNBQVMsYUFBYSxjQUFjLElBQUk7QUFFaEQsUUFBTSxXQUFXO0FBQUEsSUFDZixZQUFZLGtCQUFrQjtBQUFBLElBQzlCLG9CQUFvQixZQUFZLGtCQUFrQixDQUFDO0FBQUEsSUFDbkQsb0JBQW9CLGFBQWE7QUFBQSxFQUNuQztBQUVBLFNBQU8sU0FDSixPQUFPLENBQUMsWUFBK0IsWUFBWSxVQUFhLFFBQVEsU0FBUyxDQUFDLEVBQ2xGLElBQUksQ0FBQyxZQUFZLFNBQVMsU0FBUyxHQUFHLE9BQU8sUUFBUSxhQUFhLHFCQUFxQixDQUFDO0FBQzdGO0FBUU8sU0FBUyx3QkFBd0IsUUFBK0M7QUFDckYsTUFBSSxPQUFPLFlBQVksUUFBVztBQUNoQyxXQUFPLHNDQUFzQyxPQUFPLE9BQU8sZUFBZSxxQkFBcUI7QUFBQSxFQUNqRztBQUVBLFNBQU8sc0NBQXNDLE9BQU8sT0FBTyxpQkFBaUIscUJBQXFCLFlBQVksT0FBTyxRQUFRLFlBQVksQ0FBQztBQUMzSTtBQVNBLFNBQVMsU0FBUyxTQUFpQixVQUE0QjtBQUM3RCxTQUFPLENBQUMsS0FBSyxRQUFRLDRCQUE0QixFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsS0FBSyxHQUFHO0FBQzdFO0FBUUEsU0FBUyxvQkFBb0IsTUFBOEM7QUFDekUsTUFBSSxTQUFTLFVBQWEsS0FBSyxXQUFXLEdBQUc7QUFDM0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLFNBQVMsTUFBTSxHQUFHLGlCQUFpQjtBQUM1QzsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -26,8 +26,8 @@ export interface CoreSetupParams {
|
|
|
26
26
|
* Whether to install and enable the built plugin in the temp vault. Defaults
|
|
27
27
|
* to `true`. Set to `false` for a **non-plugin** consumer (e.g. a typings
|
|
28
28
|
* crawler) that only needs a registered, empty vault to `evalInObsidian`
|
|
29
|
-
* against: the plugin `dist`/`manifest.json` read, the copy into
|
|
30
|
-
*
|
|
29
|
+
* against: the plugin `dist`/`manifest.json` read, the copy into the config
|
|
30
|
+
* folder's `plugins/`, the `community-plugins.json` write, and the enable step
|
|
31
31
|
* are all skipped, while the transport, temp vault, registration, and
|
|
32
32
|
* worker-facing endpoint provisioning still run unchanged.
|
|
33
33
|
*/
|
|
@@ -37,6 +37,11 @@ export interface CoreSetupParams {
|
|
|
37
37
|
* its startup scan indexes them in one pass (see {@link TemporaryVault.populate}).
|
|
38
38
|
* Use this for large fixtures — writing thousands of notes after open and
|
|
39
39
|
* forcing a re-scan is far slower and less reliable.
|
|
40
|
+
*
|
|
41
|
+
* Keys naming the config folder are written as `.obsidian/…`; under a
|
|
42
|
+
* `configDirectory` override {@link remapConfigDirectoryKeys} redirects them to
|
|
43
|
+
* the folder the vault will actually read, so a map does not have to carry a
|
|
44
|
+
* second copy of the override.
|
|
40
45
|
*/
|
|
41
46
|
readonly populate?: PopulateFilesParams | undefined;
|
|
42
47
|
/**
|
|
@@ -87,6 +92,26 @@ export declare function coreSetup(params?: CoreSetupParams): Promise<CoreSetupRe
|
|
|
87
92
|
* @param result - The result from {@link coreSetup}. When `undefined`, does nothing.
|
|
88
93
|
*/
|
|
89
94
|
export declare function coreTeardown(result?: CoreSetupResult): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Redirects a populate map's config-folder entries to the folder the vault will actually read.
|
|
97
|
+
*
|
|
98
|
+
* A populate map names its destinations vault-relative, and everything that builds one — including
|
|
99
|
+
* `buildDemoVaultPopulate`, which seeds `.obsidian/*` config files and injected community plugins'
|
|
100
|
+
* binaries — writes them under a literal `.obsidian/`, because that is the folder Obsidian uses when nothing
|
|
101
|
+
* overrides it. Under a `configDirectory` override those entries land in a folder the vault never opens, and
|
|
102
|
+
* the plugins seeded that way come back as the generic "enabled but not loaded" with nothing naming a config
|
|
103
|
+
* folder. Rewriting the key here fixes every consumer at once — a hand-written map as much as a demo vault's
|
|
104
|
+
* — and needs no second copy of the override for a caller to keep in sync with their transport options.
|
|
105
|
+
*
|
|
106
|
+
* Safe rather than magic: the vault is one the harness made for this run and has exactly one config folder,
|
|
107
|
+
* so under an override a `.obsidian/` entry is dead weight nothing reads. Only a leading `.obsidian` path
|
|
108
|
+
* SEGMENT moves; a note whose name merely contains the string does not.
|
|
109
|
+
*
|
|
110
|
+
* @param populate - The consumer's populate map.
|
|
111
|
+
* @param configDirectory - The resolved override, or `undefined` for Obsidian's default (a no-op).
|
|
112
|
+
* @returns The map with its config-folder keys redirected, or the original map when there is nothing to move.
|
|
113
|
+
*/
|
|
114
|
+
export declare function remapConfigDirectoryKeys(populate: PopulateFilesParams, configDirectory: string | undefined): PopulateFilesParams;
|
|
90
115
|
/**
|
|
91
116
|
* Resolves transport options for an integration run.
|
|
92
117
|
*
|