// IsRunning attempts to determine whether this process is // running on CI. This is done by checking any of: // // CI=true // travis.IsRunning() // jenkins.IsRunning() // func IsRunning() bool { if os.Getenv(string(VarCI)) == "true" { return true } return travis.IsRunning() || jenkins.IsRunning() }
func TestCloseLeak(t *testing.T) { // t.Skip("Skipping in favor of another test") if testing.Short() { t.SkipNow() } if travis.IsRunning() { t.Skip("this doesn't work well on travis") } var wg sync.WaitGroup runPair := func(num int) { ctx, cancel := context.WithCancel(context.Background()) c1, c2, _, _ := setupSingleConn(t, ctx) mc1 := msgioWrap(c1) mc2 := msgioWrap(c2) for i := 0; i < num; i++ { b1 := []byte(fmt.Sprintf("beep%d", i)) mc1.WriteMsg(b1) b2, err := mc2.ReadMsg() if err != nil { panic(err) } if !bytes.Equal(b1, b2) { panic(fmt.Errorf("bytes not equal: %s != %s", b1, b2)) } b2 = []byte(fmt.Sprintf("boop%d", i)) mc2.WriteMsg(b2) b1, err = mc1.ReadMsg() if err != nil { panic(err) } if !bytes.Equal(b1, b2) { panic(fmt.Errorf("bytes not equal: %s != %s", b1, b2)) } <-time.After(time.Microsecond * 5) } c1.Close() c2.Close() cancel() // close the listener wg.Done() } var cons = 5 var msgs = 50 log.Debugf("Running %d connections * %d msgs.\n", cons, msgs) for i := 0; i < cons; i++ { wg.Add(1) go runPair(msgs) } log.Debugf("Waiting...\n") wg.Wait() // done! time.Sleep(time.Millisecond * 150) ngr := runtime.NumGoroutine() if ngr > 25 { // note, this is really innacurate //panic("uncomment me to debug") t.Fatal("leaking goroutines:", ngr) } }
func TestSecureCloseLeak(t *testing.T) { // t.Skip("Skipping in favor of another test") if testing.Short() { t.SkipNow() } if travis.IsRunning() { t.Skip("this doesn't work well on travis") } runPair := func(c1, c2 Conn, num int) { mc1 := msgioWrap(c1) mc2 := msgioWrap(c2) log.Debugf("runPair %d", num) for i := 0; i < num; i++ { log.Debugf("runPair iteration %d", i) b1 := []byte("beep") mc1.WriteMsg(b1) b2, err := mc2.ReadMsg() if err != nil { panic(err) } if !bytes.Equal(b1, b2) { panic("bytes not equal") } b2 = []byte("beep") mc2.WriteMsg(b2) b1, err = mc1.ReadMsg() if err != nil { panic(err) } if !bytes.Equal(b1, b2) { panic("bytes not equal") } time.Sleep(time.Microsecond * 5) } } var cons = 5 var msgs = 50 log.Debugf("Running %d connections * %d msgs.\n", cons, msgs) var wg sync.WaitGroup for i := 0; i < cons; i++ { wg.Add(1) ctx, cancel := context.WithCancel(context.Background()) c1, c2, _, _ := setupSecureConn(t, ctx) go func(c1, c2 Conn) { defer func() { c1.Close() c2.Close() cancel() wg.Done() }() runPair(c1, c2, msgs) }(c1, c2) } log.Debugf("Waiting...") wg.Wait() // done! time.Sleep(time.Millisecond * 150) ngr := runtime.NumGoroutine() if ngr > 25 { // panic("uncomment me to debug") t.Fatal("leaking goroutines:", ngr) } }