123 lines
2.5 KiB
Go
123 lines
2.5 KiB
Go
package dedup
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestShouldIgnoreOwnOrigin(t *testing.T) {
|
|
f := NewFilter("machine-a")
|
|
|
|
p := Payload{
|
|
Text: "hello",
|
|
Ts: time.Now().UnixNano(),
|
|
Origin: "machine-a", // same as our origin
|
|
}
|
|
|
|
if !f.ShouldIgnore(p) {
|
|
t.Error("should ignore payload from own origin")
|
|
}
|
|
}
|
|
|
|
func TestShouldIgnoreStaleTimestamp(t *testing.T) {
|
|
f := NewFilter("machine-a")
|
|
f.MarkWritten("previous text")
|
|
|
|
// Wait a tiny bit so the timestamp is definitely in the past.
|
|
time.Sleep(time.Millisecond)
|
|
|
|
p := Payload{
|
|
Text: "hello",
|
|
Ts: f.LastWriteTs() - 1, // older than our last write
|
|
Origin: "machine-b",
|
|
}
|
|
|
|
if !f.ShouldIgnore(p) {
|
|
t.Error("should ignore payload with stale timestamp")
|
|
}
|
|
}
|
|
|
|
func TestShouldIgnoreDuplicateHash(t *testing.T) {
|
|
f := NewFilter("machine-a")
|
|
f.MarkWritten("hello world")
|
|
|
|
p := Payload{
|
|
Text: "hello world",
|
|
Ts: time.Now().UnixNano(),
|
|
Origin: "machine-b",
|
|
}
|
|
|
|
if !f.ShouldIgnore(p) {
|
|
t.Error("should ignore payload with recently written hash")
|
|
}
|
|
}
|
|
|
|
func TestShouldAcceptNewContent(t *testing.T) {
|
|
f := NewFilter("machine-a")
|
|
f.MarkWritten("old content")
|
|
|
|
time.Sleep(time.Millisecond)
|
|
|
|
p := Payload{
|
|
Text: "new content",
|
|
Ts: time.Now().UnixNano(),
|
|
Origin: "machine-b",
|
|
}
|
|
|
|
if f.ShouldIgnore(p) {
|
|
t.Error("should accept new content from other origin")
|
|
}
|
|
}
|
|
|
|
func TestShouldIgnoreDuplicateImageHash(t *testing.T) {
|
|
f := NewFilter("machine-a")
|
|
f.MarkWrittenPayload(Payload{Mime: "image/png", Data: "aGVsbG8="})
|
|
|
|
p := Payload{
|
|
Mime: "image/png",
|
|
Data: "aGVsbG8=",
|
|
Ts: time.Now().UnixNano(),
|
|
Origin: "machine-b",
|
|
}
|
|
|
|
if !f.ShouldIgnore(p) {
|
|
t.Error("should ignore image payload with recently written data hash")
|
|
}
|
|
}
|
|
|
|
func TestCacheEviction(t *testing.T) {
|
|
f := NewFilter("machine-a")
|
|
|
|
// Fill the cache with 20 different texts.
|
|
for i := 0; i < defaultCacheSize; i++ {
|
|
f.MarkWritten("text")
|
|
}
|
|
|
|
// The latest write is "text" — it should be in cache.
|
|
p := Payload{
|
|
Text: "text",
|
|
Ts: time.Now().UnixNano(),
|
|
Origin: "machine-b",
|
|
}
|
|
if !f.ShouldIgnore(p) {
|
|
t.Error("'text' should still be in cache after 20 writes")
|
|
}
|
|
}
|
|
|
|
func TestMarkWrittenUpdatesTimestamp(t *testing.T) {
|
|
f := NewFilter("machine-a")
|
|
|
|
before := f.LastWriteTs()
|
|
if before != 0 {
|
|
t.Errorf("initial LastWriteTs = %d, want 0", before)
|
|
}
|
|
|
|
time.Sleep(time.Millisecond)
|
|
f.MarkWritten("some text")
|
|
|
|
after := f.LastWriteTs()
|
|
if after <= before {
|
|
t.Errorf("LastWriteTs not updated: %d <= %d", after, before)
|
|
}
|
|
}
|