package net import ( "sync" "testing" ) func TestHubConcurrency(t *testing.T) { h := NewHub() h.OnRemove(func(s *Session) {}) var wg sync.WaitGroup const n = 50 for i := 0; i < n; i++ { wg.Add(1) go func() { defer wg.Done() s := &Session{} h.Add(s) h.EnterRoom(s, 1) h.PlayersInRoom(1) h.LeaveRoom(s) h.HardRemove(s) }() } for i := 0; i < n; i++ { wg.Add(1) go func() { defer wg.Done() h.AllSessions() }() } wg.Wait() } type testConn struct{ data []byte } func (c *testConn) ReadMessage() (string, error) { return "", nil } func (c *testConn) Write(b []byte) (int, error) { c.data = append(c.data, b...); return len(b), nil } func (c *testConn) Close() error { return nil } func (c *testConn) SetEcho(bool) error { return nil } func TestSessionWriteConcurrency(t *testing.T) { conn := &testConn{} sess := &Session{Conn: conn} var wg sync.WaitGroup const n = 50 for i := 0; i < n; i++ { wg.Add(1) go func() { defer wg.Done() sess.Write("hello") sess.WriteLine("world") sess.Writef("formatted %d", 42) }() } wg.Wait() }