1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package acme
6
7import (
8	"errors"
9	"net/http"
10	"testing"
11	"time"
12)
13
14func TestRateLimit(t *testing.T) {
15	now := time.Date(2017, 04, 27, 10, 0, 0, 0, time.UTC)
16	f := timeNow
17	defer func() { timeNow = f }()
18	timeNow = func() time.Time { return now }
19
20	h120, hTime := http.Header{}, http.Header{}
21	h120.Set("Retry-After", "120")
22	hTime.Set("Retry-After", "Tue Apr 27 11:00:00 2017")
23
24	err1 := &Error{
25		ProblemType: "urn:ietf:params:acme:error:nolimit",
26		Header:      h120,
27	}
28	err2 := &Error{
29		ProblemType: "urn:ietf:params:acme:error:rateLimited",
30		Header:      h120,
31	}
32	err3 := &Error{
33		ProblemType: "urn:ietf:params:acme:error:rateLimited",
34		Header:      nil,
35	}
36	err4 := &Error{
37		ProblemType: "urn:ietf:params:acme:error:rateLimited",
38		Header:      hTime,
39	}
40
41	tt := []struct {
42		err error
43		res time.Duration
44		ok  bool
45	}{
46		{nil, 0, false},
47		{errors.New("dummy"), 0, false},
48		{err1, 0, false},
49		{err2, 2 * time.Minute, true},
50		{err3, 0, true},
51		{err4, time.Hour, true},
52	}
53	for i, test := range tt {
54		res, ok := RateLimit(test.err)
55		if ok != test.ok {
56			t.Errorf("%d: RateLimit(%+v): ok = %v; want %v", i, test.err, ok, test.ok)
57			continue
58		}
59		if res != test.res {
60			t.Errorf("%d: RateLimit(%+v) = %v; want %v", i, test.err, res, test.res)
61		}
62	}
63}
64
65func TestAuthorizationError(t *testing.T) {
66	tests := []struct {
67		desc string
68		err  *AuthorizationError
69		msg  string
70	}{
71		{
72			desc: "when auth error identifier is set",
73			err: &AuthorizationError{
74				Identifier: "domain.com",
75				Errors: []error{
76					(&wireError{
77						Status: 403,
78						Type:   "urn:ietf:params:acme:error:caa",
79						Detail: "CAA record for domain.com prevents issuance",
80					}).error(nil),
81				},
82			},
83			msg: "acme: authorization error for domain.com: 403 urn:ietf:params:acme:error:caa: CAA record for domain.com prevents issuance",
84		},
85
86		{
87			desc: "when auth error identifier is unset",
88			err: &AuthorizationError{
89				Errors: []error{
90					(&wireError{
91						Status: 403,
92						Type:   "urn:ietf:params:acme:error:caa",
93						Detail: "CAA record for domain.com prevents issuance",
94					}).error(nil),
95				},
96			},
97			msg: "acme: authorization error: 403 urn:ietf:params:acme:error:caa: CAA record for domain.com prevents issuance",
98		},
99	}
100
101	for _, tt := range tests {
102		if tt.err.Error() != tt.msg {
103			t.Errorf("got: %s\nwant: %s", tt.err, tt.msg)
104		}
105	}
106}
107