package pubsub import ( "sync" "testing" "time" ) func TestDupePublisher(t *testing.T) { pt := NewProgressTracker() if _, err := pt.Publish("foo"); err != nil { t.Fatalf("First publisher should not give error, err:%v", err) } if _, err := pt.Publish("foo"); err == nil { t.Fatal("Dupe publisher should give error but got nil") } else { t.Logf("Got err: %v", err) } if _, err := pt.Publish("bar"); err != nil { t.Fatalf("Different publisher should not give error, err:%v", err) } } func TestSubSub(t *testing.T) { pt := NewProgressTracker() c1 := pt.Subscribe("foo") select { case <-c1: default: } if c1 == nil { t.Fatal("Subscriber should not get a closed channel") } c2 := pt.Subscribe("foo") if c2 == nil { t.Fatal("Subscriber should not get a closed channel") } } func TestPubSub(t *testing.T) { pt := NewProgressTracker() pc, err := pt.Publish("foo") if err != nil { t.Fatalf("Unexpected err: %v", err) } if pc == nil { t.Fatal("Should not get nil channel") } sc := pt.Subscribe("foo") if sc == nil { t.Fatal("Should not get nil channel") } wg := sync.WaitGroup{} wg.Add(1) go func() { for range sc { } wg.Done() }() for i := 0; i < 10; i++ { pc <- "blah" if i == 4 || i == 5 { time.Sleep(100 * time.Millisecond) } } close(pc) wg.Wait() sc2 := pt.Subscribe("foo") if sc2 != nil { t.Fatal("Subscriber after publisher done should return nil") } }