func TestAddRegistration(t *testing.T) { sa, clk, cleanUp := initSA(t) defer cleanUp() jwk := satest.GoodJWK() contact, err := core.ParseAcmeURL("mailto:[email protected]") if err != nil { t.Fatalf("unable to parse contact link: %s", err) } contacts := []*core.AcmeURL{contact} reg, err := sa.NewRegistration(core.Registration{ Key: jwk, Contact: contacts, InitialIP: net.ParseIP("43.34.43.34"), }) if err != nil { t.Fatalf("Couldn't create new registration: %s", err) } test.Assert(t, reg.ID != 0, "ID shouldn't be 0") test.AssertDeepEquals(t, reg.Contact, contacts) _, err = sa.GetRegistration(0) test.AssertError(t, err, "Registration object for ID 0 was returned") dbReg, err := sa.GetRegistration(reg.ID) test.AssertNotError(t, err, fmt.Sprintf("Couldn't get registration with ID %v", reg.ID)) expectedReg := core.Registration{ ID: reg.ID, Key: jwk, InitialIP: net.ParseIP("43.34.43.34"), CreatedAt: clk.Now(), } test.AssertEquals(t, dbReg.ID, expectedReg.ID) test.Assert(t, core.KeyDigestEquals(dbReg.Key, expectedReg.Key), "Stored key != expected") u, _ := core.ParseAcmeURL("test.com") newReg := core.Registration{ ID: reg.ID, Key: jwk, Contact: []*core.AcmeURL{u}, InitialIP: net.ParseIP("72.72.72.72"), Agreement: "yes", } err = sa.UpdateRegistration(newReg) test.AssertNotError(t, err, fmt.Sprintf("Couldn't get registration with ID %v", reg.ID)) dbReg, err = sa.GetRegistrationByKey(jwk) test.AssertNotError(t, err, "Couldn't get registration by key") test.AssertEquals(t, dbReg.ID, newReg.ID) test.AssertEquals(t, dbReg.Agreement, newReg.Agreement) var anotherJWK jose.JsonWebKey err = json.Unmarshal([]byte(anotherKey), &anotherJWK) test.AssertNotError(t, err, "couldn't unmarshal anotherJWK") _, err = sa.GetRegistrationByKey(anotherJWK) test.AssertError(t, err, "Registration object for invalid key was returned") }
func TestChecking(t *testing.T) { type CAATest struct { Domain string Present bool Valid bool } tests := []CAATest{ // Reserved {"reserved.com", true, false}, // Critical {"critical.com", true, false}, {"nx.critical.com", true, false}, // Good (absent) {"absent.com", false, true}, {"example.co.uk", false, true}, // Good (present) {"present.com", true, true}, {"present.servfail.com", true, true}, // Good (multiple critical, one matching) {"multi-crit-present.com", true, true}, // Bad (unknown critical) {"unknown-critical.com", true, false}, {"unknown-critical2.com", true, false}, // Good (unknown noncritical, no issue/issuewild records) {"unknown-noncritical.com", true, true}, // Good (issue record with unknown parameters) {"present-with-parameter.com", true, true}, // Bad (unsatisfiable issue record) {"unsatisfiable.com", true, false}, } stats, _ := statsd.NewNoopClient() ccs := &caaCheckerServer{&bdns.MockDNSResolver{}, stats} issuerDomain := "letsencrypt.org" ctx := context.Background() for _, caaTest := range tests { result, err := ccs.ValidForIssuance(ctx, &pb.Check{Name: &caaTest.Domain, IssuerDomain: &issuerDomain}) if err != nil { t.Errorf("CheckCAARecords error for %s: %s", caaTest.Domain, err) } if *result.Present != caaTest.Present { t.Errorf("CheckCAARecords presence mismatch for %s: got %t expected %t", caaTest.Domain, *result.Present, caaTest.Present) } if *result.Valid != caaTest.Valid { t.Errorf("CheckCAARecords presence mismatch for %s: got %t expected %t", caaTest.Domain, *result.Valid, caaTest.Valid) } } servfail := "servfail.com" servfailPresent := "servfail.present.com" result, err := ccs.ValidForIssuance(ctx, &pb.Check{Name: &servfail, IssuerDomain: &issuerDomain}) test.AssertError(t, err, "servfail.com") test.Assert(t, result == nil, "result should be nil") result, err = ccs.ValidForIssuance(ctx, &pb.Check{Name: &servfailPresent, IssuerDomain: &issuerDomain}) test.AssertError(t, err, "servfail.present.com") test.Assert(t, result == nil, "result should be nil") }
func TestCAAChecking(t *testing.T) { type CAATest struct { Domain string Present bool Valid bool } tests := []CAATest{ // Reserved CAATest{"reserved.com", true, false}, // Critical CAATest{"critical.com", true, false}, CAATest{"nx.critical.com", true, false}, CAATest{"cname-critical.com", true, false}, CAATest{"nx.cname-critical.com", true, false}, // Good (absent) CAATest{"absent.com", false, true}, CAATest{"cname-absent.com", false, true}, CAATest{"nx.cname-absent.com", false, true}, CAATest{"cname-nx.com", false, true}, CAATest{"example.co.uk", false, true}, // Good (present) CAATest{"present.com", true, true}, CAATest{"cname-present.com", true, true}, CAATest{"cname2-present.com", true, true}, CAATest{"nx.cname2-present.com", true, true}, CAATest{"dname-present.com", true, true}, CAATest{"dname2cname.com", true, true}, // CNAME to critical } va := NewValidationAuthorityImpl(true) va.DNSResolver = &mocks.MockDNS{} va.IssuerDomain = "letsencrypt.org" for _, caaTest := range tests { present, valid, err := va.CheckCAARecords(core.AcmeIdentifier{Type: "dns", Value: caaTest.Domain}) test.AssertNotError(t, err, caaTest.Domain) fmt.Println(caaTest.Domain, caaTest.Present == present, caaTest.Valid == valid) test.AssertEquals(t, caaTest.Present, present) test.AssertEquals(t, caaTest.Valid, valid) } present, valid, err := va.CheckCAARecords(core.AcmeIdentifier{Type: "dns", Value: "servfail.com"}) test.AssertError(t, err, "servfail.com") test.Assert(t, !present, "Present should be false") test.Assert(t, !valid, "Valid should be false") for _, name := range []string{ "www.caa-loop.com", "a.cname-loop.com", "a.dname-loop.com", "cname-servfail.com", "cname2servfail.com", "dname-servfail.com", "cname-and-dname.com", "servfail.com", } { _, _, err = va.CheckCAARecords(core.AcmeIdentifier{Type: "dns", Value: name}) test.AssertError(t, err, name) } }
func TestWhitelist(t *testing.T) { p, cleanup := padbImpl(t) defer cleanup() err := p.LoadRules(RuleSet{ Blacklist: []BlacklistRule{ BlacklistRule{ Host: "bad.com", }, }, Whitelist: []WhitelistRule{ WhitelistRule{ Host: "good.bad.com", }, WhitelistRule{ Host: "good.com", }, }, }) test.AssertNotError(t, err, "Couldn't load rules") err = p.CheckHostLists("bad.com", true) test.AssertError(t, err, "Hostname should be blacklisted") // Whitelisted subdomain of blacklisted root should still be blacklsited err = p.CheckHostLists("good.bad.com", true) test.AssertError(t, err, "Blacklist should beat whitelist") // Non-existent domain should fail err = p.CheckHostLists("not-good.com", true) test.AssertError(t, err, "Hostname isn't on whitelist") // Whitelisted err = p.CheckHostLists("good.com", true) test.AssertNotError(t, err, "Hostname is on whitelist") }
func TestProblemDetails(t *testing.T) { pb, err := problemDetailsToPB(nil) test.AssertNotEquals(t, err, "problemDetailToPB failed") test.Assert(t, pb == nil, "Returned corepb.ProblemDetails is not nil") prob := &probs.ProblemDetails{Type: probs.TLSProblem, Detail: "asd", HTTPStatus: 200} pb, err = problemDetailsToPB(prob) test.AssertNotError(t, err, "problemDetailToPB failed") test.Assert(t, pb != nil, "return corepb.ProblemDetails is nill") test.AssertDeepEquals(t, *pb.ProblemType, string(prob.Type)) test.AssertEquals(t, *pb.Detail, prob.Detail) test.AssertEquals(t, int(*pb.HttpStatus), prob.HTTPStatus) recon, err := pbToProblemDetails(pb) test.AssertNotError(t, err, "pbToProblemDetails failed") test.AssertDeepEquals(t, recon, prob) recon, err = pbToProblemDetails(nil) test.AssertNotError(t, err, "pbToProblemDetails failed") test.Assert(t, recon == nil, "Returned core.PRoblemDetails is not nil") _, err = pbToProblemDetails(&corepb.ProblemDetails{}) test.AssertError(t, err, "pbToProblemDetails did not fail") test.AssertEquals(t, err, ErrMissingParameters) empty := "" _, err = pbToProblemDetails(&corepb.ProblemDetails{ProblemType: &empty}) test.AssertError(t, err, "pbToProblemDetails did not fail") test.AssertEquals(t, err, ErrMissingParameters) _, err = pbToProblemDetails(&corepb.ProblemDetails{Detail: &empty}) test.AssertError(t, err, "pbToProblemDetails did not fail") test.AssertEquals(t, err, ErrMissingParameters) }
func TestAuthzMeta(t *testing.T) { authz := core.Authorization{ID: "asd", RegistrationID: 10} pb, err := authzMetaToPB(authz) test.AssertNotError(t, err, "authzMetaToPB failed") test.Assert(t, pb != nil, "return vapb.AuthzMeta is nill") test.Assert(t, pb.Id != nil, "Id field is nil") test.AssertEquals(t, *pb.Id, authz.ID) test.Assert(t, pb.RegID != nil, "RegistrationID field is nil") test.AssertEquals(t, *pb.RegID, authz.RegistrationID) recon, err := pbToAuthzMeta(pb) test.AssertNotError(t, err, "pbToAuthzMeta failed") test.AssertEquals(t, recon.ID, authz.ID) test.AssertEquals(t, recon.RegistrationID, authz.RegistrationID) _, err = pbToAuthzMeta(nil) test.AssertError(t, err, "pbToAuthzMeta did not fail") test.AssertEquals(t, err, ErrMissingParameters) _, err = pbToAuthzMeta(&vapb.AuthzMeta{}) test.AssertError(t, err, "pbToAuthzMeta did not fail") test.AssertEquals(t, err, ErrMissingParameters) empty := "" one := int64(1) _, err = pbToAuthzMeta(&vapb.AuthzMeta{Id: &empty}) test.AssertError(t, err, "pbToAuthzMeta did not fail") test.AssertEquals(t, err, ErrMissingParameters) _, err = pbToAuthzMeta(&vapb.AuthzMeta{RegID: &one}) test.AssertError(t, err, "pbToAuthzMeta did not fail") test.AssertEquals(t, err, ErrMissingParameters) }
func TestValidateContacts(t *testing.T) { tel, _ := core.ParseAcmeURL("tel:") ansible, _ := core.ParseAcmeURL("ansible:earth.sol.milkyway.laniakea/letsencrypt") validEmail, _ := core.ParseAcmeURL("mailto:[email protected]") invalidEmail, _ := core.ParseAcmeURL("mailto:[email protected]") malformedEmail, _ := core.ParseAcmeURL("mailto:admin.com") err := validateContacts([]*core.AcmeURL{}, &mocks.MockDNS{}) test.AssertNotError(t, err, "No Contacts") err = validateContacts([]*core.AcmeURL{tel}, &mocks.MockDNS{}) test.AssertNotError(t, err, "Simple Telephone") err = validateContacts([]*core.AcmeURL{validEmail}, &mocks.MockDNS{}) test.AssertNotError(t, err, "Valid Email") err = validateContacts([]*core.AcmeURL{invalidEmail}, &mocks.MockDNS{}) test.AssertError(t, err, "Invalid Email") err = validateContacts([]*core.AcmeURL{malformedEmail}, &mocks.MockDNS{}) test.AssertError(t, err, "Malformed Email") err = validateContacts([]*core.AcmeURL{ansible}, &mocks.MockDNS{}) test.AssertError(t, err, "Unknown scehme") }
func TestValidateContacts(t *testing.T) { _, _, ra, _, cleanUp := initAuthorities(t) defer cleanUp() ansible, _ := core.ParseAcmeURL("ansible:earth.sol.milkyway.laniakea/letsencrypt") validEmail, _ := core.ParseAcmeURL("mailto:[email protected]") otherValidEmail, _ := core.ParseAcmeURL("mailto:[email protected]") malformedEmail, _ := core.ParseAcmeURL("mailto:admin.com") err := ra.validateContacts(context.Background(), &[]*core.AcmeURL{}) test.AssertNotError(t, err, "No Contacts") err = ra.validateContacts(context.Background(), &[]*core.AcmeURL{validEmail, otherValidEmail}) test.AssertError(t, err, "Too Many Contacts") err = ra.validateContacts(context.Background(), &[]*core.AcmeURL{validEmail}) test.AssertNotError(t, err, "Valid Email") err = ra.validateContacts(context.Background(), &[]*core.AcmeURL{malformedEmail}) test.AssertError(t, err, "Malformed Email") err = ra.validateContacts(context.Background(), &[]*core.AcmeURL{ansible}) test.AssertError(t, err, "Unknown scheme") err = ra.validateContacts(context.Background(), &[]*core.AcmeURL{nil}) test.AssertError(t, err, "Nil AcmeURL") }
func TestVAChallenge(t *testing.T) { var jwk jose.JsonWebKey err := json.Unmarshal([]byte(JWK1JSON), &jwk) test.AssertNotError(t, err, "Failed to unmarshal test key") chall := core.Challenge{ AccountKey: &jwk, ID: 10, Type: core.ChallengeTypeDNS01, Status: core.StatusPending, Token: "asd", ProvidedKeyAuthorization: "keyauth", } pb, err := vaChallengeToPB(chall) test.AssertNotError(t, err, "vaChallengeToPB failed") test.Assert(t, pb != nil, "Returned corepb.Challenge is nil") recon, err := pbToVAChallenge(pb) test.AssertNotError(t, err, "pbToVAChallenge failed") test.AssertDeepEquals(t, recon, chall) _, err = pbToVAChallenge(nil) test.AssertError(t, err, "pbToVAChallenge did not fail") test.AssertEquals(t, err, ErrMissingParameters) _, err = pbToVAChallenge(&corepb.Challenge{}) test.AssertError(t, err, "pbToVAChallenge did not fail") test.AssertEquals(t, err, ErrMissingParameters) }
func TestSimpleHttpRedirectLookup(t *testing.T) { tls := false chall := core.Challenge{ Token: expectedToken, TLS: &tls, ValidationRecord: []core.ValidationRecord{}, AccountKey: accountKey, } hs := simpleSrv(t, expectedToken, tls) defer hs.Close() port, err := getPort(hs) test.AssertNotError(t, err, "failed to get test server port") va := NewValidationAuthorityImpl(&PortConfig{SimpleHTTPPort: port}) va.DNSResolver = &mocks.MockDNS{} log.Clear() chall.Token = pathMoved finChall, err := va.validateSimpleHTTP(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/301" to ".*/valid"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 2) log.Clear() chall.Token = pathFound finChall, err = va.validateSimpleHTTP(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/302" to ".*/301"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/301" to ".*/valid"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 3) log.Clear() chall.Token = pathRedirectLookupInvalid finChall, err = va.validateSimpleHTTP(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusInvalid) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`No IPv4 addresses found for invalid.invalid`)), 1) log.Clear() chall.Token = pathRedirectLookup finChall, err = va.validateSimpleHTTP(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/re-lookup" to ".*other.valid/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) log.Clear() chall.Token = pathRedirectPort finChall, err = va.validateSimpleHTTP(ident, chall) fmt.Println(finChall.ValidationRecord) test.AssertEquals(t, finChall.Status, core.StatusInvalid) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/port-redirect" to ".*other.valid:8080/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) }
func TestDvsni(t *testing.T) { chall := createChallenge(core.ChallengeTypeDVSNI) hs := dvsniSrv(t, chall) port, err := getPort(hs) test.AssertNotError(t, err, "failed to get test server port") va := NewValidationAuthorityImpl(&PortConfig{DVSNIPort: port}) va.DNSResolver = &mocks.MockDNS{} log.Clear() finChall, err := va.validateDvsni(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, "") test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) log.Clear() invalidChall, err := va.validateDvsni(core.AcmeIdentifier{ Type: core.IdentifierType("ip"), Value: net.JoinHostPort("127.0.0.1", fmt.Sprintf("%d", port)), }, chall) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "IdentifierType IP shouldn't have worked.") test.AssertEquals(t, invalidChall.Error.Type, core.MalformedProblem) log.Clear() invalidChall, err = va.validateDvsni(core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "always.invalid"}, chall) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Domain name was supposed to be invalid.") test.AssertEquals(t, invalidChall.Error.Type, core.UnknownHostProblem) // Need to re-sign to get an unknown SNI (from the signature value) chall.Token = core.NewToken() validationPayload, _ := json.Marshal(map[string]interface{}{ "type": chall.Type, "token": chall.Token, }) signer, _ := jose.NewSigner(jose.RS256, &TheKey) chall.Validation, _ = signer.Sign(validationPayload, "") log.Clear() started := time.Now() invalidChall, err = va.validateDvsni(ident, chall) took := time.Since(started) // Check that the HTTP connection times out after 5 seconds and doesn't block for 10 seconds test.Assert(t, (took > (time.Second * 5)), "HTTP timed out before 5 seconds") test.Assert(t, (took < (time.Second * 10)), "HTTP connection didn't timeout after 5 seconds") test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Connection should've timed out") test.AssertEquals(t, invalidChall.Error.Type, core.ConnectionProblem) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) // Take down DVSNI validation server and check that validation fails. hs.Close() invalidChall, err = va.validateDvsni(ident, chall) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Server's down; expected refusal. Where did we connect?") test.AssertEquals(t, invalidChall.Error.Type, core.ConnectionProblem) }
func TestValidateContacts(t *testing.T) { tel, _ := url.Parse("tel:") ansible, _ := url.Parse("ansible:earth.sol.milkyway.laniakea/letsencrypt") validEmail, _ := url.Parse("mailto:[email protected]") invalidEmail, _ := url.Parse("mailto:[email protected]") malformedEmail, _ := url.Parse("mailto:admin.com") err := validateContacts([]core.AcmeURL{}) test.AssertNotError(t, err, "No Contacts") err = validateContacts([]core.AcmeURL{core.AcmeURL(*tel)}) test.AssertNotError(t, err, "Simple Telephone") err = validateContacts([]core.AcmeURL{core.AcmeURL(*validEmail)}) test.AssertNotError(t, err, "Valid Email") err = validateContacts([]core.AcmeURL{core.AcmeURL(*invalidEmail)}) test.AssertError(t, err, "Invalid Email") err = validateContacts([]core.AcmeURL{core.AcmeURL(*malformedEmail)}) test.AssertError(t, err, "Malformed Email") err = validateContacts([]core.AcmeURL{core.AcmeURL(*ansible)}) test.AssertError(t, err, "Unknown scehme") }
func TestServerInterceptor(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() statter := metrics.NewMockStatter(ctrl) stats := metrics.NewStatsdScope(statter, "fake") si := serverInterceptor{stats, fc} statter.EXPECT().Inc("fake.gRPC.NoInfo", int64(1), float32(1.0)).Return(nil) _, err := si.intercept(context.Background(), nil, nil, testHandler) test.AssertError(t, err, "si.intercept didn't fail with a nil grpc.UnaryServerInfo") statter.EXPECT().Inc("fake.gRPC.test", int64(1), float32(1.0)).Return(nil) statter.EXPECT().GaugeDelta("fake.gRPC.test.InProgress", int64(1), float32(1.0)).Return(nil) statter.EXPECT().TimingDuration("fake.gRPC.test", time.Second, float32(1.0)).Return(nil) statter.EXPECT().GaugeDelta("fake.gRPC.test.InProgress", int64(-1), float32(1.0)).Return(nil) _, err = si.intercept(context.Background(), nil, &grpc.UnaryServerInfo{FullMethod: "test"}, testHandler) test.AssertNotError(t, err, "si.intercept failed with a non-nil grpc.UnaryServerInfo") statter.EXPECT().Inc("fake.gRPC.broke-test", int64(1), float32(1.0)).Return(nil) statter.EXPECT().GaugeDelta("fake.gRPC.broke-test.InProgress", int64(1), float32(1.0)).Return(nil) statter.EXPECT().TimingDuration("fake.gRPC.broke-test", time.Duration(0), float32(1.0)).Return(nil) statter.EXPECT().GaugeDelta("fake.gRPC.broke-test.InProgress", int64(-1), float32(1.0)).Return(nil) statter.EXPECT().Inc("fake.gRPC.broke-test.Failed", int64(1), float32(1.0)).Return(nil) _, err = si.intercept(context.Background(), 0, &grpc.UnaryServerInfo{FullMethod: "broke-test"}, testHandler) test.AssertError(t, err, "si.intercept didn't fail when handler returned a error") }
// Ensure we get only valid authorization with correct RegID func TestGetLatestValidAuthorizationBasic(t *testing.T) { sa, _, cleanUp := initSA(t) defer cleanUp() // attempt to get unauthorized domain authz, err := sa.GetLatestValidAuthorization(0, core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "example.org"}) test.AssertError(t, err, "Should not have found a valid auth for example.org") reg := satest.CreateWorkingRegistration(t, sa) // authorize "example.org" authz = CreateDomainAuthWithRegID(t, "example.org", sa, reg.ID) // finalize auth authz.Status = core.StatusValid err = sa.FinalizeAuthorization(authz) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+authz.ID) // attempt to get authorized domain with wrong RegID authz, err = sa.GetLatestValidAuthorization(0, core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "example.org"}) test.AssertError(t, err, "Should not have found a valid auth for example.org and regID 0") // get authorized domain authz, err = sa.GetLatestValidAuthorization(reg.ID, core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "example.org"}) test.AssertNotError(t, err, "Should have found a valid auth for example.org and regID 42") test.AssertEquals(t, authz.Status, core.StatusValid) test.AssertEquals(t, authz.Identifier.Type, core.IdentifierDNS) test.AssertEquals(t, authz.Identifier.Value, "example.org") test.AssertEquals(t, authz.RegistrationID, reg.ID) }
func TestDNSServFail(t *testing.T) { obj := NewTestDNSResolverImpl(time.Second*10, []string{dnsLoopbackAddr}, testStats, clock.NewFake(), 1) bad := "servfail.com" _, _, err := obj.LookupTXT(context.Background(), bad) test.AssertError(t, err, "LookupTXT didn't return an error") _, err = obj.LookupHost(context.Background(), bad) test.AssertError(t, err, "LookupHost didn't return an error") // CAA lookup ignores validation failures from the resolver for now // and returns an empty list of CAA records. emptyCaa, err := obj.LookupCAA(context.Background(), bad) test.Assert(t, len(emptyCaa) == 0, "Query returned non-empty list of CAA records") test.AssertNotError(t, err, "LookupCAA returned an error") // When we turn on enforceCAASERVFAIL, such lookups should fail. obj.caaSERVFAILExceptions = map[string]bool{"servfailexception.example.com": true} emptyCaa, err = obj.LookupCAA(context.Background(), bad) test.Assert(t, len(emptyCaa) == 0, "Query returned non-empty list of CAA records") test.AssertError(t, err, "LookupCAA should have returned an error") // Unless they are on the exception list emptyCaa, err = obj.LookupCAA(context.Background(), "servfailexception.example.com") test.Assert(t, len(emptyCaa) == 0, "Query returned non-empty list of CAA records") test.AssertNotError(t, err, "LookupCAA for servfail exception returned an error") }
func TestValidateContacts(t *testing.T) { _, _, ra, _, cleanUp := initAuthorities(t) defer cleanUp() tel, _ := core.ParseAcmeURL("tel:") ansible, _ := core.ParseAcmeURL("ansible:earth.sol.milkyway.laniakea/letsencrypt") validEmail, _ := core.ParseAcmeURL("mailto:[email protected]") malformedEmail, _ := core.ParseAcmeURL("mailto:admin.com") err := ra.validateContacts([]*core.AcmeURL{}) test.AssertNotError(t, err, "No Contacts") err = ra.validateContacts([]*core.AcmeURL{tel, validEmail}) test.AssertError(t, err, "Too Many Contacts") err = ra.validateContacts([]*core.AcmeURL{tel}) test.AssertNotError(t, err, "Simple Telephone") err = ra.validateContacts([]*core.AcmeURL{validEmail}) test.AssertNotError(t, err, "Valid Email") err = ra.validateContacts([]*core.AcmeURL{malformedEmail}) test.AssertError(t, err, "Malformed Email") err = ra.validateContacts([]*core.AcmeURL{ansible}) test.AssertError(t, err, "Unknown scheme") }
func TestECDSABadCurve(t *testing.T) { for _, curve := range invalidCurves { private, err := ecdsa.GenerateKey(curve, rand.Reader) test.AssertNotError(t, err, "Error generating key") test.AssertError(t, testingPolicy.GoodKey(&private.PublicKey), "Should have rejected key with unsupported curve.") test.AssertError(t, testingPolicy.GoodKey(private.PublicKey), "Should have rejected key with unsupported curve.") } }
// TestGetCertificateByShortSerial tests some failure conditions for GetCertificate. // Success conditions are tested above in TestAddCertificate. func TestGetCertificateByShortSerial(t *testing.T) { sa := initSA(t) _, err := sa.GetCertificateByShortSerial("") test.AssertError(t, err, "Should've failed on empty serial") _, err = sa.GetCertificateByShortSerial("01020304050607080102030405060708") test.AssertError(t, err, "Should've failed on too-long serial") }
func TestSimpleHttpRedirectLookup(t *testing.T) { va := NewValidationAuthorityImpl(true) va.DNSResolver = &mocks.MockDNS{} tls := false chall := core.Challenge{Token: expectedToken, TLS: &tls, ValidationRecord: []core.ValidationRecord{}} stopChan := make(chan bool, 1) waitChan := make(chan bool, 1) go simpleSrv(t, expectedToken, stopChan, waitChan, tls) defer func() { stopChan <- true }() <-waitChan log.Clear() chall.Token = pathMoved finChall, err := va.validateSimpleHTTP(ident, chall, AccountKey) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/301" to ".*/valid"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 2) log.Clear() chall.Token = pathFound finChall, err = va.validateSimpleHTTP(ident, chall, AccountKey) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/302" to ".*/301"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/301" to ".*/valid"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 3) log.Clear() chall.Token = pathRedirectLookupInvalid finChall, err = va.validateSimpleHTTP(ident, chall, AccountKey) test.AssertEquals(t, finChall.Status, core.StatusInvalid) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`No IPv4 addresses found for invalid.invalid`)), 1) log.Clear() chall.Token = pathRedirectLookup finChall, err = va.validateSimpleHTTP(ident, chall, AccountKey) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/re-lookup" to ".*other.valid/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) log.Clear() chall.Token = pathRedirectPort finChall, err = va.validateSimpleHTTP(ident, chall, AccountKey) fmt.Println(finChall.ValidationRecord) test.AssertEquals(t, finChall.Status, core.StatusInvalid) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/port-redirect" to ".*other.valid:8080/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) }
func TestTLSSNI(t *testing.T) { chall := createChallenge(core.ChallengeTypeTLSSNI01) hs := tlssniSrv(t, chall) port, err := getPort(hs) test.AssertNotError(t, err, "failed to get test server port") stats, _ := statsd.NewNoopClient() va := NewValidationAuthorityImpl(&PortConfig{TLSPort: port}, nil, stats, clock.Default()) va.DNSResolver = &mocks.DNSResolver{} log.Clear() finChall, err := va.validateTLSSNI01(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, "") test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) log.Clear() invalidChall, err := va.validateTLSSNI01(core.AcmeIdentifier{ Type: core.IdentifierType("ip"), Value: net.JoinHostPort("127.0.0.1", fmt.Sprintf("%d", port)), }, chall) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "IdentifierType IP shouldn't have worked.") test.AssertEquals(t, invalidChall.Error.Type, core.MalformedProblem) log.Clear() invalidChall, err = va.validateTLSSNI01(core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "always.invalid"}, chall) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Domain name was supposed to be invalid.") test.AssertEquals(t, invalidChall.Error.Type, core.UnknownHostProblem) // Need to create a new authorized keys object to get an unknown SNI (from the signature value) chall.Token = core.NewToken() keyAuthorization, _ := core.NewKeyAuthorization(chall.Token, accountKey) chall.KeyAuthorization = &keyAuthorization log.Clear() started := time.Now() invalidChall, err = va.validateTLSSNI01(ident, chall) took := time.Since(started) // Check that the HTTP connection times out after 5 seconds and doesn't block for 10 seconds test.Assert(t, (took > (time.Second * 5)), "HTTP timed out before 5 seconds") test.Assert(t, (took < (time.Second * 10)), "HTTP connection didn't timeout after 5 seconds") test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Connection should've timed out") test.AssertEquals(t, invalidChall.Error.Type, core.ConnectionProblem) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) // Take down validation server and check that validation fails. hs.Close() invalidChall, err = va.validateTLSSNI01(ident, chall) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Server's down; expected refusal. Where did we connect?") test.AssertEquals(t, invalidChall.Error.Type, core.ConnectionProblem) }
func TestHTTPRedirectLookup(t *testing.T) { chall := core.HTTPChallenge01(accountKey) err := setChallengeToken(&chall, expectedToken) test.AssertNotError(t, err, "Failed to complete HTTP challenge") hs := httpSrv(t, expectedToken) defer hs.Close() port, err := getPort(hs) test.AssertNotError(t, err, "failed to get test server port") stats, _ := statsd.NewNoopClient() va := NewValidationAuthorityImpl(&PortConfig{HTTPPort: port}, nil, stats, clock.Default()) va.DNSResolver = &bdns.MockDNSResolver{} log.Clear() setChallengeToken(&chall, pathMoved) _, prob := va.validateHTTP01(context.Background(), ident, chall) if prob != nil { t.Fatalf("Unexpected failure in redirect (%s): %s", pathMoved, prob) } test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathMoved+`" to ".*/`+pathValid+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 2) log.Clear() setChallengeToken(&chall, pathFound) _, prob = va.validateHTTP01(context.Background(), ident, chall) if prob != nil { t.Fatalf("Unexpected failure in redirect (%s): %s", pathFound, prob) } test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathFound+`" to ".*/`+pathMoved+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathMoved+`" to ".*/`+pathValid+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 3) log.Clear() setChallengeToken(&chall, pathReLookupInvalid) _, err = va.validateHTTP01(context.Background(), ident, chall) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`No IPv4 addresses found for invalid.invalid`)), 1) log.Clear() setChallengeToken(&chall, pathReLookup) _, prob = va.validateHTTP01(context.Background(), ident, chall) if prob != nil { t.Fatalf("Unexpected error in redirect (%s): %s", pathReLookup, prob) } test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathReLookup+`" to ".*other.valid:\d+/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) log.Clear() setChallengeToken(&chall, pathRedirectPort) _, err = va.validateHTTP01(context.Background(), ident, chall) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/port-redirect" to ".*other.valid:8080/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) }
func TestHTTPRedirectLookup(t *testing.T) { chall := core.HTTPChallenge01(accountKey) err := setChallengeToken(&chall, expectedToken) test.AssertNotError(t, err, "Failed to complete HTTP challenge") hs := httpSrv(t, expectedToken) defer hs.Close() port, err := getPort(hs) test.AssertNotError(t, err, "failed to get test server port") stats, _ := statsd.NewNoopClient() va := NewValidationAuthorityImpl(&PortConfig{HTTPPort: port}, nil, stats, clock.Default()) va.DNSResolver = &mocks.DNSResolver{} log.Clear() setChallengeToken(&chall, pathMoved) finChall, err := va.validateHTTP01(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathMoved+`" to ".*/`+pathValid+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 2) log.Clear() setChallengeToken(&chall, pathFound) finChall, err = va.validateHTTP01(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathFound+`" to ".*/`+pathMoved+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathMoved+`" to ".*/`+pathValid+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 3) log.Clear() setChallengeToken(&chall, pathReLookupInvalid) finChall, err = va.validateHTTP01(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusInvalid) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`No IPv4 addresses found for invalid.invalid`)), 1) log.Clear() setChallengeToken(&chall, pathReLookup) finChall, err = va.validateHTTP01(ident, chall) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathReLookup+`" to ".*other.valid:\d+/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) log.Clear() setChallengeToken(&chall, pathRedirectPort) finChall, err = va.validateHTTP01(ident, chall) fmt.Println(finChall.ValidationRecord) test.AssertEquals(t, finChall.Status, core.StatusInvalid) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/port-redirect" to ".*other.valid:8080/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) }
func TestNewDbMap(t *testing.T) { _, err := NewDbMap("", "") test.AssertError(t, err, "Nil not permitted.") _, err = NewDbMap("sqlite3", "/not/a/file") test.AssertError(t, err, "Shouldn't have found a DB.") _, err = NewDbMap("sqlite3", ":memory:") test.AssertNotError(t, err, "Should have constructed a DB.") }
func TestECDSANotOnCurveX(t *testing.T) { for _, curve := range validCurves { // Change a public key so that it is no longer on the curve. private, err := ecdsa.GenerateKey(curve, rand.Reader) test.AssertNotError(t, err, "Error generating key") private.X.Add(private.X, big.NewInt(1)) test.AssertError(t, testingPolicy.GoodKey(&private.PublicKey), "Should not have accepted key not on the curve.") test.AssertError(t, testingPolicy.GoodKey(private.PublicKey), "Should not have accepted key not on the curve.") } }
func TestECDSANegativeUnmodulatedY(t *testing.T) { for _, curve := range validCurves { // Check that unmodulated Y is not accepted. private, err := ecdsa.GenerateKey(curve, rand.Reader) test.AssertNotError(t, err, "Error generating key") private.X.Mul(private.Y, private.Curve.Params().P) test.AssertError(t, testingPolicy.GoodKey(&private.PublicKey), "Should not have accepted key with unmodulated Y.") test.AssertError(t, testingPolicy.GoodKey(private.PublicKey), "Should not have accepted key with unmodulated Y.") } }
func TestHTTPRedirectLookup(t *testing.T) { chall := core.HTTPChallenge01(accountKey) setChallengeToken(&chall, expectedToken) hs := httpSrv(t, expectedToken) defer hs.Close() port, err := getPort(hs) test.AssertNotError(t, err, "failed to get test server port") va, _, log := setup() va.httpPort = port setChallengeToken(&chall, pathMoved) _, prob := va.validateHTTP01(ctx, ident, chall) if prob != nil { t.Fatalf("Unexpected failure in redirect (%s): %s", pathMoved, prob) } test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathMoved+`" to ".*/`+pathValid+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 2) log.Clear() setChallengeToken(&chall, pathFound) _, prob = va.validateHTTP01(ctx, ident, chall) if prob != nil { t.Fatalf("Unexpected failure in redirect (%s): %s", pathFound, prob) } test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathFound+`" to ".*/`+pathMoved+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathMoved+`" to ".*/`+pathValid+`"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 3) log.Clear() setChallengeToken(&chall, pathReLookupInvalid) _, err = va.validateHTTP01(ctx, ident, chall) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`No IPv4 addresses found for invalid.invalid`)), 1) log.Clear() setChallengeToken(&chall, pathReLookup) _, prob = va.validateHTTP01(ctx, ident, chall) if prob != nil { t.Fatalf("Unexpected error in redirect (%s): %s", pathReLookup, prob) } test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/`+pathReLookup+`" to ".*other.valid:\d+/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) log.Clear() setChallengeToken(&chall, pathRedirectPort) _, err = va.validateHTTP01(ctx, ident, chall) test.AssertError(t, err, chall.Token) test.AssertEquals(t, len(log.GetAllMatching(`redirect from ".*/port-redirect" to ".*other.valid:8080/path"`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for localhost \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) test.AssertEquals(t, len(log.GetAllMatching(`Resolved addresses for other.valid \[using 127.0.0.1\]: \[127.0.0.1\]`)), 1) }
func TestDNSLookupsNoServer(t *testing.T) { obj := NewTestDNSResolverImpl(time.Second*10, []string{}) _, _, err := obj.LookupTXT("letsencrypt.org") test.AssertError(t, err, "No servers") _, _, err = obj.LookupHost("letsencrypt.org") test.AssertError(t, err, "No servers") _, _, err = obj.LookupCAA("letsencrypt.org") test.AssertError(t, err, "No servers") }
func TestDvsni(t *testing.T) { va := NewValidationAuthorityImpl(true) va.DNSResolver = &mocks.MockDNS{} chall := createChallenge(core.ChallengeTypeDVSNI) invalidChall, err := va.validateDvsni(ident, chall, AccountKey) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Server's not up yet; expected refusal. Where did we connect?") test.AssertEquals(t, invalidChall.Error.Type, core.ConnectionProblem) waitChan := make(chan bool, 1) stopChan := make(chan bool, 1) go dvsniSrv(t, chall, stopChan, waitChan) defer func() { stopChan <- true }() <-waitChan finChall, err := va.validateDvsni(ident, chall, AccountKey) test.AssertEquals(t, finChall.Status, core.StatusValid) test.AssertNotError(t, err, "") invalidChall, err = va.validateDvsni(core.AcmeIdentifier{Type: core.IdentifierType("ip"), Value: "127.0.0.1"}, chall, AccountKey) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "IdentifierType IP shouldn't have worked.") test.AssertEquals(t, invalidChall.Error.Type, core.MalformedProblem) va.TestMode = false invalidChall, err = va.validateDvsni(core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "always.invalid"}, chall, AccountKey) test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Domain name is invalid.") test.AssertEquals(t, invalidChall.Error.Type, core.UnknownHostProblem) va.TestMode = true // Need to re-sign to get an unknown SNI (from the signature value) chall.Token = core.NewToken() validationPayload, _ := json.Marshal(map[string]interface{}{ "type": chall.Type, "token": chall.Token, }) signer, _ := jose.NewSigner(jose.RS256, &TheKey) chall.Validation, _ = signer.Sign(validationPayload, "") started := time.Now() invalidChall, err = va.validateDvsni(ident, chall, AccountKey) took := time.Since(started) // Check that the HTTP connection times out after 5 seconds and doesn't block for 10 seconds test.Assert(t, (took > (time.Second * 5)), "HTTP timed out before 5 seconds") test.Assert(t, (took < (time.Second * 10)), "HTTP connection didn't timeout after 5 seconds") test.AssertEquals(t, invalidChall.Status, core.StatusInvalid) test.AssertError(t, err, "Connection should've timed out") test.AssertEquals(t, invalidChall.Error.Type, core.ConnectionProblem) }
func TestDNSLookupsNoServer(t *testing.T) { obj := NewTestDNSResolverImpl(time.Second*10, []string{}, testStats, clock.NewFake(), 1) _, _, err := obj.LookupTXT(context.Background(), "letsencrypt.org") test.AssertError(t, err, "No servers") _, err = obj.LookupHost(context.Background(), "letsencrypt.org") test.AssertError(t, err, "No servers") _, err = obj.LookupCAA(context.Background(), "letsencrypt.org") test.AssertError(t, err, "No servers") }
func TestConstruction(t *testing.T) { // Successful case _, err := NewCertificateAuthorityDatabaseImpl(sqliteDriver, sqliteName) test.AssertNotError(t, err, "Could not construct CA DB") // Covers "sql.Open" error _, err = NewCertificateAuthorityDatabaseImpl(badDriver, sqliteName) test.AssertError(t, err, "Should have failed construction") // Covers "db.Ping" error _, err = NewCertificateAuthorityDatabaseImpl(sqliteDriver, badFilename) test.AssertError(t, err, "Should have failed construction") }