メインコンテンツまでスキップ

Appendix F. Test Suite (テストスイート)

Appendix F. Test Suite (テストスイート)

この付録は、SPF実装を検証するための包括的なテストスイートを提供します。テストは、SPFチェッカーが正しく動作することを確認するためのさまざまなシナリオをカバーしています。

F.1 Basic Tests (基本テスト)

F.1.1 シンプルなIP4テスト

テスト1: 直接IP4マッチ

SPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: pass

テスト2: IP4 CIDRマッチ

SPFレコード: v=spf1 ip4:192.0.2.0/24 -all
テストIP: 192.0.2.128
期待される結果: pass

テスト3: IP4非マッチ

SPFレコード: v=spf1 ip4:192.0.2.0/24 -all
テストIP: 192.0.3.1
期待される結果: fail

F.1.2 シンプルなIP6テスト

テスト4: 直接IP6マッチ

SPFレコード: v=spf1 ip6:2001:db8::1 -all
テストIP: 2001:db8::1
期待される結果: pass

テスト5: IP6 CIDRマッチ

SPFレコード: v=spf1 ip6:2001:db8::/32 -all
テストIP: 2001:db8::dead:beef
期待される結果: pass

テスト6: IP6非マッチ

SPFレコード: v=spf1 ip6:2001:db8::/32 -all
テストIP: 2001:db9::1
期待される結果: fail

F.2 Mechanism Tests (メカニズムテスト)

F.2.1 Aメカニズムテスト

テスト7: Aメカニズム - マッチ

ドメイン: example.com
SPFレコード: v=spf1 a -all
example.comのDNS Aレコード: 192.0.2.1
テストIP: 192.0.2.1
期待される結果: pass

テスト8: CIDRを含むAメカニズム

ドメイン: example.com
SPFレコード: v=spf1 a/24 -all
example.comのDNS Aレコード: 192.0.2.1
テストIP: 192.0.2.200
期待される結果: pass

テスト9: ドメイン指定を含むAメカニズム

ドメイン: sender.example.com
SPFレコード: v=spf1 a:mail.example.com -all
mail.example.comのDNS Aレコード: 192.0.2.10
テストIP: 192.0.2.10
期待される結果: pass

F.2.2 MXメカニズムテスト

テスト10: MXメカニズム - マッチ

ドメイン: example.com
SPFレコード: v=spf1 mx -all
example.comのDNS MXレコード: 10 mail.example.com
mail.example.comのDNS Aレコード: 192.0.2.1
テストIP: 192.0.2.1
期待される結果: pass

テスト11: 複数のMXレコードを含むMXメカニズム

ドメイン: example.com
SPFレコード: v=spf1 mx -all
DNS MXレコード:
10 mail1.example.com → 192.0.2.1
20 mail2.example.com → 192.0.2.2
テストIP: 192.0.2.2
期待される結果: pass

テスト12: CIDRを含むMXメカニズム

ドメイン: example.com
SPFレコード: v=spf1 mx/24 -all
DNS MXレコード: 10 mail.example.com
mail.example.comのDNS Aレコード: 192.0.2.1
テストIP: 192.0.2.200
期待される結果: pass

F.2.3 PTRメカニズムテスト (使用しない)

テスト13: PTRメカニズム - マッチ

ドメイン: example.com
SPFレコード: v=spf1 ptr -all
テストIP: 192.0.2.1
192.0.2.1のPTRレコード: mail.example.com
mail.example.comのAレコード: 192.0.2.1
期待される結果: pass

注意: PTRメカニズムは非推奨であり、使用すべきではありません。

F.2.4 EXISTSメカニズムテスト

テスト14: EXISTSメカニズム - 見つかった

ドメイン: example.com
SPFレコード: v=spf1 exists:%\{i}.whitelist.example.com -all
テストIP: 192.0.2.1
192.0.2.1.whitelist.example.comのDNS A照会: 127.0.0.2
期待される結果: pass

テスト15: EXISTSメカニズム - 見つからない

ドメイン: example.com
SPFレコード: v=spf1 exists:%\{i}.whitelist.example.com -all
テストIP: 192.0.2.99
192.0.2.99.whitelist.example.comのDNS A照会: NXDOMAIN
期待される結果: fail

F.2.5 INCLUDEメカニズムテスト

テスト16: INCLUDE - シンプルなpass伝播

ドメイン: example.com
SPFレコード: v=spf1 include:trusted.example.com -all
trusted.example.comのSPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: pass

テスト17: INCLUDE - failは伝播しない

ドメイン: example.com
SPFレコード: v=spf1 include:trusted.example.com -all
trusted.example.comのSPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: 192.0.2.99
期待される結果: fail (includeからではなく-allから)

テスト18: INCLUDE - TempError伝播

ドメイン: example.com
SPFレコード: v=spf1 include:trusted.example.com -all
trusted.example.comのDNS照会: DNSサーバー利用不可
期待される結果: temperror

テスト19: INCLUDE - PermError伝播

ドメイン: example.com
SPFレコード: v=spf1 include:trusted.example.com -all
trusted.example.comのSPFレコード: v=spf1 ip4:192.0.2.1 ip4:192.0.2.1 -all (無効)
期待される結果: permerror

F.2.6 ALLメカニズムテスト

テスト20: 異なる修飾子を持つALL

+all: pass
-all: fail
~all: softfail
?all: neutral

F.3 Qualifier Tests (修飾子テスト)

テスト21: プラス修飾子 (+)

SPFレコード: v=spf1 +ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: pass

テスト22: マイナス修飾子 (-)

SPFレコード: v=spf1 -ip4:192.0.2.1 ~all
テストIP: 192.0.2.1
期待される結果: fail

テスト23: チルダ修飾子 (~)

SPFレコード: v=spf1 ~ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: softfail

テスト24: クエスチョンマーク修飾子 (?)

SPFレコード: v=spf1 ?ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: neutral

F.4 Modifier Tests (モディファイアテスト)

F.4.1 REDIRECTモディファイアテスト

テスト25: REDIRECT - 基本的なリダイレクト

ドメイン: example.com
SPFレコード: v=spf1 redirect=_spf.example.com
_spf.example.comのSPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: pass

テスト26: REDIRECT - メカニズム後は無視される

ドメイン: example.com
SPFレコード: v=spf1 ip4:192.0.2.1 redirect=_spf.example.com
テストIP: 192.0.2.1
期待される結果: pass (メカニズムがマッチ、redirectは無視)

テスト27: REDIRECT - マッチなし

ドメイン: example.com
SPFレコード: v=spf1 redirect=_spf.example.com
_spf.example.comのSPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: 192.0.2.99
期待される結果: fail

F.4.2 EXPモディファイアテスト

テスト28: EXP - 説明文字列の取得

ドメイン: example.com
SPFレコード: v=spf1 ip4:192.0.2.1 -all exp=explain.example.com
explain.example.comのDNS TXTレコード: "Mail from %\{i} not allowed"
テストIP: 192.0.2.99
期待される結果: fail
期待される説明: "Mail from 192.0.2.99 not allowed"

F.5 Macro Tests (マクロテスト)

F.5.1 基本的なマクロ展開

テスト29: %\{s} - 送信者

ドメイン: example.com
MAIL FROM: [email protected]
SPFレコード: v=spf1 exists:%\{s}.whitelist.example.com -all
展開先: exists:[email protected]

テスト30: %\{l} - ローカル部分

ドメイン: example.com
MAIL FROM: [email protected]
SPFレコード: v=spf1 exists:%\{l}.whitelist.example.com -all
展開先: exists:sender.whitelist.example.com

テスト31: %\{o} - ドメイン

ドメイン: example.com
MAIL FROM: [email protected]
SPFレコード: v=spf1 exists:%\{o}.whitelist.example.com -all
展開先: exists:example.com.whitelist.example.com

テスト32: %\{d} - 現在のドメイン

ドメイン: mail.example.com
SPFレコード: v=spf1 exists:%\{d}.whitelist.example.com -all
展開先: exists:mail.example.com.whitelist.example.com

テスト33: %\{i} - IPアドレス

テストIP: 192.0.2.1
SPFレコード: v=spf1 exists:%\{i}.whitelist.example.com -all
展開先: exists:192.0.2.1.whitelist.example.com

テスト34: %\{i} - IPv6アドレス

テストIP: 2001:db8::1
SPFレコード: v=spf1 exists:%\{i}.whitelist.example.com -all
展開先: exists:2001.0db8.0000.0000.0000.0000.0000.0001.whitelist.example.com

F.5.2 マクロトランスフォーマー

テスト35: リバーストランスフォーマー (r)

ドメイン: mail.example.com
マクロ: %\{d}
通常: mail.example.com
rを使用: %\{dr}
展開先: com.example.mail

テスト36: 区切り文字とリバース

MAIL FROM: [email protected]
マクロ: %\{or}
展開先: com.example.mail

テスト37: 数字指定

ドメイン: mail.example.com
マクロ: %\{d2}
展開先: example.com (最後の2コンポーネント)

テスト38: リバース付き数字

ドメイン: mail.example.com
マクロ: %\{d2r}
展開先: com.example

F.5.3 マクロでのURLエンコーディング

テスト39: URLエスケープ文字

MAIL FROM: "test user"@example.com
マクロ: %\{l}
展開先: test%20user

F.6 DNS Lookup Limit Tests (DNS照会制限テスト)

テスト40: DNS照会制限 - 正確に10

SPFレコード: v=spf1 mx a include:d1.example.com include:d2.example.com ...
(DNS照会を必要とする合計10個のメカニズム)
期待される結果: 正常に処理される

テスト41: DNS照会制限 - 11で超過

SPFレコード: v=spf1 mx a include:d1.example.com ... (11照会)
期待される結果: permerror

テスト42: ネストされたinclude照会カウント

ドメイン: example.com
SPF: v=spf1 include:a.example.com -all (1照会)
a.example.com: v=spf1 include:b.example.com -all (1照会)
b.example.com: v=spf1 mx a -all (2照会)
合計照会: 4
期待される結果: pass (IPがマッチする場合)

F.7 Void Lookup Tests (空の照会テスト)

テスト43: Aメカニズム - Aレコードなし

ドメイン: example.com
SPFレコード: v=spf1 a -all
example.comのDNS Aレコード: (なし)
テストIP: 192.0.2.1
期待される結果: fail (メカニズムがマッチしない)
空の照会: 1

テスト44: MXメカニズム - MXレコードなし

ドメイン: example.com
SPFレコード: v=spf1 mx -all
example.comのDNS MXレコード: (なし)
テストIP: 192.0.2.1
期待される結果: fail
空の照会: 1

テスト45: 空の照会制限 - 超過

それぞれが空の照会を返す3つのメカニズムを持つSPFレコード
期待される結果: permerror (制限が2の場合)

F.8 Syntax Error Tests (構文エラーテスト)

テスト46: SPFバージョンなし

SPFレコード: ip4:192.0.2.1 -all
期待される結果: none (有効なSPFレコードなし)

テスト47: 無効なIPアドレス

SPFレコード: v=spf1 ip4:999.999.999.999 -all
期待される結果: permerror

テスト48: 無効なCIDR範囲

SPFレコード: v=spf1 ip4:192.0.2.0/99 -all
期待される結果: permerror

テスト49: 重複したモディファイア

SPFレコード: v=spf1 redirect=a.example.com redirect=b.example.com
期待される結果: permerror

テスト50: 未知のモディファイア (無視されるべき)

SPFレコード: v=spf1 ip4:192.0.2.1 unknown=value -all
テストIP: 192.0.2.1
期待される結果: pass (未知のモディファイアは無視)

F.9 Integration Tests (統合テスト)

テスト51: 複雑な現実的シナリオ

ドメイン: company.com
SPFレコード: v=spf1 mx include:_spf.google.com include:sendgrid.net -all

設定:
- MXレコード: mail1.company.com (192.0.2.1), mail2.company.com (192.0.2.2)
- GoogleのSPFは複数のIP範囲を含む
- SendGridのSPFは複数のIP範囲を含む

テストケース:
1. IP 192.0.2.1: pass (mxマッチ)
2. Google範囲からのIP: pass (includeマッチ)
3. SendGrid範囲からのIP: pass (includeマッチ)
4. ランダムIP: fail (-all)

テスト52: サブドメイン処理

ドメイン: mail.company.com
company.comのSPFレコード: v=spf1 -all
mail.company.comのSPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: pass (サブドメインには独自のSPFレコードがある)

テスト53: SPFレコードなし

ドメイン: example.com
SPFレコード: (なし)
テストIP: 192.0.2.1
期待される結果: none

F.10 Edge Cases (エッジケース)

テスト54: 空のローカル部分

MAIL FROM: <>
HELO: mail.example.com
mail.example.comのSPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: pass (HELOアイデンティティを使用)

テスト55: IPv4マップIPv6アドレス

SPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: ::ffff:192.0.2.1 (IPv4マップIPv6)
期待される結果: pass (IPv4として扱われるべき)

テスト56: IPv4の/32 CIDR

SPFレコード: v=spf1 ip4:192.0.2.1/32 -all
テストIP: 192.0.2.1
期待される結果: pass

テスト57: IPv6の/128 CIDR

SPFレコード: v=spf1 ip6:2001:db8::1/128 -all
テストIP: 2001:db8::1
期待される結果: pass

テスト58: 複数のSPFレコード (無効)

ドメイン: example.com
SPFレコード:
v=spf1 ip4:192.0.2.1 -all
v=spf1 ip4:192.0.2.2 -all
期待される結果: permerror (複数のSPFレコードは許可されない)

F.11 Performance Tests (パフォーマンステスト)

テスト59: 最大DNS照会深度

深度10までのネストされたinclude
すべてが正しく処理されることを確認

テスト60: 大きなCIDR範囲

SPFレコード: v=spf1 ip4:192.0.0.0/8 -all
テストIP: 192.255.255.255
期待される結果: pass

F.12 Test Result Summary Format (テスト結果サマリー形式)

各テスト実行について、以下の情報を記録する必要があります:

テストID: F.1.1-Test1
説明: 直接IP4マッチ
SPFレコード: v=spf1 ip4:192.0.2.1 -all
テストIP: 192.0.2.1
期待される結果: pass
実際の結果: pass
ステータス: 合格
DNS照会: 1
空の照会: 0
処理時間: 45ms

完全なSPF実装は、RFC 7208に準拠していると見なされるために、このスイートのすべてのテストに合格する必要があります。