package hostfiles import ( "reflect" "testing" "time" ) func TestQueueArmsOnTheFirstTouchAndLaterTouchesDoNotPushItBack(t *testing.T) { q := newQueue(time.Second) t0 := time.Unix(1000, 0) q.Touch("a", t0) q.Touch("a", t0.Add(900*time.Millisecond)) // still being written if got := q.Due(t0.Add(999 * time.Millisecond)); len(got) != 0 { t.Fatalf("due early: %v", got) } if got := q.Due(t0.Add(time.Second)); !reflect.DeepEqual(got, []string{"a"}) { t.Fatalf("due = %v, want [a]", got) } if got := q.Due(t0.Add(2 * time.Second)); len(got) != 0 { t.Fatalf("due twice: %v", got) } q.Touch("a", t0.Add(3*time.Second)) // a new modification arms a new deadline if got := q.Due(t0.Add(4 * time.Second)); !reflect.DeepEqual(got, []string{"a"}) { t.Fatalf("second deadline: %v", got) } } func TestQueueReturnsDuePathsSorted(t *testing.T) { q := newQueue(time.Second) t0 := time.Unix(1000, 0) for _, p := range []string{"c", "a", "b"} { q.Touch(p, t0) } if got := q.Due(t0.Add(time.Second)); !reflect.DeepEqual(got, []string{"a", "b", "c"}) { t.Fatalf("due = %v", got) } }