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 TestLocker(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 | ||
|  | 	}) | ||
|  | } |