Guest User

Untitled

a guest
Mar 15th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.77 KB | None | 0 0
  1. package net_test
  2.  
  3. import (
  4.         "fmt"
  5.         "math/rand"
  6.         "net"
  7.         "sync"
  8.         "testing"
  9. )
  10.  
  11. const (
  12.         ndialers = 100
  13.         nlisteners = 100
  14.         nconn = 100000
  15. )
  16.  
  17. func TestAccept(t *testing.T) {
  18.         listeners := []net.Listener{}
  19.         l, err := net.ListenTCP("tcp", &net.TCPAddr{})
  20.         if err != nil {
  21.                 panic("Listen failed: " + err.Error())
  22.         }
  23.         listeners = append(listeners, l)
  24.  
  25.         // start dialers
  26.         var dialWg sync.WaitGroup
  27.         for k := 0; k < ndialers; k++ {
  28.                 dialWg.Add(1)
  29.                 go func() {
  30.                         rng := rand.New(rand.NewSource(int64(k)))
  31.                         defer dialWg.Done()
  32.                         for j := 0; j < nconn; j++ {
  33.                                 l := listeners[rng.Intn(len(listeners))]
  34.                                 fmt.Printf("Dialing %v\n", l.Addr())
  35.                                 c, err := net.Dial("tcp", l.Addr().String())
  36.                                 if err != nil {
  37.                                         panic("Dial failed: " + err.Error())
  38.                                 }
  39.                                 tc := c.(*net.TCPConn)
  40.                                 if err := tc.SetLinger(0); err != nil {
  41.                                         panic(err)
  42.                                 }
  43.                                 if err := c.Close(); err != nil {
  44.                                         panic(err)
  45.                                 }
  46.                         }
  47.                 }()
  48.         }
  49.  
  50.         // accept on listeners
  51.         var listenWg sync.WaitGroup
  52.         for _, listener := range listeners {
  53.                 listenWg.Add(1)
  54.                 l := listener
  55.                 go func() {
  56.                         defer listenWg.Done()
  57.                         for {
  58.                                 fmt.Printf("Accepting on %v\n", l.Addr())
  59.                                 c, err := l.Accept()
  60.                                 if err != nil {
  61.                                         break
  62.                                 }
  63.                                 tc := c.(*net.TCPConn)
  64.                                 if err := tc.SetLinger(0); err != nil {
  65.                                         panic(err)
  66.                                 }
  67.                                 if err := c.Close(); err != nil {
  68.                                         panic(err)
  69.                                 }
  70.                         }
  71.                 }()
  72.         }
  73.  
  74.         dialWg.Wait()
  75.  
  76.         for _, l := range listeners {
  77.                 if err := l.Close(); err != nil {
  78.                         panic("listener close failed: " + err.Error())
  79.                 }
  80.         }
  81.  
  82.         listenWg.Wait()
  83. }
Add Comment
Please, Sign In to add comment