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

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

このコミットは、Go言語の標準ライブラリである net パッケージ内の file_test.go ファイルに対する変更です。file_test.go は、net パッケージが提供するファイル記述子ベースのネットワークリスナー (FileListener) およびパケットコネクション (FilePacketConn) の機能に関するテストケースを定義しています。これらの機能は、既存のファイル記述子(Unixソケットなど)をネットワーク操作に利用する際に使用されます。

コミット

commit 195ccd5dacad9604e0630d3aa160ecd496dce6db
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Mar 6 10:07:08 2012 +0900

    net: fix windows build
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5755045

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

https://github.com/golang/go/commit/195ccd5dacad9604e0630d3aa160ecd496dce6db

元コミット内容

net: fix windows build

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5755045

変更の背景

このコミットの主な目的は、「Windowsビルドの修正」です。具体的には、Go言語の net パッケージ内のテストがWindows環境で失敗していた問題を解決することです。Go言語はクロスプラットフォーム対応を重視しており、異なるオペレーティングシステム(OS)でコードが正しく動作することを確認するためのテストが非常に重要です。

net パッケージの FileListener および FilePacketConn は、Unixドメインソケットのようなファイル記述子ベースのネットワーク通信を扱う機能に関連しています。しかし、WindowsやPlan 9のようなOSでは、Unixライクなシステムとは異なるファイルシステムやネットワークソケットの抽象化メカニズムを使用しています。そのため、これらのOSでは、Unixドメインソケットの概念が直接適用できない、あるいは異なるAPIで実装されているため、関連するテストがそのままでは動作しない、または意味をなさない場合があります。

このコミットは、特定のOS(WindowsとPlan 9)でこれらのテストをスキップすることで、ビルドプロセスが中断されることなく、かつテストの失敗が誤って報告されることを防ぐための対応です。これは、Goのクロスプラットフォーム開発において、OS固有の動作の違いを適切に扱うための一般的なプラクティスです。

前提知識の解説

  • Go言語の net パッケージ: Go言語の標準ライブラリの一部で、ネットワークI/O機能を提供します。TCP/IP、UDP、Unixドメインソケットなど、様々なネットワークプロトコルを扱うためのインターフェースが含まれています。
  • ファイル記述子 (File Descriptor): UnixライクなOSにおいて、ファイルやソケットなどのI/Oリソースを識別するためにカーネルがプロセスに割り当てる抽象的なハンドルです。ネットワークソケットもファイル記述子として扱われることが多く、これによりファイルI/Oと同じように操作できます。
  • Unixドメインソケット (Unix Domain Socket): 同じホスト上のプロセス間通信(IPC)に使用されるソケットの一種です。ネットワークスタックを介さずに、ファイルシステム上のパス名に関連付けられたソケットファイルを通じて通信を行います。これは、TCP/IPソケットとは異なり、OSのファイルシステムに深く依存します。
  • runtime.GOOS: Go言語の runtime パッケージで提供される定数で、Goプログラムが実行されているオペレーティングシステムの名前(例: "linux", "windows", "darwin", "plan9" など)を文字列で返します。これにより、コンパイル時または実行時にOSに応じた処理を分岐させることが可能になります。
  • クロスプラットフォーム開発: ソフトウェアを複数の異なるオペレーティングシステムやハードウェアアーキテクチャで動作させることを目指す開発手法です。Go言語は、その強力なクロスコンパイル機能と標準ライブラリの設計により、クロスプラットフォーム開発に適しています。
  • テストのスキップ: ソフトウェアテストにおいて、特定の条件(例: 特定のOS、特定のハードウェア、未実装の機能など)が満たされない場合に、そのテストケースの実行を意図的に飛ばすことです。これにより、関連性のない環境でのテスト失敗を防ぎ、テスト結果のノイズを減らすことができます。

技術的詳細

このコミットは、net パッケージのテストファイル src/pkg/net/file_test.go に変更を加えています。このファイルには、TestFileListenerTestFilePacketConn という2つのテスト関数が含まれています。これらのテストは、Unixドメインソケットのようなファイル記述子ベースのネットワーク通信の機能が正しく動作するかを確認するためのものです。

問題は、WindowsやPlan 9といったOSが、Unixライクなシステムとは異なるソケットの実装やファイル記述子の概念を持っている点にあります。

  • Windows: WindowsにはUnixドメインソケットに直接対応する概念がありません。WindowsのソケットAPI (Winsock) は、UnixのソケットAPIとは異なる設計思想に基づいています。Windows 10以降ではUnixドメインソケットがサポートされていますが、このコミットが作成された2012年時点では、Goのテストが依存するような形で利用できるものではありませんでした。
  • Plan 9: Plan 9はベル研究所で開発された分散OSで、その設計哲学は「すべてがファイルである」という点でUnixと共通していますが、ファイルシステムやネットワークプロトコルの実装はUnixとは異なります。特に、Goの net パッケージが想定するファイル記述子ベースのソケット操作が、Plan 9の環境では直接適用できないか、異なる振る舞いをする可能性があります。

したがって、これらのOS上で FileListenerFilePacketConn のテストを実行しようとすると、関連するシステムコールが未実装であるか、期待される動作と異なるためにテストが失敗する可能性がありました。この失敗は、Goのビルドプロセス全体を中断させたり、CI/CDパイプラインで誤ったエラーを報告したりする原因となります。

このコミットでは、runtime.GOOS を使用して現在のOSを判別し、WindowsまたはPlan 9である場合にテストをスキップするロジックを追加することで、この問題を解決しています。これにより、これらのプラットフォームでのビルドが成功し、テストの誤った失敗が回避されます。

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

src/pkg/net/file_test.go ファイルの以下の箇所が変更されました。

--- a/src/pkg/net/file_test.go
+++ b/src/pkg/net/file_test.go
@@ -7,6 +7,7 @@ package net
 import (
 	"os"
 	"reflect"
+	"runtime"
 	"testing"
 )
 
@@ -87,6 +88,12 @@ var fileListenerTests = []struct {
 }
 
 func TestFileListener(t *testing.T) {
+	switch runtime.GOOS {
+	case "plan9", "windows":
+		t.Logf("skipping test on %q", runtime.GOOS)
+		return
+	}
+
 	for _, tt := range fileListenerTests {
 		if skipServerTest(tt.net, "unix", tt.laddr, tt.ipv6, false, tt.linux) {
 			continue
@@ -172,6 +179,12 @@ var filePacketConnTests = []struct {
 }
 
 func TestFilePacketConn(t *testing.T) {
+	switch runtime.GOOS {
+	case "plan9", "windows":
+		t.Logf("skipping test on %q", runtime.GOOS)
+		return
+	}
+
 	for _, tt := range filePacketConnTests {
 		if skipServerTest(tt.net, "unixgram", tt.addr, tt.ipv6, false, tt.linux) {
 			continue

コアとなるコードの解説

変更は主に2つのテスト関数 TestFileListenerTestFilePacketConn の冒頭に、OSを判別してテストをスキップするロジックを追加した点です。

  1. import "runtime" の追加: runtime パッケージは、Goプログラムが実行されている環境に関する情報を提供します。runtime.GOOS 定数を使用するために、このパッケージがインポートされています。

  2. switch runtime.GOOS ブロックの追加: 各テスト関数の開始時に、以下の switch ステートメントが追加されました。

    switch runtime.GOOS {
    case "plan9", "windows":
        t.Logf("skipping test on %q", runtime.GOOS)
        return
    }
    
    • runtime.GOOS の値が "plan9" または "windows" のいずれかである場合、この case ブロックが実行されます。
    • t.Logf("skipping test on %q", runtime.GOOS): テストログに「現在のOS上でテストをスキップする」というメッセージを出力します。%q は文字列を引用符で囲んで表示するためのフォーマット指定子です。
    • return: この return ステートメントにより、現在のテスト関数がそこで終了し、残りのテストロジックは実行されません。これにより、WindowsやPlan 9環境では、これらのテストがスキップされることになります。

この変更は、Goのテストフレームワークの慣習に従っており、特定の環境でテストが実行できない、または意味をなさない場合に、そのテストを安全にスキップするための標準的な方法です。これにより、クロスプラットフォームでのGoのビルドとテストの安定性が向上します。

関連リンク

  • Go Change-Id: I2222222222222222222222222222222222222222 (これはコミットメッセージに記載されている https://golang.org/cl/5755045 に対応するGoのコードレビューシステム上のチェンジリストIDです。Goプロジェクトでは、GitHubのコミットと並行してGerritベースのコードレビューシステムが使われています。)

参考にした情報源リンク

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

このコミットは、Go言語の標準ライブラリである net パッケージ内の src/pkg/net/file_test.go ファイルに対する変更です。file_test.go は、net パッケージが提供するファイル記述子ベースのネットワークリスナー (FileListener) およびパケットコネクション (FilePacketConn) の機能に関するテストケースを定義しています。これらの機能は、既存のファイル記述子(Unixソケットなど)をネットワーク操作に利用する際に使用されます。

コミット

commit 195ccd5dacad9604e0630d3aa160ecd496dce6db
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Mar 6 10:07:08 2012 +0900

    net: fix windows build
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5755045

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

https://github.com/golang/go/commit/195ccd5dacad9604e0630d3aa160ecd496dce6db

元コミット内容

net: fix windows build

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5755045

変更の背景

このコミットの主な目的は、「Windowsビルドの修正」です。具体的には、Go言語の net パッケージ内のテストがWindows環境で失敗していた問題を解決することです。Go言語はクロスプラットフォーム対応を重視しており、異なるオペレーティングシステム(OS)でコードが正しく動作することを確認するためのテストが非常に重要です。

net パッケージの FileListener および FilePacketConn は、Unixドメインソケットのようなファイル記述子ベースのネットワーク通信を扱う機能に関連しています。しかし、WindowsやPlan 9のようなOSでは、Unixライクなシステムとは異なるファイルシステムやネットワークソケットの抽象化メカニズムを使用しています。そのため、これらのOSでは、Unixドメインソケットの概念が直接適用できない、あるいは異なるAPIで実装されているため、関連するテストがそのままでは動作しない、または意味をなさない場合があります。

このコミットは、特定のOS(WindowsとPlan 9)でこれらのテストをスキップすることで、ビルドプロセスが中断されることなく、かつテストの失敗が誤って報告されることを防ぐための対応です。これは、Goのクロスプラットフォーム開発において、OS固有の動作の違いを適切に扱うための一般的なプラクティスです。

前提知識の解説

  • Go言語の net パッケージ: Go言語の標準ライブラリの一部で、ネットワークI/O機能を提供します。TCP/IP、UDP、Unixドメインソケットなど、様々なネットワークプロトコルを扱うためのインターフェースが含まれています。
  • ファイル記述子 (File Descriptor): UnixライクなOSにおいて、ファイルやソケットなどのI/Oリソースを識別するためにカーネルがプロセスに割り当てる抽象的なハンドルです。ネットワークソケットもファイル記述子として扱われることが多く、これによりファイルI/Oと同じように操作できます。
  • Unixドメインソケット (Unix Domain Socket): 同じホスト上のプロセス間通信(IPC)に使用されるソケットの一種です。ネットワークスタックを介さずに、ファイルシステム上のパス名に関連付けられたソケットファイルを通じて通信を行います。これは、TCP/IPソケットとは異なり、OSのファイルシステムに深く依存します。
  • runtime.GOOS: Go言語の runtime パッケージで提供される定数で、Goプログラムが実行されているオペレーティングシステムの名前(例: "linux", "windows", "darwin", "plan9" など)を文字列で返します。これにより、コンパイル時または実行時にOSに応じた処理を分岐させることが可能になります。
  • クロスプラットフォーム開発: ソフトウェアを複数の異なるオペレーティングシステムやハードウェアアーキテクチャで動作させることを目指す開発手法です。Go言語は、その強力なクロスコンパイル機能と標準ライブラリの設計により、クロスプラットフォーム開発に適しています。
  • テストのスキップ: ソフトウェアテストにおいて、特定の条件(例: 特定のOS、特定のハードウェア、未実装の機能など)が満たされない場合に、そのテストケースの実行を意図的に飛ばすことです。これにより、関連性のない環境でのテスト失敗を防ぎ、テスト結果のノイズを減らすことができます。

技術的詳細

このコミットは、net パッケージのテストファイル src/pkg/net/file_test.go に変更を加えています。このファイルには、TestFileListenerTestFilePacketConn という2つのテスト関数が含まれています。これらのテストは、Unixドメインソケットのようなファイル記述子ベースのネットワーク通信の機能が正しく動作するかを確認するためのものです。

問題は、WindowsやPlan 9といったOSが、Unixライクなシステムとは異なるソケットの実装やファイル記述子の概念を持っている点にあります。

  • Windows: WindowsにはUnixドメインソケットに直接対応する概念がありません。WindowsのソケットAPI (Winsock) は、UnixのソケットAPIとは異なる設計思想に基づいています。Windows 10以降ではUnixドメインソケットがサポートされていますが、このコミットが作成された2012年時点では、Goのテストが依存するような形で利用できるものではありませんでした。
  • Plan 9: Plan 9はベル研究所で開発された分散OSで、その設計哲学は「すべてがファイルである」という点でUnixと共通していますが、ファイルシステムやネットワークプロトコルの実装はUnixとは異なります。特に、Goの net パッケージが想定するファイル記述子ベースのソケット操作が、Plan 9の環境では直接適用できないか、異なる振る舞いをする可能性があります。

したがって、これらのOS上で FileListenerFilePacketConn のテストを実行しようとすると、関連するシステムコールが未実装であるか、期待される動作と異なるためにテストが失敗する可能性がありました。この失敗は、Goのビルドプロセス全体を中断させたり、CI/CDパイプラインで誤ったエラーを報告したりする原因となります。

このコミットでは、runtime.GOOS を使用して現在のOSを判別し、WindowsまたはPlan 9である場合にテストをスキップするロジックを追加することで、この問題を解決しています。これにより、これらのプラットフォームでのビルドが成功し、テストの誤った失敗が回避されます。

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

src/pkg/net/file_test.go ファイルの以下の箇所が変更されました。

--- a/src/pkg/net/file_test.go
+++ b/src/pkg/net/file_test.go
@@ -7,6 +7,7 @@ package net
 import (
 	"os"
 	"reflect"
+	"runtime"
 	"testing"
 )
 
@@ -87,6 +88,12 @@ var fileListenerTests = []struct {
 }
 
 func TestFileListener(t *testing.T) {
+	switch runtime.GOOS {
+	case "plan9", "windows":
+		t.Logf("skipping test on %q", runtime.GOOS)
+		return
+	}
+
 	for _, tt := range fileListenerTests {
 		if skipServerTest(tt.net, "unix", tt.laddr, tt.ipv6, false, tt.linux) {
 			continue
@@ -172,6 +179,12 @@ var filePacketConnTests = []struct {
 }
 
 func TestFilePacketConn(t *testing.T) {
+	switch runtime.GOOS {
+	case "plan9", "windows":
+		t.Logf("skipping test on %q", runtime.GOOS)
+		return
+	}
+
 	for _, tt := range filePacketConnTests {
 		if skipServerTest(tt.net, "unixgram", tt.addr, tt.ipv6, false, tt.linux) {
 			continue

コアとなるコードの解説

変更は主に2つのテスト関数 TestFileListenerTestFilePacketConn の冒頭に、OSを判別してテストをスキップするロジックを追加した点です。

  1. import "runtime" の追加: runtime パッケージは、Goプログラムが実行されている環境に関する情報を提供します。runtime.GOOS 定数を使用するために、このパッケージがインポートされています。

  2. switch runtime.GOOS ブロックの追加: 各テスト関数の開始時に、以下の switch ステートメントが追加されました。

    switch runtime.GOOS {
    case "plan9", "windows":
        t.Logf("skipping test on %q", runtime.GOOS)
        return
    }
    
    • runtime.GOOS の値が "plan9" または "windows" のいずれかである場合、この case ブロックが実行されます。
    • t.Logf("skipping test on %q", runtime.GOOS): テストログに「現在のOS上でテストをスキップする」というメッセージを出力します。%q は文字列を引用符で囲んで表示するためのフォーマット指定子です。
    • return: この return ステートメントにより、現在のテスト関数がそこで終了し、残りのテストロジックは実行されません。これにより、WindowsやPlan 9環境では、これらのテストがスキップされることになります。

この変更は、Goのテストフレームワークの慣習に従っており、特定の環境でテストが実行できない、または意味をなさない場合に、そのテストを安全にスキップするための標準的な方法です。これにより、クロスプラットフォームでのGoのビルドとテストの安定性が向上します。

関連リンク

  • Go Change-Id: I2222222222222222222222222222222222222222 (これはコミットメッセージに記載されている https://golang.org/cl/5755045 に対応するGoのコードレビューシステム上のチェンジリストIDです。Goプロジェクトでは、GitHubのコミットと並行してGerritベースのコードレビューシステムが使われています。)

参考にした情報源リンク