github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/deadlock/detector_test.go (about)

     1  package deadlock
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  )
     7  
     8  func TestDetector(t *testing.T) {
     9  	var (
    10  		lock1, lock2 Mutex
    11  	)
    12  	lock1.Init()
    13  	lock2.Init()
    14  
    15  	var (
    16  		errDL    *ErrorDeadlock
    17  		errUsage *ErrorUsage
    18  	)
    19  
    20  	go func() {
    21  		lock1.Lock()
    22  
    23  		time.Sleep(time.Millisecond * 200)
    24  
    25  		defer func() {
    26  			panicErr := recover()
    27  			errDL, errUsage = ParsePanicError(panicErr)
    28  		}()
    29  
    30  		lock2.Lock()
    31  
    32  		select {}
    33  	}()
    34  
    35  	time.Sleep(time.Millisecond * 100)
    36  
    37  	go func() {
    38  		lock2.Lock()
    39  
    40  		lock1.Lock()
    41  	}()
    42  
    43  	time.Sleep(time.Millisecond * 300)
    44  	if errDL == nil {
    45  		t.FailNow()
    46  	}
    47  	if errUsage != nil {
    48  		t.FailNow()
    49  	}
    50  
    51  }
    52  
    53  func TestMap(t *testing.T) {
    54  	m := make(map[int]int)
    55  
    56  	m[1]++
    57  
    58  	if m[1] != 1 {
    59  		t.FailNow()
    60  	}
    61  
    62  	m[1]--
    63  	m[1]--
    64  
    65  	if m[1] != -1 {
    66  		t.FailNow()
    67  	}
    68  
    69  	var nilMap map[int]int
    70  	if _, ok := nilMap[1]; ok {
    71  		t.FailNow()
    72  	}
    73  }