Fuchsia 的相容性測試

適用於 Fuchsia (CTF) 的相容性測試 針對 Fuchsia 預先建構的各種 Fuchsia 軟體版本 平台表面區域偵測相容性問題。

透過 CTF 測試,確保用戶端凍結到之前的發布里程碑 與應用程式設計介面 (API) 相容 透過以下方式提供給開發人員的應用程式二進位檔介面 (ABI) SDK。模擬行為變化 卻發生在 Fuchsia 平台中破壞了預先編譯的用戶端。

CTF 基本上是由以下部分組成:

  • 一種在版本分支版本上凍結構件的機制,然後 在主要分支版本測試中納入這些構件
  • 一組建構規則,用於選取要凍結的構件 的建構規則,可簡化在 。
  • 一系列測試會使用這些建構規則,測試產品的相容性 舊的用戶端程式碼和最新的平台途徑區域。
  • 該組測試提供的涵蓋範圍 系統會測試 FIDL 方法和系統呼叫的相容性, 版本。

CTF 最初的提案是 RFC 0015,而專案 位於 //sdk/ctf

提振精神

Fuchsia 平台定義的表面積是由 Fuchsia SDK 中公開的 FIDL 通訊協定。開發人員可以 下載 ,使用 Fuchsia SDK 編寫以 Fuchsia 系統為目標的軟體 指定 API 級別

隨著 Fuchsia 平台的表面積不斷演變, 以 FIDL 通訊協定的可用性註解表示:

protocol Entry {
  @available(added=12)
  SetValue(struct { value string; });

  @available(added=20)
  GetTimestamp() -> (struct { timestamp int64; });

  @available(added=13, removed=20)
  Encrypt();
};

在上述範例中,通訊協定 Entry 有三種方法:

  • SetValue,已在 API 級別 12 新增
  • GetTimestamp (已在 API 級別 20 新增)
  • Encrypt:已在 API 級別 13 新增,但在 API 級別中移除 如果發現帳戶已不再需要 20 天,

使用 Fuchsia SDK 建構的元件必須宣告 API 級別 進而影響他們看得到的定義請考量下列要點 情境:

  • 元件是以 API 級別 19 為目標:
    • 已顯示「SetValue」和「Encrypt」。
    • GetTimestamp 不存在,因為 API 級別 19 中尚未存在。
  • 元件建立的目標 API 級別為 21:
    • 已顯示「SetValue」和「GetTimestamp」。
    • Encrypt 不存在,因為已在 API 級別 20 中移除。

Fuchsia 平台目前只支援部分 API 級別。 已檢查支援的 API 級別的標準清單 傳送至 fuchsia.git 存放區,並會用來判斷哪個 API 我們將支援 Fuchsia SDK 版本。

指定支援的 API 級別,確保用戶端可以連線 僅適用於支援和保證實作的通訊協定 但不保證平台行為 而針對該 API 的預建元件將保持一致 第二,自訂角色只能 套用至專案或機構

對元件而言,確保一致行為至關重要 在 fuchsia.git 存放區外建構,尤其是當這些物件 元件會以預先建構的二進位檔下載 產品圖片

例如:相容性問題

假設上述 Entry 通訊協定的簡化版本:

protocol Entry {
  @available(added=20)
  GetTimestamp() -> (struct { timestamp int64; });
};

GetTimestamp 方法會傳回 Entry 的時間戳記以秒為單位

我們可以透過以下方式測試:

TEST(Timestamp) {
  EntrySyncPtr entry = CreateEntryAtMidnightJan1stUTC();
  ASSERT_EQ(entry.GetTimestamp(), 1704067200);
}

假設我們決定實際需要奈秒的精細程度,三 會將 GetTimestamp實作變更為傳回 奈秒,但請注意,FIDL 定義不會變更。

我們可以按照下列方式更新測試:

TEST(Timestamp) {
  EntrySyncPtr entry = CreateEntryAtMidnightJan1stUTC();
- ASSERT_EQ(entry.GetTimestamp(), 17040672000);
+ ASSERT_EQ(entry.GetTimestamp(), 17040672000000000);
}

這樣會通過「fuchsia.git」的所有支票並提交, 導入Fuchsia 平台的相容性中斷

錯誤時程

讓我們查看導致服務中斷的完整時間表。

  1. SDK 異動前:假設 FooWidget 團隊 實作他們的 FooWidget for Fuchsia。他們會下載 Fuchsia SDK 並建立指定 API 級別 20 的元件。這個 元件使用 Entry 通訊協定並呼叫 GetTimestamp 方法。目前,GetTimestamp 會傳回秒數。

    他們可以採用這種做法,因此 FooWidget 團隊發布一份 Fuchsia 文章。 名為 foo-widget 的套件。經過檢查,這個套件的使用者 但目標 API 級別為 20

  2. FooWidget 隨附於 Fuchsia 產品:Fchsia 產品 組合包含 foo-widget 套件和 Fuchsia 導入這個 API系統將以下列格式擷取 foo-widget 套件 無需存取原始碼的預先建構二進位檔,但產品組合 您會發現套件在建構時指定的 API 級別為 20,而且 Fuchsia 平台圖片支援 API 級別 20。

  3. 系統推出 SDK 變更:目前我們定義的變更 高於 fuchsia.git,系統就會產生新的 SDK, 已發布。

  4. 產品搭配新的 SDK 組合:產品 存放區移至新的 SDK,並使用 新的 Fuchsia 平台映像檔,與現有預建好的 foo-widget

  5. FooWidget 呈現該產品:當 foo-widget 元件呼叫 GetTimestamp(),結果將以奈秒為單位 而不是幾秒,因此結果可能非常奇怪 舉例來說,FooWidget 使用者介面可能開始顯示數百萬次 因為這個模型將奈秒視為 秒!

    變更平台功能的行為具有危險性 取決於舊行為

找出相容性問題

CTF 測試利用 Fuchsia 的 發行分支程序。如果 CTF 測試失敗 以舊版 Fuchsia 平台實作為目標的預建元件 將會失敗。可以正常運作 如下所示:

  1. 每個 Fuchsia 里程碑版本都含有 fuchsia.git 中的相關版本分支版本。代表 Fuchsia 平台推出時的狀態。
  2. 該平台實作會通過該平台的一系列測試 發行分支。
  3. 一組構件包含在 CTF 構件套件中 新的分支版本
  4. 建立和/或修改發布分支時,CTF 系統會編譯該分支版本的構件並上傳至 CIPD。
  5. 各支援的 API 級別適用的 CTF 構件會下載為 main 分支版本上的預先建構,會藉由轉動而破壞 納入測試套件中
  6. 這些測試套件會針對最新的 Fuchsia 平台執行 main 分支版本。如果失敗,系統會封鎖 CL 提交作業。

這確切反映了建立元件的情況 對舊版 Fuchsia SDK 和平台進行呼叫 根據目前的 Fuchsia 平台預先建構。

背景和記錄

設有 CTF 以避免對實作的 Fuchsia 造成破壞性變更 從平台進入的 API 和 ABI。

CTF 最初的設計目的是讓 Fuchsia 系統正確導入了月球表面 而非特定 ABI 修訂版本這意味著 檔案編輯是否可在系統上生效 回溯相容

CTF 的目前用途是提供凍結機制 和「thawing」測試不同版本分支中的 測試成果

這項機制可以套用這項機制,確保目前的 Fuchsia 平台 支援舊的 API 和 ABI 行為 。此外,凍結的測試可能是 套用至任意 Fuchsia 圖像,以達成原始目標 不會產生 CTF。