obsidian-integration-testing 12.0.0 → 12.1.1
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/adb.cjs +61 -0
- package/dist/lib/cjs/adb.d.cts +61 -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/device-screenshot.cjs +42 -0
- package/dist/lib/cjs/device-screenshot.d.cts +36 -0
- package/dist/lib/cjs/device-setting-restore.cjs +45 -0
- package/dist/lib/cjs/device-setting-restore.d.cts +60 -0
- package/dist/lib/cjs/device-settings-command.cjs +49 -0
- package/dist/lib/cjs/device-settings-command.d.cts +76 -0
- package/dist/lib/cjs/device-settings.cjs +88 -0
- package/dist/lib/cjs/device-settings.d.cts +94 -0
- 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-device-id.cjs +32 -0
- package/dist/lib/cjs/emulator-device-id.d.cts +49 -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 +67 -3
- package/dist/lib/cjs/index.d.cts +24 -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/resolve-emulator-device-id.cjs +54 -0
- package/dist/lib/cjs/resolve-emulator-device-id.d.cts +28 -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/soft-keyboard-geometry.cjs +75 -0
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +156 -0
- package/dist/lib/cjs/soft-keyboard.cjs +118 -0
- package/dist/lib/cjs/soft-keyboard.d.cts +82 -0
- 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/adb.d.mts +61 -0
- package/dist/lib/esm/adb.mjs +35 -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/device-screenshot.d.mts +36 -0
- package/dist/lib/esm/device-screenshot.mjs +18 -0
- package/dist/lib/esm/device-setting-restore.d.mts +60 -0
- package/dist/lib/esm/device-setting-restore.mjs +20 -0
- package/dist/lib/esm/device-settings-command.d.mts +76 -0
- package/dist/lib/esm/device-settings-command.mjs +23 -0
- package/dist/lib/esm/device-settings.d.mts +94 -0
- package/dist/lib/esm/device-settings.mjs +67 -0
- 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-device-id.d.mts +49 -0
- package/dist/lib/esm/emulator-device-id.mjs +8 -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 +24 -1
- package/dist/lib/esm/index.mjs +68 -2
- 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/resolve-emulator-device-id.d.mts +28 -0
- package/dist/lib/esm/resolve-emulator-device-id.mjs +33 -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/soft-keyboard-geometry.d.mts +156 -0
- package/dist/lib/esm/soft-keyboard-geometry.mjs +47 -0
- package/dist/lib/esm/soft-keyboard.d.mts +82 -0
- package/dist/lib/esm/soft-keyboard.mjs +91 -0
- 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 +26 -24
- 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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Builds the `adb shell settings …` argument list.
|
|
5
|
+
*
|
|
6
|
+
* Split out of {@link ./device-settings.ts} for the same reason
|
|
7
|
+
* {@link ./adb-device-list.ts} is split out of the transport factory: the
|
|
8
|
+
* argument list is pure and worth unit-testing, while the call that runs it is
|
|
9
|
+
* integration-time code that a unit test cannot reach. Keeping them in one file
|
|
10
|
+
* would put the namespace default inside a coverage-ignored block, where nothing
|
|
11
|
+
* checks that it is what the documentation claims.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* The `settings` namespaces this helper addresses.
|
|
15
|
+
*/
|
|
16
|
+
export declare enum DeviceSettingNamespace {
|
|
17
|
+
/**
|
|
18
|
+
* Device-wide settings, e.g. `hide_error_dialogs`.
|
|
19
|
+
*/
|
|
20
|
+
Global = "global",
|
|
21
|
+
/**
|
|
22
|
+
* Per-user settings the system reads, e.g. `show_ime_with_hard_keyboard`.
|
|
23
|
+
*/
|
|
24
|
+
Secure = "secure",
|
|
25
|
+
/**
|
|
26
|
+
* Per-user settings apps may read, e.g. `screen_brightness`.
|
|
27
|
+
*/
|
|
28
|
+
System = "system"
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The `settings` sub-commands this helper issues.
|
|
32
|
+
*/
|
|
33
|
+
export declare enum DeviceSettingVerb {
|
|
34
|
+
/**
|
|
35
|
+
* Removes the setting, returning it to never-having-been-written.
|
|
36
|
+
*/
|
|
37
|
+
Delete = "delete",
|
|
38
|
+
/**
|
|
39
|
+
* Reads the setting, printing `null` when it has never been written.
|
|
40
|
+
*/
|
|
41
|
+
Get = "get",
|
|
42
|
+
/**
|
|
43
|
+
* Writes the setting.
|
|
44
|
+
*/
|
|
45
|
+
Put = "put"
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parameters for {@link buildDeviceSettingsCommandArguments}.
|
|
49
|
+
*/
|
|
50
|
+
export interface BuildDeviceSettingsCommandArgumentsParams {
|
|
51
|
+
/**
|
|
52
|
+
* The setting's name within {@link namespace}, e.g. `show_ime_with_hard_keyboard`.
|
|
53
|
+
*/
|
|
54
|
+
readonly name: string;
|
|
55
|
+
/**
|
|
56
|
+
* The settings namespace the name lives in.
|
|
57
|
+
*
|
|
58
|
+
* @default {@link DeviceSettingNamespace.Secure}
|
|
59
|
+
*/
|
|
60
|
+
readonly namespace?: DeviceSettingNamespace;
|
|
61
|
+
/**
|
|
62
|
+
* The value to write. Meaningful only for {@link DeviceSettingVerb.Put}.
|
|
63
|
+
*/
|
|
64
|
+
readonly value?: string;
|
|
65
|
+
/**
|
|
66
|
+
* The sub-command to issue.
|
|
67
|
+
*/
|
|
68
|
+
readonly verb: DeviceSettingVerb;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Builds the arguments for `adb shell settings <verb> <namespace> <name> [value]`.
|
|
72
|
+
*
|
|
73
|
+
* @param params - The sub-command, the setting, its namespace and — for a write — its value.
|
|
74
|
+
* @returns The arguments to hand to `runAdbText`, `shell` included.
|
|
75
|
+
*/
|
|
76
|
+
export declare function buildDeviceSettingsCommandArguments(params: BuildDeviceSettingsCommandArgumentsParams): string[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
var DeviceSettingNamespace = /* @__PURE__ */ ((DeviceSettingNamespace2) => {
|
|
2
|
+
DeviceSettingNamespace2["Global"] = "global";
|
|
3
|
+
DeviceSettingNamespace2["Secure"] = "secure";
|
|
4
|
+
DeviceSettingNamespace2["System"] = "system";
|
|
5
|
+
return DeviceSettingNamespace2;
|
|
6
|
+
})(DeviceSettingNamespace || {});
|
|
7
|
+
var DeviceSettingVerb = /* @__PURE__ */ ((DeviceSettingVerb2) => {
|
|
8
|
+
DeviceSettingVerb2["Delete"] = "delete";
|
|
9
|
+
DeviceSettingVerb2["Get"] = "get";
|
|
10
|
+
DeviceSettingVerb2["Put"] = "put";
|
|
11
|
+
return DeviceSettingVerb2;
|
|
12
|
+
})(DeviceSettingVerb || {});
|
|
13
|
+
function buildDeviceSettingsCommandArguments(params) {
|
|
14
|
+
const namespace = params.namespace ?? "secure" /* Secure */;
|
|
15
|
+
const value = params.verb === "put" /* Put */ && params.value !== void 0 ? [params.value] : [];
|
|
16
|
+
return ["shell", "settings", params.verb, namespace, params.name, ...value];
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
DeviceSettingNamespace,
|
|
20
|
+
DeviceSettingVerb,
|
|
21
|
+
buildDeviceSettingsCommandArguments
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zZXR0aW5ncy1jb21tYW5kLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQnVpbGRzIHRoZSBgYWRiIHNoZWxsIHNldHRpbmdzIFx1MjAyNmAgYXJndW1lbnQgbGlzdC5cbiAqXG4gKiBTcGxpdCBvdXQgb2Yge0BsaW5rIC4vZGV2aWNlLXNldHRpbmdzLnRzfSBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiB7QGxpbmsgLi9hZGItZGV2aWNlLWxpc3QudHN9IGlzIHNwbGl0IG91dCBvZiB0aGUgdHJhbnNwb3J0IGZhY3Rvcnk6IHRoZVxuICogYXJndW1lbnQgbGlzdCBpcyBwdXJlIGFuZCB3b3J0aCB1bml0LXRlc3RpbmcsIHdoaWxlIHRoZSBjYWxsIHRoYXQgcnVucyBpdCBpc1xuICogaW50ZWdyYXRpb24tdGltZSBjb2RlIHRoYXQgYSB1bml0IHRlc3QgY2Fubm90IHJlYWNoLiBLZWVwaW5nIHRoZW0gaW4gb25lIGZpbGVcbiAqIHdvdWxkIHB1dCB0aGUgbmFtZXNwYWNlIGRlZmF1bHQgaW5zaWRlIGEgY292ZXJhZ2UtaWdub3JlZCBibG9jaywgd2hlcmUgbm90aGluZ1xuICogY2hlY2tzIHRoYXQgaXQgaXMgd2hhdCB0aGUgZG9jdW1lbnRhdGlvbiBjbGFpbXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgYHNldHRpbmdzYCBuYW1lc3BhY2VzIHRoaXMgaGVscGVyIGFkZHJlc3Nlcy5cbiAqL1xuZXhwb3J0IGVudW0gRGV2aWNlU2V0dGluZ05hbWVzcGFjZSB7XG4gIC8qKlxuICAgKiBEZXZpY2Utd2lkZSBzZXR0aW5ncywgZS5nLiBgaGlkZV9lcnJvcl9kaWFsb2dzYC5cbiAgICovXG4gIEdsb2JhbCA9ICdnbG9iYWwnLFxuXG4gIC8qKlxuICAgKiBQZXItdXNlciBzZXR0aW5ncyB0aGUgc3lzdGVtIHJlYWRzLCBlLmcuIGBzaG93X2ltZV93aXRoX2hhcmRfa2V5Ym9hcmRgLlxuICAgKi9cbiAgU2VjdXJlID0gJ3NlY3VyZScsXG5cbiAgLyoqXG4gICAqIFBlci11c2VyIHNldHRpbmdzIGFwcHMgbWF5IHJlYWQsIGUuZy4gYHNjcmVlbl9icmlnaHRuZXNzYC5cbiAgICovXG4gIFN5c3RlbSA9ICdzeXN0ZW0nXG59XG5cbi8qKlxuICogVGhlIGBzZXR0aW5nc2Agc3ViLWNvbW1hbmRzIHRoaXMgaGVscGVyIGlzc3Vlcy5cbiAqL1xuZXhwb3J0IGVudW0gRGV2aWNlU2V0dGluZ1ZlcmIge1xuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgc2V0dGluZywgcmV0dXJuaW5nIGl0IHRvIG5ldmVyLWhhdmluZy1iZWVuLXdyaXR0ZW4uXG4gICAqL1xuICBEZWxldGUgPSAnZGVsZXRlJyxcblxuICAvKipcbiAgICogUmVhZHMgdGhlIHNldHRpbmcsIHByaW50aW5nIGBudWxsYCB3aGVuIGl0IGhhcyBuZXZlciBiZWVuIHdyaXR0ZW4uXG4gICAqL1xuICBHZXQgPSAnZ2V0JyxcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBzZXR0aW5nLlxuICAgKi9cbiAgUHV0ID0gJ3B1dCdcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGREZXZpY2VTZXR0aW5nc0NvbW1hbmRBcmd1bWVudHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5nJ3MgbmFtZSB3aXRoaW4ge0BsaW5rIG5hbWVzcGFjZX0sIGUuZy4gYHNob3dfaW1lX3dpdGhfaGFyZF9rZXlib2FyZGAuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBuYW1lc3BhY2UgdGhlIG5hbWUgbGl2ZXMgaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBEZXZpY2VTZXR0aW5nTmFtZXNwYWNlLlNlY3VyZX1cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZT86IERldmljZVNldHRpbmdOYW1lc3BhY2U7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byB3cml0ZS4gTWVhbmluZ2Z1bCBvbmx5IGZvciB7QGxpbmsgRGV2aWNlU2V0dGluZ1ZlcmIuUHV0fS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3ViLWNvbW1hbmQgdG8gaXNzdWUuXG4gICAqL1xuICByZWFkb25seSB2ZXJiOiBEZXZpY2VTZXR0aW5nVmVyYjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGFyZ3VtZW50cyBmb3IgYGFkYiBzaGVsbCBzZXR0aW5ncyA8dmVyYj4gPG5hbWVzcGFjZT4gPG5hbWU+IFt2YWx1ZV1gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc3ViLWNvbW1hbmQsIHRoZSBzZXR0aW5nLCBpdHMgbmFtZXNwYWNlIGFuZCBcdTIwMTQgZm9yIGEgd3JpdGUgXHUyMDE0IGl0cyB2YWx1ZS5cbiAqIEByZXR1cm5zIFRoZSBhcmd1bWVudHMgdG8gaGFuZCB0byBgcnVuQWRiVGV4dGAsIGBzaGVsbGAgaW5jbHVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERldmljZVNldHRpbmdzQ29tbWFuZEFyZ3VtZW50cyhwYXJhbXM6IEJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lc3BhY2UgPSBwYXJhbXMubmFtZXNwYWNlID8/IERldmljZVNldHRpbmdOYW1lc3BhY2UuU2VjdXJlO1xuICBjb25zdCB2YWx1ZSA9IHBhcmFtcy52ZXJiID09PSBEZXZpY2VTZXR0aW5nVmVyYi5QdXQgJiYgcGFyYW1zLnZhbHVlICE9PSB1bmRlZmluZWQgPyBbcGFyYW1zLnZhbHVlXSA6IFtdO1xuXG4gIHJldHVybiBbJ3NoZWxsJywgJ3NldHRpbmdzJywgcGFyYW1zLnZlcmIsIG5hbWVzcGFjZSwgcGFyYW1zLm5hbWUsIC4uLnZhbHVlXTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWdCTyxJQUFLLHlCQUFMLGtCQUFLQSw0QkFBTDtBQUlMLEVBQUFBLHdCQUFBLFlBQVM7QUFLVCxFQUFBQSx3QkFBQSxZQUFTO0FBS1QsRUFBQUEsd0JBQUEsWUFBUztBQWRDLFNBQUFBO0FBQUEsR0FBQTtBQW9CTCxJQUFLLG9CQUFMLGtCQUFLQyx1QkFBTDtBQUlMLEVBQUFBLG1CQUFBLFlBQVM7QUFLVCxFQUFBQSxtQkFBQSxTQUFNO0FBS04sRUFBQUEsbUJBQUEsU0FBTTtBQWRJLFNBQUFBO0FBQUEsR0FBQTtBQWtETCxTQUFTLG9DQUFvQyxRQUE2RDtBQUMvRyxRQUFNLFlBQVksT0FBTyxhQUFhO0FBQ3RDLFFBQU0sUUFBUSxPQUFPLFNBQVMsbUJBQXlCLE9BQU8sVUFBVSxTQUFZLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQztBQUV0RyxTQUFPLENBQUMsU0FBUyxZQUFZLE9BQU8sTUFBTSxXQUFXLE9BQU8sTUFBTSxHQUFHLEtBQUs7QUFDNUU7IiwKICAibmFtZXMiOiBbIkRldmljZVNldHRpbmdOYW1lc3BhY2UiLCAiRGV2aWNlU2V0dGluZ1ZlcmIiXQp9Cg==
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Reads and writes Android device settings — and wraps the one setting a
|
|
5
|
+
* screenshot suite has to change.
|
|
6
|
+
*
|
|
7
|
+
* The screenshot AVDs are built `hw.keyboard=yes`, so Android suppresses the
|
|
8
|
+
* on-screen keyboard even where the page asks for one. `show_ime_with_hard_keyboard`
|
|
9
|
+
* is what turns it back on. {@link withSoftKeyboardEnabled} flips it, runs the
|
|
10
|
+
* work, and puts the device back exactly as it found it — including restoring a
|
|
11
|
+
* setting that had never been written, which takes a delete rather than a write
|
|
12
|
+
* (see `device-setting-restore`).
|
|
13
|
+
*
|
|
14
|
+
* Every function here shells out, so the whole module is integration-time code;
|
|
15
|
+
* the restore decision and the argument list it depends on are unit-tested in
|
|
16
|
+
* their own modules.
|
|
17
|
+
*/
|
|
18
|
+
import type { DeviceSettingNamespace } from './device-settings-command.mjs';
|
|
19
|
+
/**
|
|
20
|
+
* Parameters for {@link deleteDeviceSetting} and {@link readDeviceSetting}.
|
|
21
|
+
*/
|
|
22
|
+
export interface DeviceSettingParams {
|
|
23
|
+
/**
|
|
24
|
+
* The device to address.
|
|
25
|
+
*/
|
|
26
|
+
readonly deviceId: string;
|
|
27
|
+
/**
|
|
28
|
+
* The setting's name within {@link namespace}, e.g. `show_ime_with_hard_keyboard`.
|
|
29
|
+
*/
|
|
30
|
+
readonly name: string;
|
|
31
|
+
/**
|
|
32
|
+
* The settings namespace the name lives in.
|
|
33
|
+
*
|
|
34
|
+
* @default {@link DeviceSettingNamespace.Secure}
|
|
35
|
+
*/
|
|
36
|
+
readonly namespace?: DeviceSettingNamespace;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parameters for {@link withSoftKeyboardEnabled}.
|
|
40
|
+
*
|
|
41
|
+
* @typeParam T - What the wrapped work returns.
|
|
42
|
+
*/
|
|
43
|
+
export interface WithSoftKeyboardEnabledParams<T> {
|
|
44
|
+
/**
|
|
45
|
+
* The work to run while the on-screen keyboard is permitted.
|
|
46
|
+
*/
|
|
47
|
+
readonly callback: (this: void) => Promise<T>;
|
|
48
|
+
/**
|
|
49
|
+
* The device to address.
|
|
50
|
+
*/
|
|
51
|
+
readonly deviceId: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parameters for {@link writeDeviceSetting}.
|
|
55
|
+
*/
|
|
56
|
+
export interface WriteDeviceSettingParams extends DeviceSettingParams {
|
|
57
|
+
/**
|
|
58
|
+
* The value to write.
|
|
59
|
+
*/
|
|
60
|
+
readonly value: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Clears a device setting, returning it to never-having-been-written.
|
|
64
|
+
*
|
|
65
|
+
* @param params - The device, the setting and its namespace.
|
|
66
|
+
* @returns A {@link Promise} that resolves once the setting is gone.
|
|
67
|
+
*/
|
|
68
|
+
export declare function deleteDeviceSetting(params: DeviceSettingParams): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Reads a device setting.
|
|
71
|
+
*
|
|
72
|
+
* @param params - The device, the setting and its namespace.
|
|
73
|
+
* @returns A {@link Promise} that resolves to the setting's value, or the literal `null` when it has never
|
|
74
|
+
* been written.
|
|
75
|
+
*/
|
|
76
|
+
export declare function readDeviceSetting(params: DeviceSettingParams): Promise<string>;
|
|
77
|
+
/**
|
|
78
|
+
* Permits the on-screen keyboard for the duration of a callback, then restores the device exactly.
|
|
79
|
+
*
|
|
80
|
+
* The restore runs whether the callback succeeded or threw — a suite that dies mid-capture must not leave
|
|
81
|
+
* the device configured differently than it found it.
|
|
82
|
+
*
|
|
83
|
+
* @typeParam T - What the wrapped work returns.
|
|
84
|
+
* @param params - The device and the work to run.
|
|
85
|
+
* @returns A {@link Promise} that resolves to whatever the callback returned.
|
|
86
|
+
*/
|
|
87
|
+
export declare function withSoftKeyboardEnabled<T>(params: WithSoftKeyboardEnabledParams<T>): Promise<T>;
|
|
88
|
+
/**
|
|
89
|
+
* Writes a device setting.
|
|
90
|
+
*
|
|
91
|
+
* @param params - The device, the setting, its namespace and the value to write.
|
|
92
|
+
* @returns A {@link Promise} that resolves once the setting is written.
|
|
93
|
+
*/
|
|
94
|
+
export declare function writeDeviceSetting(params: WriteDeviceSettingParams): Promise<void>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { runAdbText } from "./adb.mjs";
|
|
2
|
+
import {
|
|
3
|
+
DeviceSettingRestoreKind,
|
|
4
|
+
resolveDeviceSettingRestore
|
|
5
|
+
} from "./device-setting-restore.mjs";
|
|
6
|
+
import {
|
|
7
|
+
buildDeviceSettingsCommandArguments,
|
|
8
|
+
DeviceSettingVerb
|
|
9
|
+
} from "./device-settings-command.mjs";
|
|
10
|
+
const SOFT_KEYBOARD_SETTING_NAME = "show_ime_with_hard_keyboard";
|
|
11
|
+
const SOFT_KEYBOARD_SETTING_ON = "1";
|
|
12
|
+
async function deleteDeviceSetting(params) {
|
|
13
|
+
await runAdbText({
|
|
14
|
+
commandArguments: buildDeviceSettingsCommandArguments({
|
|
15
|
+
name: params.name,
|
|
16
|
+
...params.namespace !== void 0 && { namespace: params.namespace },
|
|
17
|
+
verb: DeviceSettingVerb.Delete
|
|
18
|
+
}),
|
|
19
|
+
deviceId: params.deviceId
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function readDeviceSetting(params) {
|
|
23
|
+
return await runAdbText({
|
|
24
|
+
commandArguments: buildDeviceSettingsCommandArguments({
|
|
25
|
+
name: params.name,
|
|
26
|
+
...params.namespace !== void 0 && { namespace: params.namespace },
|
|
27
|
+
verb: DeviceSettingVerb.Get
|
|
28
|
+
}),
|
|
29
|
+
deviceId: params.deviceId
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async function withSoftKeyboardEnabled(params) {
|
|
33
|
+
const settingParams = {
|
|
34
|
+
deviceId: params.deviceId,
|
|
35
|
+
name: SOFT_KEYBOARD_SETTING_NAME
|
|
36
|
+
};
|
|
37
|
+
const previousValue = await readDeviceSetting(settingParams);
|
|
38
|
+
await writeDeviceSetting({ ...settingParams, value: SOFT_KEYBOARD_SETTING_ON });
|
|
39
|
+
try {
|
|
40
|
+
return await params.callback();
|
|
41
|
+
} finally {
|
|
42
|
+
const restore = resolveDeviceSettingRestore(previousValue);
|
|
43
|
+
if (restore.kind === DeviceSettingRestoreKind.Delete) {
|
|
44
|
+
await deleteDeviceSetting(settingParams);
|
|
45
|
+
} else {
|
|
46
|
+
await writeDeviceSetting({ ...settingParams, value: restore.value });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function writeDeviceSetting(params) {
|
|
51
|
+
await runAdbText({
|
|
52
|
+
commandArguments: buildDeviceSettingsCommandArguments({
|
|
53
|
+
name: params.name,
|
|
54
|
+
...params.namespace !== void 0 && { namespace: params.namespace },
|
|
55
|
+
value: params.value,
|
|
56
|
+
verb: DeviceSettingVerb.Put
|
|
57
|
+
}),
|
|
58
|
+
deviceId: params.deviceId
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
deleteDeviceSetting,
|
|
63
|
+
readDeviceSetting,
|
|
64
|
+
withSoftKeyboardEnabled,
|
|
65
|
+
writeDeviceSetting
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zZXR0aW5ncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlYWRzIGFuZCB3cml0ZXMgQW5kcm9pZCBkZXZpY2Ugc2V0dGluZ3MgXHUyMDE0IGFuZCB3cmFwcyB0aGUgb25lIHNldHRpbmcgYVxuICogc2NyZWVuc2hvdCBzdWl0ZSBoYXMgdG8gY2hhbmdlLlxuICpcbiAqIFRoZSBzY3JlZW5zaG90IEFWRHMgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlXG4gKiBvbi1zY3JlZW4ga2V5Ym9hcmQgZXZlbiB3aGVyZSB0aGUgcGFnZSBhc2tzIGZvciBvbmUuIGBzaG93X2ltZV93aXRoX2hhcmRfa2V5Ym9hcmRgXG4gKiBpcyB3aGF0IHR1cm5zIGl0IGJhY2sgb24uIHtAbGluayB3aXRoU29mdEtleWJvYXJkRW5hYmxlZH0gZmxpcHMgaXQsIHJ1bnMgdGhlXG4gKiB3b3JrLCBhbmQgcHV0cyB0aGUgZGV2aWNlIGJhY2sgZXhhY3RseSBhcyBpdCBmb3VuZCBpdCBcdTIwMTQgaW5jbHVkaW5nIHJlc3RvcmluZyBhXG4gKiBzZXR0aW5nIHRoYXQgaGFkIG5ldmVyIGJlZW4gd3JpdHRlbiwgd2hpY2ggdGFrZXMgYSBkZWxldGUgcmF0aGVyIHRoYW4gYSB3cml0ZVxuICogKHNlZSBgZGV2aWNlLXNldHRpbmctcmVzdG9yZWApLlxuICpcbiAqIEV2ZXJ5IGZ1bmN0aW9uIGhlcmUgc2hlbGxzIG91dCwgc28gdGhlIHdob2xlIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGU7XG4gKiB0aGUgcmVzdG9yZSBkZWNpc2lvbiBhbmQgdGhlIGFyZ3VtZW50IGxpc3QgaXQgZGVwZW5kcyBvbiBhcmUgdW5pdC10ZXN0ZWQgaW5cbiAqIHRoZWlyIG93biBtb2R1bGVzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgKHNoZWxscyBvdXQgdG8gYSByZWFsIGRldmljZSkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRGV2aWNlU2V0dGluZ05hbWVzcGFjZSB9IGZyb20gJy4vZGV2aWNlLXNldHRpbmdzLWNvbW1hbmQubWpzJztcblxuaW1wb3J0IHsgcnVuQWRiVGV4dCB9IGZyb20gJy4vYWRiLm1qcyc7XG5pbXBvcnQge1xuICBEZXZpY2VTZXR0aW5nUmVzdG9yZUtpbmQsXG4gIHJlc29sdmVEZXZpY2VTZXR0aW5nUmVzdG9yZVxufSBmcm9tICcuL2RldmljZS1zZXR0aW5nLXJlc3RvcmUubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzLFxuICBEZXZpY2VTZXR0aW5nVmVyYlxufSBmcm9tICcuL2RldmljZS1zZXR0aW5ncy1jb21tYW5kLm1qcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGRlbGV0ZURldmljZVNldHRpbmd9IGFuZCB7QGxpbmsgcmVhZERldmljZVNldHRpbmd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldmljZVNldHRpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNldHRpbmcncyBuYW1lIHdpdGhpbiB7QGxpbmsgbmFtZXNwYWNlfSwgZS5nLiBgc2hvd19pbWVfd2l0aF9oYXJkX2tleWJvYXJkYC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIG5hbWVzcGFjZSB0aGUgbmFtZSBsaXZlcyBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERldmljZVNldHRpbmdOYW1lc3BhY2UuU2VjdXJlfVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlPzogRGV2aWNlU2V0dGluZ05hbWVzcGFjZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWR9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFdoYXQgdGhlIHdyYXBwZWQgd29yayByZXR1cm5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkUGFyYW1zPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSB3b3JrIHRvIHJ1biB3aGlsZSB0aGUgb24tc2NyZWVuIGtleWJvYXJkIGlzIHBlcm1pdHRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxiYWNrOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxUPjtcblxuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd3JpdGVEZXZpY2VTZXR0aW5nfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZURldmljZVNldHRpbmdQYXJhbXMgZXh0ZW5kcyBEZXZpY2VTZXR0aW5nUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmcgZGVjaWRpbmcgd2hldGhlciBBbmRyb2lkIGRyYXdzIGEga2V5Ym9hcmQgd2hpbGUgYSBoYXJkd2FyZSBvbmUgaXMgYXR0YWNoZWQuXG4gKi9cbmNvbnN0IFNPRlRfS0VZQk9BUkRfU0VUVElOR19OQU1FID0gJ3Nob3dfaW1lX3dpdGhfaGFyZF9rZXlib2FyZCc7XG5cbmNvbnN0IFNPRlRfS0VZQk9BUkRfU0VUVElOR19PTiA9ICcxJztcblxuLyoqXG4gKiBDbGVhcnMgYSBkZXZpY2Ugc2V0dGluZywgcmV0dXJuaW5nIGl0IHRvIG5ldmVyLWhhdmluZy1iZWVuLXdyaXR0ZW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBzZXR0aW5nIGFuZCBpdHMgbmFtZXNwYWNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzZXR0aW5nIGlzIGdvbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVEZXZpY2VTZXR0aW5nKHBhcmFtczogRGV2aWNlU2V0dGluZ1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBidWlsZERldmljZVNldHRpbmdzQ29tbWFuZEFyZ3VtZW50cyh7XG4gICAgICBuYW1lOiBwYXJhbXMubmFtZSxcbiAgICAgIC4uLihwYXJhbXMubmFtZXNwYWNlICE9PSB1bmRlZmluZWQgJiYgeyBuYW1lc3BhY2U6IHBhcmFtcy5uYW1lc3BhY2UgfSksXG4gICAgICB2ZXJiOiBEZXZpY2VTZXR0aW5nVmVyYi5EZWxldGVcbiAgICB9KSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgZGV2aWNlIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBzZXR0aW5nIGFuZCBpdHMgbmFtZXNwYWNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2V0dGluZydzIHZhbHVlLCBvciB0aGUgbGl0ZXJhbCBgbnVsbGAgd2hlbiBpdCBoYXMgbmV2ZXJcbiAqICAgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZERldmljZVNldHRpbmcocGFyYW1zOiBEZXZpY2VTZXR0aW5nUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgIGNvbW1hbmRBcmd1bWVudHM6IGJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzKHtcbiAgICAgIG5hbWU6IHBhcmFtcy5uYW1lLFxuICAgICAgLi4uKHBhcmFtcy5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWVzcGFjZTogcGFyYW1zLm5hbWVzcGFjZSB9KSxcbiAgICAgIHZlcmI6IERldmljZVNldHRpbmdWZXJiLkdldFxuICAgIH0pLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUGVybWl0cyB0aGUgb24tc2NyZWVuIGtleWJvYXJkIGZvciB0aGUgZHVyYXRpb24gb2YgYSBjYWxsYmFjaywgdGhlbiByZXN0b3JlcyB0aGUgZGV2aWNlIGV4YWN0bHkuXG4gKlxuICogVGhlIHJlc3RvcmUgcnVucyB3aGV0aGVyIHRoZSBjYWxsYmFjayBzdWNjZWVkZWQgb3IgdGhyZXcgXHUyMDE0IGEgc3VpdGUgdGhhdCBkaWVzIG1pZC1jYXB0dXJlIG11c3Qgbm90IGxlYXZlXG4gKiB0aGUgZGV2aWNlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhbiBpdCBmb3VuZCBpdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBXaGF0IHRoZSB3cmFwcGVkIHdvcmsgcmV0dXJucy5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgd29yayB0byBydW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoYXRldmVyIHRoZSBjYWxsYmFjayByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkPFQ+KHBhcmFtczogV2l0aFNvZnRLZXlib2FyZEVuYWJsZWRQYXJhbXM8VD4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3Qgc2V0dGluZ1BhcmFtczogRGV2aWNlU2V0dGluZ1BhcmFtcyA9IHtcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkLFxuICAgIG5hbWU6IFNPRlRfS0VZQk9BUkRfU0VUVElOR19OQU1FXG4gIH07XG5cbiAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGF3YWl0IHJlYWREZXZpY2VTZXR0aW5nKHNldHRpbmdQYXJhbXMpO1xuICBhd2FpdCB3cml0ZURldmljZVNldHRpbmcoeyAuLi5zZXR0aW5nUGFyYW1zLCB2YWx1ZTogU09GVF9LRVlCT0FSRF9TRVRUSU5HX09OIH0pO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHBhcmFtcy5jYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIGNvbnN0IHJlc3RvcmUgPSByZXNvbHZlRGV2aWNlU2V0dGluZ1Jlc3RvcmUocHJldmlvdXNWYWx1ZSk7XG4gICAgaWYgKHJlc3RvcmUua2luZCA9PT0gRGV2aWNlU2V0dGluZ1Jlc3RvcmVLaW5kLkRlbGV0ZSkge1xuICAgICAgYXdhaXQgZGVsZXRlRGV2aWNlU2V0dGluZyhzZXR0aW5nUGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgd3JpdGVEZXZpY2VTZXR0aW5nKHsgLi4uc2V0dGluZ1BhcmFtcywgdmFsdWU6IHJlc3RvcmUudmFsdWUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGEgZGV2aWNlIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBzZXR0aW5nLCBpdHMgbmFtZXNwYWNlIGFuZCB0aGUgdmFsdWUgdG8gd3JpdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHNldHRpbmcgaXMgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRGV2aWNlU2V0dGluZyhwYXJhbXM6IFdyaXRlRGV2aWNlU2V0dGluZ1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBidWlsZERldmljZVNldHRpbmdzQ29tbWFuZEFyZ3VtZW50cyh7XG4gICAgICBuYW1lOiBwYXJhbXMubmFtZSxcbiAgICAgIC4uLihwYXJhbXMubmFtZXNwYWNlICE9PSB1bmRlZmluZWQgJiYgeyBuYW1lc3BhY2U6IHBhcmFtcy5uYW1lc3BhY2UgfSksXG4gICAgICB2YWx1ZTogcGFyYW1zLnZhbHVlLFxuICAgICAgdmVyYjogRGV2aWNlU2V0dGluZ1ZlcmIuUHV0XG4gICAgfSksXG4gICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXNCQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBc0RQLE1BQU0sNkJBQTZCO0FBRW5DLE1BQU0sMkJBQTJCO0FBUWpDLGVBQXNCLG9CQUFvQixRQUE0QztBQUNwRixRQUFNLFdBQVc7QUFBQSxJQUNmLGtCQUFrQixvQ0FBb0M7QUFBQSxNQUNwRCxNQUFNLE9BQU87QUFBQSxNQUNiLEdBQUksT0FBTyxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sVUFBVTtBQUFBLE1BQ3BFLE1BQU0sa0JBQWtCO0FBQUEsSUFDMUIsQ0FBQztBQUFBLElBQ0QsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUNIO0FBU0EsZUFBc0Isa0JBQWtCLFFBQThDO0FBQ3BGLFNBQU8sTUFBTSxXQUFXO0FBQUEsSUFDdEIsa0JBQWtCLG9DQUFvQztBQUFBLE1BQ3BELE1BQU0sT0FBTztBQUFBLE1BQ2IsR0FBSSxPQUFPLGNBQWMsVUFBYSxFQUFFLFdBQVcsT0FBTyxVQUFVO0FBQUEsTUFDcEUsTUFBTSxrQkFBa0I7QUFBQSxJQUMxQixDQUFDO0FBQUEsSUFDRCxVQUFVLE9BQU87QUFBQSxFQUNuQixDQUFDO0FBQ0g7QUFZQSxlQUFzQix3QkFBMkIsUUFBc0Q7QUFDckcsUUFBTSxnQkFBcUM7QUFBQSxJQUN6QyxVQUFVLE9BQU87QUFBQSxJQUNqQixNQUFNO0FBQUEsRUFDUjtBQUVBLFFBQU0sZ0JBQWdCLE1BQU0sa0JBQWtCLGFBQWE7QUFDM0QsUUFBTSxtQkFBbUIsRUFBRSxHQUFHLGVBQWUsT0FBTyx5QkFBeUIsQ0FBQztBQUU5RSxNQUFJO0FBQ0YsV0FBTyxNQUFNLE9BQU8sU0FBUztBQUFBLEVBQy9CLFVBQUU7QUFDQSxVQUFNLFVBQVUsNEJBQTRCLGFBQWE7QUFDekQsUUFBSSxRQUFRLFNBQVMseUJBQXlCLFFBQVE7QUFDcEQsWUFBTSxvQkFBb0IsYUFBYTtBQUFBLElBQ3pDLE9BQU87QUFDTCxZQUFNLG1CQUFtQixFQUFFLEdBQUcsZUFBZSxPQUFPLFFBQVEsTUFBTSxDQUFDO0FBQUEsSUFDckU7QUFBQSxFQUNGO0FBQ0Y7QUFRQSxlQUFzQixtQkFBbUIsUUFBaUQ7QUFDeEYsUUFBTSxXQUFXO0FBQUEsSUFDZixrQkFBa0Isb0NBQW9DO0FBQUEsTUFDcEQsTUFBTSxPQUFPO0FBQUEsTUFDYixHQUFJLE9BQU8sY0FBYyxVQUFhLEVBQUUsV0FBVyxPQUFPLFVBQVU7QUFBQSxNQUNwRSxPQUFPLE9BQU87QUFBQSxNQUNkLE1BQU0sa0JBQWtCO0FBQUEsSUFDMUIsQ0FBQztBQUFBLElBQ0QsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
* @file
|
|
3
3
|
*
|
|
4
4
|
* Builds the argument list for spawning the Android emulator.
|
|
5
|
+
*
|
|
6
|
+
* **The harness owns the snapshot it loads, or it loads none.** This file used
|
|
7
|
+
* to pass `-no-snapshot-save` alone — the one combination that is never
|
|
8
|
+
* correct. It never *writes* `default_boot`, yet every run *resumed* it, so the
|
|
9
|
+
* guest each run started from was state nothing had validated since whenever a
|
|
10
|
+
* human last saved it. Measured 2026-09-03, same AVD back to back:
|
|
11
|
+
*
|
|
12
|
+
* | Launch | Result |
|
|
13
|
+
* | --- | --- |
|
|
14
|
+
* | snapshot resumed (`-no-snapshot-save` alone) | guest dies ~90s in, every time |
|
|
15
|
+
* | `-no-snapshot-load` (cold) | booted in 50s, alive at 60/120/180/240s |
|
|
16
|
+
*
|
|
17
|
+
* A resumed snapshot rots silently, and the failure it eventually produces —
|
|
18
|
+
* a device that serves adb, accepts a session and then drops `offline` a
|
|
19
|
+
* half-minute later — is indistinguishable from a code regression. So the
|
|
20
|
+
* default is a full cold boot, and snapshot reuse is an explicit opt-in that
|
|
21
|
+
* takes **both** halves: load and save together, so the snapshot the next run
|
|
22
|
+
* resumes is one this run wrote.
|
|
5
23
|
*/
|
|
6
24
|
/**
|
|
7
25
|
* Parameters for {@link buildEmulatorArguments}.
|
|
@@ -16,6 +34,14 @@ export interface BuildEmulatorArgumentsParams {
|
|
|
16
34
|
* focus. Resolved from the `isEmulatorVisible` transport option.
|
|
17
35
|
*/
|
|
18
36
|
readonly isHidden: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Whether the emulator may resume — and refresh — the AVD's saved boot
|
|
39
|
+
* snapshot. Resolved from the `shouldReuseEmulatorSnapshot` transport option.
|
|
40
|
+
*
|
|
41
|
+
* `false` (the default) cold-boots hermetically. `true` buys back the ~112s
|
|
42
|
+
* boot on a persistent runner, at the cost of test isolation.
|
|
43
|
+
*/
|
|
44
|
+
readonly shouldReuseSnapshot: boolean;
|
|
19
45
|
}
|
|
20
46
|
/**
|
|
21
47
|
* Builds the argument list for spawning the Android emulator.
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
const DNS_SERVER = "8.8.8.8";
|
|
2
2
|
function buildEmulatorArguments(params) {
|
|
3
|
-
const emulatorArguments = ["-avd", params.avdName
|
|
3
|
+
const emulatorArguments = ["-avd", params.avdName];
|
|
4
|
+
if (!params.shouldReuseSnapshot) {
|
|
5
|
+
emulatorArguments.push("-no-snapshot-load", "-no-snapshot-save");
|
|
6
|
+
}
|
|
7
|
+
emulatorArguments.push("-dns-server", DNS_SERVER);
|
|
4
8
|
if (params.isHidden) {
|
|
5
9
|
emulatorArguments.push("-no-window");
|
|
6
10
|
}
|
|
@@ -9,4 +13,4 @@ function buildEmulatorArguments(params) {
|
|
|
9
13
|
export {
|
|
10
14
|
buildEmulatorArguments
|
|
11
15
|
};
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWFyZ3VtZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEJ1aWxkcyB0aGUgYXJndW1lbnQgbGlzdCBmb3Igc3Bhd25pbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IuXG4gKlxuICogKipUaGUgaGFybmVzcyBvd25zIHRoZSBzbmFwc2hvdCBpdCBsb2Fkcywgb3IgaXQgbG9hZHMgbm9uZS4qKiBUaGlzIGZpbGUgdXNlZFxuICogdG8gcGFzcyBgLW5vLXNuYXBzaG90LXNhdmVgIGFsb25lIFx1MjAxNCB0aGUgb25lIGNvbWJpbmF0aW9uIHRoYXQgaXMgbmV2ZXJcbiAqIGNvcnJlY3QuIEl0IG5ldmVyICp3cml0ZXMqIGBkZWZhdWx0X2Jvb3RgLCB5ZXQgZXZlcnkgcnVuICpyZXN1bWVkKiBpdCwgc28gdGhlXG4gKiBndWVzdCBlYWNoIHJ1biBzdGFydGVkIGZyb20gd2FzIHN0YXRlIG5vdGhpbmcgaGFkIHZhbGlkYXRlZCBzaW5jZSB3aGVuZXZlciBhXG4gKiBodW1hbiBsYXN0IHNhdmVkIGl0LiBNZWFzdXJlZCAyMDI2LTA5LTAzLCBzYW1lIEFWRCBiYWNrIHRvIGJhY2s6XG4gKlxuICogfCBMYXVuY2ggfCBSZXN1bHQgfFxuICogfCAtLS0gfCAtLS0gfFxuICogfCBzbmFwc2hvdCByZXN1bWVkIChgLW5vLXNuYXBzaG90LXNhdmVgIGFsb25lKSB8IGd1ZXN0IGRpZXMgfjkwcyBpbiwgZXZlcnkgdGltZSB8XG4gKiB8IGAtbm8tc25hcHNob3QtbG9hZGAgKGNvbGQpIHwgYm9vdGVkIGluIDUwcywgYWxpdmUgYXQgNjAvMTIwLzE4MC8yNDBzIHxcbiAqXG4gKiBBIHJlc3VtZWQgc25hcHNob3Qgcm90cyBzaWxlbnRseSwgYW5kIHRoZSBmYWlsdXJlIGl0IGV2ZW50dWFsbHkgcHJvZHVjZXMgXHUyMDE0XG4gKiBhIGRldmljZSB0aGF0IHNlcnZlcyBhZGIsIGFjY2VwdHMgYSBzZXNzaW9uIGFuZCB0aGVuIGRyb3BzIGBvZmZsaW5lYCBhXG4gKiBoYWxmLW1pbnV0ZSBsYXRlciBcdTIwMTQgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGNvZGUgcmVncmVzc2lvbi4gU28gdGhlXG4gKiBkZWZhdWx0IGlzIGEgZnVsbCBjb2xkIGJvb3QsIGFuZCBzbmFwc2hvdCByZXVzZSBpcyBhbiBleHBsaWNpdCBvcHQtaW4gdGhhdFxuICogdGFrZXMgKipib3RoKiogaGFsdmVzOiBsb2FkIGFuZCBzYXZlIHRvZ2V0aGVyLCBzbyB0aGUgc25hcHNob3QgdGhlIG5leHQgcnVuXG4gKiByZXN1bWVzIGlzIG9uZSB0aGlzIHJ1biB3cm90ZS5cbiAqL1xuXG5jb25zdCBETlNfU0VSVkVSID0gJzguOC44LjgnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZEVtdWxhdG9yQXJndW1lbnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEVtdWxhdG9yQXJndW1lbnRzUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBlbXVsYXRvciBoZWFkbGVzcyAoYC1uby13aW5kb3dgKSwgc28gaXQgbmV2ZXIgc3RlYWxzXG4gICAqIGZvY3VzLiBSZXNvbHZlZCBmcm9tIHRoZSBgaXNFbXVsYXRvclZpc2libGVgIHRyYW5zcG9ydCBvcHRpb24uXG4gICAqL1xuICByZWFkb25seSBpc0hpZGRlbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW11bGF0b3IgbWF5IHJlc3VtZSBcdTIwMTQgYW5kIHJlZnJlc2ggXHUyMDE0IHRoZSBBVkQncyBzYXZlZCBib290XG4gICAqIHNuYXBzaG90LiBSZXNvbHZlZCBmcm9tIHRoZSBgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90YCB0cmFuc3BvcnQgb3B0aW9uLlxuICAgKlxuICAgKiBgZmFsc2VgICh0aGUgZGVmYXVsdCkgY29sZC1ib290cyBoZXJtZXRpY2FsbHkuIGB0cnVlYCBidXlzIGJhY2sgdGhlIH4xMTJzXG4gICAqIGJvb3Qgb24gYSBwZXJzaXN0ZW50IHJ1bm5lciwgYXQgdGhlIGNvc3Qgb2YgdGVzdCBpc29sYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZVNuYXBzaG90OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgYXJndW1lbnQgbGlzdCBmb3Igc3Bhd25pbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbXVsYXRvciBhcmd1bWVudCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIGFyZ3VtZW50IGFycmF5IHRvIHBhc3MgdG8gdGhlIGVtdWxhdG9yIGJpbmFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JBcmd1bWVudHMocGFyYW1zOiBCdWlsZEVtdWxhdG9yQXJndW1lbnRzUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCBlbXVsYXRvckFyZ3VtZW50cyA9IFsnLWF2ZCcsIHBhcmFtcy5hdmROYW1lXTtcbiAgLypcbiAgICogQm90aCBmbGFncyBvciBuZWl0aGVyOiBsb2FkaW5nIHdpdGhvdXQgc2F2aW5nIGlzIHRoZSByZXN1bWUtd2hhdC13ZS1uZXZlci1cbiAgICogd3JvdGUgY29tYmluYXRpb24gdGhpcyBmaWxlJ3MgaGVhZGVyIGV4aXN0cyB0byBydWxlIG91dC5cbiAgICovXG4gIGlmICghcGFyYW1zLnNob3VsZFJldXNlU25hcHNob3QpIHtcbiAgICBlbXVsYXRvckFyZ3VtZW50cy5wdXNoKCctbm8tc25hcHNob3QtbG9hZCcsICctbm8tc25hcHNob3Qtc2F2ZScpO1xuICB9XG4gIGVtdWxhdG9yQXJndW1lbnRzLnB1c2goJy1kbnMtc2VydmVyJywgRE5TX1NFUlZFUik7XG4gIGlmIChwYXJhbXMuaXNIaWRkZW4pIHtcbiAgICBlbXVsYXRvckFyZ3VtZW50cy5wdXNoKCctbm8td2luZG93Jyk7XG4gIH1cbiAgcmV0dXJuIGVtdWxhdG9yQXJndW1lbnRzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBd0JBLE1BQU0sYUFBYTtBQWlDWixTQUFTLHVCQUF1QixRQUFnRDtBQUNyRixRQUFNLG9CQUFvQixDQUFDLFFBQVEsT0FBTyxPQUFPO0FBS2pELE1BQUksQ0FBQyxPQUFPLHFCQUFxQjtBQUMvQixzQkFBa0IsS0FBSyxxQkFBcUIsbUJBQW1CO0FBQUEsRUFDakU7QUFDQSxvQkFBa0IsS0FBSyxlQUFlLFVBQVU7QUFDaEQsTUFBSSxPQUFPLFVBQVU7QUFDbkIsc0JBQWtCLEtBQUssWUFBWTtBQUFBLEVBQ3JDO0FBQ0EsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure helpers for finding the Android emulator process that **outlives the pid
|
|
5
|
+
* the harness killed**.
|
|
6
|
+
*
|
|
7
|
+
* Under `-no-window` the emulator's backend process is
|
|
8
|
+
* `qemu-system-x86_64-headless` (`qemu-system-x86_64` when windowed), not the
|
|
9
|
+
* `emulator` launcher the harness spawned and holds a `ChildProcess` for. The
|
|
10
|
+
* launcher exits or is killed, and the backend is what actually holds the AVD's
|
|
11
|
+
* `multiinstance.lock` and the console/adb ports — so `taskkill /F /T` against
|
|
12
|
+
* the launcher's pid reports success while the emulator keeps running. Every
|
|
13
|
+
* later run against that AVD then dies with `Running multiple emulators with the
|
|
14
|
+
* same AVD is an experimental feature`, which never reaches the user because the
|
|
15
|
+
* emulator writes it to its own stdout.
|
|
16
|
+
*
|
|
17
|
+
* Note that the obvious filter — `-Name qemu-system-x86_64` / matching that
|
|
18
|
+
* exact image name — does **not** match the `-headless` build, which is how the
|
|
19
|
+
* leftover stays invisible through several rounds of "no emulator is running".
|
|
20
|
+
*
|
|
21
|
+
* Ownership is decided by a **pre-launch snapshot**: a backend already running
|
|
22
|
+
* before this run started its own belongs to somebody else (another AVD, or one
|
|
23
|
+
* the user booted by hand) and is never touched. Kept separate from the
|
|
24
|
+
* integration-only `transport-factory` so the parsing and the selection stay
|
|
25
|
+
* unit-testable.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* One process from a host process listing.
|
|
29
|
+
*/
|
|
30
|
+
export interface ProcessListEntry {
|
|
31
|
+
/**
|
|
32
|
+
The process/image name, as the platform's listing reports it.
|
|
33
|
+
*/
|
|
34
|
+
readonly name: string;
|
|
35
|
+
/**
|
|
36
|
+
The process ID.
|
|
37
|
+
*/
|
|
38
|
+
readonly pid: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parameters for {@link selectEmulatorBackendPids}.
|
|
42
|
+
*/
|
|
43
|
+
export interface SelectEmulatorBackendPidsParams {
|
|
44
|
+
/**
|
|
45
|
+
Emulator backend PIDs seen **before** this run launched its emulator, which it therefore does not own.
|
|
46
|
+
*/
|
|
47
|
+
readonly knownPids: readonly number[];
|
|
48
|
+
/**
|
|
49
|
+
The host's current process listing.
|
|
50
|
+
*/
|
|
51
|
+
readonly processes: readonly ProcessListEntry[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parses `ps -eo pid=,comm=` output.
|
|
55
|
+
*
|
|
56
|
+
* @param processListOutput - Raw stdout of the `ps` listing.
|
|
57
|
+
* @returns One entry per parsable row, in listed order.
|
|
58
|
+
*/
|
|
59
|
+
export declare function parsePosixProcessList(processListOutput: string): ProcessListEntry[];
|
|
60
|
+
/**
|
|
61
|
+
* Parses `tasklist /FO CSV /NH` output.
|
|
62
|
+
*
|
|
63
|
+
* Only the first two fields are read — the image name and the PID — so the
|
|
64
|
+
* memory column's own commas cannot confuse the split.
|
|
65
|
+
*
|
|
66
|
+
* @param taskListOutput - Raw stdout of the `tasklist` listing.
|
|
67
|
+
* @returns One entry per parsable row, in listed order.
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseWindowsTaskList(taskListOutput: string): ProcessListEntry[];
|
|
70
|
+
/**
|
|
71
|
+
* Selects the emulator processes this run is responsible for killing.
|
|
72
|
+
*
|
|
73
|
+
* @param params - The current listing plus the PIDs that predate this run's emulator.
|
|
74
|
+
* @returns The PIDs of emulator processes this run owns, in listed order.
|
|
75
|
+
*/
|
|
76
|
+
export declare function selectEmulatorBackendPids(params: SelectEmulatorBackendPidsParams): number[];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const EMULATOR_BACKEND_NAME_PATTERN = /^(?:emulator|emulator64-[\w.-]+|qemu-system-[\w.-]+)$/;
|
|
2
|
+
const EXECUTABLE_SUFFIX_PATTERN = /\.exe$/;
|
|
3
|
+
const RADIX_DECIMAL = 10;
|
|
4
|
+
const TASK_LIST_FIELDS_READ = 2;
|
|
5
|
+
function parsePosixProcessList(processListOutput) {
|
|
6
|
+
const entries = [];
|
|
7
|
+
for (const rawLine of processListOutput.split("\n")) {
|
|
8
|
+
const line = rawLine.trim();
|
|
9
|
+
const separatorIndex = line.indexOf(" ");
|
|
10
|
+
if (separatorIndex === -1) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const pid = Number.parseInt(line.slice(0, separatorIndex), RADIX_DECIMAL);
|
|
14
|
+
if (Number.isNaN(pid)) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
entries.push({ name: line.slice(separatorIndex + 1).trim(), pid });
|
|
18
|
+
}
|
|
19
|
+
return entries;
|
|
20
|
+
}
|
|
21
|
+
function parseWindowsTaskList(taskListOutput) {
|
|
22
|
+
const entries = [];
|
|
23
|
+
for (const rawLine of taskListOutput.split("\n")) {
|
|
24
|
+
const [rawName = "", rawPid = ""] = rawLine.trim().replaceAll('"', "").split(",", TASK_LIST_FIELDS_READ);
|
|
25
|
+
const pid = Number.parseInt(rawPid, RADIX_DECIMAL);
|
|
26
|
+
if (rawName.length === 0 || Number.isNaN(pid)) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
entries.push({ name: rawName, pid });
|
|
30
|
+
}
|
|
31
|
+
return entries;
|
|
32
|
+
}
|
|
33
|
+
function selectEmulatorBackendPids(params) {
|
|
34
|
+
return params.processes.filter((entry) => checkIsEmulatorBackendName(entry.name) && !params.knownPids.includes(entry.pid)).map((entry) => entry.pid);
|
|
35
|
+
}
|
|
36
|
+
function checkIsEmulatorBackendName(name) {
|
|
37
|
+
const baseName = name.slice(Math.max(name.lastIndexOf("/"), name.lastIndexOf("\\")) + 1);
|
|
38
|
+
return EMULATOR_BACKEND_NAME_PATTERN.test(baseName.toLowerCase().replace(EXECUTABLE_SUFFIX_PATTERN, ""));
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
parsePosixProcessList,
|
|
42
|
+
parseWindowsTaskList,
|
|
43
|
+
selectEmulatorBackendPids
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWJhY2tlbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGZpbmRpbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IgcHJvY2VzcyB0aGF0ICoqb3V0bGl2ZXMgdGhlIHBpZFxuICogdGhlIGhhcm5lc3Mga2lsbGVkKiouXG4gKlxuICogVW5kZXIgYC1uby13aW5kb3dgIHRoZSBlbXVsYXRvcidzIGJhY2tlbmQgcHJvY2VzcyBpc1xuICogYHFlbXUtc3lzdGVtLXg4Nl82NC1oZWFkbGVzc2AgKGBxZW11LXN5c3RlbS14ODZfNjRgIHdoZW4gd2luZG93ZWQpLCBub3QgdGhlXG4gKiBgZW11bGF0b3JgIGxhdW5jaGVyIHRoZSBoYXJuZXNzIHNwYXduZWQgYW5kIGhvbGRzIGEgYENoaWxkUHJvY2Vzc2AgZm9yLiBUaGVcbiAqIGxhdW5jaGVyIGV4aXRzIG9yIGlzIGtpbGxlZCwgYW5kIHRoZSBiYWNrZW5kIGlzIHdoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIEFWRCdzXG4gKiBgbXVsdGlpbnN0YW5jZS5sb2NrYCBhbmQgdGhlIGNvbnNvbGUvYWRiIHBvcnRzIFx1MjAxNCBzbyBgdGFza2tpbGwgL0YgL1RgIGFnYWluc3RcbiAqIHRoZSBsYXVuY2hlcidzIHBpZCByZXBvcnRzIHN1Y2Nlc3Mgd2hpbGUgdGhlIGVtdWxhdG9yIGtlZXBzIHJ1bm5pbmcuIEV2ZXJ5XG4gKiBsYXRlciBydW4gYWdhaW5zdCB0aGF0IEFWRCB0aGVuIGRpZXMgd2l0aCBgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGVcbiAqIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCwgd2hpY2ggbmV2ZXIgcmVhY2hlcyB0aGUgdXNlciBiZWNhdXNlIHRoZVxuICogZW11bGF0b3Igd3JpdGVzIGl0IHRvIGl0cyBvd24gc3Rkb3V0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgb2J2aW91cyBmaWx0ZXIgXHUyMDE0IGAtTmFtZSBxZW11LXN5c3RlbS14ODZfNjRgIC8gbWF0Y2hpbmcgdGhhdFxuICogZXhhY3QgaW1hZ2UgbmFtZSBcdTIwMTQgZG9lcyAqKm5vdCoqIG1hdGNoIHRoZSBgLWhlYWRsZXNzYCBidWlsZCwgd2hpY2ggaXMgaG93IHRoZVxuICogbGVmdG92ZXIgc3RheXMgaW52aXNpYmxlIHRocm91Z2ggc2V2ZXJhbCByb3VuZHMgb2YgXCJubyBlbXVsYXRvciBpcyBydW5uaW5nXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIGRlY2lkZWQgYnkgYSAqKnByZS1sYXVuY2ggc25hcHNob3QqKjogYSBiYWNrZW5kIGFscmVhZHkgcnVubmluZ1xuICogYmVmb3JlIHRoaXMgcnVuIHN0YXJ0ZWQgaXRzIG93biBiZWxvbmdzIHRvIHNvbWVib2R5IGVsc2UgKGFub3RoZXIgQVZELCBvciBvbmVcbiAqIHRoZSB1c2VyIGJvb3RlZCBieSBoYW5kKSBhbmQgaXMgbmV2ZXIgdG91Y2hlZC4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZVxuICogaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXJzaW5nIGFuZCB0aGUgc2VsZWN0aW9uIHN0YXlcbiAqIHVuaXQtdGVzdGFibGUuXG4gKi9cblxuLyoqXG4gKiBPbmUgcHJvY2VzcyBmcm9tIGEgaG9zdCBwcm9jZXNzIGxpc3RpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0xpc3RFbnRyeSB7XG4gIC8qKlxuICBUaGUgcHJvY2Vzcy9pbWFnZSBuYW1lLCBhcyB0aGUgcGxhdGZvcm0ncyBsaXN0aW5nIHJlcG9ydHMgaXQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBwcm9jZXNzIElELlxuICAgKi9cbiAgcmVhZG9ubHkgcGlkOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNQYXJhbXMge1xuICAvKipcbiAgRW11bGF0b3IgYmFja2VuZCBQSURzIHNlZW4gKipiZWZvcmUqKiB0aGlzIHJ1biBsYXVuY2hlZCBpdHMgZW11bGF0b3IsIHdoaWNoIGl0IHRoZXJlZm9yZSBkb2VzIG5vdCBvd24uXG4gICAqL1xuICByZWFkb25seSBrbm93blBpZHM6IHJlYWRvbmx5IG51bWJlcltdO1xuXG4gIC8qKlxuICBUaGUgaG9zdCdzIGN1cnJlbnQgcHJvY2VzcyBsaXN0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2VzOiByZWFkb25seSBQcm9jZXNzTGlzdEVudHJ5W107XG59XG5cbi8qKlxuICogTWF0Y2hlcyB0aGUgZW11bGF0b3IgbGF1bmNoZXIgYW5kIGJvdGggUUVNVSBiYWNrZW5kIGJ1aWxkcyBcdTIwMTQgY3J1Y2lhbGx5XG4gKiBpbmNsdWRpbmcgdGhlIGAtaGVhZGxlc3NgIHN1ZmZpeCBgLW5vLXdpbmRvd2AgcnVucyBwcm9kdWNlLlxuICovXG5jb25zdCBFTVVMQVRPUl9CQUNLRU5EX05BTUVfUEFUVEVSTiA9IC9eKD86ZW11bGF0b3J8ZW11bGF0b3I2NC1bXFx3Li1dK3xxZW11LXN5c3RlbS1bXFx3Li1dKykkLztcbmNvbnN0IEVYRUNVVEFCTEVfU1VGRklYX1BBVFRFUk4gPSAvXFwuZXhlJC87XG5jb25zdCBSQURJWF9ERUNJTUFMID0gMTA7XG4vKipcbiAqIE9ubHkgdGhlIGltYWdlIG5hbWUgYW5kIHRoZSBQSUQgYXJlIHJlYWQsIHNvIHRoZSBzcGxpdCBzdG9wcyBhZnRlciB0aGVtLlxuICovXG5jb25zdCBUQVNLX0xJU1RfRklFTERTX1JFQUQgPSAyO1xuXG4vKipcbiAqIFBhcnNlcyBgcHMgLWVvIHBpZD0sY29tbT1gIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc0xpc3RPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIHRoZSBgcHNgIGxpc3RpbmcuXG4gKiBAcmV0dXJucyBPbmUgZW50cnkgcGVyIHBhcnNhYmxlIHJvdywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3NpeFByb2Nlc3NMaXN0KHByb2Nlc3NMaXN0T3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBQcm9jZXNzTGlzdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgcHJvY2Vzc0xpc3RPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZSA9IHJhd0xpbmUudHJpbSgpO1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCcgJyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGlkID0gTnVtYmVyLnBhcnNlSW50KGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLCBSQURJWF9ERUNJTUFMKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHBpZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGVudHJpZXMucHVzaCh7IG5hbWU6IGxpbmUuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCksIHBpZCB9KTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFBhcnNlcyBgdGFza2xpc3QgL0ZPIENTViAvTkhgIG91dHB1dC5cbiAqXG4gKiBPbmx5IHRoZSBmaXJzdCB0d28gZmllbGRzIGFyZSByZWFkIFx1MjAxNCB0aGUgaW1hZ2UgbmFtZSBhbmQgdGhlIFBJRCBcdTIwMTQgc28gdGhlXG4gKiBtZW1vcnkgY29sdW1uJ3Mgb3duIGNvbW1hcyBjYW5ub3QgY29uZnVzZSB0aGUgc3BsaXQuXG4gKlxuICogQHBhcmFtIHRhc2tMaXN0T3V0cHV0IC0gUmF3IHN0ZG91dCBvZiB0aGUgYHRhc2tsaXN0YCBsaXN0aW5nLlxuICogQHJldHVybnMgT25lIGVudHJ5IHBlciBwYXJzYWJsZSByb3csIGluIGxpc3RlZCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2luZG93c1Rhc2tMaXN0KHRhc2tMaXN0T3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBQcm9jZXNzTGlzdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgdGFza0xpc3RPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgW3Jhd05hbWUgPSAnJywgcmF3UGlkID0gJyddID0gcmF3TGluZS50cmltKCkucmVwbGFjZUFsbCgnXCInLCAnJykuc3BsaXQoJywnLCBUQVNLX0xJU1RfRklFTERTX1JFQUQpO1xuICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChyYXdQaWQsIFJBRElYX0RFQ0lNQUwpO1xuICAgIGlmIChyYXdOYW1lLmxlbmd0aCA9PT0gMCB8fCBOdW1iZXIuaXNOYU4ocGlkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZW50cmllcy5wdXNoKHsgbmFtZTogcmF3TmFtZSwgcGlkIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgZW11bGF0b3IgcHJvY2Vzc2VzIHRoaXMgcnVuIGlzIHJlc3BvbnNpYmxlIGZvciBraWxsaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY3VycmVudCBsaXN0aW5nIHBsdXMgdGhlIFBJRHMgdGhhdCBwcmVkYXRlIHRoaXMgcnVuJ3MgZW11bGF0b3IuXG4gKiBAcmV0dXJucyBUaGUgUElEcyBvZiBlbXVsYXRvciBwcm9jZXNzZXMgdGhpcyBydW4gb3ducywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RW11bGF0b3JCYWNrZW5kUGlkcyhwYXJhbXM6IFNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNQYXJhbXMpOiBudW1iZXJbXSB7XG4gIHJldHVybiBwYXJhbXMucHJvY2Vzc2VzXG4gICAgLmZpbHRlcigoZW50cnkpID0+IGNoZWNrSXNFbXVsYXRvckJhY2tlbmROYW1lKGVudHJ5Lm5hbWUpICYmICFwYXJhbXMua25vd25QaWRzLmluY2x1ZGVzKGVudHJ5LnBpZCkpXG4gICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnBpZCk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNFbXVsYXRvckJhY2tlbmROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlTmFtZSA9IG5hbWUuc2xpY2UoTWF0aC5tYXgobmFtZS5sYXN0SW5kZXhPZignLycpLCBuYW1lLmxhc3RJbmRleE9mKCdcXFxcJykpICsgMSk7XG4gIHJldHVybiBFTVVMQVRPUl9CQUNLRU5EX05BTUVfUEFUVEVSTi50ZXN0KGJhc2VOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZShFWEVDVVRBQkxFX1NVRkZJWF9QQVRURVJOLCAnJykpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBNkRBLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sZ0JBQWdCO0FBSXRCLE1BQU0sd0JBQXdCO0FBUXZCLFNBQVMsc0JBQXNCLG1CQUErQztBQUNuRixRQUFNLFVBQThCLENBQUM7QUFFckMsYUFBVyxXQUFXLGtCQUFrQixNQUFNLElBQUksR0FBRztBQUNuRCxVQUFNLE9BQU8sUUFBUSxLQUFLO0FBQzFCLFVBQU0saUJBQWlCLEtBQUssUUFBUSxHQUFHO0FBQ3ZDLFFBQUksbUJBQW1CLElBQUk7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxNQUFNLE9BQU8sU0FBUyxLQUFLLE1BQU0sR0FBRyxjQUFjLEdBQUcsYUFBYTtBQUN4RSxRQUFJLE9BQU8sTUFBTSxHQUFHLEdBQUc7QUFDckI7QUFBQSxJQUNGO0FBRUEsWUFBUSxLQUFLLEVBQUUsTUFBTSxLQUFLLE1BQU0saUJBQWlCLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQUEsRUFDbkU7QUFFQSxTQUFPO0FBQ1Q7QUFXTyxTQUFTLHFCQUFxQixnQkFBNEM7QUFDL0UsUUFBTSxVQUE4QixDQUFDO0FBRXJDLGFBQVcsV0FBVyxlQUFlLE1BQU0sSUFBSSxHQUFHO0FBQ2hELFVBQU0sQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFFLElBQUksUUFBUSxLQUFLLEVBQUUsV0FBVyxLQUFLLEVBQUUsRUFBRSxNQUFNLEtBQUsscUJBQXFCO0FBQ3ZHLFVBQU0sTUFBTSxPQUFPLFNBQVMsUUFBUSxhQUFhO0FBQ2pELFFBQUksUUFBUSxXQUFXLEtBQUssT0FBTyxNQUFNLEdBQUcsR0FBRztBQUM3QztBQUFBLElBQ0Y7QUFFQSxZQUFRLEtBQUssRUFBRSxNQUFNLFNBQVMsSUFBSSxDQUFDO0FBQUEsRUFDckM7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLDBCQUEwQixRQUFtRDtBQUMzRixTQUFPLE9BQU8sVUFDWCxPQUFPLENBQUMsVUFBVSwyQkFBMkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLFVBQVUsU0FBUyxNQUFNLEdBQUcsQ0FBQyxFQUNqRyxJQUFJLENBQUMsVUFBVSxNQUFNLEdBQUc7QUFDN0I7QUFFQSxTQUFTLDJCQUEyQixNQUF1QjtBQUN6RCxRQUFNLFdBQVcsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLFlBQVksR0FBRyxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3ZGLFNBQU8sOEJBQThCLEtBQUssU0FBUyxZQUFZLEVBQUUsUUFBUSwyQkFBMkIsRUFBRSxDQUFDO0FBQ3pHOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Picks the running emulator that belongs to a named AVD.
|
|
5
|
+
*
|
|
6
|
+
* A capture suite must never take "the first device `adb devices` lists". Two
|
|
7
|
+
* things routinely make that the wrong device on this fleet: a physical phone is
|
|
8
|
+
* often plugged into the same machine, and the harness's own `obsidian_test` AVD
|
|
9
|
+
* runs at a different geometry than the `obsidian_screenshots` AVD sized to the
|
|
10
|
+
* store's frame. Picking by position silently photographs the wrong screen at
|
|
11
|
+
* the wrong size, and the dimension assertion that would have caught it fires
|
|
12
|
+
* several minutes later, after the run.
|
|
13
|
+
*
|
|
14
|
+
* Pure and unit-tested; the `adb` round-trips that gather the AVD names live in
|
|
15
|
+
* `resolve-emulator-device-id`.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* One running emulator, paired with the AVD it was started from.
|
|
19
|
+
*/
|
|
20
|
+
export interface EmulatorDeviceCandidate {
|
|
21
|
+
/**
|
|
22
|
+
* The AVD name the emulator reports, e.g. `obsidian_screenshots`.
|
|
23
|
+
*/
|
|
24
|
+
readonly avdName: string;
|
|
25
|
+
/**
|
|
26
|
+
* The device UDID, e.g. `emulator-5554`.
|
|
27
|
+
*/
|
|
28
|
+
readonly deviceId: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parameters for {@link selectEmulatorDeviceId}.
|
|
32
|
+
*/
|
|
33
|
+
export interface SelectEmulatorDeviceIdParams {
|
|
34
|
+
/**
|
|
35
|
+
* The AVD name to match.
|
|
36
|
+
*/
|
|
37
|
+
readonly avdName: string;
|
|
38
|
+
/**
|
|
39
|
+
* Every running emulator, with the AVD each was started from.
|
|
40
|
+
*/
|
|
41
|
+
readonly candidates: readonly EmulatorDeviceCandidate[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Picks the emulator started from a named AVD.
|
|
45
|
+
*
|
|
46
|
+
* @param params - The AVD to match and the running emulators to match against.
|
|
47
|
+
* @returns The matching device UDID, or `null` when no running emulator carries that AVD name.
|
|
48
|
+
*/
|
|
49
|
+
export declare function selectEmulatorDeviceId(params: SelectEmulatorDeviceIdParams): null | string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
function selectEmulatorDeviceId(params) {
|
|
2
|
+
const match = params.candidates.find((candidate) => candidate.avdName === params.avdName);
|
|
3
|
+
return match ? match.deviceId : null;
|
|
4
|
+
}
|
|
5
|
+
export {
|
|
6
|
+
selectEmulatorDeviceId
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWRldmljZS1pZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFBpY2tzIHRoZSBydW5uaW5nIGVtdWxhdG9yIHRoYXQgYmVsb25ncyB0byBhIG5hbWVkIEFWRC5cbiAqXG4gKiBBIGNhcHR1cmUgc3VpdGUgbXVzdCBuZXZlciB0YWtlIFwidGhlIGZpcnN0IGRldmljZSBgYWRiIGRldmljZXNgIGxpc3RzXCIuIFR3b1xuICogdGhpbmdzIHJvdXRpbmVseSBtYWtlIHRoYXQgdGhlIHdyb25nIGRldmljZSBvbiB0aGlzIGZsZWV0OiBhIHBoeXNpY2FsIHBob25lIGlzXG4gKiBvZnRlbiBwbHVnZ2VkIGludG8gdGhlIHNhbWUgbWFjaGluZSwgYW5kIHRoZSBoYXJuZXNzJ3Mgb3duIGBvYnNpZGlhbl90ZXN0YCBBVkRcbiAqIHJ1bnMgYXQgYSBkaWZmZXJlbnQgZ2VvbWV0cnkgdGhhbiB0aGUgYG9ic2lkaWFuX3NjcmVlbnNob3RzYCBBVkQgc2l6ZWQgdG8gdGhlXG4gKiBzdG9yZSdzIGZyYW1lLiBQaWNraW5nIGJ5IHBvc2l0aW9uIHNpbGVudGx5IHBob3RvZ3JhcGhzIHRoZSB3cm9uZyBzY3JlZW4gYXRcbiAqIHRoZSB3cm9uZyBzaXplLCBhbmQgdGhlIGRpbWVuc2lvbiBhc3NlcnRpb24gdGhhdCB3b3VsZCBoYXZlIGNhdWdodCBpdCBmaXJlc1xuICogc2V2ZXJhbCBtaW51dGVzIGxhdGVyLCBhZnRlciB0aGUgcnVuLlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgYGFkYmAgcm91bmQtdHJpcHMgdGhhdCBnYXRoZXIgdGhlIEFWRCBuYW1lcyBsaXZlIGluXG4gKiBgcmVzb2x2ZS1lbXVsYXRvci1kZXZpY2UtaWRgLlxuICovXG5cbi8qKlxuICogT25lIHJ1bm5pbmcgZW11bGF0b3IsIHBhaXJlZCB3aXRoIHRoZSBBVkQgaXQgd2FzIHN0YXJ0ZWQgZnJvbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXVsYXRvckRldmljZUNhbmRpZGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgQVZEIG5hbWUgdGhlIGVtdWxhdG9yIHJlcG9ydHMsIGUuZy4gYG9ic2lkaWFuX3NjcmVlbnNob3RzYC5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElELCBlLmcuIGBlbXVsYXRvci01NTU0YC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNlbGVjdEVtdWxhdG9yRGV2aWNlSWR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEVtdWxhdG9yRGV2aWNlSWRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIEFWRCBuYW1lIHRvIG1hdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFdmVyeSBydW5uaW5nIGVtdWxhdG9yLCB3aXRoIHRoZSBBVkQgZWFjaCB3YXMgc3RhcnRlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuZGlkYXRlczogcmVhZG9ubHkgRW11bGF0b3JEZXZpY2VDYW5kaWRhdGVbXTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgZW11bGF0b3Igc3RhcnRlZCBmcm9tIGEgbmFtZWQgQVZELlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQVZEIHRvIG1hdGNoIGFuZCB0aGUgcnVubmluZyBlbXVsYXRvcnMgdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBkZXZpY2UgVURJRCwgb3IgYG51bGxgIHdoZW4gbm8gcnVubmluZyBlbXVsYXRvciBjYXJyaWVzIHRoYXQgQVZEIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RFbXVsYXRvckRldmljZUlkKHBhcmFtczogU2VsZWN0RW11bGF0b3JEZXZpY2VJZFBhcmFtcyk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IHBhcmFtcy5jYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmF2ZE5hbWUgPT09IHBhcmFtcy5hdmROYW1lKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2guZGV2aWNlSWQgOiBudWxsO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBcURPLFNBQVMsdUJBQXVCLFFBQXFEO0FBQzFGLFFBQU0sUUFBUSxPQUFPLFdBQVcsS0FBSyxDQUFDLGNBQWMsVUFBVSxZQUFZLE9BQU8sT0FBTztBQUN4RixTQUFPLFFBQVEsTUFBTSxXQUFXO0FBQ2xDOyIsCiAgIm5hbWVzIjogW10KfQo=
|