mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
package postgres
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
	"testing"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/stretchr/testify/require"
 | 
						|
)
 | 
						|
 | 
						|
func TestIntegrationLocker(t *testing.T) {
 | 
						|
	if testing.Short() {
 | 
						|
		t.Skip("Tests with Sleep")
 | 
						|
	}
 | 
						|
	const notUpdated = "not_updated"
 | 
						|
	const atThread1 = "at_thread_1"
 | 
						|
	const atThread2 = "at_thread_2"
 | 
						|
	t.Run("Should lock for same keys", func(t *testing.T) {
 | 
						|
		updated := notUpdated
 | 
						|
		locker := newLocker()
 | 
						|
		locker.Lock(1)
 | 
						|
		var wg sync.WaitGroup
 | 
						|
		wg.Add(1)
 | 
						|
		defer func() {
 | 
						|
			locker.Unlock(1)
 | 
						|
			wg.Wait()
 | 
						|
		}()
 | 
						|
 | 
						|
		go func() {
 | 
						|
			locker.RLock(1)
 | 
						|
			defer func() {
 | 
						|
				locker.RUnlock(1)
 | 
						|
				wg.Done()
 | 
						|
			}()
 | 
						|
			require.Equal(t, atThread1, updated, "Value should be updated in different thread")
 | 
						|
			updated = atThread2
 | 
						|
		}()
 | 
						|
		time.Sleep(time.Millisecond * 10)
 | 
						|
		require.Equal(t, notUpdated, updated, "Value should not be updated in different thread")
 | 
						|
		updated = atThread1
 | 
						|
	})
 | 
						|
 | 
						|
	t.Run("Should not lock for different keys", func(t *testing.T) {
 | 
						|
		updated := notUpdated
 | 
						|
		locker := newLocker()
 | 
						|
		locker.Lock(1)
 | 
						|
		defer locker.Unlock(1)
 | 
						|
		var wg sync.WaitGroup
 | 
						|
		wg.Add(1)
 | 
						|
		go func() {
 | 
						|
			locker.RLock(2)
 | 
						|
			defer func() {
 | 
						|
				locker.RUnlock(2)
 | 
						|
				wg.Done()
 | 
						|
			}()
 | 
						|
			require.Equal(t, notUpdated, updated, "Value should not be updated in different thread")
 | 
						|
			updated = atThread2
 | 
						|
		}()
 | 
						|
		wg.Wait()
 | 
						|
		require.Equal(t, atThread2, updated, "Value should be updated in different thread")
 | 
						|
		updated = atThread1
 | 
						|
	})
 | 
						|
}
 |