func TestParseLine(t *testing.T) { dbMap, err := sa.NewDbMap(vars.DBConnSA) if err != nil { t.Fatalf("Failed to create dbMap: %s", err) } fc := clock.NewFake() fc.Set(time.Date(2015, 3, 4, 5, 0, 0, 0, time.UTC)) sa, err := sa.NewSQLStorageAuthority(dbMap, fc) if err != nil { t.Fatalf("Failed to create SA: %s", err) } defer test.ResetSATestDatabase(t)() logger := blog.GetAuditLogger() found, added := parseLogLine(sa, logger, "") test.AssertEquals(t, found, false) test.AssertEquals(t, added, false) found, added = parseLogLine(sa, logger, "0000-00-00T00:00:00+00:00 hostname boulder-ca[pid]: [AUDIT] Failed RPC to store at SA, orphaning certificate: b64der=[] err=[AMQP-RPC timeout], regID=[1337]") test.AssertEquals(t, found, true) test.AssertEquals(t, added, false) found, added = parseLogLine(sa, logger, "0000-00-00T00:00:00+00:00 hostname boulder-ca[pid]: [AUDIT] Failed RPC to store at SA, orphaning certificate: b64der=[deadbeef] err=[AMQP-RPC timeout], regID=[]") test.AssertEquals(t, found, true) test.AssertEquals(t, added, false) reg := satest.CreateWorkingRegistration(t, sa) found, added = parseLogLine(sa, logger, fmt.Sprintf("0000-00-00T00:00:00+00:00 hostname boulder-ca[pid]: [AUDIT] Failed RPC to store at SA, orphaning certificate: b64der=[MIIEWzCCA0OgAwIBAgITAP+gFgYw1hiy61wFEIJLFCdIVjANBgkqhkiG9w0BAQsFADAfMR0wGwYDVQQDDBRoYXBweSBoYWNrZXIgZmFrZSBDQTAeFw0xNTEwMDMwNTIxMDBaFw0xNjAxMDEwNTIxMDBaMBgxFjAUBgNVBAMTDWV4YW1wbGUuY28uYm4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCeo/HSH63lWW42pqdwlalHWOS3JGa3REraT3xM9v3psdRwuTtlwf3YlpF/JIzK5JtXyA3CHGSwEGmUMhMNBZ0tg5I0booXnHyUeDVUnGSnpWgMUY+vCly+pI5oT8pjBHdcj6kjnDTx1cstBjsJi9HBcYPHUh78iEZBsvC0FAKsh8cHaEjUNHzvWd1anBdK0lRn25M8le9IxXi6di9SeyFmahmPteH+LYKZtNzrF5HpatB14+ywV8d212T62PCCnUPDLd+YWjo2+t5pZs7IlGhyGh7EerOOrI2kUUBg3tUdKDp4e3xplxvaAfSfdrqkGx+bQ0iqQnng+lVkXWYWRB8NAgMBAAGjggGVMIIBkTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFDadDBAEUrnrP/566FLp6DmjrlrbMB8GA1UdIwQYMBaAFPt4TxL5YBWDLJ8XfzQZsy426kGJMGoGCCsGAQUFBwEBBF4wXDAmBggrBgEFBQcwAYYaaHR0cDovL2xvY2FsaG9zdDo0MDAyL29jc3AwMgYIKwYBBQUHMAKGJmh0dHA6Ly9sb2NhbGhvc3Q6NDAwMC9hY21lL2lzc3Vlci1jZXJ0MBgGA1UdEQQRMA+CDWV4YW1wbGUuY28uYm4wJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL2V4YW1wbGUuY29tL2NybDBjBgNVHSAEXDBaMAoGBmeBDAECATAAMEwGAyoDBDBFMCIGCCsGAQUFBwIBFhZodHRwOi8vZXhhbXBsZS5jb20vY3BzMB8GCCsGAQUFBwICMBMMEURvIFdoYXQgVGhvdSBXaWx0MA0GCSqGSIb3DQEBCwUAA4IBAQC7tLmUlxyvouVuIljbRtiL+zYdi/zXVSHAMXTkceqp8/8ucZBZu1fMBkB5SW2FUFd8EnuqhKGOeS3dNr9Pe4dLbUDR0UKIwV045Na+Jet4BbHDdWs3NXAutFhdGIa8ivLBQIbTzlBuVRhJE8g6qqjf5hYL0DXkLNptl2l+0+4xJMm/liCp/mYCGRwbdGUzwdSjACO76QLLSqZhkBF37ZJOuDbJTMBi3QzkOcTs6e4d/gSZpCy7yy6nJDxZ9N9P3XBYIpus+aZAYy29d2shYzE3st8cQfB2Wmb0SHd67sftTAzeudiiNW/4E4IKKH4R1S794apUO07y7pkqep1cz32k] err=[AMQP-RPC timeout], regID=[%d]", reg.ID)) test.AssertEquals(t, found, true) test.AssertEquals(t, added, true) }
func TestUpdateOCSP(t *testing.T) { sa, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) // Add a cert to the DB to test with. certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") _, err = sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") serial := "00000000000000000000000000021bd4" const ocspResponse = "this is a fake OCSP response" err = sa.UpdateOCSP(serial, []byte(ocspResponse)) test.AssertNotError(t, err, "UpdateOCSP failed") certificateStatusObj, err := sa.dbMap.Get(core.CertificateStatus{}, serial) certificateStatus := certificateStatusObj.(*core.CertificateStatus) test.AssertNotError(t, err, "Failed to fetch certificate status") test.Assert(t, certificateStatus.OCSPLastUpdated.After(time.Now().Add(-time.Second)), "OCSP last updated too old.") var fetchedOcspResponse core.OCSPResponse err = sa.dbMap.SelectOne(&fetchedOcspResponse, `SELECT * from ocspResponses where serial = ? order by createdAt DESC limit 1;`, serial) test.AssertNotError(t, err, "Failed to fetch OCSP response") test.AssertEquals(t, ocspResponse, string(fetchedOcspResponse.Response)) }
func TestFindStaleOCSPResponses(t *testing.T) { updater, sa, _, fc, cleanUp := setup(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) parsedCert, err := core.LoadCert("test-cert.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(parsedCert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") earliest := fc.Now().Add(-time.Hour) certs, err := updater.findStaleOCSPResponses(earliest, 10) test.AssertNotError(t, err, "Couldn't find certificate") test.AssertEquals(t, len(certs), 1) status, err := sa.GetCertificateStatus(core.SerialToString(parsedCert.SerialNumber)) test.AssertNotError(t, err, "Couldn't get the core.Certificate from the database") meta, err := updater.generateResponse(status) test.AssertNotError(t, err, "Couldn't generate OCSP response") err = updater.storeResponse(meta) test.AssertNotError(t, err, "Couldn't store OCSP response") certs, err = updater.findStaleOCSPResponses(earliest, 10) test.AssertNotError(t, err, "Failed to find stale responses") test.AssertEquals(t, len(certs), 0) }
func TestRevokeAuthorizationsByDomain(t *testing.T) { sa, _, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) PA1 := CreateDomainAuthWithRegID(t, "a.com", sa, reg.ID) PA2 := CreateDomainAuthWithRegID(t, "a.com", sa, reg.ID) PA2.Status = core.StatusValid err := sa.FinalizeAuthorization(PA2) test.AssertNotError(t, err, "Failed to finalize authorization") ident := core.AcmeIdentifier{Value: "a.com", Type: core.IdentifierDNS} ar, par, err := sa.RevokeAuthorizationsByDomain(ident) test.AssertNotError(t, err, "Failed to revoke authorizations for a.com") test.AssertEquals(t, ar, int64(1)) test.AssertEquals(t, par, int64(1)) PA, err := sa.GetAuthorization(PA1.ID) test.AssertNotError(t, err, "Failed to retrieve pending authorization") FA, err := sa.GetAuthorization(PA2.ID) test.AssertNotError(t, err, "Failed to retrieve finalized authorization") test.AssertEquals(t, PA.Status, core.StatusRevoked) test.AssertEquals(t, FA.Status, core.StatusRevoked) }
// 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 TestAddAuthorization(t *testing.T) { sa, _, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) PA := core.Authorization{RegistrationID: reg.ID} PA, err := sa.NewPendingAuthorization(PA) test.AssertNotError(t, err, "Couldn't create new pending authorization") test.Assert(t, PA.ID != "", "ID shouldn't be blank") dbPa, err := sa.GetAuthorization(PA.ID) test.AssertNotError(t, err, "Couldn't get pending authorization with ID "+PA.ID) test.AssertMarshaledEquals(t, PA, dbPa) expectedPa := core.Authorization{ID: PA.ID} test.AssertMarshaledEquals(t, dbPa.ID, expectedPa.ID) combos := make([][]int, 1) combos[0] = []int{0, 1} exp := time.Now().AddDate(0, 0, 1) identifier := core.AcmeIdentifier{Type: core.IdentifierDNS, Value: "wut.com"} newPa := core.Authorization{ID: PA.ID, Identifier: identifier, RegistrationID: reg.ID, Status: core.StatusPending, Expires: &exp, Combinations: combos} err = sa.UpdatePendingAuthorization(newPa) test.AssertNotError(t, err, "Couldn't update pending authorization with ID "+PA.ID) newPa.Status = core.StatusValid err = sa.FinalizeAuthorization(newPa) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+PA.ID) dbPa, err = sa.GetAuthorization(PA.ID) test.AssertNotError(t, err, "Couldn't get authorization with ID "+PA.ID) }
func TestUpdateOCSP(t *testing.T) { sa, fc, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) // Add a cert to the DB to test with. certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") _, err = sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") serial := "000000000000000000000000000000021bd4" const ocspResponse = "this is a fake OCSP response" certificateStatusObj, err := sa.dbMap.Get(core.CertificateStatus{}, serial) if certificateStatusObj == nil { t.Fatalf("Failed to get certificate status for %s", serial) } beforeUpdate := certificateStatusObj.(*core.CertificateStatus) fc.Add(1 * time.Hour) err = sa.UpdateOCSP(serial, []byte(ocspResponse)) test.AssertNotError(t, err, "UpdateOCSP failed") certificateStatusObj, err = sa.dbMap.Get(core.CertificateStatus{}, serial) certificateStatus := certificateStatusObj.(*core.CertificateStatus) test.AssertNotError(t, err, "Failed to fetch certificate status") test.Assert(t, certificateStatus.OCSPLastUpdated.After(beforeUpdate.OCSPLastUpdated), fmt.Sprintf("UpdateOCSP did not take. before: %s; after: %s", beforeUpdate.OCSPLastUpdated, certificateStatus.OCSPLastUpdated)) test.AssertEquals(t, ocspResponse, string(certificateStatus.OCSPResponse)) }
func TestGenerateOCSPResponses(t *testing.T) { updater, sa, _, fc, cleanUp := setup(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) parsedCert, err := core.LoadCert("test-cert.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(parsedCert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add test-cert.pem") parsedCert, err = core.LoadCert("test-cert-b.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(parsedCert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add test-cert-b.pem") earliest := fc.Now().Add(-time.Hour) certs, err := updater.findStaleOCSPResponses(earliest, 10) test.AssertNotError(t, err, "Couldn't find stale responses") test.AssertEquals(t, len(certs), 2) updater.generateOCSPResponses(certs) certs, err = updater.findStaleOCSPResponses(earliest, 10) test.AssertNotError(t, err, "Failed to find stale responses") test.AssertEquals(t, len(certs), 0) }
// Ensure we get only valid authorization with correct RegID func TestGetValidAuthorizationsBasic(t *testing.T) { sa, clk, cleanUp := initSA(t) defer cleanUp() // Attempt to get unauthorized domain. authzMap, err := sa.GetValidAuthorizations(ctx, 0, []string{"example.org"}, clk.Now()) // Should get no results, but not error. test.AssertNotError(t, err, "Error getting valid authorizations") test.AssertEquals(t, len(authzMap), 0) 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(ctx, authz) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+authz.ID) // attempt to get authorized domain with wrong RegID authzMap, err = sa.GetValidAuthorizations(ctx, 0, []string{"example.org"}, clk.Now()) test.AssertNotError(t, err, "Error getting valid authorizations") test.AssertEquals(t, len(authzMap), 0) // get authorized domain authzMap, err = sa.GetValidAuthorizations(ctx, reg.ID, []string{"example.org"}, clk.Now()) test.AssertNotError(t, err, "Should have found a valid auth for example.org and regID 42") test.AssertEquals(t, len(authzMap), 1) result := authzMap["example.org"] test.AssertEquals(t, result.Status, core.StatusValid) test.AssertEquals(t, result.Identifier.Type, core.IdentifierDNS) test.AssertEquals(t, result.Identifier.Value, "example.org") test.AssertEquals(t, result.RegistrationID, reg.ID) }
func TestMarkCertificateRevoked(t *testing.T) { sa, fc, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) // Add a cert to the DB to test with. certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") _, err = sa.AddCertificate(ctx, certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") serial := "000000000000000000000000000000021bd4" const ocspResponse = "this is a fake OCSP response" certificateStatusObj, err := sa.GetCertificateStatus(ctx, serial) test.AssertEquals(t, certificateStatusObj.Status, core.OCSPStatusGood) fc.Add(1 * time.Hour) err = sa.MarkCertificateRevoked(ctx, serial, revocation.KeyCompromise) test.AssertNotError(t, err, "MarkCertificateRevoked failed") certificateStatusObj, err = sa.GetCertificateStatus(ctx, serial) test.AssertNotError(t, err, "Failed to fetch certificate status") if revocation.KeyCompromise != certificateStatusObj.RevokedReason { t.Errorf("RevokedReasons, expected %v, got %v", revocation.KeyCompromise, certificateStatusObj.RevokedReason) } if !fc.Now().Equal(certificateStatusObj.RevokedDate) { t.Errorf("RevokedData, expected %s, got %s", fc.Now(), certificateStatusObj.RevokedDate) } }
func TestMarkCertificateRevoked(t *testing.T) { sa, fc, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) // Add a cert to the DB to test with. certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") _, err = sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") serial := "000000000000000000000000000000021bd4" const ocspResponse = "this is a fake OCSP response" certificateStatusObj, err := sa.dbMap.Get(core.CertificateStatus{}, serial) beforeStatus := certificateStatusObj.(*core.CertificateStatus) test.AssertEquals(t, beforeStatus.Status, core.OCSPStatusGood) fc.Add(1 * time.Hour) code := core.RevocationCode(1) err = sa.MarkCertificateRevoked(serial, code) test.AssertNotError(t, err, "MarkCertificateRevoked failed") certificateStatusObj, err = sa.dbMap.Get(core.CertificateStatus{}, serial) afterStatus := certificateStatusObj.(*core.CertificateStatus) test.AssertNotError(t, err, "Failed to fetch certificate status") if code != afterStatus.RevokedReason { t.Errorf("RevokedReasons, expected %v, got %v", code, afterStatus.RevokedReason) } if !fc.Now().Equal(afterStatus.RevokedDate) { t.Errorf("RevokedData, expected %s, got %s", fc.Now(), afterStatus.RevokedDate) } }
func TestCountPendingAuthorizations(t *testing.T) { sa, fc, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) expires := fc.Now().Add(time.Hour) pendingAuthz := core.Authorization{ RegistrationID: reg.ID, Expires: &expires, } pendingAuthz, err := sa.NewPendingAuthorization(ctx, pendingAuthz) test.AssertNotError(t, err, "Couldn't create new pending authorization") count, err := sa.CountPendingAuthorizations(ctx, reg.ID) test.AssertNotError(t, err, "Couldn't count pending authorizations") test.AssertEquals(t, count, 0) pendingAuthz.Status = core.StatusPending pendingAuthz, err = sa.NewPendingAuthorization(ctx, pendingAuthz) test.AssertNotError(t, err, "Couldn't create new pending authorization") count, err = sa.CountPendingAuthorizations(ctx, reg.ID) test.AssertNotError(t, err, "Couldn't count pending authorizations") test.AssertEquals(t, count, 1) fc.Add(2 * time.Hour) count, err = sa.CountPendingAuthorizations(ctx, reg.ID) test.AssertNotError(t, err, "Couldn't count pending authorizations") test.AssertEquals(t, count, 0) }
func TestCountCertificates(t *testing.T) { sa, fc, cleanUp := initSA(t) defer cleanUp() fc.Add(time.Hour * 24) now := fc.Now() count, err := sa.CountCertificatesRange(now.Add(-24*time.Hour), now) test.AssertNotError(t, err, "Couldn't get certificate count for the last 24hrs") test.AssertEquals(t, count, int64(0)) reg := satest.CreateWorkingRegistration(t, sa) // Add a cert to the DB to test with. certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") _, err = sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") fc.Add(2 * time.Hour) now = fc.Now() count, err = sa.CountCertificatesRange(now.Add(-24*time.Hour), now) test.AssertNotError(t, err, "Couldn't get certificate count for the last 24hrs") test.AssertEquals(t, count, int64(1)) fc.Add(24 * time.Hour) now = fc.Now() count, err = sa.CountCertificatesRange(now.Add(-24*time.Hour), now) test.AssertNotError(t, err, "Couldn't get certificate count for the last 24hrs") test.AssertEquals(t, count, int64(0)) }
func TestGenerateAndStoreOCSPResponse(t *testing.T) { updater, sa, _, _, cleanUp := setup(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) parsedCert, err := core.LoadCert("test-cert.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(parsedCert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") status, err := sa.GetCertificateStatus(core.SerialToString(parsedCert.SerialNumber)) test.AssertNotError(t, err, "Couldn't get the core.CertificateStatus from the database") meta, err := updater.generateResponse(status) test.AssertNotError(t, err, "Couldn't generate OCSP response") err = updater.storeResponse(meta) test.AssertNotError(t, err, "Couldn't store certificate status") secondMeta, err := updater.generateRevokedResponse(status) test.AssertNotError(t, err, "Couldn't generate revoked OCSP response") err = updater.storeResponse(secondMeta) test.AssertNotError(t, err, "Couldn't store certificate status") newStatus, err := sa.GetCertificateStatus(status.Serial) test.AssertNotError(t, err, "Couldn't retrieve certificate status") test.AssertByteEquals(t, meta.OCSPResponse, newStatus.OCSPResponse) }
func TestStoreResponseGuard(t *testing.T) { updater, sa, _, _, cleanUp := setup(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) parsedCert, err := core.LoadCert("test-cert.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(parsedCert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") status, err := sa.GetCertificateStatus(core.SerialToString(parsedCert.SerialNumber)) test.AssertNotError(t, err, "Failed to get certificate status") status.OCSPResponse = []byte{0} err = updater.storeResponse(&status, core.OCSPStatusRevoked) test.AssertNotError(t, err, "Failed to update certificate status") unchangedStatus, err := sa.GetCertificateStatus(core.SerialToString(parsedCert.SerialNumber)) test.AssertNotError(t, err, "Failed to get certificate status") test.AssertEquals(t, len(unchangedStatus.OCSPResponse), 0) err = updater.storeResponse(&status, core.OCSPStatusGood) test.AssertNotError(t, err, "Failed to updated certificate status") changedStatus, err := sa.GetCertificateStatus(core.SerialToString(parsedCert.SerialNumber)) test.AssertNotError(t, err, "Failed to get certificate status") test.AssertEquals(t, len(changedStatus.OCSPResponse), 1) }
func TestCountCertificatesByNames(t *testing.T) { sa, clk, cleanUp := initSA(t) defer cleanUp() // Test cert generated locally by Boulder / CFSSL, names [example.com, // www.example.com, admin.example.com] certDER, err := ioutil.ReadFile("test-cert.der") test.AssertNotError(t, err, "Couldn't read example cert DER") cert, err := x509.ParseCertificate(certDER) test.AssertNotError(t, err, "Couldn't parse example cert DER") // Set the test clock's time to the time from the test certificate clk.Add(-clk.Now().Sub(cert.NotBefore)) now := clk.Now() yesterday := clk.Now().Add(-24 * time.Hour) twoDaysAgo := clk.Now().Add(-48 * time.Hour) tomorrow := clk.Now().Add(24 * time.Hour) // Count for a name that doesn't have any certs counts, err := sa.CountCertificatesByNames([]string{"example.com"}, yesterday, now) test.AssertNotError(t, err, "Error counting certs.") test.AssertEquals(t, len(counts), 1) test.AssertEquals(t, counts["example.com"], 0) // Add the test cert and query for its names. reg := satest.CreateWorkingRegistration(t, sa) _, err = sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add test-cert.der") // Time range including now should find the cert counts, err = sa.CountCertificatesByNames([]string{"example.com"}, yesterday, now) test.AssertEquals(t, len(counts), 1) test.AssertEquals(t, counts["example.com"], 1) // Time range between two days ago and yesterday should not. counts, err = sa.CountCertificatesByNames([]string{"example.com"}, twoDaysAgo, yesterday) test.AssertNotError(t, err, "Error counting certs.") test.AssertEquals(t, len(counts), 1) test.AssertEquals(t, counts["example.com"], 0) // Time range between now and tomorrow also should not (time ranges are // inclusive at the tail end, but not the beginning end). counts, err = sa.CountCertificatesByNames([]string{"example.com"}, now, tomorrow) test.AssertNotError(t, err, "Error counting certs.") test.AssertEquals(t, len(counts), 1) test.AssertEquals(t, counts["example.com"], 0) // Add a second test cert (for example.co.bn) and query for multiple names. certDER2, err := ioutil.ReadFile("test-cert2.der") test.AssertNotError(t, err, "Couldn't read test-cert2.der") _, err = sa.AddCertificate(certDER2, reg.ID) test.AssertNotError(t, err, "Couldn't add test-cert2.der") counts, err = sa.CountCertificatesByNames([]string{"example.com", "foo.com", "example.co.bn"}, yesterday, now.Add(10000*time.Hour)) test.AssertNotError(t, err, "Error counting certs.") test.AssertEquals(t, len(counts), 3) test.AssertEquals(t, counts["foo.com"], 0) test.AssertEquals(t, counts["example.com"], 1) test.AssertEquals(t, counts["example.co.bn"], 1) }
// Ensure we get the latest valid authorization for an ident func TestGetLatestValidAuthorizationMultiple(t *testing.T) { sa, _, cleanUp := initSA(t) defer cleanUp() domain := "example.org" ident := core.AcmeIdentifier{Type: core.IdentifierDNS, Value: domain} var err error reg := satest.CreateWorkingRegistration(t, sa) // create invalid authz authz := CreateDomainAuthWithRegID(t, domain, sa, reg.ID) exp := time.Now().AddDate(0, 0, 10) // expire in 10 day authz.Expires = &exp authz.Status = core.StatusInvalid err = sa.FinalizeAuthorization(authz) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+authz.ID) // should not get the auth authz, err = sa.GetLatestValidAuthorization(reg.ID, ident) test.AssertError(t, err, "Should not have found a valid auth for "+domain) // create valid auth authz = CreateDomainAuthWithRegID(t, domain, sa, reg.ID) exp = time.Now().AddDate(0, 0, 1) // expire in 1 day authz.Expires = &exp authz.Status = core.StatusValid err = sa.FinalizeAuthorization(authz) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+authz.ID) // should get the valid auth even if it's expire date is lower than the invalid one authz, err = sa.GetLatestValidAuthorization(reg.ID, ident) test.AssertNotError(t, err, "Should have found a valid auth for "+domain) test.AssertEquals(t, authz.Status, core.StatusValid) test.AssertEquals(t, authz.Identifier.Type, ident.Type) test.AssertEquals(t, authz.Identifier.Value, ident.Value) test.AssertEquals(t, authz.RegistrationID, reg.ID) // create a newer auth newAuthz := CreateDomainAuthWithRegID(t, domain, sa, reg.ID) exp = time.Now().AddDate(0, 0, 2) // expire in 2 day newAuthz.Expires = &exp newAuthz.Status = core.StatusValid err = sa.FinalizeAuthorization(newAuthz) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+newAuthz.ID) authz, err = sa.GetLatestValidAuthorization(reg.ID, ident) test.AssertNotError(t, err, "Should have found a valid auth for "+domain) test.AssertEquals(t, authz.Status, core.StatusValid) test.AssertEquals(t, authz.Identifier.Type, ident.Type) test.AssertEquals(t, authz.Identifier.Value, ident.Value) test.AssertEquals(t, authz.RegistrationID, reg.ID) // make sure we got the latest auth test.AssertEquals(t, authz.ID, newAuthz.ID) }
func TestAddCertificate(t *testing.T) { // Enable the feature for the `CertStatusOptimizationsMigrated` flag so that // adding a new certificate will populate the `certificateStatus.NotAfter` // field correctly. This will let the unit test assertion for `NotAfter` // pass provided everything is working as intended. Note: this must be done // **before** the DbMap is created in `initSA()` or the feature flag won't be // set correctly at the time the table maps are set up. _ = features.Set(map[string]bool{"CertStatusOptimizationsMigrated": true}) defer features.Reset() sa, _, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) // An example cert taken from EFF's website certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") digest, err := sa.AddCertificate(ctx, certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") test.AssertEquals(t, digest, "qWoItDZmR4P9eFbeYgXXP3SR4ApnkQj8x4LsB_ORKBo") retrievedCert, err := sa.GetCertificate(ctx, "000000000000000000000000000000021bd4") test.AssertNotError(t, err, "Couldn't get www.eff.org.der by full serial") test.AssertByteEquals(t, certDER, retrievedCert.DER) certificateStatus, err := sa.GetCertificateStatus(ctx, "000000000000000000000000000000021bd4") test.AssertNotError(t, err, "Couldn't get status for www.eff.org.der") test.Assert(t, !certificateStatus.SubscriberApproved, "SubscriberApproved should be false") test.Assert(t, certificateStatus.Status == core.OCSPStatusGood, "OCSP Status should be good") test.Assert(t, certificateStatus.OCSPLastUpdated.IsZero(), "OCSPLastUpdated should be nil") test.AssertEquals(t, certificateStatus.NotAfter, retrievedCert.Expires) // Test cert generated locally by Boulder / CFSSL, names [example.com, // www.example.com, admin.example.com] certDER2, err := ioutil.ReadFile("test-cert.der") test.AssertNotError(t, err, "Couldn't read example cert DER") serial := "ffdd9b8a82126d96f61d378d5ba99a0474f0" digest2, err := sa.AddCertificate(ctx, certDER2, reg.ID) test.AssertNotError(t, err, "Couldn't add test-cert.der") test.AssertEquals(t, digest2, "vrlPN5wIPME1D2PPsCy-fGnTWh8dMyyYQcXPRkjHAQI") retrievedCert2, err := sa.GetCertificate(ctx, serial) test.AssertNotError(t, err, "Couldn't get test-cert.der") test.AssertByteEquals(t, certDER2, retrievedCert2.DER) certificateStatus2, err := sa.GetCertificateStatus(ctx, serial) test.AssertNotError(t, err, "Couldn't get status for test-cert.der") test.Assert(t, !certificateStatus2.SubscriberApproved, "SubscriberApproved should be false") test.Assert(t, certificateStatus2.Status == core.OCSPStatusGood, "OCSP Status should be good") test.Assert(t, certificateStatus2.OCSPLastUpdated.IsZero(), "OCSPLastUpdated should be nil") }
// Ensure we get the latest valid authorization for an ident func TestGetValidAuthorizationsDuplicate(t *testing.T) { sa, clk, cleanUp := initSA(t) defer cleanUp() domain := "example.org" var err error reg := satest.CreateWorkingRegistration(t, sa) makeAuthz := func(daysToExpiry int, status core.AcmeStatus) core.Authorization { authz := CreateDomainAuthWithRegID(t, domain, sa, reg.ID) exp := clk.Now().AddDate(0, 0, daysToExpiry) authz.Expires = &exp authz.Status = status err = sa.FinalizeAuthorization(ctx, authz) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+authz.ID) return authz } // create invalid authz makeAuthz(10, core.StatusInvalid) // should not get the auth authzMap, err := sa.GetValidAuthorizations(ctx, reg.ID, []string{domain}, clk.Now()) test.AssertEquals(t, len(authzMap), 0) // create valid auth makeAuthz(1, core.StatusValid) // should get the valid auth even if it's expire date is lower than the invalid one authzMap, err = sa.GetValidAuthorizations(ctx, reg.ID, []string{domain}, clk.Now()) test.AssertNotError(t, err, "Should have found a valid auth for "+domain) test.AssertEquals(t, len(authzMap), 1) result1 := authzMap[domain] test.AssertEquals(t, result1.Status, core.StatusValid) test.AssertEquals(t, result1.Identifier.Type, core.IdentifierDNS) test.AssertEquals(t, result1.Identifier.Value, domain) test.AssertEquals(t, result1.RegistrationID, reg.ID) // create a newer auth newAuthz := makeAuthz(2, core.StatusValid) authzMap, err = sa.GetValidAuthorizations(ctx, reg.ID, []string{domain}, clk.Now()) test.AssertNotError(t, err, "Should have found a valid auth for "+domain) test.AssertEquals(t, len(authzMap), 1) result2 := authzMap[domain] test.AssertEquals(t, result2.Status, core.StatusValid) test.AssertEquals(t, result2.Identifier.Type, core.IdentifierDNS) test.AssertEquals(t, result2.Identifier.Value, domain) test.AssertEquals(t, result2.RegistrationID, reg.ID) // make sure we got the latest auth test.AssertEquals(t, result2.ID, newAuthz.ID) }
func TestAddCertificate(t *testing.T) { sa, _, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) // An example cert taken from EFF's website certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") digest, err := sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") test.AssertEquals(t, digest, "qWoItDZmR4P9eFbeYgXXP3SR4ApnkQj8x4LsB_ORKBo") // Example cert serial is 0x21bd4, so a prefix of all zeroes should fetch it. retrievedCert, err := sa.GetCertificateByShortSerial("0000000000000000") test.AssertNotError(t, err, "Couldn't get www.eff.org.der by short serial") test.AssertByteEquals(t, certDER, retrievedCert.DER) retrievedCert, err = sa.GetCertificate("00000000000000000000000000021bd4") test.AssertNotError(t, err, "Couldn't get www.eff.org.der by full serial") test.AssertByteEquals(t, certDER, retrievedCert.DER) certificateStatus, err := sa.GetCertificateStatus("00000000000000000000000000021bd4") test.AssertNotError(t, err, "Couldn't get status for www.eff.org.der") test.Assert(t, !certificateStatus.SubscriberApproved, "SubscriberApproved should be false") test.Assert(t, certificateStatus.Status == core.OCSPStatusGood, "OCSP Status should be good") test.Assert(t, certificateStatus.OCSPLastUpdated.IsZero(), "OCSPLastUpdated should be nil") // Test cert generated locally by Boulder / CFSSL, serial "ff00000000000002238054509817da5a" certDER2, err := ioutil.ReadFile("test-cert.der") test.AssertNotError(t, err, "Couldn't read example cert DER") digest2, err := sa.AddCertificate(certDER2, reg.ID) test.AssertNotError(t, err, "Couldn't add test-cert.der") test.AssertEquals(t, digest2, "CMVYqWzyqUW7pfBF2CxL0Uk6I0Upsk7p4EWSnd_vYx4") // Example cert serial is 0x21bd4, so a prefix of all zeroes should fetch it. retrievedCert2, err := sa.GetCertificateByShortSerial("ff00000000000002") test.AssertNotError(t, err, "Couldn't get test-cert.der") test.AssertByteEquals(t, certDER2, retrievedCert2.DER) retrievedCert2, err = sa.GetCertificate("ff00000000000002238054509817da5a") test.AssertNotError(t, err, "Couldn't get test-cert.der") test.AssertByteEquals(t, certDER2, retrievedCert2.DER) certificateStatus2, err := sa.GetCertificateStatus("ff00000000000002238054509817da5a") test.AssertNotError(t, err, "Couldn't get status for test-cert.der") test.Assert(t, !certificateStatus2.SubscriberApproved, "SubscriberApproved should be false") test.Assert(t, certificateStatus2.Status == core.OCSPStatusGood, "OCSP Status should be good") test.Assert(t, certificateStatus2.OCSPLastUpdated.IsZero(), "OCSPLastUpdated should be nil") }
func TestMarkCertificateRevoked(t *testing.T) { sa, fc, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) // Add a cert to the DB to test with. certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") _, err = sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") serial := "000000000000000000000000000000021bd4" const ocspResponse = "this is a fake OCSP response" certificateStatusObj, err := sa.dbMap.Get(core.CertificateStatus{}, serial) beforeStatus := certificateStatusObj.(*core.CertificateStatus) test.AssertEquals(t, beforeStatus.Status, core.OCSPStatusGood) fc.Add(1 * time.Hour) code := core.RevocationCode(1) err = sa.MarkCertificateRevoked(serial, []byte(ocspResponse), code) test.AssertNotError(t, err, "MarkCertificateRevoked failed") certificateStatusObj, err = sa.dbMap.Get(core.CertificateStatus{}, serial) afterStatus := certificateStatusObj.(*core.CertificateStatus) test.AssertNotError(t, err, "Failed to fetch certificate status") if code != afterStatus.RevokedReason { t.Errorf("RevokedReasons, expected %v, got %v", code, afterStatus.RevokedReason) } if !fc.Now().Equal(afterStatus.RevokedDate) { t.Errorf("RevokedData, expected %s, got %s", fc.Now(), afterStatus.RevokedDate) } if !fc.Now().Equal(afterStatus.OCSPLastUpdated) { t.Errorf("OCSPLastUpdated, expected %s, got %s", fc.Now(), afterStatus.OCSPLastUpdated) } if !afterStatus.OCSPLastUpdated.After(beforeStatus.OCSPLastUpdated) { t.Errorf("OCSPLastUpdated did not update correctly. before: %s; after: %s", beforeStatus.OCSPLastUpdated, afterStatus.OCSPLastUpdated) } var fetched core.OCSPResponse err = sa.dbMap.SelectOne(&fetched, `SELECT * from ocspResponses where serial = ? order by createdAt DESC limit 1;`, serial) test.AssertNotError(t, err, "Failed to fetch OCSP response") if ocspResponse != string(fetched.Response) { t.Errorf("OCSPResponse response, expected %#v, got %#v", ocspResponse, string(fetched.Response)) } }
func TestGetCertificatesWithMissingResponses(t *testing.T) { updater, sa, _, _, cleanUp := setup(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) cert, err := core.LoadCert("test-cert.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(cert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") statuses, err := updater.getCertificatesWithMissingResponses(10) test.AssertNotError(t, err, "Couldn't get status") test.AssertEquals(t, len(statuses), 1) }
func TestDeactivateAccount(t *testing.T) { _ = features.Set(map[string]bool{"AllowAccountDeactivation": true}) defer features.Reset() sa, _, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) err := sa.DeactivateRegistration(context.Background(), reg.ID) test.AssertNotError(t, err, "DeactivateRegistration failed") dbReg, err := sa.GetRegistration(context.Background(), reg.ID) test.AssertNotError(t, err, "GetRegistration failed") test.AssertEquals(t, dbReg.Status, core.StatusDeactivated) }
func TestGetAndProcessCerts(t *testing.T) { saDbMap, err := sa.NewDbMap(vars.DBConnSA) test.AssertNotError(t, err, "Couldn't connect to database") paDbMap, err := sa.NewDbMap(vars.DBConnPolicy) test.AssertNotError(t, err, "Couldn't connect to policy database") fc := clock.NewFake() checker := newChecker(saDbMap, paDbMap, fc, false, nil) sa, err := sa.NewSQLStorageAuthority(saDbMap, fc) test.AssertNotError(t, err, "Couldn't create SA to insert certificates") saCleanUp := test.ResetSATestDatabase(t) paCleanUp := test.ResetPolicyTestDatabase(t) defer func() { saCleanUp() paCleanUp() }() testKey, _ := rsa.GenerateKey(rand.Reader, 1024) // Problems // Expiry period is too long rawCert := x509.Certificate{ Subject: pkix.Name{ CommonName: "not-blacklisted.com", }, BasicConstraintsValid: true, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}, } reg := satest.CreateWorkingRegistration(t, sa) test.AssertNotError(t, err, "Couldn't create registration") for i := int64(0); i < 5; i++ { rawCert.SerialNumber = big.NewInt(i) certDER, err := x509.CreateCertificate(rand.Reader, &rawCert, &rawCert, &testKey.PublicKey, testKey) test.AssertNotError(t, err, "Couldn't create certificate") _, err = sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add certificate") } err = checker.getCerts() test.AssertNotError(t, err, "Failed to retrieve certificates") test.AssertEquals(t, len(checker.certs), 5) wg := new(sync.WaitGroup) wg.Add(1) checker.processCerts(wg) test.AssertEquals(t, checker.issuedReport.BadCerts, int64(5)) test.AssertEquals(t, len(checker.issuedReport.Entries), 5) }
func TestOldOCSPResponsesTick(t *testing.T) { updater, sa, _, fc, cleanUp := setup(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) parsedCert, err := core.LoadCert("test-cert.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(parsedCert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") updater.ocspMinTimeToExpiry = 1 * time.Hour updater.oldOCSPResponsesTick(10) certs, err := updater.findStaleOCSPResponses(fc.Now().Add(-updater.ocspMinTimeToExpiry), 10) test.AssertNotError(t, err, "Failed to find stale responses") test.AssertEquals(t, len(certs), 0) }
func TestMissingReceiptsTick(t *testing.T) { updater, sa, _, _, cleanUp := setup(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) parsedCert, err := core.LoadCert("test-cert.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(parsedCert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") updater.numLogs = 1 updater.oldestIssuedSCT = 1 * time.Hour updater.missingReceiptsTick(10) count, err := updater.getNumberOfReceipts("00") test.AssertNotError(t, err, "Couldn't get number of receipts") test.AssertEquals(t, count, 1) }
func TestAddCertificate(t *testing.T) { sa, _, cleanUp := initSA(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) // An example cert taken from EFF's website certDER, err := ioutil.ReadFile("www.eff.org.der") test.AssertNotError(t, err, "Couldn't read example cert DER") digest, err := sa.AddCertificate(certDER, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") test.AssertEquals(t, digest, "qWoItDZmR4P9eFbeYgXXP3SR4ApnkQj8x4LsB_ORKBo") retrievedCert, err := sa.GetCertificate("000000000000000000000000000000021bd4") test.AssertNotError(t, err, "Couldn't get www.eff.org.der by full serial") test.AssertByteEquals(t, certDER, retrievedCert.DER) certificateStatus, err := sa.GetCertificateStatus("000000000000000000000000000000021bd4") test.AssertNotError(t, err, "Couldn't get status for www.eff.org.der") test.Assert(t, !certificateStatus.SubscriberApproved, "SubscriberApproved should be false") test.Assert(t, certificateStatus.Status == core.OCSPStatusGood, "OCSP Status should be good") test.Assert(t, certificateStatus.OCSPLastUpdated.IsZero(), "OCSPLastUpdated should be nil") // Test cert generated locally by Boulder / CFSSL, names [example.com, // www.example.com, admin.example.com] certDER2, err := ioutil.ReadFile("test-cert.der") test.AssertNotError(t, err, "Couldn't read example cert DER") serial := "ffdd9b8a82126d96f61d378d5ba99a0474f0" digest2, err := sa.AddCertificate(certDER2, reg.ID) test.AssertNotError(t, err, "Couldn't add test-cert.der") test.AssertEquals(t, digest2, "vrlPN5wIPME1D2PPsCy-fGnTWh8dMyyYQcXPRkjHAQI") retrievedCert2, err := sa.GetCertificate(serial) test.AssertNotError(t, err, "Couldn't get test-cert.der") test.AssertByteEquals(t, certDER2, retrievedCert2.DER) certificateStatus2, err := sa.GetCertificateStatus(serial) test.AssertNotError(t, err, "Couldn't get status for test-cert.der") test.Assert(t, !certificateStatus2.SubscriberApproved, "SubscriberApproved should be false") test.Assert(t, certificateStatus2.Status == core.OCSPStatusGood, "OCSP Status should be good") test.Assert(t, certificateStatus2.OCSPLastUpdated.IsZero(), "OCSPLastUpdated should be nil") }
func TestFindRevokedCertificatesToUpdate(t *testing.T) { updater, sa, _, _, cleanUp := setup(t) defer cleanUp() reg := satest.CreateWorkingRegistration(t, sa) cert, err := core.LoadCert("test-cert.pem") test.AssertNotError(t, err, "Couldn't read test certificate") _, err = sa.AddCertificate(cert.Raw, reg.ID) test.AssertNotError(t, err, "Couldn't add www.eff.org.der") statuses, err := updater.findRevokedCertificatesToUpdate(10) test.AssertNotError(t, err, "Failed to find revoked certificates") test.AssertEquals(t, len(statuses), 0) err = sa.MarkCertificateRevoked(core.SerialToString(cert.SerialNumber), core.RevocationCode(1)) test.AssertNotError(t, err, "Failed to revoke certificate") statuses, err = updater.findRevokedCertificatesToUpdate(10) test.AssertNotError(t, err, "Failed to find revoked certificates") test.AssertEquals(t, len(statuses), 1) }
func TestPurgeAuthzs(t *testing.T) { dbMap, err := sa.NewDbMap(vars.DBConnSAFullPerms, 0) if err != nil { t.Fatalf("Couldn't connect the database: %s", err) } log := blog.UseMock() fc := clock.NewFake() fc.Add(time.Hour) ssa, err := sa.NewSQLStorageAuthority(dbMap, fc, log) if err != nil { t.Fatalf("unable to create SQLStorageAuthority: %s", err) } cleanUp := test.ResetSATestDatabase(t) defer cleanUp() stats := metrics.NewNoopScope() p := expiredAuthzPurger{stats, log, fc, dbMap, 1} rows, err := p.purgeAuthzs(time.Time{}, true) test.AssertNotError(t, err, "purgeAuthzs failed") test.AssertEquals(t, rows, int64(0)) old, new := fc.Now().Add(-time.Hour), fc.Now().Add(time.Hour) reg := satest.CreateWorkingRegistration(t, ssa) _, err = ssa.NewPendingAuthorization(context.Background(), core.Authorization{RegistrationID: reg.ID, Expires: &old}) test.AssertNotError(t, err, "NewPendingAuthorization failed") _, err = ssa.NewPendingAuthorization(context.Background(), core.Authorization{RegistrationID: reg.ID, Expires: &old}) test.AssertNotError(t, err, "NewPendingAuthorization failed") _, err = ssa.NewPendingAuthorization(context.Background(), core.Authorization{RegistrationID: reg.ID, Expires: &new}) test.AssertNotError(t, err, "NewPendingAuthorization failed") rows, err = p.purgeAuthzs(fc.Now(), true) test.AssertNotError(t, err, "purgeAuthzs failed") test.AssertEquals(t, rows, int64(2)) rows, err = p.purgeAuthzs(fc.Now().Add(time.Hour), true) test.AssertNotError(t, err, "purgeAuthzs failed") test.AssertEquals(t, rows, int64(1)) }
// Fetch multiple authzs at once. Check that func TestGetValidAuthorizationsMultiple(t *testing.T) { sa, clk, cleanUp := initSA(t) defer cleanUp() var err error reg := satest.CreateWorkingRegistration(t, sa) makeAuthz := func(daysToExpiry int, status core.AcmeStatus, domain string) core.Authorization { authz := CreateDomainAuthWithRegID(t, domain, sa, reg.ID) exp := clk.Now().AddDate(0, 0, daysToExpiry) authz.Expires = &exp authz.Status = status err = sa.FinalizeAuthorization(ctx, authz) test.AssertNotError(t, err, "Couldn't finalize pending authorization with ID "+authz.ID) return authz } makeAuthz(1, core.StatusValid, "blog.example.com") makeAuthz(2, core.StatusInvalid, "blog.example.com") makeAuthz(5, core.StatusValid, "www.example.com") wwwAuthz := makeAuthz(6, core.StatusValid, "www.example.com") authzMap, err := sa.GetValidAuthorizations(ctx, reg.ID, []string{"blog.example.com", "www.example.com", "absent.example.com"}, clk.Now()) test.AssertNotError(t, err, "Couldn't get authorizations") test.AssertEquals(t, len(authzMap), 2) blogResult := authzMap["blog.example.com"] if blogResult == nil { t.Errorf("Didn't find blog.example.com in result") } if blogResult.Status == core.StatusInvalid { t.Errorf("Got invalid blogResult") } wwwResult := authzMap["www.example.com"] if wwwResult == nil { t.Errorf("Didn't find www.example.com in result") } test.AssertEquals(t, wwwResult.ID, wwwAuthz.ID) }