Skip to content

v0.6.20 — io に fetch を足しました(版数は据え置き)

Choose a tag to compare

@Driedsandwich Driedsandwich released this 15 Aug 04:53
· 42 commits to main since this release

v0.6.20 — io に fetch を足しました。版数は上げていません

⚠ 先に読むところ

1. SOURCE_FETCH_* の 4 経路を、global を差し替えずに踏めるようになりました

実質の差分は 2 行です。

io へ      fetch: (url, init) => fetch(url, init)
呼び出し    await fetch(url, {…})  →  await io.fetch(url, {…})
判定ロジック **差分 0 行**

AbortSignal.timeoutTimeoutError を投げる約束はそのままで、
差し替える側が同じ約束を守ればよい形です。

SOURCE_FETCH_FAILED      fetch が throw
SOURCE_FETCH_TIMEOUT     name = 'TimeoutError' で throw
SOURCE_HTTP_ERROR        503 を返す
SOURCE_BODY_UNREADABLE   本文の reader が失敗する

変異対照。io.fetch を素の fetch へ戻すと、この 4 件だけが落ちます。
globalThis.fetch を触っていないことも試験で確かめています
——触っていたら、この試験は「global の差し替えが効いた」ことしか示しません。
io.fetch が呼ばれた回数も数えます(各 1 回)。呼ばれていなければ別の経路で止まっています。

2. toolVersionschemaVersion も上げていません

**受け手の分岐は 1 つも変わりません。**根拠(すべて実測):

既存 10 経路の出力  **byte 一致**(stdout / stderr / 終了コード)
出しうる code       **82 種類のまま**(増減 0)
schemaVersion       2 のまま・配布 schema も不変
io は出力に出るか    **0 件**(対照: stableReasonCode は 1 件)

io は道具の内側の仕組みで、受け手が読む値には現れません。

3. 既存の検査が 1 件、正しく鳴りました

gh に依存していない」の検査が、こう書かれていました。

expect(SRC).toMatch(/await fetch\(/)

性質(外部コマンドに頼っていない)を、書き方で確かめていたわけです。
io.fetch へ寄せた瞬間に落ちました。

検査を緩める前に、性質が保たれているかを実測しました。
io の既定は組み込みの fetch そのものなので、性質は変わっていません。

そのうえで実態へ合わせましたが、両方の書き方を許すだけにはしていません。

変更後  await (io.)?fetch(  を許す
追加    **io の既定が組み込みの fetch であること**も見る
        (差し替え先が別物になったら、この検査の意味が消えるため)
対照    取得の経路を消すと落ちる

落ちたのは検査が正しく鳴ったからでもあります——「取得の経路がソースに見当たらない」
という状態は、本当に外部コマンドへ逃げたときにも起きます。区別がつきません。

4. 子プロセスの route 表は残し、io に足さなかったものもあります

子プロセスの表(test/_cliRoutes.mjs)は残す
  io 注入は子プロセスへ効かない——spawnSync で起動するので、
  呼び出し側のオブジェクトは相手に届かない
  あの表は「配った 1 ファイルを、受け手と同じ起動のされ方で踏む」ためのもので、
  終了コード・stdout の byte・入口の判定まで含めて確かめられる

io に足していないもの:

入口の判定(realpathSync)
  「この道具が起動されたのか」を見るもので、**検証の入力ではない。**
  差し替えられるようにすると、起動のされ方を偽れることになる

execFileSync(git rev-parse / git archive)
  外部プロセスなので、差し替えるなら **PATH のほうが素直。**
  子プロセスの route 表が偽 git を置いてそれをやっている

io に注入できるもの(現在):

cwd / argv / stdout / stderr / exit                              v0.6.18
existsSync / readFileSync / statSync / lstatSync / readdirSync   v0.6.18
fetch                                                            **v0.6.20**

まだやっていないこと

  • **実測が 1 件も来ていません。**ジャック内部の接点位置は全部仮定のままで、
    導通測定も音響測定もしていません(verifiedPhysicalfalse)。
  • BusyBox を oracle に足すこと。開発機にも CI にもありません。
  • annotated tag への署名。
  • 検算ツールの強化は試験した範囲までです。すべての細工に耐えることは示していません。

数えたもの

v0.6.19 v0.6.20
単体テスト 1371 1376(skip 0 / 失敗 0)
検算ツール toolVersion 20 変わらず 20
CLI 結果契約 schemaVersion 2 変わらず 2
止め方の名前(catalog) 82 種類 変わらず 82
出力の基準(経路) 10 変わらず 10(全件 byte 一致)
io に注入できるもの 10 種類 11 種類(fetch を追加)
検証対象(validate:profiles 14 14
schema 25 25
記録された入力 32 32
区間 / event TRS 23/32・TRRS 30/36 変わらず

変わっていないもの

  • **モデルの数値。**接点位置も走査結果も同じです。
  • verifiedPhysicalfalse。実測記録は依然 0 件です。
  • toolVersion 20 / CLI 結果契約 schemaVersion 2 / catalog 82 種類。
  • 止め方の名前の一覧・archivePolicy・status・終了コードの意味。