diff --git a/net/conn/multiconn_test.go b/net/conn/multiconn_test.go index 34cbeaf8928e6c26e52aae19659dd7aff0a8c7ff..0fde058d36ec1f8f360bbd051ba8e1e4e9505a58 100644 --- a/net/conn/multiconn_test.go +++ b/net/conn/multiconn_test.go @@ -146,11 +146,16 @@ func setupMultiConns(t *testing.T, ctx context.Context) (a, b *MultiConn) { t.Fatal(err) } + p1l.Close() + p2l.Close() + log.Info("did you make multiconns?") return c1.(*MultiConn), c2.(*MultiConn) } func TestMulticonnSend(t *testing.T) { + // t.Skip("fooo") + log.Info("TestMulticonnSend") ctx := context.Background() ctxC, cancel := context.WithCancel(ctx) @@ -211,3 +216,80 @@ func TestMulticonnSend(t *testing.T) { msgsFrom2.CheckDone(t) <-time.After(100 * time.Millisecond) } + +func TestMulticonnSendUnderlying(t *testing.T) { + // t.Skip("fooo") + + log.Info("TestMulticonnSendUnderlying") + ctx := context.Background() + ctxC, cancel := context.WithCancel(ctx) + + c1, c2 := setupMultiConns(t, ctx) + + log.Info("gen msgs") + num := 100 + msgsFrom1 := genMessages(num, "from p1 to p2") + msgsFrom2 := genMessages(num, "from p2 to p1") + + var wg sync.WaitGroup + + send := func(c *MultiConn, msgs *msgMap) { + defer wg.Done() + + conns := make([]Conn, 0, len(c.conns)) + for _, c1 := range c.conns { + conns = append(conns, c1) + } + + i := 0 + for _, m := range msgs.msgs { + log.Info("send: %s", m.payload) + switch i % 3 { + case 0: + conns[0].Out() <- []byte(m.payload) + case 1: + conns[1].Out() <- []byte(m.payload) + case 2: + c.Out() <- []byte(m.payload) + } + msgs.Sent(t, m.payload) + <-time.After(time.Microsecond * 10) + i++ + } + } + + recv := func(ctx context.Context, c *MultiConn, msgs *msgMap) { + defer wg.Done() + + for { + select { + case payload := <-c.In(): + msgs.Received(t, string(payload)) + log.Info("recv: %s", payload) + if msgs.recv == len(msgs.msgs) { + return + } + + case <-ctx.Done(): + return + + } + } + + } + + log.Info("msg send + recv") + + wg.Add(4) + go send(c1, msgsFrom1) + go send(c2, msgsFrom2) + go recv(ctxC, c1, msgsFrom2) + go recv(ctxC, c2, msgsFrom1) + wg.Wait() + cancel() + c1.Close() + c2.Close() + + msgsFrom1.CheckDone(t) + msgsFrom2.CheckDone(t) +}