github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/net/conn/conn_test.go (about) 1 package conn 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "runtime" 8 "strconv" 9 "sync" 10 "testing" 11 "time" 12 13 context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" 14 ) 15 16 func TestClose(t *testing.T) { 17 // t.Skip("Skipping in favor of another test") 18 19 ctx, cancel := context.WithCancel(context.Background()) 20 c1, c2 := setupConn(t, ctx, "/ip4/127.0.0.1/tcp/5534", "/ip4/127.0.0.1/tcp/5545") 21 22 select { 23 case <-c1.Closed(): 24 t.Fatal("done before close") 25 case <-c2.Closed(): 26 t.Fatal("done before close") 27 default: 28 } 29 30 c1.Close() 31 32 select { 33 case <-c1.Closed(): 34 default: 35 t.Fatal("not done after cancel") 36 } 37 38 c2.Close() 39 40 select { 41 case <-c2.Closed(): 42 default: 43 t.Fatal("not done after cancel") 44 } 45 46 cancel() // close the listener :P 47 } 48 49 func TestCancel(t *testing.T) { 50 // t.Skip("Skipping in favor of another test") 51 52 ctx, cancel := context.WithCancel(context.Background()) 53 c1, c2 := setupConn(t, ctx, "/ip4/127.0.0.1/tcp/5534", "/ip4/127.0.0.1/tcp/5545") 54 55 select { 56 case <-c1.Closed(): 57 t.Fatal("done before close") 58 case <-c2.Closed(): 59 t.Fatal("done before close") 60 default: 61 } 62 63 c1.Close() 64 c2.Close() 65 cancel() // listener 66 67 // wait to ensure other goroutines run and close things. 68 <-time.After(time.Microsecond * 10) 69 // test that cancel called Close. 70 71 select { 72 case <-c1.Closed(): 73 default: 74 t.Fatal("not done after cancel") 75 } 76 77 select { 78 case <-c2.Closed(): 79 default: 80 t.Fatal("not done after cancel") 81 } 82 83 } 84 85 func TestCloseLeak(t *testing.T) { 86 // t.Skip("Skipping in favor of another test") 87 88 if os.Getenv("TRAVIS") == "true" { 89 t.Skip("this doesn't work well on travis") 90 } 91 92 var wg sync.WaitGroup 93 94 runPair := func(p1, p2, num int) { 95 a1 := strconv.Itoa(p1) 96 a2 := strconv.Itoa(p2) 97 ctx, cancel := context.WithCancel(context.Background()) 98 c1, c2 := setupConn(t, ctx, "/ip4/127.0.0.1/tcp/"+a1, "/ip4/127.0.0.1/tcp/"+a2) 99 100 for i := 0; i < num; i++ { 101 b1 := []byte("beep") 102 c1.Out() <- b1 103 b2 := <-c2.In() 104 if !bytes.Equal(b1, b2) { 105 panic("bytes not equal") 106 } 107 108 b2 = []byte("boop") 109 c2.Out() <- b2 110 b1 = <-c1.In() 111 if !bytes.Equal(b1, b2) { 112 panic("bytes not equal") 113 } 114 115 <-time.After(time.Microsecond * 5) 116 } 117 118 c1.Close() 119 c2.Close() 120 cancel() // close the listener 121 wg.Done() 122 } 123 124 var cons = 20 125 var msgs = 100 126 fmt.Printf("Running %d connections * %d msgs.\n", cons, msgs) 127 for i := 0; i < cons; i++ { 128 wg.Add(1) 129 go runPair(2000+i, 2001+i, msgs) 130 } 131 132 fmt.Printf("Waiting...\n") 133 wg.Wait() 134 // done! 135 136 <-time.After(time.Millisecond * 150) 137 if runtime.NumGoroutine() > 20 { 138 // panic("uncomment me to debug") 139 t.Fatal("leaking goroutines:", runtime.NumGoroutine()) 140 } 141 }