|
@@ -167,6 +167,88 @@ func TestFilter(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func TestMerge(t *testing.T) {
|
|
|
+ cases := []struct {
|
|
|
+ a, b, res []DatabaseAddress
|
|
|
+ }{
|
|
|
+ {nil, nil, nil},
|
|
|
+ {
|
|
|
+ nil,
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ nil,
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 10}, {Address: "c", Expires: 10}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 10}, {Address: "c", Expires: 10}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 15}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 15}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}},
|
|
|
+ []DatabaseAddress{{Address: "b", Expires: 15}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 15}, {Address: "b", Expires: 15}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 15}, {Address: "b", Expires: 15}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}},
|
|
|
+ []DatabaseAddress{{Address: "b", Expires: 15}, {Address: "c", Expires: 20}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}, {Address: "c", Expires: 20}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}},
|
|
|
+ []DatabaseAddress{{Address: "b", Expires: 5}, {Address: "c", Expires: 20}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}, {Address: "c", Expires: 20}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ []DatabaseAddress{{Address: "y", Expires: 10}, {Address: "z", Expires: 10}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 5}, {Address: "b", Expires: 15}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 5}, {Address: "b", Expires: 15}, {Address: "y", Expires: 10}, {Address: "z", Expires: 10}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}, {Address: "d", Expires: 10}},
|
|
|
+ []DatabaseAddress{{Address: "b", Expires: 5}, {Address: "c", Expires: 20}},
|
|
|
+ []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}, {Address: "c", Expires: 20}, {Address: "d", Expires: 10}},
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, tc := range cases {
|
|
|
+ rec := merge(DatabaseRecord{Addresses: tc.a}, DatabaseRecord{Addresses: tc.b})
|
|
|
+ if fmt.Sprint(rec.Addresses) != fmt.Sprint(tc.res) {
|
|
|
+ t.Errorf("Incorrect result %v, expected %v", rec.Addresses, tc.res)
|
|
|
+ }
|
|
|
+ rec = merge(DatabaseRecord{Addresses: tc.b}, DatabaseRecord{Addresses: tc.a})
|
|
|
+ if fmt.Sprint(rec.Addresses) != fmt.Sprint(tc.res) {
|
|
|
+ t.Errorf("Incorrect result %v, expected %v", rec.Addresses, tc.res)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func BenchmarkMergeEqual(b *testing.B) {
|
|
|
+ for i := 0; i < b.N; i++ {
|
|
|
+ ar := []DatabaseAddress{{Address: "a", Expires: 10}, {Address: "b", Expires: 15}}
|
|
|
+ br := []DatabaseAddress{{Address: "a", Expires: 15}, {Address: "b", Expires: 10}}
|
|
|
+ res := merge(DatabaseRecord{Addresses: ar}, DatabaseRecord{Addresses: br})
|
|
|
+ if len(res.Addresses) != 2 {
|
|
|
+ b.Fatal("wrong length")
|
|
|
+ }
|
|
|
+ if res.Addresses[0].Address != "a" || res.Addresses[1].Address != "b" {
|
|
|
+ b.Fatal("wrong address")
|
|
|
+ }
|
|
|
+ if res.Addresses[0].Expires != 15 || res.Addresses[1].Expires != 15 {
|
|
|
+ b.Fatal("wrong expiry")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ b.ReportAllocs() // should be zero per operation
|
|
|
+}
|
|
|
+
|
|
|
type testClock struct {
|
|
|
now time.Time
|
|
|
}
|