[インデックス 12449] ファイルの概要
このコミットは、Go言語の標準ライブラリ net
パッケージ内のテストファイル群に対する変更です。具体的には、src/pkg/net/dial_test.go
、src/pkg/net/net_test.go
、src/pkg/net/server_test.go
、src/pkg/net/unicast_test.go
の4つのファイルが修正されています。主な目的は、テスト実行時に外部ネットワークアドレスの使用を無効化し、特にmacOS (旧OS X) 環境で発生するファイアウォールダイアログのポップアップを回避することにあります。
コミット
commit 7c7966a4260b9f6c7c8e13586a04ec23f433670a
Author: Russ Cox <rsc@golang.org>
Date: Tue Mar 6 23:35:31 2012 -0500
net: disable use of external listen along with other external network uses
By default the all.bash tests must not ever announce
on an external address. It's not just an OS X issue.
R=golang-dev, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/5753067
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7c7966a4260b9f6c7c8e13586a04ec23f433670a
元コミット内容
net: disable use of external listen along with other external network uses
By default the all.bash tests must not ever announce
on an external address. It's not just an OS X issue.
R=golang-dev, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/5753067
変更の背景
このコミットの主な背景は、Go言語のテストスイート(特に all.bash
スクリプトによって実行されるもの)が、外部ネットワークアドレス(例: 0.0.0.0
や [::]
のようなワイルドカードアドレス)でリッスンしようとすると、macOS (旧OS X) 環境でファイアウォールダイアログが頻繁にポップアップするという問題にありました。
macOSのファイアウォールは、アプリケーションが外部からの接続を受け入れようとすると、セキュリティ上の理由からユーザーに許可を求めるダイアログを表示します。Goのテストスイートは、ネットワーク機能のテストのために一時的な実行可能ファイルを多数生成し、これらが外部アドレスでリッスンを試みるため、テストを実行するたびに繰り返しダイアログが表示され、開発者の作業を妨げていました。
コミットメッセージには「It's not just an OS X issue.」とあり、この問題がmacOSに限定されるものではなく、他のOSでも外部ネットワークアドレスの使用が問題を引き起こす可能性があることを示唆しています。そのため、デフォルトで all.bash
テストが外部アドレスで通知(リッスン)しないようにする、というより一般的な解決策が求められました。
前提知識の解説
testing.Short()
Go言語の testing
パッケージには testing.Short()
という関数があります。これは、go test
コマンドが -short
フラグ付きで呼び出されたかどうかを判定するために使用されます。
- 目的: 時間のかかるテストやリソースを大量に消費するテスト(例: 統合テスト、外部サービスに依存するテスト)を、開発中の迅速なフィードバックのためにスキップしたり、動作を変更したりするために利用されます。
- 動作:
go test -short
で実行された場合、testing.Short()
はtrue
を返します。それ以外の場合はfalse
を返します。 - 一般的な使用法:
これにより、開発者はfunc TestTimeConsuming(t *testing.T) { if testing.Short() { t.Skip("skipping test in short mode.") // -short フラグがある場合はテストをスキップ } // ... 時間のかかるテストのロジック ... }
-short
フラグを使って高速なテスト実行を行い、CI/CD環境などではフルテストを実行するといった使い分けが可能になります。
外部ネットワーク使用と *testExternal
フラグ
Goのテストにおいて、外部ネットワークリソース(インターネット上のサーバー、特定のIPアドレスなど)を使用するテストは、環境依存性や実行時間の問題を引き起こす可能性があります。このようなテストは、通常、特定の条件下でのみ実行されるべきです。
このコミットで参照されている *testExternal
は、Goのテストフレームワーク内で定義された(またはテストコード内で定義された)フラグであると推測されます。これは、テストが外部ネットワークリソースを使用することを明示的に許可するためのコマンドライン引数(例: -testExternal
)に対応するものです。
!*testExternal
は、「testExternal
フラグが設定されていない(つまり、外部ネットワークの使用が許可されていない)場合」を意味します。
このコミットの変更は、testing.Short()
と !*testExternal
を組み合わせることで、デフォルトでは外部ネットワークを使用するテストをスキップし、明示的に -testExternal
フラグが指定された場合にのみ実行されるように制御しています。
技術的詳細
このコミットの技術的な変更は、主に以下の2点に集約されます。
-
avoidOSXFirewallDialogPopup
関数の削除:src/pkg/net/net_test.go
から、macOSのファイアウォールダイアログを回避するためのavoidOSXFirewallDialogPopup
という変数が削除されました。この変数は、testing.Short()
がtrue
でかつruntime.GOOS
が"darwin"
(macOS) の場合にtrue
を返すように定義されていました。これは、macOSでのみ発生するファイアウォール問題を一時的に回避するための、OS固有のハックでした。 -
テスト条件の変更:
avoidOSXFirewallDialogPopup()
の呼び出し箇所が、より汎用的な(testing.Short() || !*testExternal)
という条件に置き換えられました。testing.Short()
: 前述の通り、-short
フラグが指定された場合にtrue
を返します。これにより、開発中の迅速なテスト実行時には、外部ネットワークを使用するテストがスキップされます。!*testExternal
:testExternal
というフラグが設定されていない場合にtrue
を返します。これは、デフォルトでは外部ネットワークの使用が許可されていないことを意味します。
この変更により、以下のいずれかの条件が満たされる場合に、外部ネットワークを使用する可能性のあるテストがスキップされるようになります。
go test -short
が実行された場合。testExternal
フラグが明示的に設定されていない場合。
このアプローチは、macOS固有のファイアウォール問題だけでなく、all.bash
テストがデフォルトで外部アドレスにリッスンしないようにするという、より広範な目標を達成します。これにより、テストの実行環境に依存しない、より堅牢で予測可能なテスト動作が実現されます。
また、src/pkg/net/dial_test.go
では、コメント内のスペルミス unforunate
が unfortunate
に修正されています。これは機能的な変更ではありませんが、コード品質の向上に貢献しています。
コアとなるコードの変更箇所
diff --git a/src/pkg/net/dial_test.go b/src/pkg/net/dial_test.go
index 5f5aea146a..3881953bb5 100644
--- a/src/pkg/net/dial_test.go
+++ b/src/pkg/net/dial_test.go
@@ -32,7 +32,7 @@ func TestDialTimeout(t *testing.T) {
numConns := listenerBacklog + 10
// TODO(bradfitz): It's hard to test this in a portable
- // way. This is unforunate, but works for now.
+ // way. This is unfortunate, but works for now.
switch runtime.GOOS {
case "linux":
// The kernel will start accepting TCP connections before userspace
diff --git a/src/pkg/net/net_test.go b/src/pkg/net/net_test.go
index d4409cc491..fd145e1d70 100644
--- a/src/pkg/net/net_test.go
+++ b/src/pkg/net/net_test.go
@@ -11,14 +11,6 @@ import (
"time"
)
-// avoidOSXFirewallDialogPopup avoids OS X, former konwn as MacOS X,
-// firewall dialog popups during tests. It looks like OS X checks
-// wildcard listens by default for security reasons. A listen with
-// specific address doesn't make dialog popups for now.
-var avoidOSXFirewallDialogPopup = func() bool {
- return testing.Short() && runtime.GOOS == "darwin"
-}
-
func TestShutdown(t *testing.T) {
if runtime.GOOS == "plan9" {
t.Logf("skipping test on %q", runtime.GOOS)
diff --git a/src/pkg/net/server_test.go b/src/pkg/net/server_test.go
index d5ea789880..158b9477d0 100644
--- a/src/pkg/net/server_test.go
+++ b/src/pkg/net/server_test.go
@@ -28,7 +28,7 @@ func skipServerTest(net, unixsotype, addr string, ipv6, ipv4map, linuxonly bool)
}\n \tswitch addr {\n \tcase \"\", \"0.0.0.0\", \"[::ffff:0.0.0.0]\", \"[::]\":\n-\t\tif avoidOSXFirewallDialogPopup() {\n+\t\tif testing.Short() || !*testExternal {\n \t\t\treturn true\n \t\t}\n \t}\ndiff --git a/src/pkg/net/unicast_test.go b/src/pkg/net/unicast_test.go
index fc6089414d..8bfe2796e0 100644
--- a/src/pkg/net/unicast_test.go
+++ b/src/pkg/net/unicast_test.go
@@ -50,7 +50,7 @@ func TestTCPListener(t *testing.T) {
}\n \n \tfor _, tt := range listenerTests {\n-\t\tif tt.wildcard && avoidOSXFirewallDialogPopup() {\n+\t\tif tt.wildcard && (testing.Short() || !*testExternal) {\n \t\t\tcontinue\n \t\t}\n \t\tif tt.ipv6 && !supportsIPv6 {\n@@ -98,7 +98,7 @@ func TestUDPListener(t *testing.T) {
}\n \n \tfor _, tt := range listenerTests {\n-\t\tif tt.wildcard && avoidOSXFirewallDialogPopup() {\n+\t\tif tt.wildcard && (testing.Short() || !*testExternal) {\n \t\t\tcontinue\n \t\t}\n \t\tif tt.ipv6 && !supportsIPv6 {\n@@ -132,7 +132,7 @@ func TestSimpleTCPListener(t *testing.T) {
}\n \n \tfor _, tt := range listenerTests {\n-\t\tif tt.wildcard && avoidOSXFirewallDialogPopup() {\n+\t\tif tt.wildcard && (testing.Short() || !*testExternal) {\n \t\t\tcontinue\n \t\t}\n \t\tif tt.ipv6 {\n@@ -170,7 +170,7 @@ func TestSimpleUDPListener(t *testing.T) {
}\n \n \tfor _, tt := range listenerTests {\n-\t\tif tt.wildcard && avoidOSXFirewallDialogPopup() {\n+\t\tif tt.wildcard && (testing.Short() || !*testExternal) {\n \t\t\tcontinue\n \t\t}\n \t\tif tt.ipv6 {\n@@ -267,7 +267,7 @@ func TestDualStackTCPListener(t *testing.T) {
}\n \n \tfor _, tt := range dualStackListenerTests {\n-\t\tif tt.wildcard && avoidOSXFirewallDialogPopup() {\n+\t\tif tt.wildcard && (testing.Short() || !*testExternal) {\n \t\t\tcontinue\n \t\t}\n \t\tswitch runtime.GOOS {\n@@ -316,7 +316,7 @@ func TestDualStackUDPListener(t *testing.T) {
}\n \n \tfor _, tt := range dualStackListenerTests {\n-\t\tif tt.wildcard && avoidOSXFirewallDialogPopup() {\n+\t\tif tt.wildcard && (testing.Short() || !*testExternal) {\n \t\t\tcontinue\n \t\t}\n \t\ttt.net1 = toudpnet(tt.net1)\n@@ -531,7 +531,7 @@ func TestProhibitionaryDialArgs(t *testing.T) {
\t\treturn\n \t}\n \t// This test requires both IPv6 and IPv6 IPv4-mapping functionality.\n-\tif !supportsIPv4map || avoidOSXFirewallDialogPopup() {\n+\tif !supportsIPv4map || testing.Short() || !*testExternal {\n \t\treturn\n \t}\n \n```
## コアとなるコードの解説
### `src/pkg/net/dial_test.go`
```go
// TODO(bradfitz): It's hard to test this in a portable
-// way. This is unforunate, but works for now.
+// way. This is unfortunate, but works for now.
この変更は、コメント内のスペルミス unforunate
を unfortunate
に修正したものです。機能的な変更はありません。
src/pkg/net/net_test.go
-// avoidOSXFirewallDialogPopup avoids OS X, former konwn as MacOS X,
-// firewall dialog popups during tests. It looks like OS X checks
-// wildcard listens by default for security reasons. A listen with
-// specific address doesn't make dialog popups for now.
-var avoidOSXFirewallDialogPopup = func() bool {
- return testing.Short() && runtime.GOOS == "darwin"
-}
avoidOSXFirewallDialogPopup
という変数の定義が削除されました。この変数は、macOS環境で go test -short
が実行された場合に true
を返すように設計されており、ファイアウォールダイアログのポップアップを回避するためのOS固有のロジックをカプセル化していました。この削除により、より汎用的なスキップロジックに置き換えられることになります。
src/pkg/net/server_test.go
および src/pkg/net/unicast_test.go
これらのファイルでは、avoidOSXFirewallDialogPopup()
の呼び出し箇所が、testing.Short() || !*testExternal
という新しい条件に置き換えられています。
例:
-\t\tif avoidOSXFirewallDialogPopup() {
+\t\tif testing.Short() || !*testExternal {
\t\t\treturn true
\t\t}
tt.wildcard
: テストがワイルドカードアドレス(例:0.0.0.0
や[::]
)でリッスンしようとしているかどうかを示すブール値。testing.Short()
:go test -short
が実行された場合にtrue
を返します。!*testExternal
:testExternal
フラグが設定されていない場合にtrue
を返します。
この変更により、ワイルドカードアドレスでリッスンするテストは、以下のいずれかの条件が満たされた場合にスキップされます。
go test -short
が実行された場合。testExternal
フラグが明示的に指定されていない場合。
これにより、macOSのファイアウォールダイアログの問題が解決されるだけでなく、all.bash
テストがデフォルトで外部ネットワークを使用しないという、より一般的なポリシーが適用されます。これは、テストの実行環境に依存しない、より安定したテストスイートの実現に貢献します。
関連リンク
- Go言語の
testing
パッケージ: https://pkg.go.dev/testing - Go言語の
runtime
パッケージ: https://pkg.go.dev/runtime
参考にした情報源リンク
- Goの
all.bash
テストとOS Xファイアウォールダイアログに関する情報:- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH2NEixb5DzFuEnVWzvm71ezCahFKhUxBgaz431_GAioLmPW51JnpaGt5k02ehJkPEesBD6q3oaxsJPfyJLiAS2jsBZU8MJ9NxW-Kou3It8UP4P72thLz_CW0_su8e7_hihHMki3ivNNZM8g7mwxbwq1oRhc4000xV6ZI49Isgx9hBOA10NtrDdcAjN_jTKKIZBkIL3vIGthjvh6BavIzn5sp1PvaUtBWewdEVEPxW6gTmlhpU_z1Q9YzWQVtzOh8r1
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHZzscX4b24DWJ3TfoXrJi6fSdI9N_vz6Jra66fMJpqnb7rIrjcZHMbmSZf8cVc88qAqBQPk8mpVdl4OfbKEJkrgDl5S3Fia1Zs1DQILQZEyaFLlnLrtPbAtQG2YMGJ3prodMHA8pdgrXTholu0L8pteDq0uqp5NcTwe7mozashQ8qb5nNPfK5mkPpJVXnKlglX8xRBfE73TOyBZVMuWI5zjylPYOWLuDaxSqKfeX-8BWSQcxwfllY=
testing.Short()
に関する情報:- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGy_AJYOZZ0GnVMNy8RE3kZw_HAFsQHUVjnqFohOW2kFXt5zmsBW7Upic6xg22Dy0kCin9FIAnJiXUbxvJVDb18a7sG5XaWeJluDkCMjai8WC8oAyz8U1K1nQblijhcDOgn9Yub5jz1vUuWRJsRIbmezlD1dfjHgvrMkJJCWf6tgHDoy24t4OSNh8mjwL7Af9Ax2ifRF29DJBUKysjAUQBd9OYhQpW8s5NcxdEkdY7DPK2bnH6GAg=
- https://pkg.go.dev/testing#Short
- Goにおける外部依存性のテストに関する情報 (一般的な概念):
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGIaRUobQTt19zCtcBzZxcnsGq54Ztd7hvu9V7dq7NncBb-MxvcHIxgOrZjCns3eE9k5FDqa34AGdLfAH1a2Rw9GgvVAkCQgutjNGLxRDw8AkmPkQxMhEantYSR70E1yNEvfXPzIFmarBmMXi8=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFr6BxQa2XSsPD4KxKTbAxRu7Z_q-CUWzEScPcYbVy87z1TSw2pwpnEWyteIiyaP6_oI7VIwTzop6hy8RdHp7gOmji6ZG-_T1KKgAGP-avLnsCSGS1REzFu-jGtabiqPI16B49ssC69ZslCDzxWtBAAPIcmsNe-tTpl6Mn708e5ge31mjMkCVjEC5rM2Q==