func TestUTPPingPong(t *testing.T) { defer goroutineLeakCheck(t)() s, err := NewSocket("udp", "localhost:0") require.NoError(t, err) defer s.Close() pingerClosed := make(chan struct{}) go func() { defer close(pingerClosed) b, err := Dial(s.Addr().String()) require.NoError(t, err) defer b.Close() n, err := b.Write([]byte("ping")) require.NoError(t, err) require.EqualValues(t, 4, n) buf := make([]byte, 4) b.Read(buf) require.EqualValues(t, "pong", buf) log.Printf("got pong") }() a, err := s.Accept() require.NoError(t, err) defer a.Close() log.Printf("accepted %s", a) buf := make([]byte, 42) n, err := a.Read(buf) require.NoError(t, err) require.EqualValues(t, "ping", buf[:n]) log.Print("got ping") n, err = a.Write([]byte("pong")) require.NoError(t, err) require.Equal(t, 4, n) log.Print("waiting for pinger to close") <-pingerClosed }
func TestGroupByKey(t *testing.T) { var ks []byte gb := GroupBy(StringIterator("AAAABBBCCDAABBB"), nil) for gb.Next() { ks = append(ks, gb.Value().(Group).Key().(byte)) } t.Log(ks) require.EqualValues(t, "ABCDAB", ks) }
// Check that peer sending FIN doesn't cause unread data to be dropped in a // receiver. func TestReadFinishedConn(t *testing.T) { a, b := connPair() defer a.Close() defer b.Close() mu.Lock() originalAPDC := artificialPacketDropChance artificialPacketDropChance = 1 mu.Unlock() n, err := a.Write([]byte("hello")) require.Equal(t, 5, n) require.NoError(t, err) n, err = a.Write([]byte("world")) require.Equal(t, 5, n) require.NoError(t, err) mu.Lock() artificialPacketDropChance = originalAPDC mu.Unlock() a.Close() all, err := ioutil.ReadAll(b) require.NoError(t, err) require.EqualValues(t, "helloworld", all) }
func TestCloseSubscription(t *testing.T) { ps := NewPubSub() ps.Publish(1) s := ps.Subscribe() select { case <-s.Values: t.FailNow() default: } ps.Publish(2) s2 := ps.Subscribe() ps.Publish(3) require.Equal(t, 2, <-s.Values) require.EqualValues(t, 3, <-s.Values) s.Close() _, ok := <-s.Values require.False(t, ok) ps.Publish(4) ps.Close() require.Equal(t, 3, <-s2.Values) require.Equal(t, 4, <-s2.Values) require.Nil(t, <-s2.Values) s2.Close() }