github.com/v2pro/plz@v0.0.0-20221028024117-e5f9aec5b631/gls/goid_test.go (about) 1 package gls 2 3 import ( 4 "fmt" 5 "runtime" 6 "strings" 7 "sync" 8 "testing" 9 _ "unsafe" 10 ) 11 12 func TestGoID(t *testing.T) { 13 var wg sync.WaitGroup 14 for i := 0; i < 5; i++ { 15 wg.Add(1) 16 go func() { 17 testGoID(t) 18 wg.Done() 19 }() 20 } 21 wg.Wait() 22 } 23 24 func testGoID(t *testing.T) { 25 id := GoID() 26 lines := strings.Split(stackTrace(), "\n") 27 for i, line := range lines { 28 if !strings.HasPrefix(line, fmt.Sprintf("goroutine %d ", id)) { 29 continue 30 } 31 if i+1 == len(lines) { 32 break 33 } 34 if !strings.Contains(lines[i+1], ".stackTrace") { 35 t.Errorf("there are goroutine id %d but it is not me: %s", id, lines[i+1]) 36 } 37 return 38 } 39 t.Errorf("there are no goroutine %d", id) 40 } 41 42 func stackTrace() string { 43 var n int 44 for n = 4096; n < 16777216; n *= 2 { 45 buf := make([]byte, n) 46 ret := runtime.Stack(buf, true) 47 if ret != n { 48 return string(buf[:ret]) 49 } 50 } 51 panic(n) 52 }