mirror of
				https://github.com/fluffle/goirc
				synced 2025-11-03 19:48:04 +00:00 
			
		
		
		
	An attempt to trigger data races in the state tracker.
This commit is contained in:
		
							parent
							
								
									2e39250355
								
							
						
					
					
						commit
						36e4aeb603
					
				
					 1 changed files with 57 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
package state
 | 
			
		||||
 | 
			
		||||
import "testing"
 | 
			
		||||
import (
 | 
			
		||||
	"sync"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSTNewTracker(t *testing.T) {
 | 
			
		||||
	st := NewTracker("mynick")
 | 
			
		||||
| 
						 | 
				
			
			@ -413,3 +416,56 @@ func TestSTWipe(t *testing.T) {
 | 
			
		|||
		t.Errorf("Nick chan lists wrong length after wipe.")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSTRaces(t *testing.T) {
 | 
			
		||||
	st := NewTracker("mynick")
 | 
			
		||||
	wg := sync.WaitGroup{}
 | 
			
		||||
 | 
			
		||||
	for i := 'a'; i < 'g'; i++ {
 | 
			
		||||
		wg.Add(2)
 | 
			
		||||
		go func(s string) {
 | 
			
		||||
			st.NewNick("nick-" + s)
 | 
			
		||||
			c := st.NewChannel("#chan-" + s)
 | 
			
		||||
			st.Associate(c, st.me)
 | 
			
		||||
			wg.Done()
 | 
			
		||||
		}(string(i))
 | 
			
		||||
		go func(s string) {
 | 
			
		||||
			n := st.GetNick("nick-" + s)
 | 
			
		||||
			c := st.GetChannel("#chan-" + s)
 | 
			
		||||
			st.Associate(c, n)
 | 
			
		||||
			wg.Done()
 | 
			
		||||
		}(string(i))
 | 
			
		||||
	}
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
 | 
			
		||||
	wg = sync.WaitGroup{}
 | 
			
		||||
	race := func(ns, cs string) {
 | 
			
		||||
		wg.Add(5)
 | 
			
		||||
		go func() {
 | 
			
		||||
			st.Associate(st.GetChannel("#chan-"+cs), st.GetNick("nick-"+ns))
 | 
			
		||||
			wg.Done()
 | 
			
		||||
		}()
 | 
			
		||||
		go func() {
 | 
			
		||||
			st.GetNick("nick-"+ns).Channels()
 | 
			
		||||
			wg.Done()
 | 
			
		||||
		}()
 | 
			
		||||
		go func() {
 | 
			
		||||
			st.GetChannel("#chan-"+cs).Nicks()
 | 
			
		||||
			wg.Done()
 | 
			
		||||
		}()
 | 
			
		||||
		go func() {
 | 
			
		||||
			st.Dissociate(st.GetChannel("#chan-"+cs), st.GetNick("nick-"+ns))
 | 
			
		||||
			wg.Done()
 | 
			
		||||
		}()
 | 
			
		||||
		go func() {
 | 
			
		||||
			st.ReNick("nick-"+ns, "nick2-"+ns)
 | 
			
		||||
			wg.Done()
 | 
			
		||||
		}()
 | 
			
		||||
	}
 | 
			
		||||
	for n := 'a'; n < 'g'; n++ {
 | 
			
		||||
		for c := 'a'; c < 'g'; c++ {
 | 
			
		||||
			race(string(n), string(c))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue