package link import ( "testing" "time" ) // said is one declaration as a test hands it over, with no transport under it — which is what the // seam bought: the drain's reasoning was reachable only through a real broker before. type said struct { body []byte handled bool } func (s *said) Body() []byte { return s.body } func (s *said) Handled() error { s.handled = true; return nil } func arriving(bodies ...string) chan Declaration { ch := make(chan Declaration, 8) for _, b := range bodies { ch <- &said{body: []byte(b)} } return ch } // A machine asked to be five things becomes the last one: what is already waiting supersedes what // arrived first, and everything set aside is named so it can be reported. func TestWhatIsAlreadyWaitingSupersedesWhatArrivedFirst(t *testing.T) { waiting := arriving("two", "three", "four") apply, superseded := newest(waiting, &said{body: []byte("one")}, 50*time.Millisecond) if string(apply.Body()) != "four" { t.Fatalf("applied %q, not the newest", apply.Body()) } if len(superseded) != 3 || string(superseded[0].Body()) != "one" || string(superseded[2].Body()) != "three" { t.Fatalf("set aside %d: %v", len(superseded), superseded) } } // One declaration with nothing behind it is applied as it always was, after the window. func TestALoneDeclarationIsAppliedAfterTheWindow(t *testing.T) { began := time.Now() apply, superseded := newest(arriving(), &said{body: []byte("only")}, 30*time.Millisecond) if string(apply.Body()) != "only" || len(superseded) != 0 { t.Fatalf("got %q with %d set aside", apply.Body(), len(superseded)) } if time.Since(began) < 30*time.Millisecond { t.Fatal("did not wait the window for a straggler") } } // A straggler within the window is taken; one after it is the next push. func TestAStragglerWithinTheWindowIsTaken(t *testing.T) { waiting := arriving() go func() { time.Sleep(20 * time.Millisecond) waiting <- &said{body: []byte("late")} }() apply, superseded := newest(waiting, &said{body: []byte("first")}, 100*time.Millisecond) if string(apply.Body()) != "late" || len(superseded) != 1 { t.Fatalf("got %q with %d set aside", apply.Body(), len(superseded)) } }