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

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

このコミットは、Go言語の標準ライブラリnetパッケージ内のCNAMEルックアップテストの対象ドメインをwww.google.comからwww.iana.orgに変更するものです。これにより、テストの安定性と意味合いが向上することが期待されます。

コミット

commit b7376442669a0ea48e06bd98a3350c33cefe1113
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Sun Sep 9 23:53:48 2012 +0900

    net: change cname lookup test target to iana.org
    
    It might be meaningful, and stable than others.
    
    R=golang-dev, agl
    CC=golang-dev
    https://golang.org/cl/6499091

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

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

元コミット内容

このコミットは、Go言語のnetパッケージにおけるCNAME(Canonical Name)レコードのルックアップテストを変更するものです。具体的には、既存のTestLookupCNAME関数がwww.google.comをテスト対象としていたものを削除し、新たにTestLookupIANACNAME関数を追加してwww.iana.orgをテスト対象としています。

変更の意図は、www.iana.orgがより「意味があり、他のドメインよりも安定している可能性がある」という点にあります。これは、テストの信頼性を高めるための改善です。

変更の背景

ソフトウェア開発において、外部サービスに依存するテストは、その外部サービスの可用性や応答内容の変化によって不安定になることがあります。特にDNSルックアップのようなネットワークに依存するテストでは、テスト対象のドメインのDNS設定が変更されたり、一時的にアクセスできなくなったりすると、テストが失敗する原因となります。

元のテストではwww.google.comのCNAMEレコードを検証していましたが、Googleのような大規模なサービスは、そのインフラストラクチャの変更に伴いDNSレコードも頻繁に更新される可能性があります。これにより、テストが意図せず失敗する「flaky test」(不安定なテスト)となるリスクがありました。

このコミットの背景には、テストの安定性を向上させ、より信頼性の高いテスト環境を構築するという目的があります。IANA (Internet Assigned Numbers Authority) は、インターネットのIPアドレス空間、ドメイン名、プロトコル識別子などのグローバルな調整を担当する組織であり、そのウェブサイトwww.iana.orgのDNSレコードは、一般的な商用サイトと比較して非常に安定していると推測されます。そのため、テスト対象としてより適切であると判断されたと考えられます。

前提知識の解説

CNAMEレコード (Canonical Name Record)

CNAMEレコードは、DNS (Domain Name System) におけるリソースレコードの一種で、あるドメイン名が別のドメイン名のエイリアス(別名)であることを示します。例えば、blog.example.comexample.github.ioのCNAMEレコードである場合、blog.example.comへのアクセスはexample.github.ioに転送されます。これにより、複数のサービスが同じIPアドレスを共有したり、サービスプロバイダの変更時にIPアドレスの変更を隠蔽したりすることが可能になります。

CNAMEレコードは、主に以下のような目的で使用されます。

  • サブドメインのエイリアス: www.example.comexample.comのエイリアスにするなど。
  • ホスティングサービスの利用: GitHub PagesやHerokuなどのサービスで、カスタムドメインをサービスプロバイダのドメインにマッピングする場合。
  • CDN (Content Delivery Network) の利用: CDNのエッジサーバーにトラフィックをルーティングする場合。

CNAMEレコードをルックアップする際には、最終的な正規名(Canonical Name)が返されます。

Go言語のnetパッケージ

Go言語の標準ライブラリには、ネットワーク機能を提供するnetパッケージが含まれています。このパッケージは、TCP/IP、UDP、DNSルックアップなど、様々なネットワーク操作のためのAPIを提供します。

  • net.LookupCNAME: この関数は、指定されたホスト名のCNAMEレコードをルックアップし、その正規名を返します。エラーが発生した場合はエラーも返します。

Go言語のテストフレームワーク

Go言語には、標準でテストをサポートするtestingパッケージが用意されています。

  • testing.T: テスト関数に渡される型で、テストのログ出力、エラー報告、テストのスキップなどの機能を提供します。
  • t.Logf: テスト中に情報をログに出力します。
  • t.Errorf: テストが失敗したことを報告し、エラーメッセージを出力します。
  • testing.Short(): go test -shortフラグが指定された場合にtrueを返します。これにより、時間のかかるテストや外部ネットワークに依存するテストをスキップすることができます。
  • *testExternal: この変数は、テストが外部ネットワークにアクセスする必要があるかどうかを制御するためのフラグであると推測されます。go testコマンドに特定のフラグを渡すことで、この変数の値を設定し、外部ネットワークへのアクセスを伴うテストの実行を制御できます。

技術的詳細

このコミットは、Go言語のnetパッケージにおけるDNS CNAMEルックアップのテストロジックを改善しています。

  1. テストファイルの変更:

    • src/pkg/net/dialgoogle_test.goからTestLookupCNAME関数が削除されました。このファイルは元々Google関連のネットワークテストをまとめたものだったようです。
    • src/pkg/net/lookup_test.goTestLookupIANACNAME関数が追加されました。このファイルは一般的なDNSルックアップテストをまとめる役割を担っています。
  2. テスト対象の変更:

    • 旧テスト: LookupCNAME("www.google.com")
    • 新テスト: LookupCNAME("www.iana.org")
  3. 期待されるCNAMEの変更:

    • 旧テストでは、www.google.comのCNAMEが.l.google.com.で終わることを期待していました。これはGoogleのインフラストラクチャ(例えば、ロードバランシングやCDN)に関連するCNAMEパターンです。
    • 新テストでは、www.iana.orgのCNAMEが.icann.org.で終わることを期待しています。IANAはICANN (Internet Corporation for Assigned Names and Numbers) の一部門であるため、このCNAMEパターンは妥当です。
  4. テストのスキップ条件:

    • 両方のテスト関数で、testing.Short()または!*testExternaltrueの場合にテストをスキップするロジックは維持されています。これは、CI/CD環境での高速なテスト実行や、外部ネットワークへのアクセスが制限されている環境でのテスト実行を考慮したものです。

この変更により、テストはより安定したDNSレコードを持つiana.orgを対象とすることで、GoogleのDNS設定変更に起因するテストの不安定性を回避できるようになります。これは、テストの信頼性と保守性を向上させるための重要な改善です。

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

src/pkg/net/dialgoogle_test.go (削除)

--- a/src/pkg/net/dialgoogle_test.go
+++ b/src/pkg/net/dialgoogle_test.go
@@ -41,17 +41,6 @@ func doDial(t *testing.T, network, addr string) {
 	fd.Close()
 }
 
-func TestLookupCNAME(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Logf("skipping test to avoid external network")
-		return
-	}
-	cname, err := LookupCNAME("www.google.com")
-	if !strings.HasSuffix(cname, ".l.google.com.") || err != nil {
-		t.Errorf(`LookupCNAME("www.google.com.") = %q, %v, want "*.l.google.com.", nil`, cname, err)
-	}
-}
-
 var googleaddrsipv4 = []string{
 	"%d.%d.%d.%d:80",
 	"www.google.com:80",

src/pkg/net/lookup_test.go (追加)

--- a/src/pkg/net/lookup_test.go
+++ b/src/pkg/net/lookup_test.go
@@ -9,6 +9,7 @@ package net
 
 import (
 	"flag"
+	"strings"
 	"testing"
 )
 
@@ -79,6 +80,17 @@ func TestGoogleDNSAddr(t *testing.T) {
 	}
 }
 
+func TestLookupIANACNAME(t *testing.T) {
+	if testing.Short() || !*testExternal {
+		t.Logf("skipping test to avoid external network")
+		return
+	}
+	cname, err := LookupCNAME("www.iana.org")
+	if !strings.HasSuffix(cname, ".icann.org.") || err != nil {
+		t.Errorf(`LookupCNAME("www.iana.org.") = %q, %v, want "*.icann.org.", nil`, cname, err)
+	}
+}
+
 var revAddrTests = []struct {
 	Addr      string
 	Reverse   string

コアとなるコードの解説

削除されたコード (src/pkg/net/dialgoogle_test.goより)

TestLookupCNAME関数は、www.google.comのCNAMEレコードをルックアップし、その結果が.l.google.com.で終わることを期待していました。このテストは、Googleの特定のDNS設定に依存しており、Google側のインフラ変更によってテストが不安定になる可能性がありました。テストの目的はCNAMEルックアップ機能自体の検証であり、特定の外部ドメインのCNAME構造に依存することは、テストの安定性を損なう要因となり得ます。

追加されたコード (src/pkg/net/lookup_test.goより)

TestLookupIANACNAME関数が新しく追加されました。この関数は以下の処理を行います。

  1. テストスキップ条件の確認:

    if testing.Short() || !*testExternal {
        t.Logf("skipping test to avoid external network")
        return
    }
    

    これは、go test -shortフラグが指定された場合、または外部ネットワークへのアクセスが許可されていない場合に、テストをスキップするための標準的なGoのテストパターンです。これにより、開発者がローカルで高速にテストを実行したり、ネットワーク接続がない環境でテストを実行したりする際に、外部依存のテストがボトルネックになるのを防ぎます。

  2. CNAMEルックアップの実行:

    cname, err := LookupCNAME("www.iana.org")
    

    net.LookupCNAME関数を使用して、www.iana.orgのCNAMEレコードをルックアップします。

  3. 結果の検証:

    if !strings.HasSuffix(cname, ".icann.org.") || err != nil {
        t.Errorf(`LookupCNAME("www.iana.org.") = %q, %v, want "*.icann.org.", nil`, cname, err)
    }
    

    ルックアップされたCNAME (cname) が.icann.org.で終わることを検証します。また、エラーが発生していないことも確認します。iana.orgはICANNの管理下にあるため、そのCNAMEが.icann.org.で終わることは非常に論理的であり、安定したテスト結果を期待できます。

この変更により、CNAMEルックアップ機能のテストは、より安定した外部ドメインに依存するようになり、テストの信頼性が向上しました。また、stringsパッケージが新しくインポートされている点も注目すべき変更です。

関連リンク

参考にした情報源リンク

  • Go言語のテストに関する公式ドキュメントやブログ記事
  • DNS CNAMEレコードに関する一般的な技術情報
  • IANAおよびICANNの役割に関する情報
  • Go言語のnetパッケージのソースコード(コミット時点のバージョン)
  • Go言語のコードレビューシステム (Gerrit) のCL (Change List) ページ: https://golang.org/cl/6499091 (これはコミットメッセージに記載されているリンクであり、当時のレビュープロセスを理解する上で有用です。)

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

このコミットは、Go言語の標準ライブラリnetパッケージ内のCNAMEルックアップテストの対象ドメインをwww.google.comからwww.iana.orgに変更するものです。これにより、テストの安定性と意味合いが向上することが期待されます。

コミット

commit b7376442669a0ea48e06bd98a3350c33cefe1113
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Sun Sep 9 23:53:48 2012 +0900

    net: change cname lookup test target to iana.org
    
    It might be meaningful, and stable than others.
    
    R=golang-dev, agl
    CC=golang-dev
    https://golang.org/cl/6499091

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

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

元コミット内容

このコミットは、Go言語のnetパッケージにおけるCNAME(Canonical Name)レコードのルックアップテストを変更するものです。具体的には、既存のTestLookupCNAME関数がwww.google.comをテスト対象としていたものを削除し、新たにTestLookupIANACNAME関数を追加してwww.iana.orgをテスト対象としています。

変更の意図は、www.iana.orgがより「意味があり、他のドメインよりも安定している可能性がある」という点にあります。これは、テストの信頼性を高めるための改善です。

変更の背景

ソフトウェア開発において、外部サービスに依存するテストは、その外部サービスの可用性や応答内容の変化によって不安定になることがあります。特にDNSルックアップのようなネットワークに依存するテストでは、テスト対象のドメインのDNS設定が変更されたり、一時的にアクセスできなくなったりすると、テストが失敗する原因となります。

元のテストではwww.google.comのCNAMEレコードを検証していましたが、Googleのような大規模なサービスは、そのインフラストラクチャの変更に伴いDNSレコードも頻繁に更新される可能性があります。これにより、テストが意図せず失敗する「flaky test」(不安定なテスト)となるリスクがありました。

このコミットの背景には、テストの安定性を向上させ、より信頼性の高いテスト環境を構築するという目的があります。IANA (Internet Assigned Numbers Authority) は、インターネットのIPアドレス空間、ドメイン名、プロトコル識別子などのグローバルな調整を担当する組織であり、そのウェブサイトwww.iana.orgのDNSレコードは、一般的な商用サイトと比較して非常に安定していると推測されます。そのため、テスト対象としてより適切であると判断されたと考えられます。IANAはDNSルートゾーンの管理など、DNSの安定性とグローバルな調整において中心的な役割を担っており、その技術要件はDNSの安定運用に不可欠です。

前提知識の解説

CNAMEレコード (Canonical Name Record)

CNAMEレコードは、DNS (Domain Name System) におけるリソースレコードの一種で、あるドメイン名が別のドメイン名のエイリアス(別名)であることを示します。例えば、blog.example.comexample.github.ioのCNAMEレコードである場合、blog.example.comへのアクセスはexample.github.ioに転送されます。これにより、複数のサービスが同じIPアドレスを共有したり、サービスプロバイダの変更時にIPアドレスの変更を隠蔽したりすることが可能になります。

CNAMEレコードは、主に以下のような目的で使用されます。

  • サブドメインのエイリアス: www.example.comexample.comのエイリアスにするなど。
  • ホスティングサービスの利用: GitHub PagesやHerokuなどのサービスで、カスタムドメインをサービスプロバイダのドメインにマッピングする場合。
  • CDN (Content Delivery Network) の利用: CDNのエッジサーバーにトラフィックをルーティングする場合。

CNAMEレコードをルックアップする際には、最終的な正規名(Canonical Name)が返されます。

Go言語のnetパッケージ

Go言語の標準ライブラリには、ネットワーク機能を提供するnetパッケージが含まれています。このパッケージは、TCP/IP、UDP、DNSルックアップなど、様々なネットワーク操作のためのAPIを提供します。

  • net.LookupCNAME: この関数は、指定されたホスト名のCNAMEレコードをルックアップし、その正規名を返します。エラーが発生した場合はエラーも返します。

Go言語のテストフレームワーク

Go言語には、標準でテストをサポートするtestingパッケージが用意されています。

  • testing.T: テスト関数に渡される型で、テストのログ出力、エラー報告、テストのスキップなどの機能を提供します。
  • t.Logf: テスト中に情報をログに出力します。
  • t.Errorf: テストが失敗したことを報告し、エラーメッセージを出力します。
  • testing.Short(): go test -shortフラグが指定された場合にtrueを返します。これにより、時間のかかるテストや外部ネットワークに依存するテストをスキップすることができます。
  • *testExternal: この変数は、テストが外部ネットワークにアクセスする必要があるかどうかを制御するためのフラグであると推測されます。go testコマンドに特定のフラグを渡すことで、この変数の値を設定し、外部ネットワークへのアクセスを伴うテストの実行を制御できます。

外部ネットワークに依存するテストの課題と対策

Go言語で外部ネットワークに依存するテストを行う場合、以下のような課題があります。

  • 不安定性 (Flakiness): 外部サービスの可用性や応答内容の変動により、テストが不安定になる可能性があります。
  • 速度: 実際のネットワーク呼び出しは、インメモリ操作よりも大幅に遅く、テストスイートの実行時間を長くします。
  • 副作用: テストが外部システム上のデータを作成、変更、削除する可能性があり、テストの分離と再現性に問題が生じることがあります。
  • コスト: 一部の外部サービスはリクエストごとに課金されるため、テストが費用を発生させる可能性があります。
  • 依存関係: テストが外部サービスの可用性と正常な機能に依存するようになります。

これらの課題に対処するため、Goでは主に以下の戦略が用いられます。

  • モック/フェイク: 外部ネットワークとのやり取りを抽象化するインターフェースを定義し、テスト時にはモックまたはフェイクの実装を提供します。net/http/httptestパッケージは、HTTPクライアントのテストにおいて、実際のネットワークに接続せずにローカルのHTTPサーバーを作成できるため非常に有用です。
  • 実際の外部サービスの使用 (統合/エンドツーエンドテスト): ユニットテストでは避けるべきですが、実際の外部サービスとの統合をテストする必要がある場合もあります。この場合、専用のテストアカウントやサンドボックス環境を使用し、テスト後にデータをクリーンアップすることが重要です。また、t.Skip()を使用して、必要な環境変数が設定されていない場合や外部サービスが利用できない場合にテストをスキップすることで、メインのテストスイートの実行を高速に保つことができます。

このコミットでは、後者の「実際の外部サービスの使用」の範疇で、より安定した外部サービスを選択することでテストの信頼性を高めるアプローチが取られています。

技術的詳細

このコミットは、Go言語のnetパッケージにおけるDNS CNAMEルックアップのテストロジックを改善しています。

  1. テストファイルの変更:

    • src/pkg/net/dialgoogle_test.goからTestLookupCNAME関数が削除されました。このファイルは元々Google関連のネットワークテストをまとめたものだったようです。
    • src/pkg/net/lookup_test.goTestLookupIANACNAME関数が追加されました。このファイルは一般的なDNSルックアップテストをまとめる役割を担っています。この変更は、テストの関心事をより適切に分離し、コードの保守性を向上させます。
  2. テスト対象の変更:

    • 旧テスト: LookupCNAME("www.google.com")
    • 新テスト: LookupCNAME("www.iana.org")

    www.google.comは、その大規模なインフラストラクチャとCDNの利用により、CNAMEレコードが頻繁に変動したり、地域によって異なる結果を返したりする可能性があります。これは、テストの再現性と安定性を損なう要因となります。 一方、www.iana.orgは、インターネットの基盤を管理する組織のウェブサイトであり、そのDNSレコードは非常に安定していると期待されます。IANAはDNSルート、IPアドレス、プロトコルパラメータのグローバルな調整を担当しており、そのウェブサイトのDNS設定は、テストの信頼性を確保する上で理想的な選択肢となります。

  3. 期待されるCNAMEの変更:

    • 旧テストでは、www.google.comのCNAMEが.l.google.com.で終わることを期待していました。これはGoogleのインフラストラクチャ(例えば、ロードバランシングやCDN)に関連するCNAMEパターンです。
    • 新テストでは、www.iana.orgのCNAMEが.icann.org.で終わることを期待しています。IANAはICANN (Internet Corporation for Assigned Names and Numbers) の一部門であるため、このCNAMEパターンは妥当です。iana.orgのCNAMEレコード自体は、そのルートドメインでは存在しないことが一般的ですが、www.iana.orgのようなサブドメインでは、ICANNのインフラストラクチャに関連するCNAMEが設定されている可能性が高いです。このテストは、その特定のCNAMEのサフィックスを検証することで、CNAMEルックアップ機能が正しく動作していることを確認します。
  4. テストのスキップ条件:

    • 両方のテスト関数で、testing.Short()または!*testExternaltrueの場合にテストをスキップするロジックは維持されています。これは、CI/CD環境での高速なテスト実行や、外部ネットワークへのアクセスが制限されている環境でのテスト実行を考慮したものです。これにより、開発者は必要に応じて外部ネットワークに依存するテストをスキップし、テストスイートの実行時間を最適化できます。

この変更により、テストはより安定したDNSレコードを持つiana.orgを対象とすることで、GoogleのDNS設定変更に起因するテストの不安定性を回避できるようになります。これは、テストの信頼性と保守性を向上させるための重要な改善です。

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

src/pkg/net/dialgoogle_test.go (削除)

--- a/src/pkg/net/dialgoogle_test.go
+++ b/src/pkg/net/dialgoogle_test.go
@@ -41,17 +41,6 @@ func doDial(t *testing.T, network, addr string) {
 	fd.Close()
 }
 
-func TestLookupCNAME(t *testing.T) {
-	if testing.Short() || !*testExternal {
-		t.Logf("skipping test to avoid external network")
-		return
-	}
-	cname, err := LookupCNAME("www.google.com")
-	if !strings.HasSuffix(cname, ".l.google.com.") || err != nil {
-		t.Errorf(`LookupCNAME("www.google.com.") = %q, %v, want "*.l.google.com.", nil`, cname, err)
-	}
-}
-
 var googleaddrsipv4 = []string{
 	"%d.%d.%d.%d:80",
 	"www.google.com:80",

src/pkg/net/lookup_test.go (追加)

--- a/src/pkg/net/lookup_test.go
+++ b/src/pkg/net/lookup_test.go
@@ -9,6 +9,7 @@ package net
 
 import (
 	"flag"
+	"strings"
 	"testing"
 )
 
@@ -79,6 +80,17 @@ func TestGoogleDNSAddr(t *testing.T) {
 	}
 }
 
+func TestLookupIANACNAME(t *testing.T) {
+	if testing.Short() || !*testExternal {
+		t.Logf("skipping test to avoid external network")
+		return
+	}
+	cname, err := LookupCNAME("www.iana.org")
+	if !strings.HasSuffix(cname, ".icann.org.") || err != nil {
+		t.Errorf(`LookupCNAME("www.iana.org.") = %q, %v, want "*.icann.org.", nil`, cname, err)
+	}
+}
+
 var revAddrTests = []struct {
 	Addr      string
 	Reverse   string

コアとなるコードの解説

削除されたコード (src/pkg/net/dialgoogle_test.goより)

TestLookupCNAME関数は、www.google.comのCNAMEレコードをルックアップし、その結果が.l.google.com.で終わることを期待していました。このテストは、Googleの特定のDNS設定に依存しており、Google側のインフラ変更によってテストが不安定になる可能性がありました。テストの目的はCNAMEルックアップ機能自体の検証であり、特定の外部ドメインのCNAME構造に依存することは、テストの安定性を損なう要因となり得ます。

追加されたコード (src/pkg/net/lookup_test.goより)

TestLookupIANACNAME関数が新しく追加されました。この関数は以下の処理を行います。

  1. テストスキップ条件の確認:

    if testing.Short() || !*testExternal {
        t.Logf("skipping test to avoid external network")
        return
    }
    

    これは、go test -shortフラグが指定された場合、または外部ネットワークへのアクセスが許可されていない場合に、テストをスキップするための標準的なGoのテストパターンです。これにより、開発者がローカルで高速にテストを実行したり、ネットワーク接続がない環境でテストを実行したりする際に、外部依存のテストがボトルネックになるのを防ぎます。

  2. CNAMEルックアップの実行:

    cname, err := LookupCNAME("www.iana.org")
    

    net.LookupCNAME関数を使用して、www.iana.orgのCNAMEレコードをルックアップします。

  3. 結果の検証:

    if !strings.HasSuffix(cname, ".icann.org.") || err != nil {
        t.Errorf(`LookupCNAME("www.iana.org.") = %q, %v, want "*.icann.org.", nil`, cname, err)
    }
    

    ルックアップされたCNAME (cname) が.icann.org.で終わることを検証します。また、エラーが発生していないことも確認します。iana.orgはICANNの管理下にあるため、そのCNAMEが.icann.org.で終わることは非常に論理的であり、安定したテスト結果を期待できます。

この変更により、CNAMEルックアップ機能のテストは、より安定した外部ドメインに依存するようになり、テストの信頼性が向上しました。また、stringsパッケージが新しくインポートされている点も注目すべき変更です。これは、strings.HasSuffix関数を使用するために必要です。

関連リンク

参考にした情報源リンク

  • Go言語のテストに関する公式ドキュメントやブログ記事
  • DNS CNAMEレコードに関する一般的な技術情報
  • IANAおよびICANNの役割に関する情報
  • Go言語のnetパッケージのソースコード(コミット時点のバージョン)
  • Go言語のコードレビューシステム (Gerrit) のCL (Change List) ページ: https://golang.org/cl/6499091 (これはコミットメッセージに記載されているリンクであり、当時のレビュープロセスを理解する上で有用です。)
  • Google検索結果: "Go net package CNAME lookup", "IANA.org CNAME record", "Why use iana.org for DNS tests", "Go testing external network"