Skip to content

Commit 605d49d

Browse files
authored
chore: clean up tests and code (#2602)
1 parent 137ad86 commit 605d49d

File tree

18 files changed

+225
-378
lines changed

18 files changed

+225
-378
lines changed

acme/api/certificate.go

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,12 @@ package api
22

33
import (
44
"bytes"
5-
"crypto/x509"
65
"encoding/pem"
76
"errors"
87
"io"
98
"net/http"
109

1110
"github.com/go-acme/lego/v4/acme"
12-
"github.com/go-acme/lego/v4/certcrypto"
13-
"github.com/go-acme/lego/v4/log"
1411
)
1512

1613
// maxBodySize is the maximum size of body that we will read.
@@ -77,62 +74,22 @@ func (c *CertificateService) get(certURL string, bundle bool) (*acme.RawCertific
7774
return nil, resp.Header, err
7875
}
7976

80-
cert := c.getCertificateChain(data, resp.Header, bundle, certURL)
77+
cert := c.getCertificateChain(data, bundle)
8178

8279
return cert, resp.Header, err
8380
}
8481

8582
// getCertificateChain Returns the certificate and the issuer certificate.
86-
func (c *CertificateService) getCertificateChain(cert []byte, headers http.Header, bundle bool, certURL string) *acme.RawCertificate {
83+
func (c *CertificateService) getCertificateChain(cert []byte, bundle bool) *acme.RawCertificate {
8784
// Get issuerCert from bundled response from Let's Encrypt
8885
// See https://community.letsencrypt.org/t/acme-v2-no-up-link-in-response/64962
8986
_, issuer := pem.Decode(cert)
90-
if issuer != nil {
91-
// If bundle is false, we want to return a single certificate.
92-
// To do this, we remove the issuer cert(s) from the issued cert.
93-
if !bundle {
94-
cert = bytes.TrimSuffix(cert, issuer)
95-
}
96-
return &acme.RawCertificate{Cert: cert, Issuer: issuer}
97-
}
98-
99-
// The issuer certificate link may be supplied via an "up" link
100-
// in the response headers of a new certificate.
101-
// See https://www.rfc-editor.org/rfc/rfc8555.html#section-7.4.2
102-
up := getLink(headers, "up")
10387

104-
issuer, err := c.getIssuerFromLink(up)
105-
if err != nil {
106-
// If we fail to acquire the issuer cert, return the issued certificate - do not fail.
107-
log.Warnf("acme: Could not bundle issuer certificate [%s]: %v", certURL, err)
108-
} else if len(issuer) > 0 {
109-
// If bundle is true, we want to return a certificate bundle.
110-
// To do this, we append the issuer cert to the issued cert.
111-
if bundle {
112-
cert = append(cert, issuer...)
113-
}
88+
// If bundle is false, we want to return a single certificate.
89+
// To do this, we remove the issuer cert(s) from the issued cert.
90+
if !bundle {
91+
cert = bytes.TrimSuffix(cert, issuer)
11492
}
11593

11694
return &acme.RawCertificate{Cert: cert, Issuer: issuer}
11795
}
118-
119-
// getIssuerFromLink requests the issuer certificate.
120-
func (c *CertificateService) getIssuerFromLink(up string) ([]byte, error) {
121-
if up == "" {
122-
return nil, nil
123-
}
124-
125-
log.Infof("acme: Requesting issuer cert from %s", up)
126-
127-
cert, _, err := c.get(up, false)
128-
if err != nil {
129-
return nil, err
130-
}
131-
132-
_, err = x509.ParseCertificate(cert.Cert)
133-
if err != nil {
134-
return nil, err
135-
}
136-
137-
return certcrypto.PEMEncode(certcrypto.DERCertificateBytes(cert.Cert)), nil
138-
}

acme/api/certificate_test.go

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package api
33
import (
44
"crypto/rand"
55
"crypto/rsa"
6-
"encoding/pem"
76
"net/http"
87
"testing"
98

109
"github.com/go-acme/lego/v4/platform/tester"
10+
"github.com/go-acme/lego/v4/platform/tester/servermock"
1111
"github.com/stretchr/testify/assert"
1212
"github.com/stretchr/testify/require"
1313
)
@@ -74,25 +74,9 @@ rzFL1KZfz+HZdnFwFW2T2gVW8L3ii1l9AJDuKzlvjUH3p6bgihVq02sjT8mx+GM2
7474
`
7575

7676
func TestCertificateService_Get_issuerRelUp(t *testing.T) {
77-
mux, apiURL := tester.SetupFakeAPI(t)
78-
79-
mux.HandleFunc("/certificate", func(w http.ResponseWriter, _ *http.Request) {
80-
w.Header().Set("Link", "<"+apiURL+`/issuer>; rel="up"`)
81-
_, err := w.Write([]byte(certResponseMock))
82-
if err != nil {
83-
http.Error(w, err.Error(), http.StatusInternalServerError)
84-
return
85-
}
86-
})
87-
88-
mux.HandleFunc("/issuer", func(w http.ResponseWriter, _ *http.Request) {
89-
p, _ := pem.Decode([]byte(issuerMock))
90-
_, err := w.Write(p.Bytes)
91-
if err != nil {
92-
http.Error(w, err.Error(), http.StatusInternalServerError)
93-
return
94-
}
95-
})
77+
apiURL := tester.MockACMEServer().
78+
Route("POST /certificate", servermock.RawStringResponse(certResponseMock)).
79+
Build(t)
9680

9781
key, err := rsa.GenerateKey(rand.Reader, 2048)
9882
require.NoError(t, err, "Could not generate test key")
@@ -107,15 +91,9 @@ func TestCertificateService_Get_issuerRelUp(t *testing.T) {
10791
}
10892

10993
func TestCertificateService_Get_embeddedIssuer(t *testing.T) {
110-
mux, apiURL := tester.SetupFakeAPI(t)
111-
112-
mux.HandleFunc("/certificate", func(w http.ResponseWriter, _ *http.Request) {
113-
_, err := w.Write([]byte(certResponseMock))
114-
if err != nil {
115-
http.Error(w, err.Error(), http.StatusInternalServerError)
116-
return
117-
}
118-
})
94+
apiURL := tester.MockACMEServer().
95+
Route("POST /certificate", servermock.RawStringResponse(certResponseMock)).
96+
Build(t)
11997

12098
key, err := rsa.GenerateKey(rand.Reader, 2048)
12199
require.NoError(t, err, "Could not generate test key")

acme/api/order_test.go

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,55 +11,48 @@ import (
1111

1212
"github.com/go-acme/lego/v4/acme"
1313
"github.com/go-acme/lego/v4/platform/tester"
14+
"github.com/go-acme/lego/v4/platform/tester/servermock"
1415
"github.com/go-jose/go-jose/v4"
1516
"github.com/stretchr/testify/assert"
1617
"github.com/stretchr/testify/require"
1718
)
1819

1920
func TestOrderService_NewWithOptions(t *testing.T) {
20-
mux, apiURL := tester.SetupFakeAPI(t)
21-
2221
// small value keeps test fast
2322
privateKey, errK := rsa.GenerateKey(rand.Reader, 1024)
2423
require.NoError(t, errK, "Could not generate test key")
2524

26-
mux.HandleFunc("/newOrder", func(w http.ResponseWriter, r *http.Request) {
27-
if r.Method != http.MethodPost {
28-
http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
29-
return
30-
}
31-
32-
body, err := readSignedBody(r, privateKey)
33-
if err != nil {
34-
http.Error(w, err.Error(), http.StatusBadRequest)
35-
return
36-
}
37-
38-
order := acme.Order{}
39-
err = json.Unmarshal(body, &order)
40-
if err != nil {
41-
http.Error(w, err.Error(), http.StatusBadRequest)
42-
return
43-
}
44-
45-
err = tester.WriteJSONResponse(w, acme.Order{
46-
Status: acme.StatusValid,
47-
Expires: order.Expires,
48-
Identifiers: order.Identifiers,
49-
Profile: order.Profile,
50-
NotBefore: order.NotBefore,
51-
NotAfter: order.NotAfter,
52-
Error: order.Error,
53-
Authorizations: order.Authorizations,
54-
Finalize: order.Finalize,
55-
Certificate: order.Certificate,
56-
Replaces: order.Replaces,
57-
})
58-
if err != nil {
59-
http.Error(w, err.Error(), http.StatusInternalServerError)
60-
return
61-
}
62-
})
25+
apiURL := tester.MockACMEServer().
26+
Route("POST /newOrder",
27+
http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
28+
body, err := readSignedBody(req, privateKey)
29+
if err != nil {
30+
http.Error(rw, err.Error(), http.StatusBadRequest)
31+
return
32+
}
33+
34+
order := acme.Order{}
35+
err = json.Unmarshal(body, &order)
36+
if err != nil {
37+
http.Error(rw, err.Error(), http.StatusBadRequest)
38+
return
39+
}
40+
41+
servermock.JSONEncode(acme.Order{
42+
Status: acme.StatusValid,
43+
Expires: order.Expires,
44+
Identifiers: order.Identifiers,
45+
Profile: order.Profile,
46+
NotBefore: order.NotBefore,
47+
NotAfter: order.NotAfter,
48+
Error: order.Error,
49+
Authorizations: order.Authorizations,
50+
Finalize: order.Finalize,
51+
Certificate: order.Certificate,
52+
Replaces: order.Replaces,
53+
}).ServeHTTP(rw, req)
54+
})).
55+
Build(t)
6356

6457
core, err := New(http.DefaultClient, "lego-test", apiURL+"/dir", "", privateKey)
6558
require.NoError(t, err)

certificate/certificates_test.go

Lines changed: 23 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package certificate
33
import (
44
"crypto/rand"
55
"crypto/rsa"
6-
"encoding/pem"
76
"fmt"
87
"net/http"
98
"testing"
@@ -12,6 +11,7 @@ import (
1211
"github.com/go-acme/lego/v4/acme/api"
1312
"github.com/go-acme/lego/v4/certcrypto"
1413
"github.com/go-acme/lego/v4/platform/tester"
14+
"github.com/go-acme/lego/v4/platform/tester/servermock"
1515
"github.com/stretchr/testify/assert"
1616
"github.com/stretchr/testify/require"
1717
)
@@ -175,15 +175,9 @@ Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
175175
`
176176

177177
func Test_checkResponse(t *testing.T) {
178-
mux, apiURL := tester.SetupFakeAPI(t)
179-
180-
mux.HandleFunc("/certificate", func(w http.ResponseWriter, _ *http.Request) {
181-
_, err := w.Write([]byte(certResponseMock))
182-
if err != nil {
183-
http.Error(w, err.Error(), http.StatusInternalServerError)
184-
return
185-
}
186-
})
178+
apiURL := tester.MockACMEServer().
179+
Route("POST /certificate", servermock.RawStringResponse(certResponseMock)).
180+
Build(t)
187181

188182
key, err := rsa.GenerateKey(rand.Reader, 2048)
189183
require.NoError(t, err, "Could not generate test key")
@@ -215,25 +209,9 @@ func Test_checkResponse(t *testing.T) {
215209
}
216210

217211
func Test_checkResponse_issuerRelUp(t *testing.T) {
218-
mux, apiURL := tester.SetupFakeAPI(t)
219-
220-
mux.HandleFunc("/certificate", func(w http.ResponseWriter, _ *http.Request) {
221-
w.Header().Set("Link", "<"+apiURL+`/issuer>; rel="up"`)
222-
_, err := w.Write([]byte(certResponseMock))
223-
if err != nil {
224-
http.Error(w, err.Error(), http.StatusInternalServerError)
225-
return
226-
}
227-
})
228-
229-
mux.HandleFunc("/issuer", func(w http.ResponseWriter, _ *http.Request) {
230-
p, _ := pem.Decode([]byte(issuerMock))
231-
_, err := w.Write(p.Bytes)
232-
if err != nil {
233-
http.Error(w, err.Error(), http.StatusInternalServerError)
234-
return
235-
}
236-
})
212+
apiURL := tester.MockACMEServer().
213+
Route("POST /certificate", servermock.RawStringResponse(certResponseMock)).
214+
Build(t)
237215

238216
key, err := rsa.GenerateKey(rand.Reader, 2048)
239217
require.NoError(t, err, "Could not generate test key")
@@ -265,15 +243,9 @@ func Test_checkResponse_issuerRelUp(t *testing.T) {
265243
}
266244

267245
func Test_checkResponse_no_bundle(t *testing.T) {
268-
mux, apiURL := tester.SetupFakeAPI(t)
269-
270-
mux.HandleFunc("/certificate", func(w http.ResponseWriter, _ *http.Request) {
271-
_, err := w.Write([]byte(certResponseMock))
272-
if err != nil {
273-
http.Error(w, err.Error(), http.StatusInternalServerError)
274-
return
275-
}
276-
})
246+
apiURL := tester.MockACMEServer().
247+
Route("POST /certificate", servermock.RawStringResponse(certResponseMock)).
248+
Build(t)
277249

278250
key, err := rsa.GenerateKey(rand.Reader, 2048)
279251
require.NoError(t, err, "Could not generate test key")
@@ -305,25 +277,16 @@ func Test_checkResponse_no_bundle(t *testing.T) {
305277
}
306278

307279
func Test_checkResponse_alternate(t *testing.T) {
308-
mux, apiURL := tester.SetupFakeAPI(t)
309-
310-
mux.HandleFunc("/certificate", func(w http.ResponseWriter, _ *http.Request) {
311-
w.Header().Add("Link", fmt.Sprintf(`<%s/certificate/1>;title="foo";rel="alternate"`, apiURL))
312-
313-
_, err := w.Write([]byte(certResponseMock))
314-
if err != nil {
315-
http.Error(w, err.Error(), http.StatusInternalServerError)
316-
return
317-
}
318-
})
319-
320-
mux.HandleFunc("/certificate/1", func(w http.ResponseWriter, _ *http.Request) {
321-
_, err := w.Write([]byte(certResponseMock2))
322-
if err != nil {
323-
http.Error(w, err.Error(), http.StatusInternalServerError)
324-
return
325-
}
326-
})
280+
apiURL := tester.MockACMEServer().
281+
Route("POST /certificate",
282+
http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
283+
rw.Header().Add("Link",
284+
fmt.Sprintf(`<http://%s/certificate/1>;title="foo";rel="alternate"`, req.Context().Value(http.LocalAddrContextKey)))
285+
286+
servermock.RawStringResponse(certResponseMock).ServeHTTP(rw, req)
287+
})).
288+
Route("/certificate/1", servermock.RawStringResponse(certResponseMock2)).
289+
Build(t)
327290

328291
key, err := rsa.GenerateKey(rand.Reader, 2048)
329292
require.NoError(t, err, "Could not generate test key")
@@ -358,15 +321,9 @@ func Test_checkResponse_alternate(t *testing.T) {
358321
}
359322

360323
func Test_Get(t *testing.T) {
361-
mux, apiURL := tester.SetupFakeAPI(t)
362-
363-
mux.HandleFunc("/acme/cert/test-cert", func(w http.ResponseWriter, _ *http.Request) {
364-
_, err := w.Write([]byte(certResponseMock))
365-
if err != nil {
366-
http.Error(w, err.Error(), http.StatusInternalServerError)
367-
return
368-
}
369-
})
324+
apiURL := tester.MockACMEServer().
325+
Route("POST /acme/cert/test-cert", servermock.RawStringResponse(certResponseMock)).
326+
Build(t)
370327

371328
key, err := rsa.GenerateKey(rand.Reader, 2048)
372329
require.NoError(t, err, "Could not generate test key")

0 commit comments

Comments
 (0)