fix(scan): allow slower SANE network discovery
This commit is contained in:
@@ -20,7 +20,9 @@ export const hasSane = () => commandExists("scanimage")
|
|||||||
|
|
||||||
export const listScanners = async () => {
|
export const listScanners = async () => {
|
||||||
if (!await hasSane()) return []
|
if (!await hasSane()) return []
|
||||||
const result = await runCommand("scanimage", ["-L"], { timeoutMs: 10_000 })
|
// SANE also probes network backends; these can take more than ten seconds
|
||||||
|
// even when the USB scanner is already available.
|
||||||
|
const result = await runCommand("scanimage", ["-L"], { timeoutMs: 30_000 })
|
||||||
if (result.code !== 0) return []
|
if (result.code !== 0) return []
|
||||||
return result.stdout.split(/\r?\n/)
|
return result.stdout.split(/\r?\n/)
|
||||||
.map((line) => line.trim().match(/^device `([^']+)'/)?.[1])
|
.map((line) => line.trim().match(/^device `([^']+)'/)?.[1])
|
||||||
|
|||||||
@@ -3,16 +3,21 @@ import test, { TestContext } from "node:test"
|
|||||||
import os from "node:os"
|
import os from "node:os"
|
||||||
import path from "node:path"
|
import path from "node:path"
|
||||||
import { chmod, mkdtemp, readFile, readdir, rm, writeFile } from "node:fs/promises"
|
import { chmod, mkdtemp, readFile, readdir, rm, writeFile } from "node:fs/promises"
|
||||||
import { runScan } from "../src/scan/sane.js"
|
import { listScanners, runScan } from "../src/scan/sane.js"
|
||||||
import { commandExists, runCommand } from "../src/commands.js"
|
import { commandExists, runCommand } from "../src/commands.js"
|
||||||
import { AgentConfig, ScanJob } from "../src/types.js"
|
import { AgentConfig, ScanJob } from "../src/types.js"
|
||||||
|
|
||||||
const fakeScanner = `#!/usr/bin/env python3
|
const fakeScanner = `#!/usr/bin/env python3
|
||||||
import json, os, sys
|
import json, os, sys, time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
args = sys.argv[1:]
|
args = sys.argv[1:]
|
||||||
Path(os.environ['SCAN_TEST_CALL']).write_text(json.dumps(args))
|
Path(os.environ['SCAN_TEST_CALL']).write_text(json.dumps(args))
|
||||||
|
if args == ['-L']:
|
||||||
|
time.sleep(float(os.environ.get('SCAN_TEST_DISCOVERY_DELAY', '0')))
|
||||||
|
print("device " + chr(96) + "fujitsu:ScanSnap iX1600:test' is a FUJITSU scanner")
|
||||||
|
print("device " + chr(96) + "airscan:test' is a network scanner")
|
||||||
|
sys.exit(int(os.environ.get('SCAN_TEST_EXIT', '0')))
|
||||||
batch = next((arg.split('=', 1)[1] for arg in args if arg.startswith('--batch=')), None)
|
batch = next((arg.split('=', 1)[1] for arg in args if arg.startswith('--batch=')), None)
|
||||||
single = args[args.index('--output-file') + 1] if '--output-file' in args else None
|
single = args[args.index('--output-file') + 1] if '--output-file' in args else None
|
||||||
count = int(os.environ.get('SCAN_TEST_PAGES', '4')) if batch else 1
|
count = int(os.environ.get('SCAN_TEST_PAGES', '4')) if batch else 1
|
||||||
@@ -52,6 +57,18 @@ const setup = async (t: TestContext) => {
|
|||||||
return { config, job, dir, args: async () => JSON.parse(await readFile(process.env.SCAN_TEST_CALL!, "utf8")) as string[] }
|
return { config, job, dir, args: async () => JSON.parse(await readFile(process.env.SCAN_TEST_CALL!, "utf8")) as string[] }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("scanner discovery waits for network probes beyond the former ten-second limit", async (t) => {
|
||||||
|
await setup(t)
|
||||||
|
process.env.SCAN_TEST_DISCOVERY_DELAY = "10.2"
|
||||||
|
assert.deepEqual(await listScanners(), ["fujitsu:ScanSnap iX1600:test", "airscan:test"])
|
||||||
|
})
|
||||||
|
|
||||||
|
test("failed scanner discovery does not advertise devices from an unsuccessful command", async (t) => {
|
||||||
|
await setup(t)
|
||||||
|
process.env.SCAN_TEST_EXIT = "1"
|
||||||
|
assert.deepEqual(await listScanners(), [])
|
||||||
|
})
|
||||||
|
|
||||||
test("duplex batch saves all pages as PDF, accepts NO_DOCS and passes A4 geometry", async (t) => {
|
test("duplex batch saves all pages as PDF, accepts NO_DOCS and passes A4 geometry", async (t) => {
|
||||||
const { config, job, args } = await setup(t)
|
const { config, job, args } = await setup(t)
|
||||||
process.env.SCAN_TEST_EMPTY_FINAL = "1"
|
process.env.SCAN_TEST_EMPTY_FINAL = "1"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user