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