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に準拠していると見なされるために、このスイートのすべてのテストに合格する必要があります。