github.com/onsi/ginkgo@v1.16.6-0.20211118180735-4e1925ba4c95/integration/_fixtures/profile_fixture/lock_contest/lock_contest_suite_test.go (about)

     1  package lock_contest_test
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  	"time"
     7  
     8  	. "github.com/onsi/ginkgo"
     9  	. "github.com/onsi/gomega"
    10  
    11  	"github.com/onsi/ginkgo/integration/_fixtures/profile_fixture/lock_contest"
    12  )
    13  
    14  func TestLockContest(t *testing.T) {
    15  	RegisterFailHandler(Fail)
    16  	RunSpecs(t, "LockContest Suite")
    17  }
    18  
    19  var _ = Describe("quick lock blocks", func() {
    20  	for i := 0; i < 10; i++ {
    21  		It("reads a lock quickly", func() {
    22  			c := make(chan bool)
    23  			l := &sync.Mutex{}
    24  			l.Lock()
    25  			go func() {
    26  				lock_contest.WaitForLock(l)
    27  				close(c)
    28  			}()
    29  			time.Sleep(5 * time.Millisecond)
    30  			l.Unlock()
    31  			<-c
    32  		})
    33  	}
    34  })
    35  
    36  var _ = Describe("slow lock block", func() {
    37  	It("gets stuck for a bit", func() {
    38  		c := make(chan bool)
    39  		l := &sync.Mutex{}
    40  		l.Lock()
    41  		go func() {
    42  			lock_contest.SlowWaitForLock(l)
    43  			close(c)
    44  		}()
    45  		time.Sleep(500 * time.Millisecond)
    46  		l.Unlock()
    47  		<-c
    48  	})
    49  })