boulder/ctpolicy/loglist/loglist_test.go

211 lines
6.3 KiB
Go

package loglist
import (
"testing"
"time"
"github.com/google/certificate-transparency-go/loglist3"
"github.com/letsencrypt/boulder/test"
)
func TestNew(t *testing.T) {
}
func TestSubset(t *testing.T) {
input := List{
"Operator A": {
"ID A1": Log{Name: "Log A1"},
"ID A2": Log{Name: "Log A2"},
},
"Operator B": {
"ID B1": Log{Name: "Log B1"},
"ID B2": Log{Name: "Log B2"},
},
"Operator C": {
"ID C1": Log{Name: "Log C1"},
"ID C2": Log{Name: "Log C2"},
},
}
actual, err := input.subset(nil)
test.AssertNotError(t, err, "nil names should not error")
test.AssertEquals(t, len(actual), 0)
actual, err = input.subset([]string{})
test.AssertNotError(t, err, "empty names should not error")
test.AssertEquals(t, len(actual), 0)
actual, err = input.subset([]string{"Other Log"})
test.AssertError(t, err, "wrong name should result in error")
test.AssertEquals(t, len(actual), 0)
expected := List{
"Operator A": {
"ID A1": Log{Name: "Log A1"},
"ID A2": Log{Name: "Log A2"},
},
"Operator B": {
"ID B1": Log{Name: "Log B1"},
},
}
actual, err = input.subset([]string{"Log B1", "Log A1", "Log A2"})
test.AssertNotError(t, err, "normal usage should not error")
test.AssertDeepEquals(t, actual, expected)
}
func TestForPurpose(t *testing.T) {
input := List{
"Operator A": {
"ID A1": Log{Name: "Log A1", State: loglist3.UsableLogStatus},
"ID A2": Log{Name: "Log A2", State: loglist3.RejectedLogStatus},
},
"Operator B": {
"ID B1": Log{Name: "Log B1", State: loglist3.UsableLogStatus},
"ID B2": Log{Name: "Log B2", State: loglist3.RetiredLogStatus},
},
"Operator C": {
"ID C1": Log{Name: "Log C1", State: loglist3.PendingLogStatus},
"ID C2": Log{Name: "Log C2", State: loglist3.ReadOnlyLogStatus},
},
}
expected := List{
"Operator A": {
"ID A1": Log{Name: "Log A1", State: loglist3.UsableLogStatus},
},
"Operator B": {
"ID B1": Log{Name: "Log B1", State: loglist3.UsableLogStatus},
},
}
actual, err := input.forPurpose(Issuance)
test.AssertNotError(t, err, "should have two acceptable logs")
test.AssertDeepEquals(t, actual, expected)
input = List{
"Operator A": {
"ID A1": Log{Name: "Log A1", State: loglist3.UsableLogStatus},
"ID A2": Log{Name: "Log A2", State: loglist3.RejectedLogStatus},
},
"Operator B": {
"ID B1": Log{Name: "Log B1", State: loglist3.QualifiedLogStatus},
"ID B2": Log{Name: "Log B2", State: loglist3.RetiredLogStatus},
},
"Operator C": {
"ID C1": Log{Name: "Log C1", State: loglist3.PendingLogStatus},
"ID C2": Log{Name: "Log C2", State: loglist3.ReadOnlyLogStatus},
},
}
_, err = input.forPurpose(Issuance)
test.AssertError(t, err, "should only have one acceptable log")
expected = List{
"Operator A": {
"ID A1": Log{Name: "Log A1", State: loglist3.UsableLogStatus},
},
"Operator C": {
"ID C2": Log{Name: "Log C2", State: loglist3.ReadOnlyLogStatus},
},
}
actual, err = input.forPurpose(Validation)
test.AssertNotError(t, err, "should have two acceptable logs")
test.AssertDeepEquals(t, actual, expected)
expected = List{
"Operator A": {
"ID A1": Log{Name: "Log A1", State: loglist3.UsableLogStatus},
},
"Operator B": {
"ID B1": Log{Name: "Log B1", State: loglist3.QualifiedLogStatus},
},
"Operator C": {
"ID C1": Log{Name: "Log C1", State: loglist3.PendingLogStatus},
},
}
actual, err = input.forPurpose(Informational)
test.AssertNotError(t, err, "should have three acceptable logs")
test.AssertDeepEquals(t, actual, expected)
}
func TestOperatorForLogID(t *testing.T) {
input := List{
"Operator A": {
"ID A1": Log{Name: "Log A1", State: loglist3.UsableLogStatus},
},
"Operator B": {
"ID B1": Log{Name: "Log B1", State: loglist3.QualifiedLogStatus},
},
}
actual, err := input.OperatorForLogID("ID B1")
test.AssertNotError(t, err, "should have found log")
test.AssertEquals(t, actual, "Operator B")
_, err = input.OperatorForLogID("Other ID")
test.AssertError(t, err, "should not have found log")
}
func TestPermute(t *testing.T) {
input := List{
"Operator A": {
"ID A1": Log{Name: "Log A1", State: loglist3.UsableLogStatus},
"ID A2": Log{Name: "Log A2", State: loglist3.RejectedLogStatus},
},
"Operator B": {
"ID B1": Log{Name: "Log B1", State: loglist3.QualifiedLogStatus},
"ID B2": Log{Name: "Log B2", State: loglist3.RetiredLogStatus},
},
"Operator C": {
"ID C1": Log{Name: "Log C1", State: loglist3.PendingLogStatus},
"ID C2": Log{Name: "Log C2", State: loglist3.ReadOnlyLogStatus},
},
}
actual := input.Permute()
test.AssertEquals(t, len(actual), 3)
test.AssertSliceContains(t, actual, "Operator A")
test.AssertSliceContains(t, actual, "Operator B")
test.AssertSliceContains(t, actual, "Operator C")
}
func TestPickOne(t *testing.T) {
date0 := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
date1 := time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)
date2 := time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC)
input := List{
"Operator A": {
"ID A1": Log{Name: "Log A1"},
},
}
_, _, err := input.PickOne("Operator B", date0)
test.AssertError(t, err, "should have failed to find operator")
input = List{
"Operator A": {
"ID A1": Log{Name: "Log A1", StartInclusive: date0, EndExclusive: date1},
},
}
_, _, err = input.PickOne("Operator A", date2)
test.AssertError(t, err, "should have failed to find log")
_, _, err = input.PickOne("Operator A", date1)
test.AssertError(t, err, "should have failed to find log")
_, _, err = input.PickOne("Operator A", date0)
test.AssertNotError(t, err, "should have found a log")
_, _, err = input.PickOne("Operator A", date0.Add(time.Hour))
test.AssertNotError(t, err, "should have found a log")
input = List{
"Operator A": {
"ID A1": Log{Name: "Log A1", StartInclusive: date0, EndExclusive: date1, Key: "KA1", Url: "UA1"},
"ID A2": Log{Name: "Log A2", StartInclusive: date1, EndExclusive: date2, Key: "KA2", Url: "UA2"},
"ID B1": Log{Name: "Log B1", StartInclusive: date0, EndExclusive: date1, Key: "KB1", Url: "UB1"},
"ID B2": Log{Name: "Log B2", StartInclusive: date1, EndExclusive: date2, Key: "KB2", Url: "UB2"},
},
}
url, key, err := input.PickOne("Operator A", date0.Add(time.Hour))
test.AssertNotError(t, err, "should have found a log")
test.AssertSliceContains(t, []string{"UA1", "UB1"}, url)
test.AssertSliceContains(t, []string{"KA1", "KB1"}, key)
}