Skip to content

Commit a7c245b

Browse files
committed
test(unit): pin Origin::Artifact's rank position and its non-machine-local status
两条新不变量,第二条如果写反比它关掉的那个缺口更糟: * **rank 位置**:`Package < Artifact < SubosFarm`,且 `Payload < Artifact`。 这正是 #414 的那个顺序 —— farm 排在 `$ORIGIN` 前面时,产物链接了一份 libX11、 运行期加载了另一份;而钉住的 payload 仍然赢,因为它是唯一没人会重新指向的。 * **`is_machine_local(Artifact) == false`**:`$ORIGIN` 由加载器相对产物解析, 产物拷到哪台机器含义都一样 —— `pack` 恰恰是把**别的**条目改写成这个形式的。 标成 machine-local 会让 pack 拒绝它唯一想要产出的那一项。 `to_string(Artifact) == "artifact"` 也钉住:那些字符串是 `resolution.json` 里 `origin` 字段的取值,改了就是改协议。 顺带核过:`rank()` 全仓只用于相对比较,`resolution.json` 写的是字符串而非数值, 所以这次重编号(SubosFarm 2→3、HostDefault 3→4)不影响任何持久化数据。
1 parent 7821952 commit a7c245b

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

tests/unit/test_runtime_search.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ TEST(RuntimeSearch, PayloadOutranksFarm) {
2424
EXPECT_LT(search::rank(Origin::Payload), search::rank(Origin::SubosFarm));
2525
EXPECT_LT(search::rank(Origin::Package), search::rank(Origin::SubosFarm));
2626
EXPECT_LT(search::rank(Origin::SubosFarm), search::rank(Origin::HostDefault));
27+
28+
// #415 — the artifact's own directory (`$ORIGIN`) sits between the packages
29+
// and the farm. This is the ordering #414 was about: with the farm ahead of
30+
// `$ORIGIN` an artifact linked one libX11 and loaded another. A pinned
31+
// payload still wins, because that is the one thing nothing re-points.
32+
EXPECT_LT(search::rank(Origin::Package), search::rank(Origin::Artifact));
33+
EXPECT_LT(search::rank(Origin::Artifact), search::rank(Origin::SubosFarm));
34+
EXPECT_LT(search::rank(Origin::Payload), search::rank(Origin::Artifact));
2735
}
2836

2937
// `mcpp pack` asks this to decide what may not be baked into a distributable.
@@ -35,6 +43,13 @@ TEST(RuntimeSearch, MachineLocalIsEverythingButTheHostDefaults) {
3543
EXPECT_TRUE(search::is_machine_local(Origin::Package));
3644
EXPECT_TRUE(search::is_machine_local(Origin::SubosFarm));
3745
EXPECT_FALSE(search::is_machine_local(Origin::HostDefault));
46+
47+
// ⚠️ `$ORIGIN` is NOT machine-local, and getting this backwards would be
48+
// worse than the gap it closes: it is resolved by the loader relative to
49+
// the artifact, so it means the same thing wherever that artifact is
50+
// copied — `pack` REWRITES everything else into this form. Marking it
51+
// local would make pack reject the one entry it is trying to produce.
52+
EXPECT_FALSE(search::is_machine_local(Origin::Artifact));
3853
}
3954

4055
// These strings are PUBLISHED — they are the `origin` field of every entry in
@@ -44,6 +59,7 @@ TEST(RuntimeSearch, MachineLocalIsEverythingButTheHostDefaults) {
4459
TEST(RuntimeSearch, OriginNamesArePublishedAndStable) {
4560
EXPECT_EQ(search::to_string(Origin::Payload), "payload");
4661
EXPECT_EQ(search::to_string(Origin::Package), "package");
62+
EXPECT_EQ(search::to_string(Origin::Artifact), "artifact");
4763
EXPECT_EQ(search::to_string(Origin::SubosFarm), "subos_farm");
4864
EXPECT_EQ(search::to_string(Origin::HostDefault), "host_default");
4965
}

0 commit comments

Comments
 (0)