Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 19678] ファイルの概要

このコミットは、Go言語の標準ライブラリである crypto/x509 パッケージのテストファイル x509_test.go に対する変更です。具体的には、TestImports というテスト関数が、AndroidおよびNaCl (Native Client) 環境でスキップされるように修正されています。

コミット

commit e50d059862dbb14225a4e1a17df42be984b93404
Author: David Crawshaw <david.crawshaw@zentus.com>
Date:   Tue Jul 8 13:43:02 2014 -0400

    crypto/x509: skip test on android (no Go tool)
    
    LGTM=minux
    R=golang-codereviews, minux
    CC=golang-codereviews
    https://golang.org/cl/111970043

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/e50d059862dbb14225a4e1a17df42be984b93404

元コミット内容

crypto/x509: skip test on android (no Go tool)

このコミットメッセージは、crypto/x509 パッケージのテストがAndroid環境でスキップされるように変更されたことを示しています。その理由は「Goツールがないため」と明記されています。

変更の背景

このコミットが行われた2014年7月時点では、Go言語のAndroidサポートはまだ初期段階にありました。Go 1.4がAndroidの公式サポートを導入するのは2014年12月であり、このコミットの時点では、Android環境でGoのツールチェイン(特に go run コマンドなど)が完全に機能するとは限りませんでした。

TestImports テストは、exec.Command("go", "run", "x509_test_import.go").Run() を使用して、別のGoプログラムを実行しようとします。しかし、当時のAndroid環境では、Goのコンパイラやランタイムツールがテスト実行時に利用できない、あるいは安定して動作しないという問題がありました。これにより、テストが失敗したり、予期せぬ動作を引き起こしたりする可能性がありました。

この問題を回避し、CI/CDパイプラインや開発者のテスト実行をスムーズにするために、Android環境ではこの特定のテストをスキップするという決定がなされました。同様に、NaCl (Native Client) 環境でもGoツールが利用できない、または互換性の問題があったため、以前からスキップされていました。このコミットは、そのスキップ対象にAndroidを追加することで、テストの安定性を向上させることを目的としています。

前提知識の解説

  • Go言語のクロスコンパイルと環境変数 GOOS: Go言語は、異なるオペレーティングシステム(OS)やアーキテクチャ向けにバイナリを生成するクロスコンパイル機能を強力にサポートしています。GOOS 環境変数は、ターゲットとなるOSを指定するために使用されます(例: GOOS=linux, GOOS=windows, GOOS=android, GOOS=nacl)。
  • runtime.GOOS: Goプログラム内で実行中のOSを識別するために使用される定数です。このコミットでは、runtime.GOOS の値に基づいてテストの実行を条件分岐させています。
  • testing.T.Skip() および testing.T.Skipf(): Goの標準テストパッケージ testing に含まれるメソッドです。これらは、特定の条件が満たされない場合にテストをスキップするために使用されます。Skipffmt.Sprintf と同様にフォーマットされた文字列を引数に取ることができます。
  • exec.Command: Goの標準ライブラリ os/exec パッケージに含まれる関数で、外部コマンドを実行するために使用されます。このテストでは、go run コマンドを外部プロセスとして実行しています。
  • Android NDK (Native Development Kit): AndroidアプリケーションでC/C++などのネイティブコードを使用するためのツールセットです。Go言語のAndroidサポートは、初期段階ではNDKを介したネイティブコードとの連携が中心でした。
  • Goツールチェイン: Go言語のコンパイラ、リンカ、アセンブラ、および go コマンド(ビルド、テスト、実行などを管理する)を含む一連のツール群を指します。

技術的詳細

この変更は、Goのテストフレームワークとクロスプラットフォーム開発の課題に対処するものです。TestImports 関数は、go run コマンドを使用して x509_test_import.go という補助的なGoプログラムを実行し、その結果を検証します。これは、Goのツールチェインがテスト実行環境で完全に機能することを前提としています。

しかし、Androidのような特定の組み込み環境では、完全なGoツールチェインが利用できない、あるいはその動作が保証されない場合があります。例えば、Androidデバイス上では、開発環境のように go コマンドがパスに含まれていない、あるいは必要なライブラリや環境設定が不足している可能性があります。

このコミットは、このような環境依存の問題を runtime.GOOS を用いた条件分岐で解決しています。以前はNaCl環境のみを if runtime.GOOS == "nacl" でチェックしていましたが、この変更により switch ステートメントを導入し、"android" もスキップ対象に追加しています。これにより、テストの実行が不必要なエラーで中断されることを防ぎ、Goのクロスプラットフォーム対応をより堅牢にしています。

コアとなるコードの変更箇所

変更は src/pkg/crypto/x509/x509_test.go ファイルの TestImports 関数内で行われています。

--- a/src/pkg/crypto/x509/x509_test.go
+++ b/src/pkg/crypto/x509/x509_test.go
@@ -728,8 +728,9 @@ func TestParsePEMCRL(t *testing.T) {
 }
 
 func TestImports(t *testing.T) {
-	if runtime.GOOS == "nacl" {
-		t.Skip("skipping on nacl")
+	switch runtime.GOOS {
+	case "android", "nacl":
+		t.Skipf("skipping on %s", runtime.GOOS)
 	}
 
 	if err := exec.Command("go", "run", "x509_test_import.go").Run(); err != nil {

コアとなるコードの解説

変更前は、if runtime.GOOS == "nacl" という if 文でNaCl環境のみをチェックし、t.Skip("skipping on nacl") でテストをスキップしていました。

変更後では、この if 文が switch runtime.GOOS ステートメントに置き換えられています。 case "android", "nacl": という行が追加され、runtime.GOOS"android" または "nacl" のいずれかである場合に、そのブロック内のコードが実行されます。 ブロック内では t.Skipf("skipping on %s", runtime.GOOS) が呼び出されています。これは、スキップ理由をより詳細に(どのOSでスキップされたかを含めて)出力するために t.Skip から t.Skipf に変更されています。

この変更により、Android環境でも TestImports が実行されなくなり、Goツールチェインの可用性に依存するテストが、そのツールチェインが完全にサポートされていない環境で失敗するのを防ぎます。

関連リンク

参考にした情報源リンク