1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
package dkim
import (
"bufio"
"reflect"
"strings"
"testing"
)
var headerTests = []struct {
h header
s string
}{
{
h: header{"From: <mistuha@kiminonawa.moe>\r\n"},
s: "From: <mistuha@kiminonawa.moe>\r\n\r\n",
},
{
h: header{
"From: <mistuha@kiminonawa.moe>\r\n",
"Subject: Your Name\r\n",
},
s: "From: <mistuha@kiminonawa.moe>\r\n" +
"Subject: Your Name\r\n" +
"\r\n",
},
}
func TestReadHeader(t *testing.T) {
for _, test := range headerTests {
r := strings.NewReader(test.s)
h, err := readHeader(bufio.NewReader(r))
if err != nil {
t.Fatalf("Expected no error while reading error, got: %v", err)
}
if !reflect.DeepEqual(h, test.h) {
t.Errorf("Expected header to be \n%v\n but got \n%v", test.h, h)
}
}
}
func TestReadHeader_incomplete(t *testing.T) {
r := strings.NewReader("From: <mistuha@kiminonawa.moe>\r\nTo")
_, err := readHeader(bufio.NewReader(r))
if err == nil {
t.Error("Expected an error while reading incomplete header")
}
}
func TestFormatHeaderParams(t *testing.T) {
params := map[string]string{
"v": "1",
"a": "rsa-sha256",
"d": "example.org",
}
expected := "DKIM-Signature: a=rsa-sha256; d=example.org; v=1;"
s := formatHeaderParams("DKIM-Signature", params)
if s != expected {
t.Errorf("Expected formatted params to be %q, but got %q", expected, s)
}
}
func TestLongHeaderFolding(t *testing.T) {
// see #29 and #27
params := map[string]string{
"v": "1",
"a": "rsa-sha256",
"d": "example.org",
"h": "From:To:Subject:Date:Message-ID:Long-Header-Name",
}
expected := "DKIM-Signature: a=rsa-sha256; d=example.org;\r\n h=From:To:Subject:Date:Message-ID:Long-Header-Name; v=1;"
s := formatHeaderParams("DKIM-Signature", params)
if s != expected {
t.Errorf("Expected formatted params to be\n\n %q\n\n, but got\n\n %q", expected, s)
}
}
func TestSignedHeaderFolding(t *testing.T) {
hValue := "From:To:Subject:Date:Message-ID:Long-Header-Name:Another-Long-Header-Name"
params := map[string]string{
"v": "1",
"a": "rsa-sha256",
"d": "example.org",
"h": hValue,
}
s := formatHeaderParams("DKIM-Signature", params)
if !strings.Contains(s, hValue) {
t.Errorf("Signed Headers names (%v) are not well folded in the signed header %q", hValue, s)
}
}
func TestParseHeaderParams_malformed(t *testing.T) {
_, err := parseHeaderParams("abc; def")
if err == nil {
t.Error("Expected an error when parsing malformed header params")
}
}
func TestHeaderPicker_Pick(t *testing.T) {
t.Run("simple", func(t *testing.T) {
predefinedHeaders := []string{"From", "to"}
headers := header{
"from: fst",
"To: snd",
}
picker := newHeaderPicker(headers)
for i, k := range predefinedHeaders {
if headers[i] != picker.Pick(k) {
t.Errorf("Parameter %s not found in headers %s", k, headers)
}
}
})
t.Run("a few same headers", func(t *testing.T) {
predefinedHeaders := []string{"to", "to", "to"}
// same headers must returns from Bottom to Top
headers := header{
"To: trd",
"To: snd",
"To: fst",
}
var lh = len(headers) - 1
picker := newHeaderPicker(headers)
for i, k := range predefinedHeaders {
if headers[lh-i] != picker.Pick(k) {
t.Errorf("Parameter %s not found in headers %s", k, headers)
}
}
})
}
func TestFoldHeaderField(t *testing.T) {
// fake header with `len(header) % 75 == 74`. See #23
header := `Minimum length header that generates the issue should be of 74 characters `
expected := "Minimum length header that generates the issue should be of 74 characters \r\n"
folded := foldHeaderField(header)
if folded != expected {
t.Errorf("Extra black line added in header:\n Actual:\n ---Start--- %v ---End---\nExpected: \n ---Start--- %v ---End---\n", folded, expected)
}
}
|