fix(m168): 复审 r2 三项 —— 夹具不再空转、启动不再替英文用户下载、时限不再判慢线下不完
复审 r2(p2-3 / fix-then-merge)三项:
1. **P2-1 爬行服务端是空转的**(`font/tests/support.rs`,从 `tests.rs` 拆出守 400 行):
`seen.windows(4).any(|w| w == b"\n\n")` 拿 4 字节窗口比 2 字节切片 ⇒ `PartialEq` 先比长度 ⇒
恒 false ⇒ 请求头永远读不完、一个字节不发,用例证明的其实只是「连接挂着被掐断」。上一版
这里是 Python 生成时把 `\r\n` 落成了真实换行字节。现在两处都是转义写法
(`b"\r\n\r\n"` + 完整 CRLF 响应头),并且**把「夹具真的在说话」变成断言**:
`serve_trickle()` 返回 `TrickleProof { header, dripped }`,用例断言「真的发过头」「真的挤过
字节」——否则夹具再坏一次也会绿。拆成两条用例:`a_trickling_candidate_is_cut_by_the_attempt_deadline`
([爬行, 正常],300 ms 切断第一个后第二个成功,0.38 s)与
`the_total_deadline_cuts_a_single_crawling_candidate`(单候选 + 400 ms 总预算)。
变异证明:把服务端改成「一个字节都不发」⇒ 两条用例红在「爬行服务端必须真的发出响应头」。
2. **P2-2 启动替英文用户下 17 MiB(真行为 bug)**:
- `fonts::resolve_with` **不再触发下载**(启动那一拍只报告判据)。唯一的触发点收在
`fonts::cjk_for`(`ui/lang.rs::log_cjk`),那一拍的 `setting` 与 `LangChoice` 同源
(ULL_LANG > 配置 > 系统 locale)= 「界面实际用哪种语言」。
- `plan` 把 `is_downloading()` / `Ready` 的闸提到**所有策略之前**:上一版只在 `NeedsDownload`
分支里,"下载中 + Unprobeable" 会把状态改回「无法探测」而线程还在飞,下完又翻回「已就绪」。
当时那条理由(「否则界面停在正在下载」)只对僵死成立 ⇒ worker 现在用 `catch_unwind`
兜底「任何 panic 都写终态」,闸才敢前移。
- 出图通道:新增 `install::set_offline(true)`(`App::with_presenter` 在
`options.screenshot.is_some()` 时调),`plan_with_offline` 在 offline 下永不 `Start`。
于是 `pages/harness/app.rs` 与 `--screenshot` 都不会在 zh-locale 无字体机器上真下 17 MiB。
- 被钉住的旧判据(`Unprobeable + Downloading ⇒ Apply`)改成 `Skip` 并写明旧行为为什么是错的;
新增 `every_strategy_skips_while_a_download_is_in_flight`(四策略打表)与
`the_screenshot_channel_never_starts_a_download`。
3. **P2-3 90 s 单次上限把「慢但能下完」变永久失败**:改 `ATTEMPT_DEADLINE=120 s` /
`TOTAL_DEADLINE=360 s`,并且**最后一个候选拿整个剩余总预算**(前 n-1 个仍 `min(单次, 剩余)`)。
算账写在常量文档里:17 772 300 B / 360 s ≈ 49 KB/s,比 r1 实测最慢那条 IPv6(67~77 KB/s)
还低一档 ⇒ 慢而能下完的线路仍有一次成功机会;健康线路(1.1~16.6 s)在第一/第二个候选就结束。
代价(最坏 6 分钟)也是刻意取舍,写在同一处。
顺手:`i18n::CjkFont::source` 的「尚未钉死」改成指向 `Source::Pinned`;`clock.rs` 与
`general_section.rs` 注释里的 17.0 MB → 16.9 MB。
验证(`CARGO_TARGET_DIR=C:/Temp/ull-target/wt-168`,全量重编;取退出码,不截断):
- `cargo test -p unlucky-core --all-targets` → **16 个 target / 1189 passed / 0 failed / exit 0**
(lib 625 + setting 115 + 其余 14 个)
- `cargo test -p unlucky-i18n` → 31 passed / 0 failed / exit 0
- `cargo test -p unlucky-app-iced`(含 `no_hardcoded_tokens` integration)→ **693 passed / 0 failed / exit 0**
- `cargo clippy -p unlucky-i18n -p unlucky-core -p unlucky-app-iced --all-targets -- -D warnings` → exit 0
- `cargo fmt --all -- --check` 干净;全仓受检文件 ≤400(本分支最大 361)
This commit is contained in:
1 parent
875b792206
commit
b9009c0e61
11 files changed
+440
-199
No files matched your search
@@ -218,13 +218,78 @@ fn the_idle_strategies_only_apply_state() {
|
||||
family: "SimSun".to_owned()
|
||||
})
|
||||
);
|
||||
// 复审 r2 P2-2 ② 改判:**下载中一律 Skip**,即使策略说「探测不出」。
|
||||
// 上一版在这里断言 `Apply(Unprobeable)`,理由是「否则界面会停在正在下载」——那个理由只对
|
||||
// 僵死成立(线程 panic),而在飞是常见情形:线程还在下,状态却被改成「无法探测」,下完又
|
||||
// 翻回「已就绪」,状态行在几十秒里来回翻。僵死由 worker 的 catch_unwind 兜底。
|
||||
assert_eq!(
|
||||
plan(Strategy::Unprobeable, &CjkInstall::Downloading { bytes: 1 }),
|
||||
Step::Apply(CjkInstall::Unprobeable),
|
||||
"探测不出也要把状态改回来(否则界面会停在「正在下载」)"
|
||||
Step::Skip,
|
||||
"在飞的下载不许被别的策略改写状态"
|
||||
);
|
||||
}
|
||||
|
||||
/// **下载中一律 `Skip`**(复审 r2 P2-2 ②):四种策略挨个打一遍。
|
||||
///
|
||||
/// 抓得住:把 `is_downloading()` 那道闸挪回 `NeedsDownload` 分支里(上一版就是这样)——
|
||||
/// `Unprobeable` / `NotNeeded` / `System` 三行立刻红。
|
||||
/// 抓不住:worker 真的永不僵死(那要制造 panic,见 `worker` 的 `catch_unwind` 与报告的「没验」)。
|
||||
#[test]
|
||||
fn every_strategy_skips_while_a_download_is_in_flight() {
|
||||
let downloading = CjkInstall::Downloading { bytes: 17_772_300 };
|
||||
for strategy in [
|
||||
Strategy::NeedsDownload(&NOTO_SANS_SC),
|
||||
Strategy::NotNeeded,
|
||||
Strategy::System { family: "SimSun" },
|
||||
Strategy::Unprobeable,
|
||||
] {
|
||||
assert_eq!(
|
||||
plan(strategy, &downloading),
|
||||
Step::Skip,
|
||||
"{strategy:?}:下载中不许改状态、不许起第二条线程"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// 出图通道(`offline`)**永不发起下载**(D30:同一份代码出同一张图)。
|
||||
///
|
||||
/// 抓得住:删掉 `plan_with_offline` 里 `NeedsDownload(_) if offline => Skip` 那一臂 ⇒ 截图/演示
|
||||
/// 通道会在 zh-locale 且无中文字体的机器上真下 17 MiB,用例在 `Step::Skip` 处红。
|
||||
/// 抓不住:真出图时有没有产生流量(那要真机跑 `--screenshot`,见报告「没验」)。
|
||||
#[test]
|
||||
fn the_screenshot_channel_never_starts_a_download() {
|
||||
assert_eq!(
|
||||
plan_with_offline(
|
||||
Strategy::NeedsDownload(&NOTO_SANS_SC),
|
||||
&CjkInstall::Unknown,
|
||||
true
|
||||
),
|
||||
Step::Skip,
|
||||
"出图通道不许联网"
|
||||
);
|
||||
assert_eq!(
|
||||
plan_with_offline(
|
||||
Strategy::NeedsDownload(&NOTO_SANS_SC),
|
||||
&CjkInstall::Unknown,
|
||||
false
|
||||
),
|
||||
Step::Start(&NOTO_SANS_SC),
|
||||
"正常通道该发起(否则上面那条可能是「永远 Skip」的假绿)"
|
||||
);
|
||||
// 只改状态的三种策略在两条通道里表现一致(它们本来就不联网)。
|
||||
for strategy in [
|
||||
Strategy::NotNeeded,
|
||||
Strategy::System { family: "SimSun" },
|
||||
Strategy::Unprobeable,
|
||||
] {
|
||||
assert_eq!(
|
||||
plan_with_offline(strategy, &CjkInstall::Unknown, false),
|
||||
plan_with_offline(strategy, &CjkInstall::Unknown, true),
|
||||
"{strategy:?}:不联网的策略与通道无关"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// 截图钉子(D30):每个 `ULL_FONT_STATUS` 取值都能解析成一档状态,坏值不猜。
|
||||
///
|
||||
/// 抓得住:出图夹具写了一个不存在的取值却静默出「未知」状态的图(报告就会撒谎)。
|
||||
|
||||
Reference in new issue
Block a user