Cleanup authority creation

This commit is contained in:
Roland Shoemaker 2015-08-28 15:03:02 -07:00
parent f945bb0efb
commit 88c2f95179
9 changed files with 75 additions and 79 deletions

View File

@ -35,10 +35,9 @@ func main() {
go cmd.DebugServer(c.RA.DebugAddr)
rai := ra.NewRegistrationAuthorityImpl()
rai := ra.NewRegistrationAuthorityImpl(stats)
rai.AuthzBase = c.Common.BaseURL + wfe.AuthzPath
rai.MaxKeySize = c.Common.MaxKeySize
rai.Stats = stats
raDNSTimeout, err := time.ParseDuration(c.Common.DNSTimeout)
cmd.FailOnError(err, "Couldn't parse RA DNS timeout")
rai.DNSResolver = core.NewDNSResolverImpl(raDNSTimeout, []string{c.Common.DNSResolver})

View File

@ -50,8 +50,7 @@ func main() {
if c.VA.PortConfig.DVSNIPort != 0 {
pc.DVSNIPort = c.VA.PortConfig.DVSNIPort
}
vai := va.NewValidationAuthorityImpl(pc)
vai.Stats = stats
vai := va.NewValidationAuthorityImpl(pc, stats)
dnsTimeout, err := time.ParseDuration(c.Common.DNSTimeout)
cmd.FailOnError(err, "Couldn't parse DNS timeout")
vai.DNSResolver = core.NewDNSResolverImpl(dnsTimeout, []string{c.Common.DNSResolver})

View File

@ -73,12 +73,11 @@ func main() {
go cmd.DebugServer(c.WFE.DebugAddr)
wfe, err := wfe.NewWebFrontEndImpl()
wfe, err := wfe.NewWebFrontEndImpl(stats)
cmd.FailOnError(err, "Unable to create WFE")
rac, sac, closeChan := setupWFE(c, auditlogger)
wfe.RA = &rac
wfe.SA = &sac
wfe.Stats = stats
wfe.SubscriberAgreementURL = c.SubscriberAgreementURL
wfe.CertCacheDuration, err = time.ParseDuration(c.WFE.CertCacheDuration)

View File

@ -31,7 +31,7 @@ type RegistrationAuthorityImpl struct {
VA core.ValidationAuthority
SA core.StorageAuthority
PA core.PolicyAuthority
Stats statsd.Statter
stats statsd.Statter
DNSResolver core.DNSResolver
log *blog.AuditLogger
@ -40,11 +40,11 @@ type RegistrationAuthorityImpl struct {
}
// NewRegistrationAuthorityImpl constructs a new RA object.
func NewRegistrationAuthorityImpl() RegistrationAuthorityImpl {
func NewRegistrationAuthorityImpl(stats statsd.Statter) RegistrationAuthorityImpl {
logger := blog.GetAuditLogger()
logger.Notice("Registration Authority Starting")
ra := RegistrationAuthorityImpl{log: logger}
ra := RegistrationAuthorityImpl{log: logger, stats: stats}
ra.PA = policy.NewPolicyAuthorityImpl()
return ra
}
@ -99,7 +99,7 @@ func (ra *RegistrationAuthorityImpl) NewRegistration(init core.Registration) (re
}
reg.MergeUpdate(init)
err = validateContacts(reg.Contact, ra.DNSResolver, ra.Stats)
err = validateContacts(reg.Contact, ra.DNSResolver, ra.stats)
if err != nil {
return
}
@ -112,7 +112,7 @@ func (ra *RegistrationAuthorityImpl) NewRegistration(init core.Registration) (re
err = core.InternalServerError(err.Error())
}
ra.Stats.Inc("RA.NewRegistrations", 1, 1.0)
ra.stats.Inc("RA.NewRegistrations", 1, 1.0)
return
}
@ -207,7 +207,7 @@ func (ra *RegistrationAuthorityImpl) NewAuthorization(request core.Authorization
err = core.InternalServerError(err.Error())
}
ra.Stats.Inc("RA.NewPendingAuthorizations", 1, 1.0)
ra.stats.Inc("RA.NewPendingAuthorizations", 1, 1.0)
return authz, err
}
@ -336,7 +336,7 @@ func (ra *RegistrationAuthorityImpl) NewCertificate(req core.CertificateRequest,
logEvent.ResponseTime = time.Now()
logEventResult = "successful"
ra.Stats.Inc("RA.NewCertificates", 1, 1.0)
ra.stats.Inc("RA.NewCertificates", 1, 1.0)
return cert, nil
}
@ -344,7 +344,7 @@ func (ra *RegistrationAuthorityImpl) NewCertificate(req core.CertificateRequest,
func (ra *RegistrationAuthorityImpl) UpdateRegistration(base core.Registration, update core.Registration) (reg core.Registration, err error) {
base.MergeUpdate(update)
err = validateContacts(base.Contact, ra.DNSResolver, ra.Stats)
err = validateContacts(base.Contact, ra.DNSResolver, ra.stats)
if err != nil {
return
}
@ -357,7 +357,7 @@ func (ra *RegistrationAuthorityImpl) UpdateRegistration(base core.Registration,
err = core.InternalServerError(fmt.Sprintf("Could not update registration: %s", err))
}
ra.Stats.Inc("RA.UpdatedRegistrations", 1, 1.0)
ra.stats.Inc("RA.UpdatedRegistrations", 1, 1.0)
return
}
@ -389,7 +389,7 @@ func (ra *RegistrationAuthorityImpl) UpdateAuthorization(base core.Authorization
// Dispatch to the VA for service
ra.VA.UpdateValidations(authz, challengeIndex, reg.Key)
ra.Stats.Inc("RA.UpdatedPendingAuthorizations", 1, 1.0)
ra.stats.Inc("RA.UpdatedPendingAuthorizations", 1, 1.0)
return
}
@ -430,7 +430,7 @@ func (ra *RegistrationAuthorityImpl) RevokeCertificate(cert x509.Certificate, re
state = "Success"
ra.log.Audit(fmt.Sprintf("Revocation - %s", serialString))
ra.Stats.Inc("RA.RevokedCertificates", 1, 1.0)
ra.stats.Inc("RA.RevokedCertificates", 1, 1.0)
return nil
}
@ -473,6 +473,6 @@ func (ra *RegistrationAuthorityImpl) OnValidationUpdate(authz core.Authorization
return err
}
ra.Stats.Inc("RA.FinalizedAuthorizations", 1, 1.0)
ra.stats.Inc("RA.FinalizedAuthorizations", 1, 1.0)
return nil
}

View File

@ -198,14 +198,14 @@ func initAuthorities(t *testing.T) (*DummyValidationAuthority, *sa.SQLStorageAut
Registration, _ = ssa.NewRegistration(core.Registration{Key: AccountKeyA})
ra := NewRegistrationAuthorityImpl()
stats, _ := statsd.NewNoopClient()
ra := NewRegistrationAuthorityImpl(stats)
ra.SA = ssa
ra.VA = va
ra.CA = &ca
ra.PA = pa
ra.AuthzBase = "http://acme.invalid/authz/"
ra.MaxKeySize = 4096
ra.Stats, _ = statsd.NewNoopClient()
ra.DNSResolver = &mocks.MockDNS{}
AuthzInitial.RegistrationID = Registration.ID

View File

@ -49,7 +49,7 @@ type ValidationAuthorityImpl struct {
simpleHTTPSPort int
dvsniPort int
UserAgent string
Stats statsd.Statter
stats statsd.Statter
}
// PortConfig specifies what ports the VA should call to on the remote
@ -61,7 +61,7 @@ type PortConfig struct {
}
// NewValidationAuthorityImpl constructs a new VA
func NewValidationAuthorityImpl(pc *PortConfig) *ValidationAuthorityImpl {
func NewValidationAuthorityImpl(pc *PortConfig, stats statsd.Statter) *ValidationAuthorityImpl {
logger := blog.GetAuditLogger()
logger.Notice("Validation Authority Starting")
return &ValidationAuthorityImpl{
@ -69,6 +69,7 @@ func NewValidationAuthorityImpl(pc *PortConfig) *ValidationAuthorityImpl {
simpleHTTPPort: pc.SimpleHTTPPort,
simpleHTTPSPort: pc.SimpleHTTPSPort,
dvsniPort: pc.DVSNIPort,
stats: stats,
}
}
@ -147,8 +148,8 @@ func (va ValidationAuthorityImpl) getAddr(hostname string) (addr net.IP, addrs [
va.log.Debug(fmt.Sprintf("%s DNS failure: %s", hostname, err))
return
}
va.Stats.TimingDuration("VA.DNS.RTT.A", rtt, 1.0)
va.Stats.Inc("VA.DNS.Rate", 1, 1.0)
va.stats.TimingDuration("VA.DNS.RTT.A", rtt, 1.0)
va.stats.Inc("VA.DNS.Rate", 1, 1.0)
if len(addrs) == 0 {
problem = &core.ProblemDetails{
@ -533,8 +534,8 @@ func (va *ValidationAuthorityImpl) validateDNS(identifier core.AcmeIdentifier, i
// Look for the required record in the DNS
challengeSubdomain := fmt.Sprintf("%s.%s", core.DNSPrefix, identifier.Value)
txts, rtt, err := va.DNSResolver.LookupTXT(challengeSubdomain)
va.Stats.TimingDuration("VA.DNS.RTT.TXT", rtt, 1.0)
va.Stats.Inc("VA.DNS.Rate", 1, 1.0)
va.stats.TimingDuration("VA.DNS.RTT.TXT", rtt, 1.0)
va.stats.Inc("VA.DNS.Rate", 1, 1.0)
if err != nil {
challenge.Status = core.StatusInvalid
@ -585,7 +586,7 @@ func (va *ValidationAuthorityImpl) validate(authz core.Authorization, challengeI
case core.ChallengeTypeDNS:
authz.Challenges[challengeIndex], err = va.validateDNS(authz.Identifier, authz.Challenges[challengeIndex], accountKey)
}
va.Stats.TimingDuration(fmt.Sprintf("VA.Validations.%s.%s", authz.Challenges[challengeIndex].Type, authz.Challenges[challengeIndex].Status), time.Since(vStart), 1.0)
va.stats.TimingDuration(fmt.Sprintf("VA.Validations.%s.%s", authz.Challenges[challengeIndex].Type, authz.Challenges[challengeIndex].Status), time.Since(vStart), 1.0)
if err != nil {
logEvent.Error = err.Error()
@ -672,8 +673,8 @@ func (va *ValidationAuthorityImpl) getCAASet(hostname string) (*CAASet, error) {
if err != nil {
return nil, err
}
va.Stats.TimingDuration("VA.DNS.RTT.CAA", caaRtt, 1.0)
va.Stats.Inc("VA.DNS.Rate", 1, 1.0)
va.stats.TimingDuration("VA.DNS.RTT.CAA", caaRtt, 1.0)
va.stats.Inc("VA.DNS.Rate", 1, 1.0)
if len(CAAs) > 0 {
return newCAASet(CAAs), nil
}
@ -681,14 +682,14 @@ func (va *ValidationAuthorityImpl) getCAASet(hostname string) (*CAASet, error) {
if err != nil {
return nil, err
}
va.Stats.TimingDuration("VA.DNS.RTT.CNAME", cnameRtt, 1.0)
va.Stats.Inc("VA.DNS.Rate", 1, 1.0)
va.stats.TimingDuration("VA.DNS.RTT.CNAME", cnameRtt, 1.0)
va.stats.Inc("VA.DNS.Rate", 1, 1.0)
dname, dnameRtt, err := va.DNSResolver.LookupDNAME(label)
if err != nil {
return nil, err
}
va.Stats.TimingDuration("VA.DNS.RTT.DNAME", dnameRtt, 1.0)
va.Stats.Inc("VA.DNS.Rate", 1, 1.0)
va.stats.TimingDuration("VA.DNS.RTT.DNAME", dnameRtt, 1.0)
va.stats.Inc("VA.DNS.Rate", 1, 1.0)
if cname == "" && dname == "" {
// Try parent domain (note we confirmed
// earlier that label contains '.')

View File

@ -239,8 +239,8 @@ func TestSimpleHttpTLS(t *testing.T) {
port, err := getPort(hs)
test.AssertNotError(t, err, "failed to get test server port")
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPSPort: port})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPSPort: port}, stats)
va.DNSResolver = &mocks.MockDNS{}
log.Clear()
@ -275,8 +275,8 @@ func TestSimpleHttp(t *testing.T) {
if badPort == 65536 {
badPort = goodPort - 1
}
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: badPort})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: badPort}, stats)
va.DNSResolver = &mocks.MockDNS{}
invalidChall, err := va.validateSimpleHTTP(ident, chall, AccountKey)
@ -284,8 +284,7 @@ func TestSimpleHttp(t *testing.T) {
test.AssertError(t, err, "Server's down; expected refusal. Where did we connect?")
test.AssertEquals(t, invalidChall.Error.Type, core.ConnectionProblem)
va = NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: goodPort})
va.Stats, _ = statsd.NewNoopClient()
va = NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: goodPort}, stats)
va.DNSResolver = &mocks.MockDNS{}
log.Clear()
finChall, err := va.validateSimpleHTTP(ident, chall, AccountKey)
@ -357,8 +356,8 @@ func TestSimpleHttpRedirectLookup(t *testing.T) {
defer hs.Close()
port, err := getPort(hs)
test.AssertNotError(t, err, "failed to get test server port")
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: port})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: port}, stats)
va.DNSResolver = &mocks.MockDNS{}
log.Clear()
@ -414,8 +413,8 @@ func TestSimpleHttpRedirectLoop(t *testing.T) {
defer hs.Close()
port, err := getPort(hs)
test.AssertNotError(t, err, "failed to get test server port")
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: port})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: port}, stats)
va.DNSResolver = &mocks.MockDNS{}
log.Clear()
@ -448,8 +447,8 @@ func TestDvsni(t *testing.T) {
port, err := getPort(hs)
test.AssertNotError(t, err, "failed to get test server port")
va := NewValidationAuthorityImpl(&PortConfig{DVSNIPort: port})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{DVSNIPort: port}, stats)
va.DNSResolver = &mocks.MockDNS{}
@ -509,8 +508,8 @@ func TestTLSError(t *testing.T) {
port, err := getPort(hs)
test.AssertNotError(t, err, "failed to get test server port")
va := NewValidationAuthorityImpl(&PortConfig{DVSNIPort: port})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{DVSNIPort: port}, stats)
va.DNSResolver = &mocks.MockDNS{}
invalidChall, err := va.validateDvsni(ident, chall, AccountKey)
@ -528,8 +527,8 @@ func TestValidateHTTP(t *testing.T) {
hs := simpleSrv(t, challHTTP.Token, tls)
port, err := getPort(hs)
test.AssertNotError(t, err, "failed to get test server port")
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: port})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: port}, stats)
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -574,8 +573,8 @@ func TestValidateDvsni(t *testing.T) {
port, err := getPort(hs)
test.AssertNotError(t, err, "failed to get test server port")
va := NewValidationAuthorityImpl(&PortConfig{DVSNIPort: port})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{DVSNIPort: port}, stats)
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -592,8 +591,8 @@ func TestValidateDvsni(t *testing.T) {
}
func TestValidateDvsniNotSane(t *testing.T) {
va := NewValidationAuthorityImpl(&PortConfig{}) // no calls made
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats) // no calls made
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -614,8 +613,8 @@ func TestValidateDvsniNotSane(t *testing.T) {
}
func TestUpdateValidations(t *testing.T) {
va := NewValidationAuthorityImpl(&PortConfig{})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats)
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -670,8 +669,8 @@ func TestCAAChecking(t *testing.T) {
// CNAME to critical
}
va := NewValidationAuthorityImpl(&PortConfig{})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats)
va.DNSResolver = &mocks.MockDNS{}
va.IssuerDomain = "letsencrypt.org"
for _, caaTest := range tests {
@ -703,8 +702,8 @@ func TestCAAChecking(t *testing.T) {
}
func TestDNSValidationFailure(t *testing.T) {
va := NewValidationAuthorityImpl(&PortConfig{})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats)
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -740,8 +739,8 @@ func TestDNSValidationInvalid(t *testing.T) {
Challenges: []core.Challenge{chalDNS},
}
va := NewValidationAuthorityImpl(&PortConfig{})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats)
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -754,8 +753,8 @@ func TestDNSValidationInvalid(t *testing.T) {
}
func TestDNSValidationNotSane(t *testing.T) {
va := NewValidationAuthorityImpl(&PortConfig{})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats)
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -785,8 +784,8 @@ func TestDNSValidationNotSane(t *testing.T) {
}
func TestDNSValidationServFail(t *testing.T) {
va := NewValidationAuthorityImpl(&PortConfig{})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats)
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -811,8 +810,8 @@ func TestDNSValidationServFail(t *testing.T) {
}
func TestDNSValidationNoServer(t *testing.T) {
va := NewValidationAuthorityImpl(&PortConfig{})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats)
va.DNSResolver = core.NewDNSResolverImpl(time.Second*5, []string{})
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA
@ -836,8 +835,8 @@ func TestDNSValidationNoServer(t *testing.T) {
// the existance of some Internet resources. Because of that,
// it asserts nothing; it is intended for coverage.
func TestDNSValidationLive(t *testing.T) {
va := NewValidationAuthorityImpl(&PortConfig{})
va.Stats, _ = statsd.NewNoopClient()
stats, _ := statsd.NewNoopClient()
va := NewValidationAuthorityImpl(&PortConfig{}, stats)
va.DNSResolver = &mocks.MockDNS{}
mockRA := &MockRegistrationAuthority{}
va.RA = mockRA

View File

@ -43,7 +43,7 @@ const (
type WebFrontEndImpl struct {
RA core.RegistrationAuthority
SA core.StorageGetter
Stats statsd.Statter
stats statsd.Statter
log *blog.AuditLogger
// URL configuration parameters
@ -112,7 +112,7 @@ type requestEvent struct {
}
// NewWebFrontEndImpl constructs a web service for Boulder
func NewWebFrontEndImpl() (WebFrontEndImpl, error) {
func NewWebFrontEndImpl(stats statsd.Statter) (WebFrontEndImpl, error) {
logger := blog.GetAuditLogger()
logger.Notice("Web Front End Starting")
@ -124,6 +124,7 @@ func NewWebFrontEndImpl() (WebFrontEndImpl, error) {
return WebFrontEndImpl{
log: logger,
nonceService: nonceService,
stats: stats,
}, nil
}
@ -419,10 +420,10 @@ func (wfe *WebFrontEndImpl) sendError(response http.ResponseWriter, msg string,
response.WriteHeader(code)
response.Write(problemDoc)
wfe.Stats.Inc(fmt.Sprintf("WFE.HTTP.ErrorCodes.%d", code), 1, 1.0)
wfe.stats.Inc(fmt.Sprintf("WFE.HTTP.ErrorCodes.%d", code), 1, 1.0)
problemSegments := strings.Split(string(problem.Type), ":")
if len(problemSegments) > 0 {
wfe.Stats.Inc(fmt.Sprintf("WFE.HTTP.ProblemTypes.%s", problemSegments[len(problemSegments)-1]), 1, 1.0)
wfe.stats.Inc(fmt.Sprintf("WFE.HTTP.ProblemTypes.%s", problemSegments[len(problemSegments)-1]), 1, 1.0)
}
}

View File

@ -334,7 +334,8 @@ func signRequest(t *testing.T, req string, nonceService *core.NonceService) stri
}
func setupWFE(t *testing.T) WebFrontEndImpl {
wfe, err := NewWebFrontEndImpl()
stats, _ := statsd.NewNoopClient()
wfe, err := NewWebFrontEndImpl(stats)
test.AssertNotError(t, err, "Unable to create WFE")
wfe.NewReg = wfe.BaseURL + NewRegPath
@ -346,8 +347,6 @@ func setupWFE(t *testing.T) WebFrontEndImpl {
wfe.SubscriberAgreementURL = agreementURL
wfe.log.SyslogWriter = mocks.NewSyslogWriter()
wfe.Stats, _ = statsd.NewNoopClient()
return wfe
}
@ -514,10 +513,10 @@ func TestIssueCertificate(t *testing.T) {
mockLog := wfe.log.SyslogWriter.(*mocks.MockSyslogWriter)
// TODO: Use a mock RA so we can test various conditions of authorized, not authorized, etc.
ra := ra.NewRegistrationAuthorityImpl()
stats, _ := statsd.NewNoopClient(nil)
ra := ra.NewRegistrationAuthorityImpl(stats)
ra.SA = &MockSA{}
ra.CA = &MockCA{}
ra.Stats, _ = statsd.NewNoopClient()
wfe.SA = &MockSA{}
wfe.RA = &ra
responseWriter := httptest.NewRecorder()
@ -1175,7 +1174,6 @@ func TestTermsRedirect(t *testing.T) {
wfe.RA = &MockRegistrationAuthority{}
wfe.SA = &MockSA{}
wfe.Stats, _ = statsd.NewNoopClient()
wfe.SubscriberAgreementURL = agreementURL
responseWriter := httptest.NewRecorder()